首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将osg图像转换为opencv垫进行处理

将osg图像转换为opencv垫进行处理
EN

Stack Overflow用户
提问于 2016-06-17 09:59:45
回答 1查看 711关注 0票数 2

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

在OSG中,我有一个osg::ImageStream,和一个osg::Image。ImageStream基本上在运行时存储和播放一个预先录制的视频,而图像作为一个覆盖来显示额外的信息。

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

我需要图像以RGBA格式显示,这样就可以屏蔽未使用的像素,这就是我如何声明图像的方法。

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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进行检查,因此我添加了以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
cv::imshow("Mat", *overlay);

当程序编译和运行时,它会以错误退出。

代码语言:javascript
代码运行次数:0
运行
复制
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow

知道我做错什么了吗?

EN

回答 1

Stack Overflow用户

发布于 2016-06-18 13:41:48

您可以使用cv::cvarrToMat。它位于core.hpp和cv::命名空间中。

代码语言:javascript
代码运行次数:0
运行
复制
cv::Mat overlay = cv::cvarrToMat(myIplImage);
cv::imshow("Mat", overlay);
waitKey(0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37878621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档