编辑:问题已经解决了,但是问题的根源在其他地方,下面是为了帮助其他可能需要转换OpenCV<->OSG的人
在OSG中,我有一个osg::ImageStream,和一个osg::Image。ImageStream基本上在运行时存储和播放一个预先录制的视频,而图像作为一个覆盖来显示额外的信息。
本例中的信息是使用 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);
这样,可变的叠加就可以用来输出OpenCV算法的结果。
但是,在开始测试任何算法之前,我尝试对它是否是有效的cv::Mat进行检查,因此我添加了以下内容:
cv::imshow("Mat", *overlay);
当程序编译和运行时,它会以错误退出。
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow
知道我做错什么了吗?
发布于 2016-06-18 13:41:48
您可以使用cv::cvarrToMat。它位于core.hpp和cv::命名空间中。
cv::Mat overlay = cv::cvarrToMat(myIplImage);
cv::imshow("Mat", overlay);
waitKey(0);
https://stackoverflow.com/questions/37878621
复制相似问题