本文包括:
- 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()