我目前正在开展一个大学项目,我想探索不同的计算机视觉技术。我的目标是对中国车牌进行自动车牌识别(ALPR)。到目前为止,我已经训练了一个检测模型(YOLOv5)来定位车牌。模型的边界框不会考虑图像中的任何倾斜,因此我选择暂时裁剪它们。这就是图像现在的样子:
我想使用 OpenCV 对车牌进行边缘检测,并用它进行进一步的裁剪和透视变换。我希望图像仅包含车牌,以便稍后可以使用尽可能好的输入图像进行字符分割。
不幸的是,我对计算机视觉非常陌生,无法找到适用于大多数图像并使 OpenCV 能够可靠地检测矩形车牌的预处理方法。对我来说,针对不同光照条件和车辆颜色进行预处理确实很困难。 我希望得到一些关于如何解决这个问题的建议(或者我是否应该采取不同的方法)
这就是我迄今为止使用 OpenCV 实现边缘检测所做的事情:
如果不每次都调整精明边缘检测的阈值,这种方法甚至无法找到车牌的矩形轮廓。这是调整后的结果: 从上到下的描述:
我不只是将代码转储在这里,因为我认为最大的问题是图像的预处理。
答案取决于您使用的数据集。例如,在收费公路上,交通摄像头可以直接指向车牌,从而简化了问题。与汽车行车记录仪相比,两车都在移动,问题就复杂了。同样,距离也是一个因素——收费站很近,而俯瞰州际公路的固定交通摄像头甚至可能看不到车牌。
由于这是一个学术项目,您可能专注于可以手动改进的更高质量的数据集,例如通过裁剪。尽管如此,根据我的经验,PyImageSearch 往往有很好的教程。 这是 ANPR 的此类教程。
流程如下:
rectKern = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
blackhat = cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT, rectKern)
渐变:
gradX = cv2.Sobel(blackhat, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)
高斯模糊:
gradX = cv2.GaussianBlur(gradX, (5, 5), 0)
gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKern)
thresh = cv2.threshold(gradX, 0, 255,
cv2.THRESH_BINARY | cv2.THRESH_OTSU)
等等。我建议您先阅读本教程,看看在执行 OCR 之前是否能获得改进的轮廓结果。