一、拉动进度条实现两幅图片融合:
主要函数: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 cv2
import numpy as np
import time
def nothing(x):
pass
img_before = cv2.imread(r'D:pythonpythoninstallation packaget0118c62a58ab2a87a9.jpg')
img_after = cv2.imread(r'D:pythonpythoninstallation packaget01866b35b22c82b3ac.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:
break
cv2.destroyAllWindows()
效果如下图:
二、以下代码运行后自动由第一张图以0.2秒的速度缓慢切换成第二幅图。
import cv2
import numpy as np
import time
img_before = cv2.imread(r'D:pythonpythoninstallation packaget0118c62a58ab2a87a9.jpg')
img_after = cv2.imread(r'D:pythonpythoninstallation packaget01866b35b22c82b3ac.jpg')
#读取两幅原图数据
rows,cols,_ = img_before.shape
img = 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)&0xFF
if k == ord('q') or count >= 1:
break
count += 0.1
img = cv2.addWeighted(img_before,count,img_after,1-count,0)
time.sleep(0.2)
cv2.waitKey()
cv2.destroyAllWindows()



