版权声明:本文为博主原创文章,未经博主允许不得转载。若有任何问题,请联系QQ:575925154(加好友时,请备注:CSDN) https://blog.csdn.net/Miracle0_0/article/details/82106668
Tip:结合键盘事件、图像滤波、图像缩放、边界检测的小案例
# -*- coding: utf-8 -*-
"""
Created on Sun Aug 26 17:23:19 2018
@author: Miracle
"""
import numpy as np
import cv2
def cartoonize(image,ds_factor = 4,sketch_mode = False):
# print(image.shape)
image_gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#中值滤波
image_gray = cv2.medianBlur(image_gray,7)
#检测边界
edges = cv2.Laplacian(image_gray,cv2.CV_8U,ksize = 5)
ret,mask = cv2.threshold(edges,100,255,
cv2.THRESH_BINARY_INV)
#mask=素描图象
if sketch_mode:
return cv2.cvtColor(mask,cv2.COLOR_GRAY2BGR)
#缩小图
small_image = cv2.resize(image,None,fx = 1.0/ds_factor,
fy = 1.0/ds_factor,
interpolation = cv2.INTER_AREA)
#双面滤波参数
num_reptition = 10
sigma_color = 5
sigma_space = 7
size = 5
#多次进行双边滤波
for i in range(num_reptition):
#双边滤波
small_image = cv2.bilateralFilter(small_image,size,
sigma_color,sigma_space)
output = cv2.resize(small_image,None,fx = ds_factor,
fy = ds_factor,
interpolation = cv2.INTER_LINEAR)
#创建空白图像
dst = np.zeros(image_gray.shape)
#添加图像边界线
dst = cv2.bitwise_and(output,output,mask = mask)
return dst
if __name__ == '__main__':
#打开一个视频文件
cap = cv2.VideoCapture(0)
#定义键盘事件标记
cur_flag,pre_flag = -1,-1
#判断是否是否打开视频
if not cap.isOpened():
raise IOError('Cannot play video!')
#无限循环
while True:
ret,frame = cap.read()
if ret == True:
frame = cv2.resize(frame,None,fx = 1.05,fy = 1.05,
interpolation = cv2.INTER_CUBIC)
else:
break
key = cv2.waitKey(10)
if key > -1 and key != pre_flag:
cur_flag = key
pre_flag = key
if key == 27:
break
if cur_flag == ord('s'):
img_output = cartoonize(frame,sketch_mode=True)
elif cur_flag == ord('c'):
img_output = cartoonize(frame,sketch_mode=False)
else:
img_output = frame
cv2.imshow('Video',img_output)
cap.release()
cv2.destroyAllWindows()