PyTorch + openCV 车牌识别(一)

PyTorch + openCV 车牌识别(一)

  • 注意
  • 利用cv识别车牌并切割字符

注意

本项目仅是初学者学习pytorch过程中随手写的,有些地方不够严谨请谅解,仅供参考

利用cv识别车牌并切割字符

  1. 首先下载opencv包并导入一些需要的包
import cv2
import numpy as np
from PIL import Image
  1. 由于是用笔记本电脑,因此我们使用网上寻找的图片进行图像处理,我们导入该图片。
    imread函数中放的是你图片的路径,我们先对图片尺寸进行统一规定,并对原图进行滤波。(滤波这个步骤并不是当时写的时候想到的,而是后面识别效果不佳所以进行一定程度的滤波)
img_init = cv2.imread(self.carlicense_content)  # 加载原始图片
img_resize = cv2.resize(img_init, dsize=(1000, 600), fx=0, fy=0)  # 重置图片尺寸
img_blur = cv2.blur(img_resize, (2, 2))  # 对图片进行降噪
  1. 通过对图片中车牌蓝色域的RGB三通道值进行采集,即可获得其颜色范围,然后依靠inRange()函数将车牌部分选择出来。
    再把该色域内最大面积的部分框出来,便是车牌的区域,记录下矩形的四个角点。
    当然,项目是用来练手的简单项目,所以不考虑透视变换等情况,因为我先择的图片视角都还算正。
lower_limi = np.array([80, 30, 0])  # 设置色域上下界
upper_limi = np.array([230, 110, 70])
img_limi = cv2.inRange(img_blur, lower_limi, upper_limi)  # 选出指定色域(二值化,黑色:0,白色:255)
cont = cv2.findContours(img_limi, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  # 找出色域外边界
c = max(cont, key=cv2.contourArea)  # 在边界中找最大面积的区域
rect = cv2.minAreaRect(c)  # 绘制出该区域最小外接矩形
box = cv2.boxPoints(rect)  # 记录上述矩形四点坐标
  1. 当然,对于采集图片中某一像素点的RGB三通道值,需要用到鼠标回调函数。需要注意的是,三通道值的显示顺序依次是B,G,R。
def mouse_callback(event, x, y, flags, param):
   if event == cv2.EVENT_LBUTTONDBLCLK:
   print('BGR:', img_resize[y, x], 'x:', x, 'y:', y)
        
cv2.setMouseCallback('IMG', mouse_callback)
  1. 在步骤2和3中,所有定义的图片均可用imshow()函数进行显示并验证调试,代码如下,img_resize可替换成其他变量名。
cv2.namedWindow('IMG', cv2.WINDOW_NORMAL)
cv2.imshow('IMG', img_resize)
cv2.waitKey(0)
  1. 实现上述功能后的效果如下图,可通过对IMG图片的鼠标回调函数,显示某像素点的RGB三通道值,因此可获得上述第3步中的上下限值。
    PyTorch + openCV 车牌识别(一)_第1张图片7. 到此,可以通过色域识别在图中框出车牌的位置,如下图:
    8. 我们将第3步里四个点的坐标用来扣出车牌,并存入另一个变量img_final中。再将新的车牌图片二值化。实现效果如下图:
img_final = img_resize[int(min(box[1][1], box[2][1]))
           :int(max(box[0][1], box[3][1]))
           , int(min(box[0][0], box[1][0]))
           :int(max(box[2][0], box[3][0]))]  # 圈出车牌
img_final_resize = cv2.resize(img_final, dsize=(200, 50), fx=0, fy=0)
lower_limi2 = np.array([100, 100, 100])  # 设置色域上下界
upper_limi2 = np.array([255, 255, 255])
img_final_bin = cv2.inRange(img_final_resize, lower_limi2, upper_limi2)

PyTorch + openCV 车牌识别(一)_第2张图片
PyTorch + openCV 车牌识别(一)_第3张图片

  1. 到此我们可以识别出车牌并进行二值化,接下来需要分割车牌中的每个字符。这方面内容我会放在该项目的第(二)章节说明。

你可能感兴趣的:(opencv,pytorch,python,图像识别,计算机视觉)