**
前言
**
由于已经折腾了好久,看着别人的Opencv笔记都厌倦了。我装的是Opencv4.0.1而很多教程都不和,能符合的教程也只讲了一点皮毛,目前就学会形态学操作和直方图一点东西。
从python版学起的话,在B站上看过一个课程,越学越糊涂。果然还是需要从C++开始。
目前学过高数,线性代数学了但是忘记了,矩阵论还没学,概率论还要半年之后学,好像还需要什么凸优化-------难受的一批,脑子里满是些不理解的名词,之前学到直方图画了4天,找教程又烦了我5天-----------
想必嫦娥4号上用的也有视觉处理的技术,而我以后想找机会做视觉识别的车子。那么,现在就定个目标吧,入门水平就定在学会图像矩阵各种乱搞的操作、学会使用运动物体跟踪等等。
命名规则约定
首先需要了解的是命名规则约定,以前没想过,但有这个机会,就学学记记。
描述 | 实例 |
---|---|
类名混合使用大小写、首字母大写 | ClassName |
类型定义,包括枚举和typedef,混合使用大小写,首字母大写 | TypeName |
枚举类型处理混合使用大小写外,总以复数形式表示 | EnumeratedTypes |
局部变量混合使用大小写,且首字母小写,其名字应该与底层数据类型无关,而且应该反映该变量所代表的事物 | localVariable |
子程序参数的格式混合使用大小写,且每个单词首字母大写,其名字应该与底层数据类型无关,而且应该反映该变量所代表的事物 | RoutineParameter |
对类的多个子程序可见(且只对该类可见)的成员变量名用m_前缀 | m_ClassVariable |
全局变量名用g_前缀 | g_GlobalVariable |
具名常量全部大写 | CONSTANT |
宏全部大写,单词间用分割符_隔开 | SCREEN_WIDTH |
枚举类型成员名用能反映其基础类型的、单数形式的前缀,例如Color_Red,Color_Blue | Base_EnumeratedType |
argc与argv参数解惑
在Opencv官方实例程序里(在opencv\sources\samples\cpp里找找),往往带有这两个形参,而且一般只在命令行编译程序时才有用。
int main(int argc,char** argv){
const char* imageName=argc>1?argv[1]:"lena.jpg";
......
}
第一个参数argc,用来统计程序运行时发给main函数的命令行参数个数,而第二个参数:
- argv[0]指向程序运行的全路径名
- argv[1]指向在DOS命令行中执行程序名后的第一个字符串
- argv[2]指向执行程序后的第二个字符串
- …
- argv[argc]指向NULLL
我们写个程序验证一下:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char** argv) {
cout << "argc = " << argc << endl;
if (argc <= 1) {
cout << "参数不够..." << endl;
system("pause");
}
Mat src = imread(argv[1]);
if (src.empty()) {
cout << "cannot load image...";
system("pause");
}
imshow(argv[0], src);
for (int i = 0; i < argc; ++i) {
cout << "argv[" << i << "] = " << argv[i] << endl;
}
waitKey(0);
destroyAllWindows();
}
因为没有传入什么参数,Visual Studio 2017中默认argc为1,但是运行一遍后得到.exe执行文件,选一张图片放在与.exe同目录下,把图片拖到.exe上,显示用什么什么.exe打开,然后就有结果了。
另外,其实main(int argc,char* argv[],char** env)才是UINX、Linux中的标准写法。第三个参数为字符数组,和第二个一样,但他的每一个元素是ENVVAR=value形式的字符串,ENVVAR是环境变量,value是对应的值,在Opencv中很少使用(也许用的到呢)
格式输出函数printf()简析
printf保护在opencv.hpp中
printf"格式字符串"候选字符
格式字符串 | 作用 |
---|---|
%d | 整数->十进制 |
%f | 整数->浮点数 |
%u | 十进制无符号整数 |
%o | 整数->八进制 |
%c | 整数->ASCII字符 |
%s | 整数->字符串 |
%x | 整数->小写十六进制 |
%X | 整数->大写十六进制 |
%p | 输出地址符 |
%% | 输出百分比符号,不进行转换 |
printf特殊字符
规定字符 | 作用 |
---|---|
\n | 换行 |
\f | 清屏并换页 |
\r | 回车 |
\t | Tab符 |
\xhh | 用十六进制表示的ASCII码,其中每个h可以用0~f中的一个替换 |
比如我们查一下Opencv的版本printf("\t当前使用的版本为Opencv - ",CV_VERSION);
参考:《Opencv3编程入门》