将osg图像转换为opencv mat以进行处理

时间:2016-06-17 09:59:45

标签: c++ opencv image-processing openscenegraph

  

编辑:问题已经解决了,但问题的根源在于其他地方,以下是原样帮助其他人   可能需要进行转换 OpenCV< - > OSG

在OSG中,我有一个 osg :: ImageStream 和一个 osg :: Image 。 ImageStream基本上在运行时存储和播放预先录制的视频,而Image则作为叠加来呈现其他信息。

本案例中的信息是使用 OpenCV 算法处理的视频信息,因此我需要允许OpenCV以某种形式访问来操纵图像数据。

我需要将图像设置为 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);

这样变量 overlay 可以用来输出OpenCV算法的结果。

然而,在我开始测试任何算法之前,我试图重新检查它是否是一个有效的cv :: Mat,所以我添加了以下内容:

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

当程序编译并运行时,它将退出并显示错误

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

知道我做错了吗?

1 个答案:

答案 0 :(得分:0)

您可以使用cv :: cvarrToMat。它位于core.hpp和cv :: namespace

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