本文为大一人工智能专业学生,本文仅为个人学习路线的记录,如有问题或疏漏,欢迎指正!如有侵权请联系我个人微信:GZE08_myh

首次发布时出现缩进错误,现已更改

OpenCV插件的安装

1、安装opencv-python

pip install opencv-python

pip install opencv-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

2、安装opencv-contrib-python

pip install opencv-contrib-python

pip install opencv-contrib-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

3、安装 pytesseract

pip install pytesseract

ip install pytesseract -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

另外,需要确保numpy、pandas、matplotlib已经安装

4.1 显示图片

写一个简单的测试程序,显示一张图片

(“lena.jpg为工程文件夹中的图片,也可以用路径path代替”)

参考代码:

# 导入模块
import cv2 as cv
# 读取图片
img = cv.imread('lena.jpg') # 路径中不建议包含中文
# 显示图片
cv.imshow('img', img)
# 等待键盘输入 参数单位毫秒 表示等待时间 0表示无限等待
cv.waitKey(3000)
# 释放内存 OpenCV底层调用的是C++
cv.destroyAllWindows()

4.2 图片转灰度

彩色图片在OpenCV中的三个通道:BGR(蓝、绿、红)

为了降低图像识别的难度,通常会转换为灰度图,实际上就是把三个通道合成一个通道,

需要调用一个函数 cvtColor()

参考代码:

import cv2 as cv
img = cv.imread('lena.jpg') # 路径中不建议包含中文
cv.imshow('img', img)
# 将图片转换成灰度
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('gray_img', gray_img)
# 把灰度图片保存下来
cv.imwrite('gray_lena.jpg', gray_img)
cv.waitKey(0)
cv.destroyAllWindows()

效果如下:

4.3 修改图片尺寸

使用 resize() 修改图片尺寸

参考代码:

import cv2 as cv
img = cv.imread('lena.jpg') # 路径中不建议包含中文
cv.imshow('img', img)
print('原来图片的形状:', img.shape)
# 修改图片大小
resize_img = cv.resize(img, dsize=(400, 200))
cv.imshow('resize_img', resize_img)
print('修改后图片的形状:', resize_img.shape)
cv.waitKey(0)
cv.destroyAllWindows()

 效果如下:

4.4 在图片上绘制矩形和圆

绘制矩形使用 rectangle() 方法

rectangle(img, pt1, pt2, color, thickness)

参数1:img。在哪个图片上绘制矩形

参数2:pt1。左上角的点,作为一个元组,里面包含2个值

参数3:pt2。右下角的点。作为一个元组,里面包含2个值

参数4:color。矩形的颜色(BGR颜色)。作为一个元组,里面包含3个值,分别为BGR

参数5:thickness。矩形框的厚度

绘制圆使用 circle() 方法

circle(img, center, radius, color, thickness)

参数1:img。在哪个图片上绘制圆

参数2:center。圆心的店,作为一个元组,里面包含2个值

参数3:radius。圆的半径

参数4:color。圆的颜色(BGR颜色)。作为一个元组,里面包含3个值,分别为BGR

参数5:thickness。圆框的厚度

参考代码:

import cv2 as cv
img = cv.imread('lena.jpg') # 路径中不建议包含中文
# 绘制矩形
pt1 = (150, 150)
pt2 = (150+100, 150+100)
color = (0,255,0)
cv.rectangle(img, pt1, pt2, color, thickness=2)
# 绘制圆
center = (200, 200)
radius = 50
color = (0,255,255)
cv.circle(img, center, 50, color, thickness=3)
# 显示图片
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果如下:

 

4.5 人脸检测

使用 opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml 检测人脸

 Xml文件下载方法:https://blog.csdn.net/qq_44611433/article/details/89541648

参考代码:

import cv2 as cv
def face_detect_demo(img):
    # 将图片转换为灰度图片
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 加载frontface特征数据
    face_detector = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
    # 进行人脸检测
    faces = face_detector.detectMultiScale(gray)
    x, y, w, h = faces[0]
    pt1 = (x,y)
    pt2 = (x+w, y+h)
    color = (0, 255, 0)
    cv.rectangle(img, pt1, pt2, color, thickness=2)
    cv.imshow('face', img)
img = cv.imread('lena.jpg') # 路径中不建议包含中文
face_detect_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()

效果如下:

4.6 检测多张人脸

参考代码:

import cv2 as cv

def face_detect_demo(img):
    # 将图片转换为灰度图片
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 加载frontface特征数据
    face_detector = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
    # 进行人脸检测
    faces = face_detector.detectMultiScale(gray)
    print(faces)
    # 给人脸绘制矩形框
    for face in faces:
        x, y, w, h = face
        pt1 = (x,y)
        pt2 = (x+w, y+h)
        color = (0, 255, 0)
        cv.rectangle(img, pt1, pt2, color, thickness=2)
    cv.imshow('face', img)

img = cv.imread('face.jpg') # 路径中不建议包含中文
face_detect_demo(img)

cv.waitKey(0)
cv.destroyAllWindows()

4.7 检测视频中的人脸

视频由一帧帧的图片组成,要检测视频中的人脸,实际上就是检测每帧图片所对应的人脸

OpenCV中使用 VideoCapture() 加载视频

并通过 read() 方法读取视频中的每一帧图片

返回两个值

flag:是否有下一帧

frame:当前帧

参考代码:(MP4文件需提前拷贝到工程文件夹下)

import cv2 as cv

def face_detect_demo(img):
    # 将图片转换为灰度图片
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 加载frontface特征数据
    face_detector = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
    # 进行人脸检测
    faces = face_detector.detectMultiScale(gray)
    print(faces)
    # 给人脸绘制矩形框
    for face in faces:
        x, y, w, h = face
        pt1 = (x,y)
        pt2 = (x+w, y+h)
        color = (0, 255, 0)
        cv.rectangle(img, pt1, pt2, color, thickness=2)
    cv.imshow('face', img)

# 读取视频
cap = cv.VideoCapture('video.mp4')
while True:
    # 读取一帧
    # 返回值1 flag 如果视频一直在播放 则返回True 否则返回False
    # 返回值2 frame 当前帧对应的图片
    flag, frame = cap.read()
    if not flag:
        break

    face_detect_demo(frame)
    if cv.waitKey(10) == ord('q'):
        break

cv.destroyAllWindows()
cap.read()

4.8 拍摄视频

捕获视频的函数VideoCapture()

如果捕获现有的视频文件,则参数是视频文件的路径

如果捕获摄像头的视频,参数就是摄像头的id,一般情况下写0即可

参考代码:(正常情况下会调用笔记本电脑的前置摄像头)

import cv2 as cv

# 读取摄像头视频
def video_demo():
    # 捕获摄像头的视频
    capture = cv.VideoCapture(0)
    id = 0
    while True:
        # 读取一帧
        # 返回值1 flag 如果视频一直在播放 则返回True 否则返回False
        # 对于读取摄像头来说 flag的值将一直为True
        # 返回值2 frame 当前帧对应的图片
        flag, frame = capture.read()
        # 对摄像头进行左右反转
        frame = cv.flip(frame, 1)
        cv.imshow('video', frame)
        # 延迟捕获案件退出
        c = cv.waitKey(50)
        if c == ord('s') or c == ord('S'): # 按s键保存
            cv.imwrite('myface%d.jpg' % id, frame)
            id += 1
        if c == 27: # ESC键
            break

video_demo()

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