OpenCV基础——IplImage中的widthStep

2022-07-01 09:47:53 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

IplImage有两个属性容易导致错误:width和widthStep

前者是表示图像的每行像素数,后者指表示存储一行像素需要的字节数。

在OpenCV里边,widthStep必须是4的倍数,从而实现字节对齐,有利于提高运算速度。

如果8U单通道图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行需要4个字节,只使用前3个,最后一个空着。

也就是一个宽3高3的图像的imageData数据大小为4*3=12字节。

查看OpenCV2.1的源码

在src/cxcore/cxarray.cpp文件中,找到cvInitImageHeader函数,函数中对widthStep大小赋值如下:

image->widthStep =

(((image->width * image->nChannels *(image->depth & ~IPL_DEPTH_SIGN) 7)/8) align – 1) & (~(align – 1));

其中IPL_DEPTH_SIGN的定义可以在cxtypes.h中找到,定义为:#define IPL_DEPTH_SIGN 0x80000000, align的大小为CV_DEFAULT_IMAGE_ROW_ALIGN,其大小在cxmisc.h中定义为:#define CV_DEFAULT_IMAGE_ROW_ALIGN 4,depth取8位深度。

根据上式,已知IPL_DEPTH_SIGN、align、depth 的大小,分别手动计算如下图像的widthStep:

图像宽度 图像通道数 计算得到的widthStep

3 3 12

3 1 4

5 3 16

5 1 8

7 3 24

7 1 8

4 3 12

4 1 4

为了进一步验证手算的正确性,我们编程实现输出widthStep的大小,程序如下

例:IplImage* cvCreateImage(CvSize cvSize(int width, int height), int depth, int channels):

IplImage *image_33 = cvCreateImage(cvSize(3, 3), 8, 3); IplImage *image_31 = cvCreateImage(cvSize(3, 3), 8, 1); IplImage *image_53 = cvCreateImage(cvSize(5, 3), 8, 3); IplImage *image_51= cvCreateImage(cvSize(5, 3), 8, 1); IplImage *image_73 = cvCreateImage(cvSize(7, 3), 8, 3); IplImage *image_71 = cvCreateImage(cvSize(7, 3), 8, 1);

printf(“%d, %d, %d, %d, %d, %d”, image_33->widthStep,image_31->widthStep, image_53->widthStep,image_51->widthStep,image_73->widthStep,image_71->widthStep);

运行结果为:12, 4, 16, 8, 24, 8, 与手动计算结果相同。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131706.html原文链接:https://javaforall.cn

0 人点赞