2013-06-23 9 views
6

Buduję automatyczny czytnik elektryczności/gazu za pomocą OpenCV i Pythona. Mam w miarę robienia zdjęć z kamery internetowej:Jak programowo znaleźć lokalizacje pikseli określonych funkcji w obrazie?

enter image description here

mogę używać afine następnie przekształcić do unwarp obraz (adaptacja this example):

def unwarp_image(img): 
    rows,cols = img.shape[:2] 
    # Source points 
    left_top = 12 
    left_bottom = left_top+2 
    top_left = 24 
    top_right = 13 
    bottom = 47 
    right = 180 
    srcTri = np.array([(left_top,top_left),(right,top_right),(left_bottom,bottom)], np.float32) 

    # Corresponding Destination Points. Remember, both sets are of float32 type 
    dst_height=30 
    dstTri = np.array([(0,0),(cols-1,0),(0,dst_height)],np.float32) 

    # Affine Transformation 
    warp_mat = cv2.getAffineTransform(srcTri,dstTri) # Generating affine transform matrix of size 2x3 
    dst = cv2.warpAffine(img,warp_mat,(cols,dst_height))  # Now transform the image, notice dst_size=(cols,rows), not (rows,cols) 

    #cv2.imshow("crop_img", dst) 
    #cv2.waitKey(0) 

    return dst 

..which daje mi coś obrazu tak:

enter image description here

jeszcze trzeba wyodrębnić tekst za pomocą niektórych rodzaj procedury OCR, ale najpierw chciałbym zautomatyzować część, która określa, w jakich lokalizacjach pikseli zastosować transformację afiniczną. Więc jeśli ktoś puka kamerę internetową, nie zatrzymuje oprogramowania.

Odpowiedz

2

Ponieważ obraz jest prawie płaski, można sprawdzić, czy znajduje się on pomiędzy obrazem z kamery internetowej a żądanym obrazem (w pozycji pionowej).

Edytuj: Spowoduje to obrócenie obrazu w pozycji pionowej. Po zarejestrowaniu obrazu (ustawieniu go w pozycji pionowej) można wykonać rzuty rzędami lub kolumnowo (zsumuj wszystkie piksele wzdłuż kolumn, aby uzyskać jeden wektor, zsumuj wszystkie piksele wzdłuż wierszy, aby uzyskać jeden wektor). Możesz użyć tych wektorów, aby dowiedzieć się, gdzie masz skok w kolorze, i przyciąć go tam.

Alternatywnie możesz użyć transformacji Hough, która daje linie na obrazie. Prawdopodobnie możesz uciec, nie rejestrując obrazu, jeśli to zrobisz.

+0

Czy masz w Pythonie przykład użycia 'homography'. Przykłady na stronie OpenCV dotyczą wersji C++ i mam problem z przetłumaczeniem go na język Python ... –

+0

Nie, użyłem tylko wywołań C++. Jeśli nie możesz uruchomić go bezpośrednio w Pythonie, prawdopodobnie możesz zapisać go jako rozszerzenie C z paczką pythona. – Diana