2016-03-29 12 views
2

Ich versuche, diesen Brief begradigen, aber ich bin mir nicht sicher, wie das Begrenzungsrechteck dazu verwenden.Verwenden von umschließenden Rechteck, um Drehwinkel nicht funktioniert (OpenCV/Python)

Hier ist, was ich bisher:

import cv2 
import numpy as np 

img = cv2.imread('rtes.jpg',0) 

ret,thresh = cv2.threshold(img,127,255,0) 
ret,contours,hierarchy = cv2.findContours(thresh, 1, 2) 

cnt = contours[0] 
M = cv2.moments(cnt) 
print M 
cx = int(M['m10']/M['m00']) 
cy = int(M['m01']/M['m00']) 
#cnt = contours[2] 
#cv2.drawContours(img, [cnt], 0, (0,255,0), 3) 
rect = cv2.minAreaRect(cnt) 
box = cv2.boxPoints(rect) 
box = np.int0(box) 
cv2.drawContours(img,[box],0,(255,0,0),2) 
cv2.imshow('img',img) 

k = cv2.waitKey(0) 
if k == 27:   # wait for ESC key to exit 
    cv2.destroyAllWindows() 

und hier ist das Ergebnis: enter image description here

Ich habe in OpenCV docs sehe es zum Laufen zu bringen, war aber nicht in der Lage es zum Laufen zu bringen. Ich versuche schließlich, eine Schleife zu schreiben, die 4 Winkel ausprobieren wird, um zu sehen, ob es gerade ist.

Antwort

3
cv2.minAreaRect(cnt) 

gibt ein Box2D-Objekt zurück, das bereits Rotationsinformationen speichert.

(x,y),(width,height),theta 

wobei theta der Winkel zwischen der Horizontalen und der ersten Seite des Box2D Objekt, im Beispiel die kürzere Seite der Innenkontur umgeben ist.

Es hängt davon ab, was Sie versuchen als Endergebnis zu erreichen, aber wenn Sie nur dieses spezielle Beispiel zu drehen versuchen, könnten Sie es auf diese Weise tun:

rows, cols = img.shape 
rect = cv2.minAreaRect(cnt) 
center = rect[0] 
angle = rect[2] 
rot = cv2.getRotationMatrix2D(center, angle-90, 1) 
print(rot) 
img = cv2.warpAffine(img, rot, (rows,cols)) 
Verwandte Themen