Edit: The problem has since been solved, but the root of the problem lies elsewhere, the following is left as-is to help others who might need to do conversions 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
知道我做错了什么吗?
最佳答案
您可以使用 cv::cvarrToMat。它在 core.hpp 和 cv::命名空间中
cv::Mat overlay = cv::cvarrToMat(myIplImage);
cv::imshow("Mat", overlay);
waitKey(0);
关于c++ - 将osg图像转换为opencv mat进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37878621/