1、 cv:: mat 初始化
cv::Mat img1(h, w, CV_8UC3);
cv::Mat img1(h, w, CV_8UC3, data);
一般cv::mat 初始化后数据内存 data 段都是连续的, 可以用isContinuous()函数判断存储是否连续。
2、data段不连续情况
切记!切记!切记!不连续不能当一维数组处理
一般经过裁剪的Mat图像,都不再连续了,如
cv::Mat crop_img = src(rect);
crop_img 是不连续的Mat图像,如果想转为连续的,最简单的方法,就是将不连续的crop_img 重新clone()一份。
cv::Mat clone_img = crop_img.clone();
不连续踩坑
(1)裁剪后数据赋值
cv::Mat crop_img = src(rect);
cv::Mat img_new1(h, w, CV_8UC3, crop_img.data);
会发现 img_new1 和 crop_img 显示不一样。
(1)数据内存 memcpy
cv::Mat crop_img = src(rect);
cv::Mat img_new1(h, w, CV_8UC3);
memcpy(img_new1.data, crop_img.data, sizeof(uchar) *w * 3 * h);
会发现 img_new1 和 crop_img 显示不一样。