OpenCV git地址:
#第一节
基本识别算法概述:
SIFT/SURF基于灰度图,
一、首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使用二次插值法得到精确特征点所在的层(尺度),即完成了尺度不变。
二、在特征点选取一个与尺度相应的邻域,求出主方向,其中SIFT采用在一个正方形邻域内统计所有点的梯度方向,找到占80%以上的方向作为主方向;而SURF则选择圆形邻域,并且使用活动扇形的方法求出特征点主方向,以主方向对齐即完成旋转不变。
三、以主方向为轴可以在每个特征点建立坐标,SIFT在特征点选择一块大小与尺度相应的方形区域,分成16块,统计每一块沿着八个方向占的比例,于是特征点形成了128维特征向量,对图像进行归一化则完成强度不变;而SURF分成64块,统计每一块的dx,dy,|dx|,|dy|的累积和,同样形成128维向量,再进行归一化则完成了对比度不变与强度不变。
haar特征也是基于灰度图,
首先通过大量的具有比较明显的haar特征(矩形)的物体图像用模式识别的方法训练出分类器,分类器是个级联的,每级都以大概相同的识别率保留进入下一级的具有物体特征的候选物体,而每一级的子分类器则由许多haar特征构成(由积分图像计算得到,并保存下位置),有水平的、竖直的、倾斜的,并且每个特征带一个阈值和两个分支值,每级子分类器带一个总的阈值。识别物体的时候,同样计算积分图像为后面计算haar特征做准备,然后采用与训练的时候有物体的窗口同样大小的窗口遍历整幅图像,以后逐渐放大窗口,同样做遍历搜索物体;每当窗口移动到一个位置,即计算该窗口内的haar特征,加权后与分类器中haar特征的阈值比较从而选择左或者右分支值,累加一个级的分支值与相应级的阈值比较,大于该阈值才可以通过进入下一轮筛选。当通过分类器所以级的时候说明这个物体以大概率被识别。
下面将介绍使用haar特征
获取人脸识别训练数据 看似复杂,其实就是对于人脸特征的一些描述,这样opencv在读取完数据后很据训练中的样品数据,就可以感知读取到的图片上的特征,进而对图片进行人脸识别。
import cv2face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')复制代码
里卖弄的这个xml文件,就是opencv在GitHub上共享出来的具有普适的训练好的数据。我们可以直接的拿来使用。
import cv2pathf = r'haarcascade_frontalface_default.xml'#pathe = r'haarcascade_eye.xml'# 获取训练好的人脸的参数数据,这里直接从GitHub上使用默认值face_cascade = cv2.CascadeClassifier(pathf)eye_cascade = cv2.CascadeClassifier(pathe)# 读取图片image = cv2.imread(r"足球队员.jpg")# 将读取的图像转换成了 cv2.COLOR_BGR2GRAY格式gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)# 探测图片中的人脸faces = face_cascade.detectMultiScale( gray, scaleFactor=1.15, minNeighbors=5, minSize = (5, 5),)print("发现{0}个人脸!".format(len(faces)))for (x,y,w,h) in faces: # cv2.circle(image,((x+x+w)//2,(y+y+h)//2),w//2,(0,255,0),2) cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2) face_re = image[y:y+h, x:x+h] face_re_g = gray[y:y+h, x:x+h] eyes = eye_cascade.detectMultiScale(face_re_g) # for(ex,ey,ew,eh) in eyes: # cv2.rectangle(face_re,(ex,ey),(ex+ew,ey+eh),(255,0,0),1)cv2.imshow("Find Faces!",image)cv2.imwrite("tt.jpg", image)cv2.waitKey(0)复制代码
附录:
Parameters: cascade – Haar classifier cascade (OpenCV 1.x API only). It can be loaded from XML or YAML file using Load(). When the cascade is not needed anymore, release it using cvReleaseHaarClassifierCascade(&cascade).image – Matrix of the type CV_8U containing an image where objects are detected.objects – Vector of rectangles where each rectangle contains the detected object.scaleFactor – Parameter specifying how much the image size is reduced at each image scale.minNeighbors – Parameter specifying how many neighbors each candidate rectangle should have to retain it.flags – Parameter with the same meaning for an old cascade as in the function cvHaarDetectObjects. It is not used for a new cascade.minSize – Minimum possible object size. Objects smaller than that are ignored.maxSize – Maximum possible object size. Objects larger than that are ignored.复制代码
#第二节
使用OpenCV打开摄像头
import cv2if __name__ == "__main__": cap = cv2.VideoCapture(0) video_w, video_h = int(cap.get(3)), int(cap.get(4)) print(video_h,video_w) while True: # 获取当前帧并初始化occupied/unoccupied文本 (grabbed, frame) = cap.read() cv2.imshow("tensorflow", frame) k = cv2.waitKey(1) & 0xff if k == ord('q') or k == 27: break cap.release()复制代码