OpenCV-Python系列·第十九集-2:视频处理(cartoon-like film)

版权声明:本文为博主原创文章,未经博主允许不得转载。若有任何问题,请联系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()

猜你喜欢

转载自blog.csdn.net/Miracle0_0/article/details/82106668