Mods-请关闭此问题。我在代码中发现了错误。不幸的是,我无法删除它。
以下两个代码段之间是否有区别? 也许关于填充?因为相对于第一个图像(静态分配),我得到了奇怪的图像。第二个没事。
产生失真的图像(我猜是缺少蓝色,并且像素发生了移位)
function1(char *image) {
char image_data_[image_info_.imgSize];
memcpy(image_data_, image, image_info_.imgSize); // 144000 bytes
cv::Mat color_image_opencv(image_info_.height, image_info_.width, CV_8UC3, image_data_);
cv::imwrite("image.png", color_image_opencv);
}
AND(此方法有效)
function2(char *image) {
char *image_data_ = NULL;
image_data_ = reinterpret_cast<char*>(malloc(image_info_.imgSize));
memcpy(image_data_, image, image_info_.imgSize);
cv::Mat color_image_opencv(image_info_.height, image_info_.width, CV_8UC3, image_data_);
cv::imwrite("image.png", color_image_opencv);
}
答案 0 :(得分:1)
我们可以使用心理调试能力来推断您正在从函数返回cv::Mat
,或者将其生存期延长到它指向的char数组之外。在malloc()
中,用于存储图像字节的内存在显式释放之前是可用的,与之相反,与自动变量相反,一旦图像数据超出范围,就不能使用它。
您使用的cv::Mat
构造函数的documentation说:
采用数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化指向指定数据的矩阵头,这意味着不会复制任何数据。此操作非常有效,可用于使用OpenCV功能处理外部数据。外部数据不会自动释放,因此您应该注意这一点。
当然,当他们说“好好照顾”时,并不是说“要在销毁cv::Mat
之前销毁它。”