【问题标题】:OpenCV: PNG image with alpha channelOpenCV:带有 alpha 通道的 PNG 图像
【发布时间】:2016-07-26 20:29:22
【问题描述】:

我是 OpenCV 的新手,我已经完成了一个小型 POC,用于从某个 URL 读取图像。
我正在使用视频捕获从 URL 读取图像。代码如下:

VideoCapture vc;
vc.open("http://files.kurento.org/img/mario-wings.png");
if(vc.isOpened() && vc.grab()) 
{
       cv::Mat logo;
       vc.retrieve(logo);
       cv::namedWindow("t");
       imwrite( "mario-wings-opened.png", logo);
       cv::imshow("t", logo);
       cv::waitKey(0);
       vc.release();
}

此图像未正确打开,可能是由于 Alpha 通道。 保留 alpha 通道并正确获取图像的方法是什么?

任何帮助表示赞赏。
-谢谢

预期输出

实际输出

【问题讨论】:

    标签: c++ opencv png


    【解决方案1】:

    如果你只是加载图片,我建议你使用imread,另外,你还需要指定imread的第二个参数来加载alpha通道,即CV_LOAD_IMAGE_UNCHANGED或@987654325 @,取决于版本(在最坏的情况下,-1 也可以)。

    据我所知,VideoCaptureclass 不会使用第 4 个频道加载图像/视频。由于您使用的是 Web url,因此无法使用 imread 加载图像,但您可以使用任何方法下载数据(例如 curl),然后使用 imdecode 和数据缓冲区来获取 @987654328 @。 OpenCV 是一个用于图像处理的库,而不是用于下载图像的库。

    【讨论】:

    • 新名称是 IMREAD_UNCHANGED
    • @Miki 我认为两者都有效......在较新的版本中,虽然不确定它是在哪个版本中引入的,所以我最好同时保留 :)
    • 当然.. 只是新名字
    • 我有一个服务器,我将通过它进行视频处理。该图像将出现在每一帧的顶部。我之前尝试过 curl,但它引发了很多与服务器的依赖关系问题。因此,我切换到了 VideoCapture。但是,我会研究您建议的替代方案。谢谢!
    • @AVB 好吧,如果你只想覆盖一个图像,你可以尝试 python ...它有一个可以下载文件的本机模块并且也有 opencv,你也可以尝试在 stackoverflow 帮助中询问对于卷曲部分。如果总是相同的标志,保存标志不是更好吗?您可以尝试的另一件事是将透明度设置为以后可以删除的颜色...对于混合使用addweighted 函数
    【解决方案2】:

    如果你想把它画在另一个图像上,你可以这样做:

    /**
     * @brief Draws a transparent image over a frame Mat.
     * 
     * @param frame the frame where the transparent image will be drawn
     * @param transp the Mat image with transparency, read from a PNG image, with the IMREAD_UNCHANGED flag
     * @param xPos x position of the frame image where the image will start.
     * @param yPos y position of the frame image where the image will start.
     */
    void drawTransparency(Mat frame, Mat transp, int xPos, int yPos) {
        Mat mask;
        vector<Mat> layers;
    
        split(transp, layers); // seperate channels
        Mat rgb[3] = { layers[0],layers[1],layers[2] };
        mask = layers[3]; // png's alpha channel used as mask
        merge(rgb, 3, transp);  // put together the RGB channels, now transp insn't transparent 
        transp.copyTo(frame.rowRange(yPos, yPos + transp.rows).colRange(xPos, xPos + transp.cols), mask);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 2018-06-26
      • 2013-10-13
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多