![](/img/trans.png)
[英]How to convert from c++ interface cv::Mat to c 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);
memory是指向內存塊開頭的void指針。
我想將此代碼移植到僅使用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),所以我猜有一些不必要的復制。
這樣做的正確方法是什么?
編輯:內存實際上是一個包裝類。 它會自動解除分配。 為簡單起見,我將其改為“記憶”。
EDIT2:這是完整的代碼,包括內存來自的對象:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.