C++/cv::Mat相当于使用memcpy创建IplImage
C++ / cv::Mat equivalent of creating IplImage using memcpy
我收到了一些代码,其中使用memcpy创建IplImage,然后转换为cv::Mat:
IplImage* iplImage = cvCreateImage(cv::Size(imageWidth, imageHeight), IPL_DEPTH_8U, bytesPerPixel);
memcpy(iplImage->imageData, memory, imageWidth * imageHeight * bytesPerPixel);
cv::Mat image = cv::cvarrToMat(iplImage, true, true, 0);
cvReleaseImage(&iplImage);
内存是指向内存块开头的空指针。
我想移植此代码以仅使用OpenCV C++Api。这是我首先尝试的:
cv::Mat image(cv::Size(imageWidth, imageHeight), CV_MAKETYPE(CV_8U, bytesPerPixel), memory);
但是图像是空的。
然后我尝试了这个:
cv::Mat image(cv::Size(imageWidth, imageHeight), CV_MAKETYPE(CV_8U, bytesPerPixel));
memcpy(image.data, memory, imageWidth * imageHeight * bytesPerPixel);
这种方法是有效的,但是它会占用更多的RAM(大约100mb),所以我想会涉及到一些不必要的复制。
正确的方法是什么?
编辑:内存实际上在一个包装类中。它会自动解除分配。为了简单起见,我把它改成了"记忆"。
编辑2:这是完整的代码,包括内存来自的对象:
cv::Mat RecordingPlayer::next() {
if (currentContainer.getDataType() == odcore::data::image::SharedImage::ID()) {
odcore::data::image::SharedImage sharedImage = currentContainer.getData<odcore::data::image::SharedImage>();
std::shared_ptr<odcore::wrapper::SharedMemory> memory = odcore::wrapper::SharedMemoryFactory::attachToSharedMemory(sharedImage.getName());
IplImage* iplImage = cvCreateImage(imageSize(), IPL_DEPTH_8U, bytesPerPixel);
memcpy(iplImage->imageData, memory->getSharedMemory(), imageWidth * imageHeight * bytesPerPixel);
cv::Mat image = cv::cvarrToMat(iplImage, true, true, 0);
cvReleaseImage(&iplImage);
return image;
} else {
return cv::Mat();
}
}
问题是memory->getSharedMemory()
中的数据被释放,而矩阵仍然有效。
OpenCV在基础数据上创建了一个矩阵头,但无法控制它。因此,您需要对这些基础数据进行深入复制。最简单的方法是使用clone()
:
cv::Mat image = Mat(cv::Size(imageWidth, imageHeight), CV_MAKETYPE(CV_8U, bytesPerPixel), memory->getSharedMemory()).clone();
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- C++/cv::Mat相当于使用memcpy创建IplImage
- 使用memcpy复制从QGraphicsItem派生的类不会创建新对象