opencv Iplimage data access

来源:互联网 发布:大数据和数据挖掘教程 编辑:程序博客网 时间:2024/06/05 14:23
分享一下我对数据结构IplImage的使用,个人习惯,我倾向于使用iplImage类里面的data指针,但是这种做法的确比较危险,原因是opencv里面对于数组来说有个row-based 4-aligned机制(可能是为了读取内存更快一些), EX: A 2*3 matrix:
XXX*                              XXX
XXX*                              XXX
(1)                                  (2)
http://opencv.willowgarage.com/documentation/c/basic_structures.html
如上所示, 一个2*3矩阵在opencv的处理方式是图(1)而非图(2)。在这种情况下,矩阵的row不被4字节整除,则强制性插入多余的字节使之4-aligned.
对于对data操作正确的做法是:
//以下代码令灰度图像img(i, j)=111
IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
int height = img->height;
int width = img->width;
int step = img->widthStep/sizeof(uchar);
uchar* data = (uchar *)img->imageData;
data[i*step+j] = 111;
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00041000000000000000
注意如上代码通过img->widthStep巧妙的处理了4字节对齐问题。
对于工程应用而言,比方说爸pImg的数据copy到uchar *pArr上面,"memcpy(pArr, pImg->data, height*width*sizeof(uchar));"这段代码依然具备诱惑力,毕竟太简洁了,当然前提是pImg的行size是被4整除(本人在这上面吃过亏,不推荐使用)。
原创粉丝点击