700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > opencv_python拉动进度条实现两幅图片融合及一幅图片自动平滑切换成另一张图片

opencv_python拉动进度条实现两幅图片融合及一幅图片自动平滑切换成另一张图片

时间:2019-07-23 14:40:30

相关推荐

opencv_python拉动进度条实现两幅图片融合及一幅图片自动平滑切换成另一张图片

一、拉动进度条实现两幅图片融合:

主要函数: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()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。