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数据都是连续的吧。