在进行光学字符识别(OCR)之前,通常需要先对图像中的预测区域进行裁剪。这是因为如果对整张图像进行OCR处理,可能会产生大量噪声,导致输出结果难以处理。本文将指导如何使用Python的cv2库来裁剪计算机视觉模型预测的区域。将通过一个实例来演示如何从图像中裁剪出车牌。完成本教程后,将能够创建一个只包含摩托车车牌的小图像,如下所示:
💡 如果正在使用分割模型,可以参考教程,了解如何创建分割掩码来裁剪模型预测。
现在,让开始吧!
计算机视觉工具的常见输出,包括tensorflow.js和Roboflow,是返回一个x、y、宽度和高度值,这些值对应于预测的位置。要使用cv2裁剪模型预测,需要计算x1、y1、x2、y2坐标,这些坐标对应于想要裁剪的每个区域的每个角落。这个区域通常被称为“感兴趣区域”(ROI)。将在下面的代码中使用这个缩写。
在本节中,将从这张摩托车的图像中裁剪出车牌:
如果还没有x1、y1、x2、y2坐标,需要进行一些转换来计算它们。以下代码采用x、y、宽度和高度值,并将它们转换为绘制图像所需的坐标。这段代码假设已经有了想要裁剪的预测位置。如果还没有一个模型来检索预测,请查看本文后面的“设置模型”部分。
import cv2
image = cv2.imread("example.jpeg")
prediction = {'x': 181.5, 'y': 222.5, 'width': 97.0, 'height': 89.0}
roi_x = int(prediction['x'] - prediction['width'] / 2)
roi_y = int(prediction['y'] - prediction['height'] / 2)
roi_width = int(prediction['width'])
roi_height = int(prediction['height'])
roi = image[roi_y:roi_y+roi_height, roi_x:roi_x+roi_width]
如果已经有了x1、y1、x2、y2坐标,可以直接在“roi”裁剪中使用它们:
x1 = 133
y1 = 178
x2 = 230
y2 = 267
roi = image[y1:y2, x1:x2]
现在已经有一个变量存储了感兴趣区域的内容,可以将其内容保存到文件中。可以使用cv2.imwrite()函数来实现这一点:
cv2.imwrite("cropped_region.jpeg", roi)
这段代码将裁剪的区域保存到一个名为“cropped_region.jpeg”的文件中。让打开生成的文件来查看输出:
代码已经成功地裁剪了车牌!
本教程使用的是一个开源的车牌检测模型,包含超过10,000张图片,托管在Roboflow Universe上。要使用这个模型,需要一个免费的Roboflow账户。当创建账户时,将获得一个API密钥,可以使用它来运行Universe上公共模型的推理。
创建一个Roboflow账户,然后点击车牌模型页面侧边栏上的“模型”链接。
从模型页面,可以测试模型以确保它符合需求。在上面的截图中,一张有一辆车的图片已经通过模型运行。
模型返回了一个预测,并在图片上用黄绿色框注释。可以将图片拖放到页面上运行推理,或者从页面上的其他选项中选择(网络摄像头,从测试集中选择一个样本,粘贴URL)。
在模型页面上,向下滚动到标有“托管API”的部分,并复制出现在页面上的Python代码片段到一个新的Python文件中:
from roboflow import Roboflow
rf = Roboflow(api_key="YOUR_KEY")
project = rf.workspace().project("license-plate-recognition-rxg4e")
model = project.version(4).model
这段代码创建了一个“model”对象,可以使用它来对图片进行推理。可以对上传到Roboflow的图片或本地图片进行推理。
现在已经准备好了模型,可以开始运行推理:
inference = model.predict("example.jpeg", confidence=40)
predictions = inference.json()
这段代码返回一个字典列表,其中包含所有预测的信息,这些预测的置信度值等于或大于40%。每个字典包含x、y、宽度和高度值,可以使用这些值来计算需要裁剪模型预测的x1、y1、x2、y2坐标。
在本文中,展示了如何裁剪计算机视觉模型预测,并将裁剪结果保存到一个新文件中。使用了一组公式来计算x1、y1、x2、y2坐标,然后使用这些坐标来检索与感兴趣区域相关的图像数据。然后将这些结果保存到文件中。