引言
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);