我如何通过编程找到图像中特定特征的像素位置?

6
我正在使用OpenCV和Python构建一个自动化的电力/燃气仪表读取器。目前已经成功使用网络摄像头拍摄到了图像:

enter image description here

然后我使用仿射变换对图像进行了矫正(参考这个示例):
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

...这让我想到了一个类似于这样的图像:

在此输入图片描述

我仍然需要使用某种OCR程序提取文本,但首先我想自动化识别哪些像素位置应用仿射变换的部分。这样,如果有人碰到网络摄像头,它不会停止软件的工作。

1个回答

2
由于您的图像几乎是平面的,因此您可以尝试找到从网络摄像头获取的图像与所需图像(正立位置)之间的单应性变换homography
编辑:这将使图像旋转到正立位置。注册图像后(将其带入正立位置),您可以进行逐行或逐列投影(沿列求和所有像素以获得一个向量,沿行求和所有像素以获得一个向量)。您可以使用这些向量来确定颜色跳跃的位置,并在那里裁剪它。
或者,您可以使用霍夫变换,在图像中获得线条。如果您这样做,则可能无需注册图像。

你有使用homography的基于Python的示例吗?OpenCV网站上的示例是针对C++版本的,我很难将其翻译成Python... - Jon Cage
不,我只使用了C++调用。如果你无法直接在Python中使其工作,你可以编写一个带有Python包装器的C扩展。 - Diana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接