一、拉动进度条实现两幅图片融合:
主要函数:cv2.createTrackbar()相关参数
int createTrackbar(const string& trackbarname, const string&winname, int* value, int count ,TrackbarCallback onChange = 0, void* userdata = 0);
const string& trackbarname:进度条名称
const string&winname:用于放置进度条的画布
int* value:进度条的起始值,进度条最左端一定是0,起始值则可自行设定。
int count:进度条的最大值。
TrackbarCallback onChange = 0:回调函数,默认为0,虽然默认为0,但一般设定一个空函数:def nothing(): pass
void* userdata = 0:用户传给回调函数的数据值,默认值为0。(这个参数暂时没研究,不会)
(‘进度条名称’,'放置进度条的画布',进度条起始位置,进度条最大值,回调函数,用户传给回调函数的数据值)
cv2.addWeighted()相关参数:
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
src1:第一张图片;
alpha:第一张图的权重;
src2:第二张图片;(两张图片的分辨率需一致,如不一致需要转换,此外被叠加的两幅图像必须是尺寸相同、类型相同的)
beta:第二张图片的权重(alpha+beta=1)
后两个参数还未研究,这里暂时可不用到。
以下代码实现移动进度条实现一个图片平滑切换到另一个图片。
import cv2import numpy as npimport timedef nothing(x):passimg_before = cv2.imread(r'D:\python\python\installation package\t0118c62a58ab2a87a9.jpg')img_after = cv2.imread(r'D:\python\python\installation package\t01866b35b22c82b3ac.jpg')#读取两副图片数据cv2.namedWindow('img_for_show')#创建用于放置进度条的画布。cv2.createTrackbar('weight','img_for_show',0,10,nothing)#创建进度条,进度条默认间隔为1,还不会设定进度条刻度值,故这里设定最小值为0,最大值为10.while(1): count = cv2.getTrackbarPos('weight','img_for_show')/10#循环获取进度条值,除于10将count值限定为0~1之间用作图片权重值。img_for_show = cv2.addWeighted(img_before,count,img_after,1-count,0)cv2.imshow('img_for_show',img_for_show)k = cv2.waitKey(1)if k == 27:breakcv2.destroyAllWindows()
效果如下图:
二、以下代码运行后自动由第一张图以0.2秒的速度缓慢切换成第二幅图。
import cv2import numpy as npimport timeimg_before = cv2.imread(r'D:\python\python\installation package\t0118c62a58ab2a87a9.jpg')img_after = cv2.imread(r'D:\python\python\installation package\t01866b35b22c82b3ac.jpg')#读取两幅原图数据rows,cols,_ = img_before.shapeimg = np.zeros((rows,cols),np.uint8)#这里创建一个和上述图片相同大小的纯黑图片,相当于创建一个空图片。cv2.namedWindow('show')count = 0 #创建一个计数变量,用于计算权重。while(1):if count == 0: #判断是否刚开始计数,如是,则显示第一幅图cv2.imshow('show',img_after)else: #如不等于0,则加载融合后的图片。(这里如不用判断语句,则最开始会以一幅纯黑图片再切换到第一幅图,这不是我们想要的结果,故加个判断语句。)cv2.imshow('show',img)k = cv2.waitKey(1)&0xFFif k == ord('q') or count >= 1:breakcount += 0.1img = cv2.addWeighted(img_before,count,img_after,1-count,0)time.sleep(0.2)cv2.waitKey()cv2.destroyAllWindows()