关于opencv中Mat和CvMat数据结构中的内存对齐的小实验

opencv中矩阵数据类型 Mat和CvMat,IplImage为了计算方便,会对数据进行内存对齐,故本人经常操作Mat和Iplimage进行数据的赋值,一直很小心使用memcpy进行数据的拷贝来替代循环操作,另外使用指针诸如 uchar* ptr = mat.data, uchar* ptr = img->imageData 操作也要小心。

测试代码:

IplImage* img = cvLoadImage("D:\\MM.jpg");
uchar* data = new uchar[3 * img->height * img->width];
memcpy(data, img->imageData, 3 * img->height * img->width);
cv::Mat mat(img->height, img->width, CV_8UC3, data);
cv::imshow("Test", mat);

这里MM.jpg 是一个 960 *600大小的图像数据,从分辨率上看,加载进opencv后,并不需要进行对齐,故得到的结果是这样的:

这里显示正常。

但是如果我裁剪图像到323*361,来迫使其不是偶数,显示将会这样:

数据已经混乱!

但是令人奇怪的是,如果不使用 IplImage和cvLoadImage来加载图片,而使用Mat 和 imread的话,这个问题就不存在了!也许新生成的Mat数据都是连续的吧。

 

posted @ 2018-09-20 13:42  格物的菜鸟  阅读(621)  评论(0编辑  收藏  举报