2017-02-15 12 views
1

Я пытаюсь преобразовать перспективу в 4 точки, чтобы начать делать OCR.Ошибка 4-х точечного перфективного преобразования

Начиная со следующим изображением я могу обнаружить номерной знак

enter image description here

и обрезать его с зеленой коробкой, являющейся ограничивающая рамкой и красными точками, являющихся углами прямоугольника, я хочу, чтобы умиротворять вверх.

enter image description here

Это выход преобразования.

enter image description here

На первый взгляд швы сделали преобразование наизнанку (с учетом части либо сторону, а не между точками).

Я использую пакет imutils для преобразования и работы от this и this в качестве руководства. Я уверен, что это что-то относительно просто, что мне не хватает.

#!/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

EDIT: Как вы не хотели жесткий код конечной ширины, высота пластины, поэтому для того, чтобы сделать расчеты более гибкие, вы можете рассчитать ширину и высоту пластины из 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

 Смежные вопросы

  • Нет связанных вопросов^_^