簡體   English   中英

將osg圖像轉換為opencv mat進行處理

[英]Converting osg image to opencv mat for processing

編輯:問題已經解決了,但問題的根源在於其他地方,以下是原樣,以幫助其他可能需要進行轉換的人OpenCV < - > OSG

在OSG中,我有一個osg :: ImageStream和一個osg :: Image ImageStream基本上在運行時存儲和播放預先錄制的視頻,而Image則作為疊加來呈現附加信息。

這種情況下的信息是使用OpenCV算法處理的視頻信息,因此我需要允許OpenCV以某種形式的訪問來操縱Image的數據。

我需要圖像為RGBA格式,以便可以屏蔽未使用的像素,這就是我聲明圖像的方式

osg::ref_ptr<osg::Image> opencvOverlay = new osg::Image;
int width = 1920;
int height = 1200;
int size = width*height * 4; //RGBA, 4 channels
unsigned char* data = (unsigned char*)calloc(size, sizeof(unsigned char));
for (long i = 0; i < size; i += 4)
{
    data[i    ] = 0;    //red 
    data[i + 1] = 0;    //green 
    data[i + 2] = 0;    //blue 
    data[i + 3] = 0;    //alpha
}
opencvOverlay->setOrigin(osg::Image::BOTTOM_LEFT);
opencvOverlay->setImage(width, height, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, data, osg::Image::NO_DELETE);

在OpenCV方面,我定義了一個可以操作內部數據的cv :: Mat

IplImage* myIplImage = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 4);
cvSetData(myIplImage, opencvOverlay->data(), width * 4);
cv::Mat* overlay = new cv::Mat(myIplImage);

這樣可變疊加可用於輸出OpenCV算法的結果。

但是,在我開始測試任何算法之前,我試圖重新檢查它是否是一個有效的cv :: Mat,所以我添加了以下內容:

cv::imshow("Mat", *overlay);

當程序編譯並運行時,它會以錯誤退出

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow

知道我做錯了什么嗎?

你可以使用cv :: cvarrToMat。 它位於core.hpp和cv :: namespace中

cv::Mat overlay = cv::cvarrToMat(myIplImage);
cv::imshow("Mat", overlay);
waitKey(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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