查改BUG笔记-cv::Mat拷贝

问题

从img图像中截取300x300的图像,处理后保存图像,出现乱波纹的图像;

Mat dst = img(cv::Rect(0, 0, 300, 300));
Mat dst_2 = cv::Mat::zeros(300, 300, CV_8UC3);
cv::imshow("Image", dst);
int n = dst.channels();
int nBytes = dst.rows * dst.cols * dst.channels();
memcpy(dst_2.data, dst.data, nBytes);

正常图像为左图,错误图像为右图:
在这里插入图片描述在这里插入图片描述
两个dst_2内存中的内容也是不同的:
在这里插入图片描述
在这里插入图片描述

原因

使用了memcpy,但是cv::Mat中不止有图像数据和长高信息,还有其他信息;详见OpenCV笔记-Mat类型
其中在OpenCV中,数组的行在内存中可能不是绝对按顺序存储的,由于数据对齐的原因,每一行之间可能存在一个很小的间隔,数据对齐是为了提高内存的存取效率。
一开始猜测是由于输出的图像,误将宽高颠倒了,设置成一样的宽和高,还是一样的错误;

猜你喜欢

转载自blog.csdn.net/liushao1031177/article/details/120066726