相关文章推荐
阳刚的橙子  ·  同等学力人员申请硕士学位全国统考常见问题答疑 ...·  3 月前    · 
无聊的猕猴桃  ·  【半结构化访谈法】-CSDN博客·  4 月前    · 
兴奋的蘑菇  ·  【五】知乎独家发布| ...·  2 年前    · 
深情的小摩托  ·  专家观点欧盟防控非洲猪瘟措施·  2 年前    · 
豪情万千的单车  ·  陶喆专辑封-抖音·  2 年前    · 
小百科  ›  将Texture2D转换为OpenCV Mat?开发者社区
opencv
害羞的匕首
4 月前
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
提问

问 将Texture2D转换为OpenCV Mat?

Stack Overflow用户
提问于 2018-06-19 10:01:09
EN

有一个关于将 帖子 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);
}

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

1 4.2K 0 票数 3
EN
c#
c++
opencv
unity3d

回答 1

Stack Overflow用户

回答已采纳

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

默认情况下, OpenCV 以 BGR 的形式创建图像,而 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);
 
推荐文章
阳刚的橙子  ·  同等学力人员申请硕士学位全国统考常见问题答疑- 西北政法大学经济 ...
3 月前
无聊的猕猴桃  ·  【半结构化访谈法】-CSDN博客
4 月前
兴奋的蘑菇  ·  【五】知乎独家发布| 标签系统:大数据的典型应用- 知乎
2 年前
深情的小摩托  ·  专家观点欧盟防控非洲猪瘟措施
2 年前
豪情万千的单车  ·  陶喆专辑封-抖音
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号