这篇文章介绍一个使用Opencv进行png透明头像叠加的小例子
两张图像素材
上边胡子的图片是一张png图片,包含a通道数据.使用opencv加载一下
image_3 = cv2.imread("image3.png", cv2.IMREAD_UNCHANGED)
数据大概是这个样子 shape = (320,640,4).
[0,0,0,0],[0,0,0,0]....[0,0,0,128],[0,0,0,255][0,0,0,255][0,0,0,255]
第一种效果
image_1 = cv2.imread("imge1.jpg")
image_3 = cv2.imread("image3.png", cv2.IMREAD_UNCHANGED)
image_3 = cv2.resize(image_3, (100,100))
ones = np.ones((image_1.shape[0], image_1.shape[1]))*255
image_1 = np.dstack([image_1, ones])
image_1[150:250, 150:250] = image_3
cv2.imwrite("1.png", image_1)
注意上图中有一些白色, 如果把上图放到绿色背景中,白色就行变成绿色.说明上图中的白色表示透明的意思.如果想让上图中的白色变成大图中的颜色,可以这样写
image_1 = cv2.imread("imge1.jpg")
image_3 = cv2.imread("image3.png", cv2.IMREAD_UNCHANGED)
image_3 = cv2.resize(image_3, (100,100))
ones = np.ones((image_1.shape[0], image_1.shape[1]))*255
image_1 = np.dstack([image_1, ones])
alpha_image_3 = image_3[:, :, 3] / 255.0
alpha_image = 1 - alpha_image_3
for c in range(0, 3):
image_1[150:250, 150:250, c] = ((alpha_image*image_1[150:250, 150:250, c]) + (alpha_image_3*image_3[:, :, c]))
cv2.imwrite("2.png", image_1)
使用C++实现一下.实现一个OSD叠加功能.
1.jpg
2.jpg
3.png
实现代码
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//读取原图
Mat src_img = imread("1.jpg");
//读取osd图
Mat osd_img = imread("2.jpg", 0);
//osd图二值化
cv::threshold(osd_img, osd_img, 0, 255, THRESH_BINARY);
//原图转换为rgba图
Mat src_img_rgba;
cvtColor(src_img, src_img_rgba, COLOR_BGR2BGRA);
//通道split
vector rgba_channels(4);
split(src_img_rgba, rgba_channels);
//把osd数据插入通道
resize(osd_img, rgba_channels[3](cv::Rect(0, 0, osd_img.cols, osd_img.rows)), cv::Size(osd_img.cols, osd_img.rows));
//通道组合
cv::merge(rgba_channels, src_img_rgba);
//保存新的图像
imwrite("3.png", src_img_rgba);
return 0;
}
最后的话:
这篇文章发布在CSDN/蓝色的杯子, 没事多留言,让我们一起爱智求真吧.我的邮箱[email protected].