2017-02-15 28 views
1

我一直在嘗試做一個4點透視變換,以便開始做一些OCR。4點持久性轉換失敗

與下面的圖片開始,我可以檢測號牌

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

我會建議你使用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)) 
+0

這就是w帽子imutils代碼應該是這樣做(http://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/#crayon-58a578867d24b280571411),它看起來要做的同樣的事情,只是計算動態輸出的尺寸 – hardillb

+0

所以你想要你的輸出尺寸在飛行@hardillb上計算? – ZdaR

+0

我想保持它在相同的規模開始,然後我可以稍後重新調整它 – hardillb