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 显示不一样。

Logo

一站式 AI 云服务平台

更多推荐