c++ - 将osg图像转换为opencv mat进行处理

标签 c++ opencv image-processing openscenegraph

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/

相关文章:

c++ - 获取 map<string,vector<string>> 的键

c++ - 让一个类方法为每个实例保存一个不同的静态变量

python - 在 OpenCV Python 中运行 solvePnP 时出错

c++ - 在 opencv 中创建 4x4 mat 矩阵时出错

image-processing - 写入 IplImage imageData

java - 从相机 Intent 拍摄照片并在其上覆盖另一个小图像

c++ - Win32 C++ BitBlt 透明度

c++ - OOP中Circle的类实例

java - 如何在 java 中加载/打开/读取 matlab 文件 *.mat?

java - 将 BufferedImages 绘制到另一个 BufferedImages 的最快方法