,,Python OpenCV机器学习之图像识别详解

,,Python OpenCV机器学习之图像识别详解

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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • opencv图像识别数字,opencv 识别
  • opencv图像识别数字,opencv 识别,如何基于opencv实现简单的数字识别
  • opencv图像的旋转角度计算,opencv图像仿射变换
  • opencv图像的旋转角度计算,opencv图像仿射变换,OpenCV图像几何变换之透视变换
  • opencv图像的旋转角度计算,opencv 旋转任意角度
  • opencv图像的旋转角度计算,opencv 旋转任意角度,opencv图片的任意角度旋转实现示例
  • opencv图像处理函数,opencv图像轮廓合并
  • opencv图像处理函数,opencv图像轮廓合并,OpenCV图像处理之七种常用图像几何变换
  • opencv双线性插值函数,opencv 图像插值
  • LBPH人脸识别,基于opencv的人脸识别技术
  • LBPH人脸识别,基于opencv的人脸识别技术,Opencv LBPH人脸识别算法详解
  • ,,OpenCV黑帽运算(BLACKHAT)的使用
  • opencv双线性插值函数,opencv 图像插值,C++ OpenCV实现图像双三次插值算法详解
  • ,,C语言 OpenCV实现柱面投影
  • ,,C++ Opencv imfill孔洞填充函数的实现思路与代码
  • 留言与评论(共有 条评论)
       
    验证码: