OpenCV:带alpha通道的PNG图像

时间:2016-04-06 12:24:23

标签: c++ opencv png

我是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通道并正确获取图像的方法是什么?

感谢任何帮助。
-Thanks

预期输出

Expected output

实际输出

Actual output

2 个答案:

答案 0 :(得分:2)

如果您只是加载图片,我建议您使用imread,同样,您还需要指定imread的第二个参数来加载Alpha通道,即{{ 1}}或CV_LOAD_IMAGE_UNCHANGED,取决于版本(在最坏的情况下,-1也有效)。

据我所知,cv::IMREAD_UNCHANGED类不会使用第4个频道加载图像/视频。由于您使用的是网址,因此加载图片无法使用VideoCapture,但您可以使用任何方法下载数据(例如curl),然后将imdecode与数据一起使用缓冲区获取imread。 OpenCV是一个用于图像处理的库,而不是用于下载图像的库。

答案 1 :(得分:0)

如果您想将其绘制在另一张图像上,可以这样做:

/**
 * @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);
}