c++ - cv::Mat 外部数据在使用 cv::imdecode 后未被修改

标签 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] 的指针。

我误会了什么?

最佳答案

到目前为止,我让我的程序运行的方法是使用 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行!

关于c++ - cv::Mat 外部数据在使用 cv::imdecode 后未被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22461003/

相关文章:

云中的 C++。 Microsoft Azure 上的卡萨布兰卡 REST 服务

c++ - 在 C++20 常量表达式中是否允许比较动态分配对象的地址?

python - 使用 Python 从图像中提取对象

c++ - 如何使用 C++ 接口(interface)初始化和访问 openCV 中 Mat 标量矩阵中的条目?

java - 如何使用android opencv访问CV_HAAR_SCALE_IMAGE

android - Opencv 函数等于 matlab sortrows

C++ : istringstream conversion to long int doesn't work

C++成员函数的多重定义,基于枚举模板参数

c++ - 需要 C++ 中的枚举类型转换解释

OpenCV createsamples - 无效的背景描述文件