python opencv 详细入门操作(含创建窗口, 显示图像, 标记图像, 调动摄像头, 简单人脸识别)

初试之后的第11天, 简单的学习opencv的基础操作为毕设做准备。


环境: jupyter notebook
语言:python
需要提前下载好opencv相关的库

导包

import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

opencv窗口基础操作

创建窗口

cv2.namedWindow("window",cv2.WINDOW_NORMAL)

  • 第一个参数为窗口的名字
  • 第二个参数为窗口的大小类型,具体内容可以查看其源码,通常使用的是cv2.WINDOW_NORMALcv2.WINDOW_AUTOSIZE 前者是可以手动更改窗口大小,而后者可以自适应

修改窗口大小

cv2.resizeWindow('window',800,600)


展示指定窗口

cv2.imshow('window',0)


指定按键销毁窗口

  • cv2.waitKey(0) 返回按键的ascii码的值,参数0表示接受任意按键,换成其他的整数表示等待按键的时间,单位毫秒.
  • cv2.destroyAllWindows() 关闭该线程打开的所有窗口

综合使用

key = cv2.waitKey(0)
if key == ord('q'):  # ord将字符转为其对应的ascii码
    cv2.destroyAllWindows()

全部代码

# 创建窗口
cv2.namedWindow("window",cv2.WINDOW_AUTOSIZE) # WINDOW_AUTOSIZE不允许修改窗口大小
cv2.namedWindow("window",cv2.WINDOW_NORMAL)

# 更改窗口大小
cv2.resizeWindow('window',800,600)
# 展示名字为window的窗口
cv2.imshow('window',0)

# 等待按键 拓展:计算ascii码的值,python函数:ord('q') -> 113
# waitKey会返回按键的ascii的值 参数0表示接受任意按键,其他的整数表示等待按键的时间,单位毫秒
# 可以利用waitKey来销毁窗口,不用每次都销毁
key = cv2.waitKey(0)
# key是int型,最少都是16位,但是ascii码是8位 取出前八位来与ascii码比较
if key & 0xFF == ord('q'): # 可以不写 & 0xFF
# if key == ord('q'): 
    cv2.destroyAllWindows()

opencv显示图像操作

读取图片
使用imread函数来读取当前的图片

rose = cv2.imread('./rose.jpeg')
rose.shape # (610, 610, 3)
type(rose)

Python opencv从入门到精通PDF opencv python教程简书_python


展示图片(使用opencv自带的函数)

opencv读进来的通道是BGR,不是传统的RGB
使用使用matplotlib的imshow的结果会与原图不同

# matplotlib显示的图片和真实的图片颜色不一样
plt.imshow(rose)

Python opencv从入门到精通PDF opencv python教程简书_计算机视觉_02

# 所以opencv读进来的图片一般用自己的方式去展示
cv2.imshow('rose',rose)
key = cv2.waitKey(0)
if key == ord('q'): 
    cv2.destroyAllWindows()

Python opencv从入门到精通PDF opencv python教程简书_计算机视觉_03


封装显示图片的函数,默认按q退出

# 封装函数,展示图片
def cv_show(name,img):
    cv2.imshow(name,img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'): 
        cv2.destroyAllWindows()

存储图像

cv2.imwrite('tong.jpg',img)

opencv标记图像操作

先绘制一块空白的黑色背景板, 然后完成基础的画线,画圆,标记等操作
注意: OpenCV中坐标的顺序,见下面的绘图

# 创建纯黑的背景来画图
img = np.zeros((480,640,3),np.uint8)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制背景板

Python opencv从入门到精通PDF opencv python教程简书_人脸识别_04


画线

cv2.line(img, (10,20),(300,400), (0,0,255), 5)

分别给出起始点,终点,颜色,粗细即可

Python opencv从入门到精通PDF opencv python教程简书_人脸识别_05


画矩形

cv2.rectangle(img, (10,20),(300,400), (0,0,255), 5)

分别给出左上角端点和右下角端点,颜色,粗细即可

Python opencv从入门到精通PDF opencv python教程简书_ascii码_06


画圆

v2.circle(img, (320,240),100,(0,0,255), 5)

Python opencv从入门到精通PDF opencv python教程简书_人脸识别_07


标注文字

opencv中不能显示中文,要显示中文需要借助PIL库,见下文

cv2.putText(img,'Hello OpenCV',(50,400),cv2.FONT_HERSHEY_COMPLEX,2,[0,0,255])

Python opencv从入门到精通PDF opencv python教程简书_人脸识别_08


中文标注文字

需要提前准备好用到的字体文件

# 解决中文显示乱码
from PIL import ImageFont,ImageDraw,Image
# img = np.full((200, 200, 3),fill_value=255,dtype=np.uint8)
img = cv2.imread('./rose.jpeg')
font = ImageFont.truetype('./msyhbd.ttc',15)
img_pil = Image.fromarray(img)
draw = ImageDraw.Draw(img_pil)
draw.text((100,350),'你好,我好,大家好', font = font,fill=(0,255,0,0))
img = np.array(img_pil)
cv_show('img',img)

Python opencv从入门到精通PDF opencv python教程简书_opencv_09


完整代码

# 创建纯黑的背景来画图
img = np.zeros((480,640,3),np.uint8)
# 画线
cv2.line(img, (10,20),(300,400), (0,0,255), 5)
# 画矩形
cv2.rectangle(img, (10,20),(300,400), (0,0,255), 5)
# 画圆 参数:圆心坐标,半径大小,颜色,粗细
cv2.circle(img, (320,240),100,(0,0,255), 5)
# 画文字
cv2.putText(img,'Hello OpenCV',(50,400),cv2.FONT_HERSHEY_COMPLEX,2,[0,0,255])
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv调用摄像头操作

可以根据需要增加存储当前摄像头拍摄图片的操作
cv2.imwrite('tong.jpg',frame)

frame中存储的是摄像头拍到的图像
cv2.waitKey(1000//24) 表示一秒24帧

# 打开摄像头
cap = cv2.VideoCapture(0) # cap代表被打开的摄像头
while 1:
    # 从摄像头中读取一帧数据
    ret, frame = cap.read() # frame 存储了读取到的数据
    cv2.imshow('img',frame)
    key = cv2.waitKey(1000//24)
    if key == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

OpenCV摄像头人脸识别

在python下载路径中Lib\site-packages\cv2\data找到如下文件

Python opencv从入门到精通PDF opencv python教程简书_python_10

摄像头与人脸识别代码如下

# 摄像头人脸识别

# 使用opencv提供的人脸识别算法(人脸识别器)
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')

# 打开摄像头
cap = cv2.VideoCapture(0) # cap代表被打开的摄像头

while 1:
    # 从摄像头中读取一帧数据
    ret, frame = cap.read() # frame 存储了读取到的数据
    
    # 将获取到的数据进行灰度处理
    gray = cv2.cvtColor(frame,code=cv2.COLOR_BGR2GRAY)
#     cv2.imshow('img',gray)
    # 在进行灰度处理后的图片中识别人脸
    faces = face_detector.detectMultiScale(gray) # 被识别到的多张人脸
    for x,y,w,h in faces:
        cv2.circle(frame,(x+w//2,y+h//2),w//2,[0,255,0],2) # 用圆圈圈出识别人脸
    cv2.imshow('frame',frame)
    
    
    key = cv2.waitKey(1000//24)
    if key == ord('q'):
        break
    # cv2.imwrite('tong.jpg',frame)
cap.release()
cv2.destroyAllWindows()