openCV学习-自动处理图片 & 视频

本文包括:

  • mac环境的配置
  • 一些学习和用法
  • 读取视频 & 保存视频 & 磨皮测试

**

mac环境的配置:

**

  • 安装:

python-opencv依赖numpy、matplotlib,因此这两个包也是需要安装的,直接pip安装命令即可:

1.sudo pip3 install numpy
2.sudo pip3 install Matplotlib

然后直接安装python-opencv:

3.sudo pip3 install opencv-python (很多教程是 这个命令:sudo pip install python-opencv 但是我安不上)

  • 验证是否安装成功:
    运行 Python 并执行下列命令
    import cv2import matplotlibimport numpy

**

测试代码

**

学习用测试代码(python代码):

import cv2
import numpy as np



if __name__=="__main__":

    print("start")

    d = path.dirname('.');
    patrentPath = path.abspath(d)

    print(patrentPath)

    imgBgPath = patrentPath + "/img/testBg.png"
    imgSmallPath = patrentPath + "/img/testSmall.png"
    # imgBgPath = patrentPath + "/img/testBg.jpg"
    # imgSmallPath = patrentPath + "/img/testSmall.jpg"


    # 我们加载了两个图像,转换为灰度。 我们保留原始的 RGB 图像,并创建一个灰度版本。 我之前提到过这个,但是我们这样做的原因是,我们在灰度版本上执行所有的处理,然后在彩色图像上使用相同的标签来标记。
    img_rgb  = cv2.imread(imgBgPath, -1)
    # cv2.imshow('123', img_rgb)
    # print(img_rgb)


    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    template = cv2.imread(imgSmallPath,0)
    w, h = template.shape[::-1]


    # 对于主要图像,我们只有彩色版本和灰度版本。 我们加载模板并记下尺寸。
    #在这里,我们用img_gray(我们的主图像),模板,和我们要使用的匹配方法调用matchTemplate,并将返回值称为res。 我们指定一个阈值,这里是 80%。 然后我们使用逻辑语句,找到res大于或等于 80% 的位置。
    res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
    threshold = 0.9
    loc = np.where( res >= threshold)

    
    # 最后,我们使用灰度图像中找到的坐标,标记原始图像上的所有匹配:
    for pt in zip(*loc[::-1]): 
        cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2)
        cv2.imshow('targetImg',img_rgb)

        print(pt)

    # 等待 不关闭图片
    cv2.waitKey()




**

一些学习和用法

**

常用方法================================
propId 常见取值如下:(以下为 Opencv-Python 3.x 的格式,在 Opencv-Python 2.x 中,需加上前缀 CV_)
“”"
cv2.CAP_PROP_POS_MSEC: 视频文件的当前位置(ms)
cv2.CAP_PROP_POS_FRAMES: 从0开始索引帧,帧位置。
cv2.CAP_PROP_POS_AVI_RATIO:视频文件的相对位置(0表示开始,1表示结束)
cv2.CAP_PROP_FRAME_WIDTH: 视频流的帧宽度。
cv2.CAP_PROP_FRAME_HEIGHT: 视频流的帧高度。
cv2.CAP_PROP_FPS: 帧率
cv2.CAP_PROP_FOURCC: 编解码器四字符代码
cv2.CAP_PROP_FRAME_COUNT: 视频文件的帧数
cv2.CAP_PROP_FORMAT: retrieve()返回的Mat对象的格式。
cv2.CAP_PROP_MODE: 后端专用的值,指示当前捕获模式

cv2.CAP_PROP_BRIGHTNESS:图像的亮度,仅适用于支持的相机
cv2.CAP_PROP_CONTRAST: 图像对比度,仅适用于相机
cv2.CAP_PROP_SATURATION:图像饱和度,仅适用于相机
cv2.CAP_PROP_HUE: 图像色调,仅适用于相机
cv2.CAP_PROP_GAIN: 图像增益,仅适用于支持的相机
cv2.CAP_PROP_EXPOSURE: 曝光,仅适用于支持的相机
cv2.CAP_PROP_CONVERT_RGB:布尔标志,指示是否应将图像转换为RGB。
“”"

