有一个与在Unity中将OpenCV的cv::Mat
转换为Texture2D
有关的帖子,我提供了一个有效的答案。现在,我想尝试相反的过程,但已经卡在这里几个小时了。
我想将Unity的Texture2D
转换为OpenCV的cv::Mat
,以便可以在C++端处理纹理。
这是我想要转换为cv:Mat
的Unity项目中的原始Texture2D
:
这是将其转换为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++端创建一个结构体来保存像素信息,而不是使用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);
}
为什么图像看起来这么失真,如何解决?
imwrite
函数,例如std::vector<int> params; params.push_back(CV_IMWRITE_JPEG_QUALITY); params.push_back(100);
然后调用imwrite
函数。 - mutantkeyboardimwrite
。我只是用它来调试图像,并找出为什么它会显示成那样。如果cv::imshow
也失败了,cv::imwrite
也应该失败。我刚刚尝试过了,问题仍然存在,但是感谢你的建议。 - ProgrammerBGRA
格式,而Color32
格式为RGBA。使用cv::cvtColor
函数将其转换为RGBA
格式。 - zindarodCV_8UC4
,这是一个4通道8位矩阵。我认为它是RGBA格式的。我不知道你是否尝试过伽马校正 @Programmer - mutantkeyboardcv::cvtColor(texture,texture,cv::COLOR_BGRA2RGBA)
。正如您所说的Texture2D.format
提供了RGB24
,因此在您的情况下,Alpha通道并不重要。 - zindarod