python opencv

 

安装

pip install opencv-python
  • 修改 numpy 版本

windows 只能安装 numpy 1.19.3, 若直接使用 pip install 安装是 1.19.4 版本, 因此在安装时需要指定版本

pip uninstall numpy

pip install numpy==1.19.3

使用

显示图像

import cv2 as cv
import numpy as np

image = cv.imread("图片路径")

# 灰度化处理
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", gray)

cv.waitKey(0)

# 作用是能正常关闭绘图窗口
cv.destroyAllWindows()

图片人脸识别

import cv2 as cv
import numpy as np

eye_detector_path = "venv\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml"

face_detector_path = "venv\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalcatface.xml"

def face_detect_demo():
    # 图片变成灰度图片, 因为人脸特征需要在灰度图像中查找
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    
    # 通过级联检测器 cv.CascadeClassifier, 加载特征数据
    face_detector = cv.CascadeClassifier(face_detector_path)
    
    # 在尺度空间对图片进行人脸检测, 
    # 第一个参数是哪个图片, 
    # 第二个参数是向上或向下尺度变化, 是原来尺度1.02倍, 
    # 第三个参数是在相邻几个人脸检测矩形框内出现就认定成人脸, 
    # 这里是在相邻5个人脸检测框内出现, 若图片比较模糊的话建议降低一点
    faces = face_detector.detectMultiScale(gray, 1.02, 5)
    
    # 绘制结果图
    for x, y, w, h in faces:
        # 参数:要绘制的目标图像, 矩形的第一个顶点, 矩形对角线上的另一个顶点, 线条颜色, 线条宽度
        cv.rectangle(src, (x, y), (x + w, y + h), (0, 0, 255), 2)
        cv.imshow("result", src)

if __name__ == '__main__':
    src = cv.imread("picture\\a.png")
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
    
    face_detect_demo()
    
    cv.waitKey(0)
    cv.destroyAllWindows()

视频人脸识别

import cv2 as cv
import numpy as np

eye_detector_path = "venv\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml"

face_detector_path = "venv\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml"

if __name__ == '__main__':
    cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
    cap = cv.VideoCapture(1)
    face_detector = cv.CascadeClassifier(face_detector_path)
    face_detector.load(face_detector_path)
    while (True):
        check, frame = cap.read()
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        
        # 在尺度空间对图片进行人脸检测
        # 第一个参数是图片
        # 第二个参数是向上或向下的尺度变化, 是原来尺度的1.2倍
        # 第三个参数是在相邻的几个人脸检测矩形框内出现就认定成人脸, 这里是在相邻的5个人脸检测框内出现, 若图片比较模糊的话建议降低一点
        faces = face_detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=2)
        if len(faces):
            for x, y, w, h in faces:
                # 参数:要绘制的目标图像, 矩形的第一个顶点, 矩形对角线上的另一个顶点, 线条颜色, 线条宽度
                cv.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
                print(x, y, x + w, y + h)

        cv.imshow("result", frame)
        if cv.waitKey(1) & 0xFF == ord('q'):  # 按q键退出
            break
    cap.release()
    cv.destroyAllWindows()