OpenCV也提供了一些机器学习的方法,比如DNN。本文将详细介绍OpenCV中通过机器学习实现的一些图像识别功能:人脸识别、车牌识别等。有兴趣的可以看看。
目录
背景1、人脸识别2、车牌识别3、DNN图像分类
背景
OpenCV也提供了一些机器学习的方法,比如DNN;本文将简单介绍机器学习的一些应用,对比传统和前沿的算法,从中可以看出优劣;
一、人脸识别
主要有以下两种实现方式:
1.哈尔级联法:一种专门用于人脸识别的传统算法:
实施步骤:
创建哈尔梯级;
导入图片并对其进行灰度化;
调用函数接口进行人脸识别;
功能原型:
检测多尺度(img,比例因子,minNeighbors)
ScaleFactor:缩放尺寸;
MinNeighbors:最小像素值;
代码案例:
#创建哈尔瀑布
facer=cv2。级联分类器('。/haarcascades/haarcascade _ front alface _ default . XML’)
#导入面部图片并对其进行灰度处理
img=cv2.imread('p3.png ')
gray=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)
#呼叫接口
faces=facer . detect multi scale(gray,1.1,5)
对于面中的(x,y,w,h ):
cv2.rectangle(img,(x,y),(x w,y h),(0,0,255),2)
cv2.imshow('img ',img)
cv2.waitKey()
结论:Haar级联法对完整人脸的检测效果较好,但对不完整人脸的识别效果较差,这可能也是传统算法的一个缺陷,泛化能力较差。
扩展:Haar cascade还可以识别面部的细节特征。
代码如下:
#创建哈尔瀑布
facer=cv2。级联分类器('。/haarcascades/haarcascade _ front alface _ default . XML’)
eyer=cv2。级联分类器('。/Haar cascades/Haar cascade _ eye . XML’)
#导入面部图片并对其进行灰度处理
img=cv2.imread('p3.png ')
gray=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)
#呼叫接口
faces=facer . detect multi scale(gray,1.1,5)
i=0
对于面中的(x,y,w,h ):
cv2.rectangle(img,(x,y),(x w,y h),(0,0,255),2)
ROI_img=img[y:y h,x:x w]
eyes=eyer . detect multi scale(ROI _ img,1.1,5)
对于眼睛中的(x,y,w,h ):
cv2.rectangle(ROI_img,(x,y),(x w,y h),(0,255,0),2)
i=1
name='img' str(i)
cv2.imshow(名称,ROI_img)
cv2.waitKey()
总结:Haar Cascade提供了多种面部属性识别,包括眼睛、鼻子和嘴巴,但是效果不一定那么准确;
二、车牌识别
结构:哈尔宇宙魔方车牌识别;
说明:Haar cascade只用于定位车牌的位置,Tesseract用于提取内容;
实施步骤:
1.哈尔级联装置定位车牌位置;
2.车牌预处理操作(二值化、形态学、滤波去噪、缩放);
3.调用Tesseract进行字符识别;
注:宇宙魔方;这里需要提前安装;
代码案例:
导入pytesseract
#创建哈尔瀑布
看护者=cv2。级联分类器('。/haarcascades/haarcascade _ Russian _ plate _ number . XML ')
#导入面部图片并对其进行灰度处理
img=cv2.imread('chinacar.jpeg ')
gray=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)
#呼叫接口
cars=carer.detectMultiScale(灰色,1.1,3)
对于汽车中的(x,y,w,h ):
cv2.rectangle(img,(x,y),(x w,y h),(0,0,255),2)
#提取ROI
roi=gray[y:y h,x:x w]
#二值化
ret,roi_bin=cv2.threshold(roi,0,255,cv2。THRESH_BINARY cv2。OTSU)
#单词识别
' pytesserac . pytesserac . tesserac _ cmd=r ' d:\ tesserac _ OCR \ tesserac t . exe '
text=pytesserac t . image _ to _ string(ROI,lang='chi_sim eng ',config=' - psm 8 - oem 3 ')
打印(文本)
cv2.putText(img,Text,(20,100),cv2。FONT_HERSHEY_SIMPLEX,2,(0,0,255),3)
cv2.imshow('img ',img)
cv2.waitKey()
结论:车牌的定位检测是准确的,但是Tesseract没有那么准确,所以ORC可能更准确。当然,识别精度也与图像处理后的模糊性有关。做一些处理可以提高单词的识别率;
三、DNN图像分类
DNN是深度神经网络,而且是全连接的形式;
注意:OpenCV可以使用DNN模型,但不能训练;
使用DNN的步骤:
读取模型,得到网络结构;
读取数据(图片或视频)
把图片变成张量发给网络;
模型的输出结果;
功能原型:
导入模型:readNet(模型,[配置])
图像张量:blobFromImage(图像、比例因子、大小、平均值、swapRB、裁剪)
进入网络:net.setInput(blob)
模型推理:net.forward()
代码案例:
#导入模型
配置='。/model/bvlc_googlenet.prototxt '
型号='。/model/bvlc _ Google net . caffe model '
net=dnn.readNetFromCaffe(配置,型号)
#加载图片并将其转换为张量
img=cv2.imread('。/small cat . JPEG’)
blob=dnn.blobFromImage(img,1.0,(224,224),(104,117,123))
#模型推理
net.setInput(blob)
r=net.forward()
idxs=NP . arg sort(r[0])[:-1][:5]
#显示分类结果
路径='。/model/synset_words.txt '
用open(path,' rt ')作为f:
classes=[x[x . find(' ')1:]for x in f]
对于enumerate(idxs)中的(I,idx):
#在图像上显示结果
如果i==0:
text='Label: {},{:2f}% '。格式(类[idx],
r[0][idx] * 100)
putText(img,Text,(5,25),cv2。FONT_HERSHEY_SIMPLEX,
0.7, (0, 0, 255), 2)
#显示图像
cv2.imshow('Image ',img)
cv2.waitKey(0)
结论:其实有了模型,推理的步骤并不复杂,难点在于前处理和后处理。往往图像处理出现错误,或者处理结果出现问题,都会导致结果不一致,需要特别注意;
Python OpenCV机器学习的图像识别这篇文章到此为止。有关OpenCV图像识别的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。