[英]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.