Opencv-C++的知识记录
引言
OpenCV4以来就支持标准的C++11语法了,很多接口跟函数都特别容易理解,C++11可以说应用最广泛的C++标准之一了。下面从实际项目跟代码实践总结出下面C++基础知识点,方便自己以后查漏补缺。
(1)打印与输出
这个是大家需要经常使用的功能,特别是在学习过程中,打印信息,打印内容,便于调试。打印与输出采用了C++的标准输出std::cout,代码演示如下:
// 输出与打印字符串与数字 cout << "Hello World, OpenCV" << getVersionMajor()<<"."<<getVersionMinor()<<endl; // 打印Mat矩阵 Mat m1 = Mat(3, 3, CV_8UC1); cout <<"m1=" <<m1 << endl;
(2)使用auto关键字
C++11支持auto关键字推导,这个可以避免很多不必要的书写,提供代码编写效率。提升代码的整洁跟优雅度,是个很好用的关键字。代码演示如下:
// 使用auto关键字,实现自动类型推导与识别 auto t1 = 3; // 推导为int类型 auto t2 = 3.0; // 推导为double // 推导为Mat类型 auto m2 = Mat(3, 3, CV_8UC1); // 直接用auto避免类型书写 // Ptr<ORB> orb_detecto = ORB::create(); auto orb_detecto = ORB::create();
(3)使用std::vector
这个在OpenCV的程序中被大量使用,特别是在二值图像分析,特征提取等模块中,所以掌握vector容器的语法跟函数操作很重要。代码演示部分比较长,涉及到vector容器的定义初始化、添加元素、排序、几种循环fectch方式,删除元素、合并多个vector为一个等。代码演示如下:
- vector容器的定义初始化以几种循环fectch方式
// 使用数组容器 - 直接定义 vector<int> a; // 初始化定义 vector<int> b{ 3,2,1,4,6,5,9,8,7 }; // 循环fetch元素 for (auto i : b) { cout << "for-loop方式" << i << endl; } // 迭代器方式fetch元素 for (auto it = begin(b); it != end(b); ++it) { cout << "迭代器方式: " << *it << endl; }
- 添加元素,删除元素,容器合并(push_back,erase,insert)
//添加两个 a.push_back(22);//push_back(elem) 在尾部加入一个elem数据。 a.push_back(11); // 保留前面N个 auto n = 5; b.erase(b.begin() + n, b.end());// erase(beg, end) 删除[beg, end)区间的数据 // erase(pos) 删除pos位置的数据 //合并容器 b.insert(b.end(), a.begin(), a.end());//insert(pos,elem) 在pos位置插入一个elem拷贝 cout << "打印合并之后的数组:" << endl; for (auto ab : b) { cout << ab << " "; }
- 排序(sort)
// 排序 sort(b.begin(), b.end()); cout << "打印排序之后的数组:" << endl; for (auto ab : b) { cout << ab << " "; }
- vector找最大值和最小值,并输出索引
vector<int> b{ 3,2,1,4,6,5,9,8,7 }; vector<int>::iterator itMax = max_element(b.begin(), b.end()); vector<int>::iterator itMin = min_element(b.begin(), b.end()); cout << "最大值为:" << *itMax << " " << "所在位置:" << distance(b.begin(), itMax) << endl; cout << "最小值为:" << *itMin << " " << "所在位置:" << distance(b.begin(), itMin) << endl;
\
(4)学会使用字符串流
std::stringstream是一个非常有用的格式化输出,在OpenCV中如何什么想输出的数据类型(int\float\double\string)都可以往里面扔,拼接在一起,最后只要调用一下str()方法就会全部转换为str,可以输出到图像,文本、控制台上,非常的方便。特别是通过putText输出到图像上。代码演示如下:
Mat src = imread("D:/opencv练习图片/src1.jpg"); // 字符串流,任意拼接 stringstream ss; ss << "OPENCV " <<"and"; auto version = 4.5; ss << version; putText(src, ss.str(),Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.0,Scalar(0, 0, 255), 1, 8); imshow("图像", src);