C++ & OpenCV 零散学习总结

OpenCV中Mat基本用法:编程

  Mat类 (Matrix的缩写) 是OpenCV用于处理图像而引入的一个封装类。从功能上讲,Mat类在IplImage结构的基础上进一步加强,而且,因为引入C++高级编程特性,Mat类的扩展性大大提升。数组

  Mat image(240, 320, CV8UC3);第一个参数是rows,该矩阵的行数;第二个参数是cols,该矩阵的列数;第三个参数是该矩阵元素的类型。这句话表示建立一个大小为240×320的矩阵,里面的元素为8位unsigned型,通道数(channel)有3个。函数

  Mat::zeros(3, 3, CV32F) + 5;定义个3×3的32bit浮点数矩阵,元素全为0,再将全部元素加上5.0。优化

C++中vector的at函数:spa

  假设v是一个vector对象,一般v.at(n)和v[n]是同样的,前者会检查是否越界(所以花费的时间稍多),然后者不会(后者越界会致使未定义行为)。指针

C++优化之使用emplace对象

  在C++开发过程当中,咱们常常会用STL的各类容器,好比vector,map,set等,这些容器极大的方便了咱们的开发。在使用这些容器的过程当中,咱们会大量用到的操做就是插入操做,好比vector的push_back,map的insert,set的insert。这些插入操做会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。可是不少时候咱们并不须要两次构造带来效率的浪费,若是能够在插入的时候直接构造,就只须要构造一次就够了。教程

  C++11标准已经有这样的语法能够直接使用了,那就是emplace。vector有两个函数能够使用:emplace,emplace_back。emplace相似insert,emplace_back相似push_back。内存

OpenCV的连通域处理函数
  在图像处理过程当中,常常会遇到这样一部分图像,图像的总体部分若是人来看的话一眼就能看出,可是它的内部因为有各类小缺口,致使断开了,这样在计算机“眼”里就被认为是断开的,为了使图像达到适应人眼的感受,须要将这些缺口和断开的口给链接上去,这就须要用到计算机图形学中的连通域处理技术。给出一个简单的连通域处理函数,这个函数是来自OpenCV著名教程Learning OpenCV中。开发

  这个连通域处理函数的形式:

  void ConnectedComponents(Mat &mask_process,  int poly1_hull0,  float perimScale,  int number = 0,  Rect &bounding_box = Rect(),  Point &contour_centers = Point(-1, -1));

  参数mask表示的是须要进行连通域处理二值图像。

  参数poly1_hull0表示轮廓边缘是否采用多边形拟合,若是该参数为1,则表示采用多边形拟合,不然采用凸包拟合。

  参数perimScale是用来将那些小的轮廓去掉,那些小的轮廓时指它的周长小于(mask长+宽)/perimScale。固然你在其内部代码也能够该为面积来判断。

  参数num表示实际须要处理最多的轮廓的个数(若是输入的mask有多个轮廓的话),这里的处理是指计算出这些轮廓的外接矩形和中心点。默认值为0,表示函数内部不须要处理这些外接矩形和中心点。

  参数bbs表示的是处理完后对应轮廓的外接矩形,默认值为Rect(),表示不须要返回这些外接矩形。

  参数centers表示处理完后对应轮廓的中心点坐标,默认值为Point(-1, -1),表示不须要返回这些中心点。

C++ memset()函数: 

  memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的;

  包含在<string.h>头文件中,能够用它对一片内存空间逐字节进行初始化;

  原型为 :

  void *memset(void *s, int v, size_t n);  

  这里s能够是数组名,也能够是指向某一内在空间的指针;

  v为要填充的值;

  n为要填充的字节数;

相关文章
相关标签/搜索