代码之家  ›  专栏  ›  技术社区  ›  Programmer

将纹理2d转换为opencv mat?

  •  2
  • Programmer  · 技术社区  · 6 年前

    Unity and I provided an answer which works well.现在,我正试着做相反的事情,但是我已经在这个问题上坚持了几个小时了。

    我想把Unity的代码> TraceUR2D2/代码>转换成OpenCV <代码> CV::Mat ,这样我就可以处理C++上的纹理了。

    以下是我的Unity项目中要转换为 cv:mat的原始 texture2d

    以下是将其转换为 cv:mat后的外观:

    它看起来很破旧。 我不担心图像的旋转。我可以解决这个问题。只是想知道为什么它看起来那么破烂。还使用了 cv::imwrite 保存图像以进行测试,但问题也出现在保存的图像中。

    c code :。

    [dllimport(“纹理转换器”)]
    private static extern float texturetocvmat(intptr texdata,int width,int height);
    
    不安全的void texturetocvmat(texture2d texdata)
    {
    color32[]texdatacolor=texdata.getpixels32();
    //pin内存
    固定(颜色32*P=texdatacolor)
    {
    textureToCvMat((intptr)p,texdata.width,texdata.height);
    }
    }
    
    公共纹理2d tex;
    
    无效开始()
    {
    纹理cvmat(tex);
    }
    

    <强> C++代码< /强>:

    dllexport void texturetocvmat(unsigned char*texdata,int width,int height)
    {
    垫子纹理(高度、宽度、cv uc4、texdata);
    
    cvNamedWindow(“统一纹理”,cv_window_normal);
    //cvResizeWindow(“Unity纹理”,200,200);
    cv::imshow(“统一纹理”,纹理);
    cv::imwrite(“inno image.jpg”,纹理);
    }
    

    我还尝试在C++端创建一个Stult以保存像素信息,而不是使用<代码>无符号CHAR*<代码>,但结果仍然是相同的:

    struct color32
    {
    乌哈尔R;
    乌哈尔G;
    乌哈尔B;
    乌哈尔A;
    }(二)
    
    
    dllexport void texturetocvmat(color32*texdata,int width,int height)
    {
    垫子纹理(高度、宽度、cv uc4、texdata);
    
    cvNamedWindow(“统一纹理”,cv_window_normal);
    cvResizeWindow(“统一纹理”,200,200);
    cv::imshow(“统一纹理”,纹理);
    }
    
    
    

    为什么这张照片看起来如此落伍?你如何修复它?Texture2D在团结和我提供了一个很好的答案。现在,我正试着做相反的事情,但是我已经在这个问题上坚持了几个小时了。

    我想转换Unity的纹理2d打开cv简历:材料这样我就可以处理C++上的纹理了。

    这是原件纹理2d在我的Unity项目中,我想转换为cv:Mat以下内容:

    enter image description here

    这是它转换成简历:材料以下内容:

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

    我还尝试创建一个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);
    }
    

    为什么这张照片看起来如此落伍?你如何修复它?

    1 回复  |  直到 6 年前
        1
  •  3
  •   zindarod    6 年前

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