如何在没有额外分配的情况下从OpenCV矩阵中获取图像数据
How to get image data from OpenCV matrix without extra allocation?
我想做以下事情:
- 复制我不知怎么检索到的Cv::mat
- 转换它
- 将指向数据的指针与元信息(大小、格式等)一起返回给调用者
- 完成后,释放数据
我使用的代码是:
cv::Mat m(...); //here is source image
cv::Mat *img = new cv::Mat(m.clone());// copy the data
//do transformations
(*result)->pdata = img->data; // pointer to data gois to out parameter
img->addref(); //to prevent freeing the image data after tempo
delete img; //dispose of temporary object
...
delete [] outparam->pdata; //result == &outparam; free data after use
然而,当执行时,此代码会在以下位置产生断言失败:
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
我应该如何实现我的目标?
您可以为预先分配的内存创建Mat
对象。在这种情况下,引用计数将被禁用,对象将不会在析构函数中释放此内存:
cv::Mat m(...);
Mat img(rows, cols, type, (*result)->pdata);
m.copyTo(img);
...
delete [] (*result)->pdata;
您想要做的是通过OpenCV的引用计数来实现的。依赖它比自己使用积分和分配要好得多。
cv::Mat m(...);
cv::Mat img = m; // this does not copy data, all the changes in img will be in m as well
// ... use img
// no delete necessary
请注意,如果要在不删除原始内容的情况下转换数据,则需要复制数据。在这种情况下:
cv::Mat m(...)
cv::Mat img = m.clone(); // this copies data, m and img can be used as two different Mats
// ... use img
// no delete necessary, img will be automatically deallocated
如果解除分配发生的时间很重要,您可以使用以下范围控制它:
cv::Mat m(...)
{
cv::Mat img = m.clone();
...
} // img is automatically deleted here
// img is no longer available
相关文章:
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- OpenCV(C++)处理来自JavaScript / Web Assembly的图像数据
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- OpenCV C++ 3 维垫数据访问错误值
- 将数据从 OpenCV C++传递到 NodeJS/JS |电子
- 如何将OpenCV图像数据从Python转换为C++?
- 如何将训练数据从UCI加载到OpenCV?
- 对来自csv文件的数据执行OpenCV k-means
- 这是我的程序,C++使用 OpenCv 库从数据集中读取图像序列,但它没有运行
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- 如何将OpenCV垫子转换为JPEG CHAR数据
- 将JPEG CHAR数据转换为OpenCV垫子
- 将 OpenCV 矩阵分配给数据结构
- opencv::Mat,从原始数据中获取像素值
- 使用 2D 数据创建 3D 直方图(OpenCV?
- OpenCV: cv::Mat 无法从看似有效的数据中创建矩阵
- 使用 OpenCV 和 Android NDK 转换数据格式
- OPENCV中的GSTREAMER不会通过UDP发送视频数据
- OpenCV 数据类型错误
- OpenCV数据类型的类型特征