首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Texture2D转换为OpenCV Mat?

将Texture2D转换为OpenCV Mat?
EN

Stack Overflow用户
提问于 2018-06-19 10:01:09
回答 1查看 4.2K关注 0票数 3

有一个关于将帖子 OpenCV cv::Mat转换为Texture2D in Unity的方法,我给出了一个很好的答案。现在,我正试图做相反的事情,但我已经坚持了几个小时了。

我想把联合的Texture2D转换成OpenCV cv::Mat,这样我就可以处理C++侧的纹理了。

下面是我想要转换为cv:Mat的统一项目中的原始cv:Mat

以下是将其转换为cv:Mat后的样子

它看上去被冲垮了。我并不担心图像的旋转。我能解决这个问题。只是想知道为什么它看起来这么被冲垮了。还使用cv::imwrite为测试目的保存映像,但在保存的映像中也存在问题。

C#代码

代码语言:javascript
运行
复制
[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++代码

代码语言:javascript
运行
复制
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*,但结果仍然是一样的:

代码语言:javascript
运行
复制
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);
}

为什么图像看起来如此被冲毁,你是如何修复的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-19 10:58:53

默认情况下,OpenCVBGR的形式创建图像,而Color32将像素存储为RGBA。但是,由于OP在注释中提到,Texture2D.format提供纹理格式为RGB24,所以我们可以完全忽略alpha通道。

代码语言:javascript
运行
复制
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();

}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50925614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档