使用Python和Opencv对倾斜的数字进行反求

使用Python和Opencv对倾斜的数字进行反求,python,opencv,ocr,Python,Opencv,Ocr,我正在寻找一些OCR数字在几个不同的格式。我有一个函数,它可以在水平面上对文本进行分级,使我能够在Opencv中创建边界框,它适用于我的一幅数字图像。然而,第二个数字样式稍微倾斜(斜体),这有时会起作用,但我发现小数点大部分会丢失,因为它被合并到一个数字边界矩形中 有没有办法根据实际数字的垂直线对齐数字 下面是我在水平面上的工作函数: def deskew(img): img_edges = cv2.Canny(img, 100, 100, apertureSize=3) lin

我正在寻找一些OCR数字在几个不同的格式。我有一个函数,它可以在水平面上对文本进行分级,使我能够在Opencv中创建边界框,它适用于我的一幅数字图像。然而,第二个数字样式稍微倾斜(斜体),这有时会起作用,但我发现小数点大部分会丢失,因为它被合并到一个数字边界矩形中

有没有办法根据实际数字的垂直线对齐数字

下面是我在水平面上的工作函数:

def deskew(img):
    img_edges = cv2.Canny(img, 100, 100, apertureSize=3)
    lines = cv2.HoughLinesP(img_edges, 1, math.pi / 180.0, 100, minLineLength=20, maxLineGap=50)

    angles = []
    for x1, y1, x2, y2 in lines[0]:
        angle = math.degrees(math.atan2(y2 - y1, x2 - x1))
        angles.append(angle)

    med_angle = np.median(angles)
    rotated_img = ndimage.rotate(img, med_angle, cval=255)

    cv2.imshow("rotated image", rotated_img)
    cv2.waitKey(0)
    return rotated_img
下面是我尝试使用的图像/数字格式的类型,我通过一些手动输入发现,大约5度的角度似乎可以准确地绘制单独的边界矩形,以捕获数字和小数点

下面是手动调整的角度,显示了捕获的所有数字和小数点,可以进行OCR


通过比较垂直和水平角度计算剪切力,然后使用
cv2.warpAffine()
方法。或者,代替霍夫变换,计算二值化图像的凸包(
cv2.findContours()
,然后
cv2.convexHull()
),并从中导出剪切矩形。在
cv2.getAffineTransform()之后再次使用
cv2.warpAffine()
。可能更快。谢谢你的建议。我最终做了一个更简单(粗糙)的选择。由于这种类型的“文本”的倾斜度在5度左右是恒定的,所以我只需在水平面上进行斜视,然后将角度设置为5度,然后运行OCR。