代码之家  ›  专栏  ›  技术社区  ›  dancavallaro

使用OpenCV查找图像中矩形的位置

  •  12
  • dancavallaro  · 技术社区  · 16 年前

    我正在尝试使用OpenCV“解析”iPhone游戏的屏幕截图 Blocked . 截图被裁剪为如下所示:

    Blocked screenshot

    5 回复  |  直到 16 年前
        1
  •  15
  •   Glorfindel Doug L.    7 年前

    类似的问题已经讨论过: How to recognize rectangles in this image?

    至于您的数据,您试图查找的矩形是唯一的黑色对象。所以你可以试着做一个阈值二值化:黑色像素是那些所有三个RGB值都小于40的像素(我根据经验发现)。此简单操作使您的图片看起来如下所示:

    binarized picture

    之后,您可以应用Hough变换来查找直线(在我提到的主题中讨论),或者您可以更轻松地进行。计算黑色像素到X轴和Y轴的积分投影(到X的投影是X_i的向量,即黑色像素数,因此它的第一个坐标等于X_i)。因此,可以得到x和y值作为投影的峰值。然后查看所有可能被发现的x和y限制的线段(如果(x_i,y_j)和(x_i,y_k)之间有很多黑色像素,那么可能有一条线)。最后,将线段组成矩形!

        2
  •  6
  •   dancavallaro    16 年前

    最后,我只是在我原来的方法的基础上,按照罗伯特在评论我的问题时提出的建议去做。在我得到矩形列表后,我运行并计算每个矩形的平均颜色。我检查平均颜色的红色、绿色和蓝色分量是否都在灰色和蓝色矩形颜色的10%以内,如果是,我保存矩形,如果不是,我丢弃矩形。这个过程给了我这样的东西:

    screenshot

    从这里,获得我需要的信息(方向、起点和每个矩形的长度,将游戏窗口视为6x6网格)非常简单。

        3
  •  4
  •   nathancy    6 年前

    这里有一个完整的Python解决方案。其主要思想是:


    下面是每个检测到的矩形轮廓的可视化

    enter image description here

    结果

    enter image description here

    import cv2
    
    image = cv2.imread('1.png')
    blur = cv2.pyrMeanShiftFiltering(image, 11, 21)
    gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    
    cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.015 * peri, True)
        if len(approx) == 4:
            x,y,w,h = cv2.boundingRect(approx)
            cv2.rectangle(image,(x,y),(x+w,y+h),(36,255,12),2)
    
    cv2.imshow('thresh', thresh)
    cv2.imshow('image', image)
    cv2.waitKey()
    
        4
  •  3
  •   Niki    16 年前

    块看起来像位图-为什么不使用简单的模板匹配,针对每个块大小/颜色/方向使用不同的模板?

        5
  •  2
  •   Hannes Ovrén    16 年前

    因为这些线比矩形的边界要细得多,所以我首先应用 morphological operations

    使用如下所示的结构图元:

     element = [ 1 1
                 1 1 ]
    

    应删除小于两个像素宽的线条。删除小线条后,OpenCV的矩形查找算法很可能会为您完成其余的工作。 侵蚀可以通过函数在OpenCV中完成 cvErode

        6
  •  0
  •   Egon Alon Lavian    16 年前

    尝试一个像哈里斯角检测器这样的角检测器。一般来说,在多分辨率下尝试这种方法也是一个好主意:对不同的放大倍数进行一些预处理。