#grab, retrieve, read 的关系
Grabs the next frame from video file or capturing device.
retval = cv2.VideoCapture.grab()
#Decodes and returns the grabbed video frame.
retval, image = cv2.VideoCapture.retrieve([, image[, flag]])
Grabs, decodes and returns the next video frame.
retval, image = cv2.VideoCapture.read([,image])
由上可知,read 是 grab 和 retrieve 的结合体。当不需要当前的帧或画面时,可以使用 grab 跳过,以减少 read 所耗费的额外时间。

**

读取视频 & 保存视频 & 磨皮测试

**

测试代码

# 磨皮1
def beauty_face(img):
    '''
    Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
    https://my.oschina.net/wujux/blog/1563461
    '''

    dst = np.zeros_like(img)
    #int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定
    v1 = 3
    v2 = 1
    dx = v1 * 5 # 双边滤波参数之一 
    fc = v1 * 12.5 # 双边滤波参数之一 
    p = 0.1
   
    temp4 = np.zeros_like(img)
    
    temp1 = cv2.bilateralFilter(img,dx,fc,fc)
    temp2 = cv2.subtract(temp1,img)
    temp2 = cv2.add(temp2,(10,10,10,128))
    temp3 = cv2.GaussianBlur(temp2,(2*v2 - 1,2*v2-1),0)
    temp4 = cv2.add(img,temp3)
    dst = cv2.addWeighted(img,p,temp4,1-p,0.0)
    dst = cv2.add(dst,(10, 10, 10,255))
    return dst

def beauty_face2(src):
    '''
    Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
    '''

    dst = np.zeros_like(src)
    #int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定
    v1 = 3
    v2 = 1
    dx = v1 * 5 # 双边滤波参数之一 
    fc = v1 * 12.5 # 双边滤波参数之一 
    p = 0.1
   
    temp4 = np.zeros_like(src)
    
    temp1 = cv2.bilateralFilter(src,dx,fc,fc)
    temp2 = cv2.subtract(temp1,src)
    temp2 = cv2.add(temp2, (10,10,10,128))
    temp3 = cv2.GaussianBlur(temp2,(2*v2 - 1,2*v2-1),0)
    temp4 = cv2.subtract(cv2.add(cv2.add(temp3, temp3), src), (10, 10, 10, 255))
    
    dst = cv2.addWeighted(src,p,temp4,1-p,0.0)
    dst = cv2.add(dst, (10, 10, 10,255))
    return dst


import numpy as np
import cv2
 
# VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频
cap = cv2.VideoCapture('/Users/lby/Work/htsw/testOpenCV/p2.mp4')


# 视频输出相关
filePath = '/Users/lby/Work/htsw/testOpenCV/example1.avi'
fourcc =  cv2.VideoWriter_fourcc(*'XVID') # 创建 VideoWriter 实例
fps = cap.get(cv2.CAP_PROP_FPS) # 获取 VideoCapture 的 FPS
frameSize = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) # 获取视频的 VideoCapture 的 Size
out = cv2.VideoWriter(filePath, fourcc, fps, frameSize) 


while(cap.isOpened()):

    # 测试用,查看视频size
    # size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
    #         int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    # print('size:'+repr(size))


    #ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
    ret, frame = cap.read()


    if ret:
 
        gray_lwpCV = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        blur3 = beauty_face(frame)
        cv2.imshow('frame',blur3)

        # 输出
        out.write(blur3)

        # waitKey()方法本身表示等待键盘输入,
        # 参数是1,表示延时1ms切换到下一帧图像,对于视频而言;
        # 参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;
        # 参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。
        if cv2.waitKey(5) & 0xFF == ord('q'):
            break
    else:
        break
 
# 释放获取设备
cap.release()

# 释放视频写入实例
out.release()

# 删除所有建立的窗口
cv2.destroyAllWindows()





你可能感兴趣的:(加快效率相关,opencv,自动,ai,人工智能)