OpenCV学习笔记【二】

    xiaoxiao2021-03-25  123

    一、改变图像的大小

    方法1:

    使用CvPyrDown()、CvPyrUp() CvPyrDown()可以实现对图像进行缩放(长、宽分别变成原来的1/2),采用Gaussian金字塔分解法是实现,通过拒绝掉偶数行、列得到。 向下采样导致图像放大,导致模糊。 CvPyrUp()可以实现对图像的放大(长、宽分别变成原来的2倍),同样采用的是Gaussian金字塔的方法,通过填充0偶数行、列,之后再进行插值得到。 向上采样导致图像缩小,丢失信息。 这2个函数可以保持原图像长宽比不变。

    方法2:使用resize函数

    函数原型 void resize(InputArraysrc, OutputArray dst, Size dsize, double fx=0, double fy=0, intinterpolation=INTER_LINEAR ) 各个参数的意义比较直观,但是需要注意的是dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不同时为0;resize函数的目标大小可以是任意的大小,可以不保持长宽比率,删除的像素或者新增的像素值通过interpolation(内插)控制;

    fx,fy分别指水平和垂直方向的比率;如果dsize 为零,则目标图像的大小是通过这两个参数来计算的:目标图像的宽度为原图像的宽度*fx,同理目标图像的高度为原图像的高度*fy;

    如果dsize不为零,fx,fy会自动计算:fx=dsize.width/src.cols;fy=dsize.height/src.rows

    因此dsize和(fx,fy)只需设置其中一个,另外一个置为零就可以了~~

    **总结:**resize可以一次性将原图像变为任意不为0的尺寸,适合用来做归一化图像操作;而pyrDown与pyrUp适合做长宽比率不变得操作,且调用一次只能长和宽只能变为原来的1/2或者2倍,也即是说面积变为原来的1/4或者4倍。 以上部分参考自:http://blog.sina.com.cn/s/blog_4b0020f30101cgok.html

    二、cvMat相关:

    cvMat的指针遍历注意事项: 当矩阵元素数据类型大小为x字节时,若现有一个指向矩阵某数据元素A的指针Pointer_A,则得到A的下一行位置的元素的指针的方法为:Pointer_A+(step/x). Step为矩阵中行的长度,单位为byte. (这么做的原因是,C语言中指针移动时,会自动的将加数*所对应的字节。

    在矩阵中,常常将深度与通道一起表示 而在图像中,常常将深度与通道分开。 矩阵:CV32FC3 图像:IPL_DEPTH_32S nchannels: 3

    **三、 IPLImage结构:

    以下列举了一些比较重要的成员: 1. widthstep: 不能使用width*elem_size来得到step,即每行的字节数,因为opencv为了处理起来方便,通常会有一些冗余字节存在。所以需要通过widthstep得到每行字节数。

    2. origin: de/encoder,imagesource的不同可能会造成origin的取值不同,可能为:IPL_ORIGIN_TL或者IPL_ORIGIN_BL,这体现了图像坐标原点的选取是左上角,还是左下角。 (这通常是引起错误的重要原因之一,比较好的解决方式就是通过在当前所操作的区域画一些图像来进行判断。)

    3 :dataorder: 取值为IPL_DATA_ORDER_PLANE 或 IPL_DATA_ORDER_PIXEL 一般opencv里面只支持IPL_DATA_ORDER_PIXEL,即各通道交错排列,RGBRGB…… :

    4:IplROI* roi: 当其不为空时,指明有ROI(感兴趣区域),大多数的图像处理函数都只作用于ROI。 (IplROI结构中有:xOffset,yOffset,height,width,coi成员变量; coi成员变量指示了感兴趣的通道,大多数时候被忽略,取值为0,否则可为1,2,3,4~) :

    5: Imagedata: 与CvMat中的data不同,在CvMat中,ELemType由于是联合类型,需要特别说明。而在IPLImage中,Imagedata指向的是uchar类型。

    **四、 有关cerr , cout ,clog输出:

    最近在学习过程种有发现cerr这种输出方式,所以截取了一段在下面:   其中,Cerr不经过缓冲区,不需要遇到endl才显示,可用于内存紧张时的error information output,且不可被重定向(例如不可以被重定向输出至文件)。而cin,cout,clog都具备缓冲区,可被重定向。

    *五、 HSV颜色空间:

        注意:由于H色调是360度的,因此转换到HSV空间,并以8bit图像输出时,H应该除以2

    六、 CvGetCol()、CvGetRow()

    CvGetCol()与CvGetCols()并没有重新开辟内存空间,只是修改了指针的指向,得到subMat.

      cvGetCol()与cvGetRow()的行、列索引号都是从0开始的,即0代表第一行/第一列。   cvGetCols()与cvGetRows()的行、列索引号都是从1开始的,即1代表第一行/第一列。subMat的范围是从start_row+1~end_row 或start_col+1~end_col,不包括start_的row/col. (即start_col=0, end_col=2,则会将第1,第2列划入sub_mat。若start_col=1,end_col=2,则只有第2只列

    转载请注明原文地址: https://ju.6miu.com/read-11638.html

    最新回复(0)