【问题标题】:Why does openCV's convertto function not work?为什么openCV的convertto功能不起作用?
【发布时间】:2014-03-04 13:59:57
【问题描述】:

我有一张图片,它有 4 个通道,格式为 4 * UINT8

我正在尝试将其转换为 3 通道浮点数,并且我正在使用此代码:

images.convertTo(images,CV_32FC3,1/255.0);

转换后,图像为浮点格式,但仍有 4 个通道。如何摆脱 OpenCV 中的第 4 个(alpha)通道?

【问题讨论】:

    标签: c++ opencv alpha-transparency


    【解决方案1】:

    正如@AldurDisciple 所说,Mat::convertTo() 旨在用于更改Mat 的数据类型,而不是用于更改通道数。

    要解决,你应该把它分成两个步骤:

    cvtColor(image, image, CV_BGRA2BGR);       // 1. change the number of channels
    image.convertTo(image, CV_32FC3, 1/255.0); // 2. change type to float and scale
    

    【讨论】:

    • 您好先生,1/255.0 是什么?对什么有用?
    • @Kabyle 1/255.0 这里是比例因子,它将值 [0, 255] 转换为 [0, 1]。有关详细信息,请参阅Mat::convertTo() 的文档。
    【解决方案2】:

    函数convertTo 专门用于更改Mat 的数据类型。正如文档 (link) 中提到的,输出图像的通道数始终与输入图像相同。

    如果你想改变数据类型减少通道数,你应该使用splitmergeconvertTo的组合:

    cv::Mat img_8UC4;
    
    cv::Mat chans[4];
    cv::split(img_8UC4,chans);
    
    cv::Mat img_8UC3;
    cv::merge(chans,3,img_8UC3);
    
    cv::Mat img_32FC3;
    img_8UC3.convertTo(img_32FC3);
    

    另一种方法可能是自己重新编码算法,这很容易而且可能更有效。

    【讨论】:

      【解决方案3】:

      OpenCV 的 cvtColor function 允许您转换 Mat 的类型和通道数。

      void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
      

      所以这样的事情会将彩色 4 通道转换为彩色 3 通道:

      cvtColor(image, image, CV_BGRA2BGR, 3);

      或者使用mixChannels function 可能更有效,如果您查看文档,其示例显示了如何拆分通道。

      那如果你真的想改成特定的类型:

      image.convertTo(image,CV_32F);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-09
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多