(一)车牌识别
下面我们要实现的功能是识别图片中的车牌并将其用原谅色进行框选,然后截取并显示车牌的图片,最后当鼠标在Result上左键双击时保存车牌图片到指定文件夹
import cv2
platenumber = cv2.CascadeClassifier("haarcascade_russian_plate_number.xml")
#鼠标回调函数
def MouseAction(event,x,y,flags,param):
if event ==cv2.EVENT_LBUTTONDBLCLK:#如果左键双击
#这里是将提取出的车牌图片放在Scanned文件夹下,并命名为PlateNumber
#################################################################
cv2.imwrite("Scanned/PlateNumber" + ".jpg", imgRoi)#你需要在你的python文件下创建一个Scanned文件夹
cv2.rectangle(img, (320, 200), (750, 300), (0, 255, 0), cv2.FILLED)
cv2.putText(img, "Scan Saved", (350, 265), cv2.FONT_HERSHEY_DUPLEX,
2, (0, 0, 255), 2)
cv2.imshow("Result", img)
cv2.waitKey(500)
##################################################################
img=cv2.imread("number1.jpg")
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
numberPlates = platenumber.detectMultiScale(imgGray, 1.1, 10)
for (x, y, w, h) in numberPlates:
ratio = w/float(h)
print(ratio)
if ratio>2.7 and ratio<3.3:#这里过滤一下
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 3)
cv2.putText(img,"Number Plate",(x,y-5),
cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0),3)
imgRoi = img[y:y+h,x:x+w]
cv2.imshow("ROI", imgRoi)
cv2.imshow("Result", img)
cv2.setMouseCallback('Result',MouseAction)#小伙伴们在Result图片上左键双击,就可以保存ROI图片
cv2.waitKey(0)
识别车牌模型文件的百度链接
提取码:5ng2
(二)视频流的处理
前几天有小伙伴问我,怎么处理视频中的某一帧,其实很简单。我们只需将目标视频先拆分成每一帧图片,然后将在得到的图片中处理中处理目标帧图片(使用上面这种的话,路线有点麻烦)
我们先分解视频
import cv2
import numpy as np
import os
##读取视频,并逐帧分解成图片
cap = cv2.VideoCapture('1.mp4') #打开一个视频
isOpened = cap.isOpened() #判断是否打开
print(isOpened)
#获取视频的相关信息,视频的每一帧图片的宽度都是一致的
fps = cap.get(cv2.CAP_PROP_FPS) # 帧率<每秒中展示多少张图片>
count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))#获取视频的总帧数
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) #获取宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) #获取高度
print(fps,count,width,height) #输出相关信息
i = 0
while (isOpened):
#读取视频的前两秒的图像,共计2*int(fps)张
if i ==count :
break
else:
i = i+1
(flag,frame) = cap.read() #读取每一张 flag frame
filename = 'image'+str(i)+'.jpg'
#将读取的图片写入文件中,
if flag == True:
cv2.imwrite(r'./results' + os.sep + filename,frame,[cv2.IMWRITE_JPEG_QUALITY,100])
#写入文件,1文件名 2文件内容 3图片质量设置
print('success!')
小伙伴们,可以看见视频被分解成图片并放在了指定的文件夹下,现在你可以处理你的目标帧图片
接下来,我们就是将所有的图片合成为视频
import cv2
#读取一张图片
img = cv2.imread('results/image1.jpg')#从之前文件夹取出图片
#获取当前图片的信息
imgInfo = img.shape
size = (imgInfo[1],imgInfo[0])
fps=30#之前分解的的视频帧率为30
fourcc = cv2.VideoWriter_fourcc(*'XVID')
videowrite = cv2.VideoWriter('1.avi',fourcc , fps,size)
#第一个参数是合成之后的视频的名称
#第二个参数是可以使用的编码器,一般为-1
#第三个参数是帧率即每秒钟展示多少张图片
#第四个参数是图片大小信息,这里保持大小不变
for i in range(1,306):#因为之前的视频共306帧
fileName = 'image' + str(i) + '.jpg'
img = cv2.imread('results/fileName')
#写入参数,参数是图片编码之前的数据
videowrite.write(img)
print('success!')
好了,大功告成
上面这种方法有点麻烦,我们来一种简单的
import cv2
cap = cv2.VideoCapture('1.mp4') #传入目标视频
cap.set(cv2.CAP_PROP_POS_FRAMES,111) #设置要获取的帧号
rat,frame=cap.read()
cv2.imwrite('target.jpg',frame,[cv2.IMWRITE_JPEG_QUALITY,100])
cv2.imshow('frame', frame)
cv2.waitKey(0)
在python文件夹下也可以看到刚才得到的目标图片
PS:本来还想写一个迷宫破解的,但是破解迷宫对迷宫的图片有一定的要求,所以就没写了,下面是别的大佬写的迷宫破解,感兴趣的小伙伴可以看看(当然,也有其他方法,小伙伴们可以自行百度看看)
https://blog.csdn.net/github_39611196/article/details/81560719
(三)结语
学习opencv有很多的方法,我的建议是你可以加一些群,可以充分利用B站,CSDN,和百度。
在我的博客中,我不会讲解opencv的算法实现(当然我也不太会),我只会讲解一些函数的调用,不理解就多改一些参数,多尝试尝试,慢慢你就理解来。相信你总有一天可以说opencv不过“Ctrl+C,Crtl+V”
如果有什么错误的地方,还请大家批评指正,最后,希望小伙伴们都能有所收获。