将Texture2D转换为OpenCV Mat?

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

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

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

在此处输入图像描述

这是将它转换为cv:Mat后的样子cv:Mat

在此处输入图像描述

它看起来很褪色。 我并不担心图像的旋转 。 我可以解决这个问题。 只是想知道为什么它看起来如此褪色。 还使用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); } 

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

默认情况下, 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(); }