繁体   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