有一个关于将帖子 OpenCV cv::Mat
转换为Texture2D
in Unity的方法,我给出了一个很好的答案。现在,我正试图做相反的事情,但我已经坚持了几个小时了。
我想把联合的Texture2D
转换成OpenCV cv::Mat
,这样我就可以处理C++侧的纹理了。
下面是我想要转换为cv:Mat
的统一项目中的原始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);
}
我还尝试在struct
端创建一个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);
}
为什么图像看起来如此被冲毁,你是如何修复的?
发布于 2018-06-19 10:58:53
默认情况下,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();
}
https://stackoverflow.com/questions/50925614
复制相似问题