簡體   English   中英

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);

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM