相关文章推荐
霸气的麦片  ·  火影忍者中国元素盘点,凯的原型是李小龙?作者 ...·  2 月前    · 
大方的水煮鱼  ·  杨雨-中央财经大学管理科学与工程学院·  1 年前    · 
买醉的拖把  ·  山田麻莉奈 - 萌娘百科 万物皆可萌的百科全书·  1 年前    · 
英勇无比的莴苣  ·  百公里油耗2.4升 红旗H7 ...·  2 年前    · 
韩潮苏海  ·  【海棠】《【总攻快穿】炮灰断情绝欲后他们悔不 ...·  2 年前    · 
小百科  ›  将Texture2D转换为OpenCV Mat?开发者社区
opencv
害羞的匕首
2 月前
首页
学习
活动
专区
圈层
工具
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);
 
推荐文章
霸气的麦片  ·  火影忍者中国元素盘点,凯的原型是李小龙?作者最喜欢看西游记?_腾讯新闻
2 月前
大方的水煮鱼  ·  杨雨-中央财经大学管理科学与工程学院
1 年前
买醉的拖把  ·  山田麻莉奈 - 萌娘百科 万物皆可萌的百科全书
1 年前
英勇无比的莴苣  ·  百公里油耗2.4升 红旗H7 PHEV动力信息曝光-牛车网
2 年前
韩潮苏海  ·  【海棠】《【总攻快穿】炮灰断情绝欲后他们悔不当初》作者:姻兕 - 哔哩哔哩
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号