当前位置:   article > 正文

OpenCV第七篇:车牌识别_opencv车牌识别

opencv车牌识别

目录

1.调整图片大小,并获取灰度图

 2.双边滤波去除噪音:cv2.bilateralFilter()。

3.边缘检测:cv2.Canny(image,threshold1,threshold2)

4.寻找轮廓:车牌(四边形)

​编辑 5.图像位运算进行遮罩

6.图像剪裁

7.字符识别:OCR


1.调整图片大小,并获取灰度图

  1. import cv2
  2. if __name__ == '__main__':
  3. img = cv2.imread('2.jpeg')
  4. # 调整图片大小
  5. img = cv2.resize(img, (620, 480))
  6. # 灰度图
  7. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  8. # 显示效果
  9. cv2.imshow('original', img)
  10. cv2.waitKey(0)
  11. cv2.destroyAllWindows()

 2.双边滤波去除噪音:cv2.bilateralFilter()。

  1. import cv2
  2. if __name__ == '__main__':
  3. img = cv2.imread('2.jpeg')
  4. # 调整图片大小
  5. img = cv2.resize(img, (620, 480))
  6. # 灰度图
  7. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  8. # 双边滤波
  9. gray1 = cv2.bilateralFilter(gray, 13, 15, 15)
  10. # 显示效果
  11. cv2.imshow('gray', gray)
  12. cv2.imshow('bilateralFilter', gray1)
  13. cv2.waitKey(0)
  14. cv2.destroyAllWindows()

3.边缘检测:cv2.Canny(image,threshold1,threshold2)

仅显示强度梯度大于最小阈值threshold1且小于最大阈值threshold2的边缘。

  1. import cv2
  2. if __name__ == '__main__':
  3. img = cv2.imread('2.jpeg')
  4. # 调整图片大小
  5. img = cv2.resize(img, (620, 480))
  6. # 灰度图
  7. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  8. # 双边滤波
  9. gray = cv2.bilateralFilter(gray, 13, 15, 15)
  10. # 边缘检测
  11. edged = cv2.Canny(gray, 30, 200)
  12. # 显示效果
  13. cv2.imshow('gray', gray)
  14. cv2.imshow('edged', edged)
  15. cv2.waitKey(0)
  16. cv2.destroyAllWindows()

4.寻找轮廓:车牌(四边形)

pip install imutils
  1. import cv2
  2. import imutils
  3. if __name__ == '__main__':
  4. img = cv2.imread('2.jpeg')
  5. # 调整图片大小
  6. img = cv2.resize(img, (620, 480))
  7. # 灰度图
  8. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  9. # 双边滤波
  10. gray = cv2.bilateralFilter(gray, 13, 15, 15)
  11. # 边缘检测
  12. edged = cv2.Canny(gray, 30, 200)
  13. # 寻找轮廓(图像矩阵,输出模式,近似方法)
  14. contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  15. # 配合上面一句使用:用来兼容cv2和cv3
  16. contours = imutils.grab_contours(contours)
  17. # 根据区域大小排序取前十个
  18. contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
  19. screenCnt = None
  20. # 遍历轮廓,找到车牌轮廓
  21. for c in contours:
  22. # 计算轮廓周长(轮廓,是否闭合)
  23. peri = cv2.arcLength(c, True)
  24. # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标
  25. approx = cv2.approxPolyDP(c, 0.018 * peri, True)
  26. # 获取四个顶点(即四边形)
  27. if len(approx) == 4:
  28. screenCnt = approx
  29. break
  30. # 如果找到了四边形
  31. if screenCnt is not None:
  32. # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)
  33. cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)
  34. # 显示效果
  35. cv2.imshow('img', img)
  36. cv2.imshow('gray', gray)
  37. cv2.imshow('edged', edged)
  38. cv2.waitKey(0)
  39. cv2.destroyAllWindows()

 5.图像位运算进行遮罩

  1. import cv2
  2. import imutils
  3. import numpy as np
  4. if __name__ == '__main__':
  5. img = cv2.imread('2.jpeg')
  6. # 调整图片大小
  7. img = cv2.resize(img, (620, 480))
  8. # 灰度图
  9. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  10. # 双边滤波
  11. gray = cv2.bilateralFilter(gray, 13, 15, 15)
  12. # 边缘检测
  13. edged = cv2.Canny(gray, 30, 200)
  14. """寻找轮廓(图像矩阵,输出模式,近似方法)"""
  15. contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  16. # 配合上面一句使用:用来兼容cv2和cv3
  17. contours = imutils.grab_contours(contours)
  18. # 根据区域大小排序取前十个
  19. contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
  20. screenCnt = None
  21. # 遍历轮廓,找到车牌轮廓
  22. for c in contours:
  23. # 计算轮廓周长(轮廓,是否闭合)
  24. peri = cv2.arcLength(c, True)
  25. # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标
  26. approx = cv2.approxPolyDP(c, 0.018 * peri, True)
  27. # 获取四个顶点(即四边形)
  28. if len(approx) == 4:
  29. screenCnt = approx
  30. break
  31. # 如果找到了四边形
  32. if screenCnt is not None:
  33. # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)
  34. cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)
  35. """遮罩"""
  36. # 创建一个灰度图一样大小的图像矩阵
  37. mask = np.zeros(gray.shape, np.uint8)
  38. # 将创建的图像矩阵的车牌区域画成白色
  39. cv2.drawContours(mask, [screenCnt], 0, 255, -1, )
  40. # 图像位运算进行遮罩
  41. new_image = cv2.bitwise_and(img, img, mask=mask)
  42. # 显示效果
  43. cv2.imshow('img', img)
  44. cv2.imshow('gray', gray)
  45. cv2.imshow('edged', edged)
  46. cv2.imshow('new_image', new_image)
  47. cv2.waitKey(0)
  48. cv2.destroyAllWindows()

