在Unity中有一个关于将OpenCV cv::Mat
转换为Texture2D
的{{3}},我提供了一个效果很好的答案。现在,我正试图做相反的事情,但现在已经坚持了几个小时。
我想将Unity的Texture2D
转换为OpenCV cv::Mat
,以便我可以在C ++端处理Texture。
以下是我想要转换为Texture2D
的Unity项目中的原始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);
}
为什么图像看起来如此褪色,你如何解决这个问题?
答案 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();
}