opencv实用技巧总结!(后续会补充)

来源:互联网 发布:excel2013数据分级显示 编辑:程序博客网 时间:2024/05/22 06:32

1.已经定义好了img为Mat型,但是没有初始化,在后面程序的任何一个位置可以使用下面的代码初始化img,比如img=Mat(***1,***2),其中***1是矩形区域的大小,***2是数组内数据类型。 

2.在opencv中像素点的数据类型能找到对应类似char,int,float,double的,比如说是分别为CV_8UC1,CV_16UC1,CV_32FC1, CV_64FC1,一定要注意是没有这一说法的CV_16FC1。

3.在对opencv工程进行debug时,如果想查看Mat型内部的数据,直接在变量监视器里面看是不行的,且观察时其内部还有可能报错。最好是将Mat类型数据cout到屏幕终端观察。

4.将一个vector类型的变量转换成一个Mat型变量,可以采用下面的方法: Vector& c=contours(0);Mat cnew;Cnew=Mat(c);    

5.Scalar与CvScalar类似,都是标量,用于存储像素值的,有4个通道,每个通道可存double型,其内部定义为:

  typedef  struct CvScalar
     

     double val[4];

    }CvScalar; 

6.当图像像素值为hsv空间时,hsv中3个分量的取值范围为[0 180],[0 255],[0,255].

7.opencv中的NAN表示是非数字,即Not A Number,INF表示无穷大,比如+INF:正无穷,-INF:负无穷。 

8.RGB空间是类似人眼工作机制,被各种显示设备采用。HSV,HLS是描述颜色更自然的方法,去掉最后一个元素可以使算法对光照不敏感。YCrCb在jpeg中广泛使用。Lab是在感知上比较均匀的颜色空间,适合度量2个颜色之间的距离。

Size wholeSize;

    Point roiofs;

    img.locateROI(wholeSize, roiofs); 

   locateROI在此处是如果img图像是从其它父图像中某一部分得来的,那么其父图像的大小尺寸就为whleSize了,img图像左上角那个点相对于父图像的左上角位置就为点roiofs了。

9. 在opencv学习中,经常会读一些基于1.0版本的opencv代码,如果我们需要在2.0以后版本中使用已有的代码,遇到的问题最多的就是Mat和IplImage*之间的转换,现在举个例子来简单说明一下这2者之间的转换。

假设已经定义: Mat src;

            IplImage* img;

并且也假设src或者img中已经有了数据。则如果需要将src转换到img,应该使用下面的语句:

    img = &src.operator IplImage();

    如果是将img转换到src,则直接使用下面的语句:

    src = Mat(img);

    这是opencv基于c版本和c++版本混合编程的处理方法。

10. 在opencv的core.hpp里面有AutoBuffer<>()函数,该函数为自动分配一段指定大小的内存,并且可以指定内存中数据的类型。

11.调用Mat::copyTo()函数时,如果需要有mask操作,则不管源图像是多少通道的,其mask矩阵都要定义为单通道,另外可以对一个mask矩阵画一个填充的矩形来达到使mask矩阵中对应ROI的位置的值为设定值,这样就不需要去一一扫描赋值了。

12.在使用OpenCV的Mat矩阵且需要对该矩阵进行扫描时,一定要注意其取值顺序,比如说列和行的顺序,如果弄反了,则经常会报内存错误。

13.在使用OpenCV内部的判断条件时应该使用CV_Assert()函数,而不是CV_ASSERT()。

14.通过实验测试发现,虽然经过calcHist()函数计算过后的直方图保存在hist中,这里hist是一个Mat类型,并且如果计算的是一维的直方图的话,则hist是一个列向量。

15. 当Mat中数据的类型为CV_16UC1的时候,这里的16U并不是指unsigned int,而是指的是unsigned short int,因为在OpenCV框架中,int不是16位的,而是32位的。没想到我使用OpenCV一年了,今天才弄清楚这个。

16. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。(虽然网上有学着说OpenCV中有些数据结构的坐标原点是在图片的左下角,但是我暂时还没碰到过)。

17. 在使用image.at(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标,而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at(Point(x2, x1))效果相同。

18. 如果所画图像是多通道的,比如说image图像的通道数时n,则使用Mat::at(x, y)时,其x的范围依旧是0到image的height,而y的取值范围则是0到image的width乘以n,因为这个时候是有n个通道,所以每个像素需要占有n列。但是如果在同样的情况下,使用Mat::at(point)来访问的话,则这时候可以不用考虑通道的个数,因为你要赋值给获取Mat::at(point)的值时,都不是一个数字,而是一个对应的n维向量。

19. 多通道图像在使用minMaxLoc()函数是不能给出其最大最小值坐标的,因为每个像素点其实有多个坐标,所以是不会给出的。因此在编程时,这2个位置应该给NULL。

20.使用霍夫变换时,检测的直线有时候可能不是水平的,为了保持水平或者是竖直,可以使用if函数保证lines数组的第一个与第三个,第二个与第四个其中某一对数值相等。




0 0
原创粉丝点击