4点持续变换失败

时间:2017-02-15 23:40:37

标签: python opencv

我一直试图进行4点透视转换,以便开始做一些OCR。

从下图开始,我可以检测到号牌

enter image description here

并将绿色框作为边界框裁剪出来,红色圆点是我想要平方的矩形角。

enter image description here

这是变换的输出。

enter image description here

初看起来它接缝完成了内部的转换(将部分放在两边而不是点之间)。

我使用imutils包进行转换,并以thisthis为指导。我确定这是一件相对简单的事情,我不知道。

#!/usr/bin/python
import numpy as np
import cv2
import imutils
from imutils import contours
from imutils.perspective import four_point_transform

img = cv2.imread("sample7-smaller.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.bilateralFilter(gray,15,75,75)
v = np.median(blurred)
lower = int(max(0, (1.0 - 0.33) * v))
upper = int(min(255, (1.0 + 0.33) * v))
edged = cv2.Canny(blurred, lower, upper, 255)

conts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
conts = conts[0] if imutils.is_cv2() else conts[1]
conts = sorted(conts, key=cv2.contourArea, reverse=True)

for cnt in conts:
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
    if len(approx) == 4:
        x,y,w,h = cv2.boundingRect(cnt)
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
        for i in approx:
            cv2.circle(img,(i[0][0], i[0][1]),2,(0,0,255), thickness=4)
        warped = four_point_transform(img, approx.reshape(4,2))
        cv2.imshow("crop",img[y:y+h,x:x+w])
        cv2.imshow("warped", warped)
        cv2.waitKey(0)

1 个答案:

答案 0 :(得分:3)

我建议您使用OpenCV Perspective Transform方法,根据给定的图像获得所需的结果:

enter image description here

首先标记src点的位置:

src_pts = np.array([[8, 136], [415, 52], [420, 152], [14, 244]], dtype=np.float32)

假设你想把这个号牌放在一个50x200的矩阵中,那么目标点就是:

dst_pts = np.array([[0, 0],   [200, 0],  [200, 50], [0, 50]], dtype=np.float32)

将透视变换矩阵视为:

M = cv2.getPerspectiveTransform(src_pts, dst_pts)
warp = cv2.warpPerspective(img, M, (200, 50))

enter image description here

编辑:因为你不想硬编码最终宽度,板的高度,所以为了使计算更灵活,你可以从4个标记点计算板的宽度和高度:

def get_euler_distance(pt1, pt2):
    return ((pt1[0] - pt2[0])**2 + (pt1[1] - pt2[1])**2)**0.5

src_pts = np.array([[8, 136], [415, 52], [420, 152], [14, 244]], dtype=np.float32)

width = get_euler_distance(src_pts[0][0], src_pts[0][1])
height = get_euler_distance(src_pts[0][0], src_pts[0][3])

dst_pts = np.array([[0, 0],   [width, 0],  [width, height], [0, height]], dtype=np.float32)

M = cv2.getPerspectiveTransform(src_pts, dst_pts)
warp = cv2.warpPerspective(img, M, (width, height))