6 votes

Comment puis-je trouver par programme l'emplacement des pixels d'éléments spécifiques dans une image ?

Je suis en train de construire un lecteur automatique de compteurs d'électricité et de gaz en utilisant OpenCV et Python. Je suis allé jusqu'à prendre des photos avec une webcam :

enter image description here

Je peux ensuite utiliser une transformation afine pour déformer l'image (une adaptation de cet exemple ) :

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

ce qui me donne une image comme celle-ci :

enter image description here

Je dois encore extraire le texte à l'aide d'une sorte de routine OCR, mais j'aimerais d'abord automatiser la partie qui identifie les emplacements de pixels auxquels appliquer la transformation affine. Ainsi, si quelqu'un frappe la webcam, cela n'empêchera pas le logiciel de fonctionner.

2voto

Diana Points 1211

Puisque votre image est plutôt planaire, vous pouvez chercher à trouver la homographie entre l'image que vous obtenez de la webcam et l'image souhaitée (en position verticale).

Edit : Ceci fera pivoter l'image en position verticale. Une fois que vous avez enregistré votre image (en la mettant en position verticale), vous pouvez faire des projections par ligne ou par colonne (additionnez tous les pixels des colonnes pour obtenir un vecteur, additionnez tous les pixels des lignes pour obtenir un vecteur). Vous pouvez utiliser ces vecteurs pour déterminer l'endroit où vous avez un saut de couleur, et le recadrer à cet endroit.

Vous pouvez également utiliser la transformation de Hough, qui permet d'obtenir des lignes dans une image. Vous pouvez probablement vous en sortir sans enregistrer l'image si vous faites cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X