我得到了一些代码,其中使用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),因此我想可能存在一些不必要的复制。
正确的方法应该是什么?
编辑:内存实际上在一个包装类中。它会自动释放。我为了简单起见将其改为了“memory”。
编辑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();
}
}
内存
中构建一个 [mcve],这样会更容易找到问题所在。你的第一次尝试是正确的方法,问题似乎出现在你的共享对象中。 - Miki