6.图像剪裁

  1. import cv2
  2. import imutils
  3. import numpy as np
  4. if __name__ == '__main__':
  5. img = cv2.imread('2.jpeg')
  6. # 调整图片大小
  7. img = cv2.resize(img, (620, 480))
  8. # 灰度图
  9. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  10. # 双边滤波
  11. gray = cv2.bilateralFilter(gray, 13, 15, 15)
  12. # 边缘检测
  13. edged = cv2.Canny(gray, 30, 200)
  14. """寻找轮廓(图像矩阵,输出模式,近似方法)"""
  15. contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  16. # 配合上面一句使用:用来兼容cv2和cv3
  17. contours = imutils.grab_contours(contours)
  18. # 根据区域大小排序取前十个
  19. contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
  20. screenCnt = None
  21. # 遍历轮廓,找到车牌轮廓
  22. for c in contours:
  23. # 计算轮廓周长(轮廓,是否闭合)
  24. peri = cv2.arcLength(c, True)
  25. # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标
  26. approx = cv2.approxPolyDP(c, 0.018 * peri, True)
  27. # 获取四个顶点(即四边形)
  28. if len(approx) == 4:
  29. screenCnt = approx
  30. break
  31. # 如果找到了四边形
  32. if screenCnt is not None:
  33. # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)
  34. cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)
  35. """遮罩"""
  36. # 创建一个灰度图一样大小的图像矩阵
  37. mask = np.zeros(gray.shape, np.uint8)
  38. # 将创建的图像矩阵的车牌区域画成白色
  39. cv2.drawContours(mask, [screenCnt], 0, 255, -1, )
  40. # 图像位运算进行遮罩
  41. new_image = cv2.bitwise_and(img, img, mask=mask)
  42. """图像剪裁"""
  43. # 获取车牌区域的所有坐标点
  44. (x, y) = np.where(mask == 255)
  45. # 获取底部顶点坐标
  46. (topx, topy) = (np.min(x), np.min(y))
  47. # 获取底部坐标
  48. (bottomx, bottomy,) = (np.max(x), np.max(y))
  49. # 剪裁
  50. Cropped = gray[topx:bottomx, topy:bottomy]
  51. # 显示效果
  52. cv2.imshow('img', img)
  53. cv2.imshow('gray', gray)
  54. cv2.imshow('edged', edged)
  55. cv2.imshow('Cropped', Cropped)
  56. cv2.waitKey(0)
  57. cv2.destroyAllWindows()

7.字符识别:OCR

  1. import cv2
  2. import imutils
  3. import numpy as np
  4. if __name__ == '__main__':
  5. img = cv2.imread('2.jpeg')
  6. # 调整图片大小
  7. img = cv2.resize(img, (620, 480))
  8. # 灰度图
  9. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  10. # 双边滤波
  11. gray = cv2.bilateralFilter(gray, 13, 15, 15)
  12. # 边缘检测
  13. edged = cv2.Canny(gray, 30, 200)
  14. """寻找轮廓(图像矩阵,输出模式,近似方法)"""
  15. contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  16. # 配合上面一句使用:用来兼容cv2和cv3
  17. contours = imutils.grab_contours(contours)
  18. # 根据区域大小排序取前十个
  19. contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
  20. screenCnt = None
  21. # 遍历轮廓,找到车牌轮廓
  22. for c in contours:
  23. # 计算轮廓周长(轮廓,是否闭合)
  24. peri = cv2.arcLength(c, True)
  25. # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标
  26. approx = cv2.approxPolyDP(c, 0.018 * peri, True)
  27. # 获取四个顶点(即四边形)
  28. if len(approx) == 4:
  29. screenCnt = approx
  30. break
  31. # 如果找到了四边形
  32. if screenCnt is not None:
  33. # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)
  34. cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)
  35. """遮罩"""
  36. # 创建一个灰度图一样大小的图像矩阵
  37. mask = np.zeros(gray.shape, np.uint8)
  38. # 将创建的图像矩阵的车牌区域画成白色
  39. cv2.drawContours(mask, [screenCnt], 0, 255, -1, )
  40. # 图像位运算进行遮罩
  41. new_image = cv2.bitwise_and(img, img, mask=mask)
  42. """图像剪裁"""
  43. # 获取车牌区域的所有坐标点
  44. (x, y) = np.where(mask == 255)
  45. # 获取底部顶点坐标
  46. (topx, topy) = (np.min(x), np.min(y))
  47. # 获取底部坐标
  48. (bottomx, bottomy,) = (np.max(x), np.max(y))
  49. # 剪裁
  50. Cropped = gray[topx:bottomx, topy:bottomy]
  51. """OCR识别"""
  52. text = pytesseract.image_to_string(Cropped, config='--psm 11')
  53. print("车牌结果:", text)
  54. # 显示效果
  55. cv2.imshow('img', img)
  56. cv2.imshow('gray', gray)
  57. cv2.imshow('edged', edged)
  58. cv2.imshow('new_image', Cropped)
  59. cv2.waitKey(0)
  60. cv2.destroyAllWindows()

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/327143
推荐阅读
相关标签
  

闽ICP备14008679号