一、何为opencv
(百度百科哈哈哈)
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
二、opencv加载展示图片
(1)加载图片:
cv.imread(file)
(2)展示图片:
cv.imshow(winname,img)
(3)保存图片:
cv.imwrite(filename,img,params=None)
(4)实例:
import cv2 as cvimg = cv.imread('abc.jpg') # 加载图片cv.imshow('img',img) # 展示图片cv.waitKey(0) # 等待键盘输入cv.destroyAllWindows() # c++编写 释放内存
加载展示如下:
三、灰度处理及绘制矩形、圆形
opencv使用的是BGR(非传统RGB),即颜色顺序为蓝绿红
(1)灰度处理使用:
cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# BGR 灰度处理img_gary=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
(2)绘制矩形框:
cv.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)
其中(x,y)为左上角x,y坐标值
w,h为矩形的宽和高
thickness为笔画大小
(3)绘制圆形:
cv.circle(img,center=(x,y),radius=r,color=(0,0,255),thickness=3)
其中center为圆心坐标
radius为半径值
四、人脸识别
(1)加载特征数据:
官网https://opencv.org/
点击Releases
下载特征数据
使用cv.CascadeClassifier(filename)加载数据
(2)实例:
定义函数face_detect_demo()对图片中的人脸进行特征识别获取人脸位置的x,y,w,h值
import cv2 as cvdef face_detect_demo(): # 灰度处理 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) # 加载特征数据 face_detector = cv.CascadeClassifier('D:/opencv/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) cv.imshow('result',img)img = cv.imread('abc.jpg')# cv.imshow('img',img)face_detect_demo()cv.waitKey(0)cv.destroyAllWindows()
结果:
(3)多人脸识别调参
face_detector.detectMultiScale(gray,scaleFactor=1.01,minNeighbors=3, flags=None, minSize=None, maxSize=None)
参数说明:
scaleFactor:表示每次图片尺寸缩小比例
minNeighbors:表示至少检测次数
minSize:目标最小尺寸
maxSize:目标最大尺寸
import cv2 as cvimg = cv.imread('hei.jpg')def face_detect_demo(): # 图片灰度处理 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) # 特征加载 face_detector = cv.CascadeClassifier(r'D:\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml') faces = face_detector.detectMultiScale(gray,scaleFactor=1.02,minNeighbors=3,) for x,y,w,h in faces: cv.rectangle(img,(x,y),(x+w,y+h),color=(255,0,0),thickness=2) # cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,0,255),thickness=2) print(x,y,w,h) cv.imshow('result',img)face_detect_demo()cv.waitKey(0)cv.destroyAllWindows()
调参前结果:
调参后结果:
相校调参前,调参后识别率高了点,不过也不全(黑人太黑了,机器识别不出来?),缺点显而易见,多人脸识别需要根据实际进行调参才能获取好的识别率和准确率。(opencv入门了吧,往下是一堆数学问题头大)
学习笔记,使用借鉴了不少网络资料