将Texture2D转换为OpenCV Mat?

时间:2018-06-19 10:01:09

标签: c# c++ opencv unity3d

在Unity中有一个关于将OpenCV cv::Mat转换为Texture2D的{​​{3}},我提供了一个效果很好的答案。现在,我正试图做相反的事情,但现在已经坚持了几个小时。

我想将Unity的Texture2D转换为OpenCV cv::Mat,以便我可以在C ++端处理Texture。

以下是我想要转换为Texture2D的Unity项目中的原始cv:Mat

post

以下是将其转换为cv:Mat后的样子:

enter image description here

它看起来很褪色。 我并不担心图像的旋转。我可以解决这个问题。只是想知道为什么它看起来如此褪色。还使用cv::imwrite保存图像以用于测试目的,但问题也出现在已保存的图像中。

C#代码

[DllImport("TextureConverter")]
private static extern float TextureToCVMat(IntPtr texData, int width, int height);

unsafe void TextureToCVMat(Texture2D texData)
{
    Color32[] texDataColor = texData.GetPixels32();
    //Pin Memory
    fixed (Color32* p = texDataColor)
    {
        TextureToCVMat((IntPtr)p, texData.width, texData.height);
    }
}

public Texture2D tex;

void Start()
{
    TextureToCVMat(tex);
}

C ++代码

DLLExport void TextureToCVMat(unsigned char*  texData, int width, int height)
{
    Mat texture(height, width, CV_8UC4, texData);

    cvNamedWindow("Unity Texture", CV_WINDOW_NORMAL);
    //cvResizeWindow("Unity Texture", 200, 200);
    cv::imshow("Unity Texture", texture);
    cv::imwrite("Inno Image.jpg", texture);
}

我还尝试在C ++端创建一个struct来保存像素信息,而不是使用unsigned char*,但结果仍然是相同的:

struct Color32
{
    uchar r;
    uchar g;
    uchar b;
    uchar a;
};


DLLExport void TextureToCVMat(Color32* texData, int width, int height)
{
    Mat texture(height, width, CV_8UC4, texData);

    cvNamedWindow("Unity Texture", CV_WINDOW_NORMAL);
    cvResizeWindow("Unity Texture", 200, 200);
    cv::imshow("Unity Texture", texture);
}

为什么图像看起来如此褪色,你如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

OpenCV默认情况下会将图片创建为BGR,而Color32会将像素存储为RGBA。但是,由于OP在评论中提到Texture2D.format将纹理格式设为RGB24,我们可以完全忽略Alpha通道。

DLLExport void TextureToCVMat(unsigned char*  texData, int width, int height)
{
    Mat texture(height, width, CV_8UC4, texData);
    cv::cvtColor(texture,texture,cv::COLOR_BGRA2RGB);

    cv::imshow("Unity Texture", texture);
    cv::waitKey(0);
    cv::destroyAllWindows();

}