Debug C++之opencv下Mat的data赋值问题,出现段错误(核心已转储)

记录一个Mat赋值报错问题:

通常算法对软件的接口没有Mat类型,需要传unsigned char*标定Mat的data,宽度和高度三个信息:

例如,下面的接口定义了两张图像,用于相机对图像处理后的返回结果,接口信息如下:

cpp 复制代码
//输入
struct OUTPUT_DATA {
	unsigned char *left_img_data;
	int left_img_width;
	int left_img_height;
	int left_img_channels;

	unsigned char *right_img_data;
	int right_img_width;
	int right_img_height;
	int right_img_channels;

};

OUTPUT_DATA 内部表示了两张图的信息,也就是两个Mat的信息,容易出错的是对unsigned char *的值赋值:

主要步骤:

(1)为结构体指针分配空间,表示一个结构体信息:

cpp 复制代码
OUTPUT_DATA *out=new OUTPUT_DATA ();
out->left_img_data = new unsigned char[2048 * 2448 * 3];
out->right_img_data = new unsigned char[2048 * 2448 * 3];

(2)当Mat的信息已经包含图像的时候:

例如:

cpp 复制代码
Mat img1 = imread("1.jpg");
Mat img2 = imread("2.jpg");

此时img1和img2包含了两张图的信息,传递到外部式容易出差:

错误赋值:

cpp 复制代码
out->left_img_data = img1.data;
out->right_img_data = img2.data;

正确赋值

cpp 复制代码
memcpy(out->left_img_data, img1.data,
           img1.cols * img1.rows * img1.channels());
//out->left_img_data = img1.data;
out->left_img_width = img1.cols;
out->left_img_height = img1.rows;
out->left_img_channels = img1.channels();
memcpy(out->right_img_data, img2.data,
           img2.cols * img2.rows * img2.channels());

//out->left_img_data = img1.data;
out->right_img_width = img2.cols;
out->right_img_height = img2.rows;
out->right_img_channels = img2.channels();
相关推荐
源码学社2 分钟前
图像去水印实测:OpenCV inpainting vs LaMa,传统算法和 AI 模型差距有多大
人工智能·opencv·算法·去水印·图片水印·ai去水印
米糕闯编程11 分钟前
鱼香ros2(十二)C++话题订阅与发布
开发语言·c++·ros2·话题
汉克老师1 小时前
GESP2026年9月认证C++八级( 第三部分编程题(2、末班车))精讲
c++·gesp·小学生·学c++编程
richard_yuu2 小时前
OpenCV 实战第 7 篇:Canny 阈值自适配、findContours 层级与 approxPolyDP
人工智能·opencv·计算机视觉
傲世仙尊2 小时前
C++起步-命名空间解决命名冲突与cin-cout缺省参数
开发语言·c++
(Charon)2 小时前
【C++面试】四种cast转换:static_cast、dynamic_cast、const_cast与reinterpret_cast
开发语言·c++·面试
蒸蒸yyyyzwd3 小时前
后端学习笔记 day58
c++·八股
道尔柯南3 小时前
【QT】从零认识 Qt:跨平台 C++ GUI 开发入门
开发语言·c++·qt
MayZork4 小时前
std::filesystem 文件操作详解
开发语言·c++·qt
NeilYuen15 小时前
【C++】STL源码仿写(二):vector
开发语言·c++