赞
踩
OpenCV 的全称是 Open Source Computer Vision Library,是一个跨平台的计算机视觉库。 OpenCV 是由英特尔公司发起并参与开发,以 BSD 许可证授权发行,可以在商业和研究领 域中免费使用。OpenCV 可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的 IPP 进行加速处理。 OpenCV 用 C++语言编写,它的主要接口也是 C++语言,但是依然保留了大量的 C 语言接口。该库也有大量的 Python、Java and MATLAB/OCTAVE(版本 2.5)的接口。这些语 言的 API 接口函数可以通过在线文档获得。如今也提供对于 C#、Ch、Ruby、GO 的支持。
OpenCV 已经支持 python 的模块了,直接使用 pip 就可以进行安装,命令如下:
pip install opencv-python
若下载缓慢可以通过第三方下载
pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple 模块名
若安装失败,可能需要更新pip
python -m pip install --upgrade pip
import cv2 as cv
img=cv.imread('lena.jpg') # 注意读取图片的路径不能有中文,不然数据读取不出来
cv.imshow('input image',img)
cv.waitKey(0) # 等待键盘的输入 单位是毫秒 传入 0 无限等待
cv.destroyAllWindows() # C++语言 使用完内存必须释放
# 将图片灰度转换 import cv2 as cv # 读取图片 img = cv.imread('0.jpg') # 显示图片 cv.imshow('BGR_img', img) # 将图片进行灰度转换 gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) cv.imshow('gray_img', gray_img) # 保存图片 cv.imwrite('gray_1.jpg', gray_img) # 等待键盘输入,解决一闪而过 单位毫秒 传入0则是无限等待 cv.waitKey(0) # 释放内存,由于OpenCv底层是C++写的 cv.destroyAllWindows()
# 修改图片大小,用一个变量接收,可以保存或显示
resize_img = cv.resize(img, dsize=(600, 500))
# 等待键盘输入,使图片持续显示
# cv.waitKey(0)
# 只有输入q时候才退出
while True:
if ord('q') == cv.waitKey(0): # 返回从键盘输入的键的ascii码值
break
import cv2 as cv # 加载图片 img = cv.imread('0.jpg') # 左上角的坐标是(x,y) 矩形的宽度和高度(w,h) x, y, w, h = 100, 100, 100, 100 cv. rectangle(img, (x, y, x+w, y+w), color=(0, 255, 255), thickness=2) # 三个色彩的通道, thickness:线条宽度, 绘制矩形传参是两个点 # 绘制圆center元组指原点的坐标 # x, y, r = 200, 200, 100 # x,y原点坐标 r是半径 # cv.circle(img, center=(x, y), radius=r, color=(0, 0, 255)) # 显示图片 cv.imshow('rectangle_img', img) # 输入键盘内容,关闭图片 cv.waitKey(0) # 关闭内容 cv.destroyAllWindows()
# 人脸检测 import cv2 as cv def face_detect(): # 将图片灰度处理,降低色彩的通道 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 加载特征数据 face_detector = cv.CascadeClassifier('D:/Python/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') face = face_detector.detectMultiScale(gray) for x, y, w, h in face: # 坐标及宽度高度 cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 255, 0), thickness=2) # img所画图片,坐标,颜色,宽度 # 显示 cv.imshow('result', img) # 加载图片 img = cv.imread('lena.jpg') # 人脸检测 face_detect() cv.waitKey(0) cv.destroyAllWindows()
# 将照片灰度
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 加载特征数据
face_detector = cv.CascadeClassifier('D:/Python/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
# 参数: scaleFactor(比例因子):图片缩放多少,minNeighbors:至少检测多少次,minSize maxSize:当前检测区域的最大最小面积
faces = face_detector.detectMultiScale(gray) # , scaleFactor=1.01, minNeighbors=3, maxSize=(33, 33), minSize=(28, 28)
import cv2 as cv # 检测图片 def face_detect(img): # 灰度处理 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 加载特征数据 face_detector = cv.CascadeClassifier('D:/Python/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') # 参数: scaleFactor(比例因子):图片缩放多少,minNeighbors:至少检测多少次,minSize maxSize:当前检测区域的最大最小面积 faces = face_detector.detectMultiScale(gray) # scaleFactor=1.01, minNeighbors=3, maxSize=(33, 33), minSize=(28, 28) # 遍历检测到的区域 for x, y, w, h in faces: cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=2) cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 255, 0), thickness=2) # 显示图片 cv.imshow('result', img) # 读取视频 cap = cv.VideoCapture('video.mp4') # 视频是重复播放,用循环来接收 while True: flag, frame = cap.read() print('flag', flag, 'frame', frame.shape) # 如果视频播放停止,则跳出循环 if not flag: break # 将每一张图片传进去进行检测 face_detect(frame) # 等待键盘10s若输入q则关闭 if ord('q') == cv.waitKey(10): break cv.destroyAllWindows() cap.release()
人脸检测是 OpenCV 的一个很不错的功能,它是人脸识别的基础。
人脸识别其实就是一个程序能识别给定图像或视频中的人脸。实现这一目标的方法之一是用一系列分好类的图像来“训练”程序,并基于这些图像来进行识别。这就是OpenCV 及其人脸识别模块进行人脸识别的过程。 人脸识别模块的另外一个重要特征是:每个识别都具有转置信(confidence)评分,因此可在实际应用中通过对其设置阈值来进行筛选。人脸识别所需要的人脸可以通过两种方式来得到:自己获得图像或从人脸数据库免费获得可用的人脸图像。互联网上有许多人脸数据库:为了对这些样本进行人脸识别,必须要在包含人脸的样本图像上进行人脸识别。这是一 个学习的过程,但并不像自己提供的图像那样令人满意。
pip install opencv-contrib-python
1.下载缓慢引起超时timeout问题
pip --default-timeout=100 install -U opencv-contrib-python
2.该模块较大官方途径下载缓慢,推荐使用第三方通道下载
pip install -i https://mirrors.aliyun.com/pypi/simple opencv-contrib-python
示例:
需要在当前目录下创建data和 trainer两个文件夹,分别存放要识别的人脸的多张.pgm照片,训练完的数据
附:(PGM 是便携式灰度图像格式(portable graymap file format),在黑白超声图像系统中经常使用PGM格式的图像。文件的后缀名为”.pgm”,PGM格式图像格式分为两类:P2和P5类型。不管是P2还是P5类型的PGM文件,都由两部分组成,文件头部分和数据部分。)
import os import cv2 from PIL import Image import numpy as np def getImageAndLabels(path): facesSamples = [] ids = [] imagePaths = [os.path.join(path, f) for f in os.listdir(path)] # 检测人脸 # 加载特征数据 face_detector = cv2.CascadeClassifier( 'D:/Python/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') # 参数: scaleFactor(比例因子):图片缩放多少,minNeighbors:至少检测多少次,minSize maxSize:当前检测区域的最大最小面积 # scaleFactor=1.01, minNeighbors=3, maxSize=(33, 33), minSize=(28, 28) # 遍历列表中的图片 for imagePath in imagePaths: # 打开当前图片 PIL_img = Image.open(imagePath).convert('L') # 将图片转化为数组 img_numpy = np.array(PIL_img, 'uint8') faces = face_detector.detectMultiScale(img_numpy) # 获取每张图片的id id = int(os.path.split(imagePath)[1].split('.')[0]) # 获取人脸区域 for x, y, w, h in faces: # 进行切片处理,获取图像数组和id facesSamples.append(img_numpy[y:y+h, x:x+w]) ids.append(id) return facesSamples, ids if __name__ == '__main__': # 图片路径 path = './data/jm/' # 获取图像数组和id标签数组 faces, ids = getImageAndLabels(path) # 获取循环对象 recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.train(faces, np.array(ids)) # 保存文件 recognizer.write('trainer/trainer.yml')
示例:
import cv2 # 加载训练数据集文件 # 获取人脸识别对象 recognizer = cv2.face.LBPHFaceRecognizer_create() # 读取训练数据 recognizer.read('trainer/trainer.yml') # 准备识别图片 img = cv2.imread('6.pgm') # 将图片灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 加载特征数据 face_detector = cv2.CascadeClassifier('D:/Python/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') # 参数: scaleFactor(比例因子):图片缩放多少,minNeighbors:至少检测多少次,minSize maxSize:当前检测区域的最大最小面积 faces = face_detector.detectMultiScale(gray) # scaleFactor=1.01, minNeighbors=3, maxSize=(33, 33), minSize=(28, 28) # 获取脸部特征值 for x, y, w, h in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), thickness=2) cv2.circle(img, (x+w//2, y+h//2), radius=w//2, thickness=2, color=(0, 0, 255)) # 人脸识别 id, confidence = recognizer.predict(gray[y:y+h, x:x+w]) print('标签id:', id, '置信评分:', confidence) # 显示图片 cv2.imshow('result', img) cv2.waitKey(0) # 一直显示 cv2.destroyAllWindows() # 释放资源
继续深究人脸识别领域后,将更新文章。
感谢跟随老师的代码在未知领域里探索,希望我能走的更高更远
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。