c# - 将 Texture2D 转换为 OpenCV Mat?

标签 c# c++ opencv unity3d

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

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

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

enter image description here

这是将其转换为 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);
}

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

最佳答案

OpenCV默认情况下将图像创建为 BGR,而 Color32将像素存储为 RGBA。然而,由于 OP 在评论中提到 Texture2D.format 提供的纹理格式为 RGB24,我们可以完全忽略 alpha channel 。

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();

}

关于c# - 将 Texture2D 转换为 OpenCV Mat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50925614/

相关文章:

c# - 断开 TCPClient 并在另一端看到

c++ - 创建命令并通过 Linux 终端执行它们

c++ - Pop 方法没有给出预期的输出

java - 使用本地过程将数据插入数据库或使用最近的框架(如 spring 或 Entity Framework )将数据插入数据库之间有什么区别吗?

c# - 如何点击没有 ID 或名称的链接?

c++ - 将 OpenMP 应用于 C++ 中的特定嵌套循环

c++ - opencv中的HoughLines变换

java - OpenCV 的 java 绑定(bind)中缺少什么?

c++ - 如何使用opencv从图像中找到标尺位置?

c# - 用户无法轻易入侵的 Windows 应用程序的安全数据库后端