Python_opencv库
阅读原文时间:2023年07月10日阅读:3

1.车牌检测

'''
项目名称:opencv/cv2 车牌检测

简介:
1.训练级联表 ***.xml 【跳过…】
2.用如下代码加载级联表和目标图片识别车牌

注:推荐用anconda安装opencv库
'''

import cv2
detector = cv2.CascadeClassifier() #实例化检测器 detector/检测器
ret = detector.load('plate_cascade.xml') #加载级联表,注:Python加载文件需要load(加载)一下,C++不需要

检测级联表是否加载成功

if not ret:
print('未找到级联表/load cascade err')
quit()

读目标图片

img = cv2.imread('2.jpg')
#转灰度(黑白色)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY ) #三字节颜色转一字节颜色(彩色转黑白) cvt/转换 covert
'''
颜色检测
颜色转换
色彩BGR、HVS两种格式
'''

目标锁定盒子

boxs = detector.detectMultiScale(gray,1.01,3) #两个参数:金字塔层级系数(1~2之间,与车牌在整张图中的占比成反比;越小越检查出来的多),非相关性抑制系数
print(len(boxs)) #找到的目标的个数
for box in boxs:
x,y,w,h=box # zy 位置 wh宽高
g=img[y:y+h,x:x+w,:]
name='%d_%d_%d_%d.jpg'%(x,y,w,h)
print(name) # 输出车牌截图名称【注:坐标命名规则】
cv2.imwrite(name,g) # 打印车牌的截图

2.图片人脸检测

# 人脸识别,正则分析

import cv2
import numpy as np
from PIL import Image
#pip install PIL
#pip install opencv-python
#pip install dlib
dector=cv2.CascadeClassifier()
ret=dector.load('haarcascade_frontalface_alt_tree.xml')
if not ret:
print('未找到级联表文件:plate_cascade.xml')
exit()

img=cv2.imread('e:/85n.jpg')
if img is None:
print('文件不存在')
exit()
#彩色转成灰度图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

正则化,亮度调成均匀的

gray=np.uint8(gray/gray.ptp()*255)

boxs=dector.detectMultiScale(gray,1.015,1)
platelist=[]
for box in boxs:
x,y,w,h=box
g=img[y:y+h,x:x+w,:]
platelist.append(g)
linew=h//100+1
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),linew)
gimg=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
image=Image.fromarray(gimg)
image.show()
image.close()

3.视频人脸检测

# 人脸识别,正则分析

import cv2
import numpy as np
from PIL import Image
#pip install PIL
#pip install opencv-python
#pip install dlib
dector=cv2.CascadeClassifier()
ret=dector.load('haarcascade_frontalface_alt_tree.xml')
if not ret:
print('未找到级联表文件:plate_cascade.xml')
exit()

img=cv2.imread('e:/85n.jpg')
if img is None:
print('文件不存在')
exit()
#彩色转成灰度图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

正则化,亮度调成均匀的

gray=np.uint8(gray/gray.ptp()*255)

boxs=dector.detectMultiScale(gray,1.015,1)
platelist=[]
for box in boxs:
x,y,w,h=box
g=img[y:y+h,x:x+w,:]
platelist.append(g)
linew=h//100+1
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),linew)
gimg=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
image=Image.fromarray(gimg)
image.show()
image.close()

4.数字识别

# -*- coding: utf-8 -*-
"""
Created on Thu May 17 19:30:13 2018

@author: AI04班级
"""

import cv2
import numpy as np
from PIL import Image #Python Image Lib
import skimage.feature as feature2d
import sklearn.neighbors as nhb
from sklearn.externals import joblib #对训练模型保存或读取
#cvhog=cv2.HOGDescriptor()

def imgPrepare(filename):
img=cv2.imread(filename,0)
img=np.uint8(img/img.ptp()*255)
img=np.where(img>128,255,img)
img=np.where(img<=128,0,img)
img=np.bitwise_not(img)
return img

def splitchar(img,axis=1):
idxrowb=np.all(img<64,axis=axis)
idxrowi=np.uint8(idxrowb).ravel()
dy=idxrowi[1:]-idxrowi[:-1]
#print(dy)
rowb=np.argwhere(dy==255).ravel()
rowe=np.argwhere(dy==1).ravel()
#print(rowb,rowe)
if axis==1:
imglines=[img[b:e+1,:] for b,e in zip(rowb,rowe)]
else:
imglines=[img[:,b:e+1] for b,e in zip(rowb,rowe)]

return imglines

def splitBox(img):
idxrowb=np.all(img<64,axis=1) idxrowi=np.uint8(idxrowb).ravel() dy=idxrowi[1:]-idxrowi[:-1] #print(dy) rowb=np.argwhere(dy==255).ravel() rowe=np.argwhere(dy==1).ravel() b=0 e=-1 if len(rowe)>0:
e=rowe[-1]+1
if len(rowb)>0:
b=rowb[0]

return img\[b:e,:\]

def myResize(img,size=(48,48)):
h,w=img.shape
bw=max(h,w)
bh=bw
bimg=np.zeros((bh,bw),np.uint8)
if bw==w:
dh=(bh-h)//2
bimg[dh:dh+h,:]=img[:,:]
else:
dw=(bw-w)//2
bimg[:,dw:dw+w]=img[:,:]

bimg=cv2.resize(bimg,size)  
return bimg

def getHog(img,cell=(16,16),block=(3,3)):
vec=feature2d.hog(img,12,cell,block,'L2')
return vec
#main
gimg=imgPrepare('e:/sx.jpg')
lines=splitchar(gimg,axis=1)
chars=[]
for line in lines:
charlist=splitchar(line,axis=0)
cchars=[ myResize(splitBox(c)) for c in charlist]
chars.append(cchars)
chars=np.asarray(chars)
X=[]
Y=[]
y=0
for linech in chars:

for ch in linech:  
    chhog=getHog(ch)  
    X.append(chhog)  
    Y.append(y)

y+=1

KNC=nhb.KNeighborsClassifier(algorithm='ball_tree',n_neighbors=3)
KNC.fit(X,Y)

joblib.dump(KNC,'knc.knn')

def predict(img):
knc=nhb.KNeighborsClassifier(algorithm='ball_tree',n_neighbors=3)
knc=joblib.load('knc.knn')
lines=splitchar(img,axis=1)
chars=[]
for line in lines:
charlist=splitchar(line,axis=0)
cchars=[ myResize(splitBox(c)) for c in charlist]
chars.append(cchars)

 chars=np.asarray(chars)

 Y=\[\]  
 for linech in chars:  
    x=\[\]  
    for ch in linech:  
        chhog=getHog(ch)  
        x.append(chhog)

    y=knc.predict(x)  
    print(y)  
    Y.append(y)

 return Y