我是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
预期输出
实际输出
答案 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);
}