/**
* @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);
}
7条答案
按热度按时间tgabmvqs1#
如果您使用的是OpenCV 2或OpenCV 3,则应使用IMREAD_* 标志(如here中所述)。
** C++ **
巨蟒
ssm49v7z2#
根据文档,OpenCV支持PNG上的alpha通道。
只需使用CV_LOAD_IMAGE_UNCHANGED作为如下标志来调用imread函数:
sxissh063#
读取透明PNG的正确方法是使用第4个通道作为alpha通道。大多数情况下,你想要一个白色的背景,如果是这样的话,下面的代码可以用于alpha合成。
关于这一点的详细博客在here。
mpbci0fu4#
如果你想在另一个图像上绘制这个透明的图像,打开你的图像,@satya-mallick(模式IMREAD_UNCHANGED)回答,然后使用这个方法在一个框架Mat上绘制图像:
y53ybaqx5#
用所有4个通道加载png图像的最佳可能方法是;
根据openCV文件,
如果标志值为,
1)=0返回灰度图像。
2)〈0按原样返回加载的图像(带Alpha通道)。
muk1a3rh6#
您可以用途:
pgx2nnw87#
在我的例子中,是文件扩展名引起了问题。检查你的png是png还是别的什么;)