b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

opencv widthstep?cvwaitkey 33?IplImage中的widthStep大小计算及原理

电脑杂谈  发布时间:2016-06-28 19:03:23  来源:网络整理

你是否正在寻找关于widthstep的内容?让我把最趣味的东西奉献给你:

一直以为IplImage结构体中的widthstep元素大小等于width*nChannels,大错特错!

查看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));(1)

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

根据(1)式,已知IPL_DEPTH_SIGN、align、depth 的大小,分别手动计算如下图像的widthstep

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

3312

314

5316

518

7324

718

4312

414

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

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, 与手动计算结果相同,。

从网上查阅资料,OpenCV分配的内存按4字节对齐,这样我们对上述计算的结果可以有个合理的解释,如宽度为3、通道数为3的图像,每一行需要的 实际内存长度为3*3,为了内存对齐,OpenCV会在每行末尾自动补上3个字节的内存,内存初始化都为0,所以widthstep变为了12。

widthstep大小对IplImage极为重要,在cxarray.cpp中,我们可以找到如下代码行:

image->imageSize = image->widthstep * image->height;

img->imageData = img->imageDataOrigin =
(char*)cvAlloc( (size_t)img->imageSize );

可见widthstep直接影响到imageData的数据长度。在操作imageData时,我们要避开对OpenCV自动补齐的内存进行操作,如直方图计算等。

写到这里,可能有人会问,我们平常都用widthStep = width * nChannels,怎么就没出错?我之前也一直在疑惑,合理的解释是,一般在实际应用中,图像的宽度一般为128, 256, 240, 320, 356,704等,刚好这些数字都能被4整除,widthstep刚好等于width * nChannels, 所以OpenCV并没有为这些图像分配多的内存,因此我们在对imageData做顺序操作也没出错。但是,请问谁能保证图像的宽度一定会是4的倍数?

纯属个人理解,如有错误,还请大虾多多指出。

以上就是关于widthstep的全部内容,相信你一定会非常满意。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shenmilingyu/article-11245-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 张琪雄
        张琪雄

        文章分明不全

      • 董婷
        董婷

        由于美国军舰没有配备足够的航空力量

        • 冯营营
          冯营营

          不被发现达不到示威效果

      热点图片
      拼命载入中...