将OGRE :: Image转换为cv :: Mat

时间:2015-05-05 00:05:29

标签: c++ opencv ogre

我是OGRE library的新手。我在OGRE中有一个人体模型,我在'orginalImage'变量中得到了模型的投影。我想使用openCV执行一些图像处理。所以我试图将OGRE :: Image转换为cv :: Mat转换。

realloc(): invalid pointer: 0x00007f9e2ca13840 ***

我收到以下错误:

cv::Mat cvtImgOGRE2MAT(Ogre::Image imgIn) {
    //Result image intialisation:
    int imgHeight = imgIn.getHeight();
    int imgWidth  = imgIn.getWidth();
    cv::Mat imgOut(imgHeight, imgWidth, CV_32FC1);

    Ogre::ColourValue color;
    float gray;
    cout << "Converting " << endl; 
    for(int r = 0; r < imgHeight; r++){
        for(int c = 0; c < imgWidth; c++){
            color = imgIn.getColourAt(r,c,0);
            gray = 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
            imgOut.at<float>(r,c) = gray;
        }
    } 
    return imgOut;  

在类似的说明中,我试着跟随我的第二次尝试

imshow("asdfasd", imgOut); 
imwrite("asdfasd.png", imgOut);

}

当我执行以下操作之一时,我收到同样的错误:

*

1 个答案:

答案 0 :(得分:1)

不幸的是我没有OGRE的经验,所以我可以谈谈OpenCV以及我在Ogre文档和海报评论中看到的内容。

首先要提到的是Ogre图像'PixelFormat is PF_BYTE_RGBA(来自评论)(根据OGRE文档)是一个4字节的像素格式,所以cv :: Mat类型应该是{{1}如果图像数据应该由指针给出。此外,openCV最好支持BGR图像,因此最好保存/显示颜色转换。

请尝试:

CV_8UC4

在你的第二个例子中我想知道那里有什么问题,直到我看到Ogre::Image orginalImage = get2dProjection(); //This is an attempt to convert the image cv::Mat destinationImage(orginalImage.getHeight(), orginalImage.getWidth(), CV_8UC4, orginalImage.getData()); cv::Mat resultBGR; cv::cvtColor(destinationImage, resultBGR, CV_RGBA2BGR); imwrite("out.png", resultBGR); 可能是错误的,因为大多数图像API使用color = imgIn.getColourAt(r,c,0);所以我确认这对于OGRE是相同的。请试试这个:

.getPixel(x,y)

如果仍然出现realloc错误,请问您可以尝试找到确切的代码行吗?

我还没有考虑的一件事是OGRE图像的真实内存布局。它们可能使用某种对齐的内存,其中每个像素行对齐以具有4或16或sth的倍数的内存大小。 (这可能更有效,例如使用SSE指令或某事。)如果是这种情况,则不能使用第一种方法,但您必须将其更改为cv::Mat cvtImgOGRE2MAT(Ogre::Image imgIn) { //Result image intialisation: int imgHeight = imgIn.getHeight(); int imgWidth = imgIn.getWidth(); cv::Mat imgOut(imgHeight, imgWidth, CV_32FC1); Ogre::ColourValue color; float gray; cout << "Converting " << endl; for(int r = 0; r < imgHeight; r++) { for(int c = 0; c < imgWidth; c++) { // next line was changed color = imgIn.getColourAt(c,r,0); gray = 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b; // this access is right imgOut.at<float>(r,c) = gray; } } return imgOut; // depending of what you want to do with the image, "float" Mat type assumes what image intensity values are within 0..1 (displaying) or 0..255 (imwrite) } ,其中cv::Mat destinationImage(orginalImage.getHeight(), orginalImage.getWidth(), CV_8UC4, orginalImage.getData(), STEPSIZE);是每个像素行的BYTES数量!但是第二个版本应该可以使用了!