如今科技发展迅速,很多领域都涉及到“计算机视觉”这个细分领域。简单的说,就是将图像信息转化为计算机可以处理的数字信息,从而让计算机可以看得见,本文就介绍一下纯小白的opencv入门技巧。
OpenCV入门# 安装:# OpenCV 的安装依赖 numpy 库,在安装之前确保已经安装好了 numpy 库。pip install opencv-python
Python中的opencv安装仅需一行代码就搞定了,opencv是C++写的代码,python中调用cv2模块中的方法就可以了。
图片读取准备就绪后,就可以开始学习了,既然是为了让计算机可以看得见,那么首先介绍一下如何来读取图片。需要注意的一点是cv2读取图片路径中,不能包含中文,否则读取不出来。从网上下载张图片放在程序同目录下,开始读取。
import cv2
dog = cv2.imread('dog.jpg') # 小编比较喜欢小狗
# 显示图片
cv2.imshow('dog', dog)
# 等待键盘输入时中断,单位是毫秒,如果是0,无限等待
cv2.waitKey(0)
# 由于opencv是有C++编写的,所以程序结束后要释放一下
cv2.destroyAllWindows()
转灰度图
利用 dog.shape 函数可以看到数据形状,彩色图片是三维的,在很多操作时数据量大,不便于操作,经常会转换成灰度图像。
# 彩色图片变为黑白
import cv2
dog = cv2.imread('dog.jpg')
# cv2 读取图片,颜色通道是BGR
# PIL 读取图片,颜q色通道是RGB
dog_gray = cv2.cvtColor(dog, code=cv2.COLOR_BGR2GRAY) # 转灰度,可以利用tab键进行操作,其中的属性名都很友好
cv2.imshow('gray', dog_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
其他常用操作
调整图片规格
dogg = cv2.resize(dog, dsize=(298, 368)) # 括号中的宽高尺寸顺序与shape输出是相反的
存储图片
cv2.imwrite('./dog_gray.jpg', dog_gray) # 参数一是存储路径,参数二是被存储图片
键盘中断退出
cv2.imshow('dogg', dogg)
while True:
if ord('q') == cv2.waitKey(9000): # 等3000毫秒,等待键盘输入字符‘q’则退出
break
cv2.destroyAllWindows()
# ord('q')是得到q的ASCII码
人脸识别
人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。这就需要训练数据来识别人脸,不过GitHub上已经有一些训练好的训练数据了,可以直接下载。直接GitHub上搜索opencv,找星标 最多的那个,C++编写的。里面有各种训练好的数据集,我们这次用到的数据,直接给出链接。
https://github.com/opencv/opencv/tree/master/data/haarcascades
import numpy as np
import cv2
pic = cv2.imread('./nba.jpg')
# 人脸数据,级联分类器,给人脸特征数据,返回可以识别人脸的对象
detector = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
# 转换成灰度
gray = cv2.cvtColor(pic, code=cv2.COLOR_BGR2GRAY)
# 使用训练好的识别人脸对象来识别人脸区域
face_zone = detector.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3) # 后两个参数就是默认值,可以修改来调整识别人脸的精确度
for x, y, w, h in face_zone:
# 在人脸上画一个正方形,画正方形只需要知道左上角和右下角坐标即可
cv2.rectangle(pic, pt1=(x, y), pt2=(x+w, y+h), color=[0, 255, 0], thickness=2)
# 在人脸上画圈,需要圆的圆心坐标和半径
cv2.circle(pic, center=(x+w//2, y+h//2), radius=w//2, color=[0, 0, 255], thickness=2)
# 使用灰度图检测,绘制在彩色图片上
cv2.imshow('pic', pic)
cv2.waitKey(0)
cv2.destroyAllWindows()
是不是很简单的几步就实现了,显然,有些误差,但是效果已经很明显了,想要获得更好的结果可以调整参数,或者自己再训练数据。
视频处理使用opencv来处理视频之前,首先应该了解视频是怎么来的。简单的说视频就是有很多张图片构成(这里忽略了音频,音频是由二维数据组成,左声道和右声道,有机会以后再说)。
中间步骤解析:
# 读取数据cap = cv2.VideoCapture('./v1.mp4') # flag和frame接收返回值,flag是个布尔型值,表示是否读取到帧,frame为当前帧的数据flag, frame = cap.read()# 获取视频对象的帧频率,可以通过该频率计算 WaitKey 时间,来调整视频的快慢cap.get(propId=cv2.CAP_PROP_FPS)
import numpy as np
import cv2
# 参数是0,则调取本地摄像头
cap = cv2.VideoCapture(0)
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + 1 # 宽一点没问题,小了不行
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + 1
vidioWriter = cv2.VideoWriter('./po.mp4', cv2.VideoWriter_fourcc('M','P','4','v'), 24, (w, h)) # 要求int型
# cv2.VideoWriter_fourcc('M','P','4','2') avi格式
# cv2.VideoWriter_fourcc('M','P','4','v') mp4格式
detector = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
while cap.isOpened():
flag, frame = cap.read()
gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
face_zone = detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
for x,y,w,h in face_zone:
cv2.circle(frame, center=(x+w//2, y+h//2), radius=w//2, color=[0, 0, 255], thickness=2)
vidioWriter.write(frame)
# 上面创建了写视频对象,仅需把每一帧写入即可
if flag == False:
# 判断是否还能读取到帧,取不到则表示视频结束了,退出循环
break
cv2.imshow('pic', frame)
if ord('q') == cv2.waitKey(40):
# 没有键入‘q’时,按等待时间展示每一帧,合起来就是个视频,输入‘q’时退出
break
cv2.destroyAllWindows()
cap.release() # 释放资源
vidioWriter.release()
完
精彩推荐python数据分析与挖掘 | 数据预处理
python数据分析与挖掘 | 数据探索
python数据分析工具 | matplotlib
Python GUI编程(Tkinter)