使用cv :: imdecode后,cv :: Mat外部数据未被修改

时间:2014-03-17 17:18:46

标签: c++ opencv

编辑:在尝试给出一个问题的直接示例时,我发现了导致真正问题的原因。我修改了示例来说明问题。

我正在尝试使用opencv对由外部数据组成的cv::Mat执行操作。

考虑这个例子:

unsigned char *extern_data = new unsigned char[1280*720*3];
cv::Mat mat = cv::Mat(1280, 720, CV_8UC3, extern_data); //Create cv::Mat external

//Edit - Added cv::imdecode
mat = cv::imdecode(mat,1);

//In real implementation it would be mat = cv::imdecode(image,'1')
// where image is a cv::Mat of an image stored in a mmap buffer

mat.data[100] = 99;

std::cout << "External array: " << static_cast<int>(extern_data[100]) << std::endl;
std::cout << "cv::Mat array: " << static_cast<int>(mat.data[100]) << std::endl;

结果是:

> External array: 0
> cv::Mat array: 100

很明显,这个外部数组没有被修改,因此为cv::Mat数组分配了新的内存。根据我的理解,这不应该发生!这应该不会导致复制操作,mat.data应该是指向extern_data[0]的指针。

我误解了什么?

1 个答案:

答案 0 :(得分:0)

到目前为止,我的程序工作方式是使用std :: copy。我仍然想知道是否有办法将cv :: imdecode()的结果直接分配给外部数据。

目前我正在使用

unsigned char *extern_data = new unsigned char[1280*720*3];
cv::Mat mat = cv::Mat(1280, 720, CV_8UC3, extern_data); //Create cv::Mat external

mat = cv::imdecode(mat,1);

std::copy(mat.data, mat.data + 1280*720*3, extern_data);

我希望我能在没有额外cv::imdecode()行的情况下弄明白如何将extern_data的结果直接分配给std::copy