2013-07-26 93 views
3

Example imagePython:检测黑色方块

我试图检测黑色方块。

这里是我的代码SOFAR ...

frame=cv2.imread('squares.jpg') 
    img=cv2.GaussianBlur(frame, (5,5), 0) 

    img=cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

    lower=np.array([0, 0, 0],np.uint8) 
    upper=np.array([10, 50, 50],np.uint8) 
    separated=cv2.inRange(img,lower,upper) 


    #this bit draws a red rectangle around the detected region 
    contours,hierarchy=cv2.findContours(separated,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 
    max_area = 0 
    largest_contour = None 
    for idx, contour in enumerate(contours): 
     area = cv2.contourArea(contour) 
     if area > max_area: 
      max_area = area 
      largest_contour=contour 
      if not largest_contour==None: 
       moment = cv2.moments(largest_contour) 
       if moment["m00"] > 1000: 
        rect = cv2.minAreaRect(largest_contour) 
        rect = ((rect[0][0], rect[0][1]), (rect[1][0], rect[1][1]), rect[2]) 
        (width,height)=(rect[1][0],rect[1][1]) 
        print str(width)+" "+str(height) 
        box = cv2.cv.BoxPoints(rect) 
        box = np.int0(box) 
        if(height>0.9*width and height<1.1*width): 
          cv2.drawContours(frame,[box], 0, (0, 0, 255), 2) 

    cv2.imshow('img',frame) 

然后我想提请各地检测出的黑区中的红方。

的代码适用于黄色,橙色,红色和绿色具有下列参数:

colours=['yellow','orange','red','green','black','white'] 
uppers=[[20,100,100],[5,100,100],[0,100,100],[???,???,???],[???,???,???]] 
lowers=[[30,255,255],[15,255,255],[6,255,255],[???,???,???],[???,???,???]] 

我只是无法得到黑色或白色工作...

有什么想法?

+0

我认为你可以尝试切换白色和黑色!它可能工作 – Khashayar

+0

我对opencv没有太多经验,但值应该大致(假设图片为8位)黑色:upper:'[180,10,50]',lower:'[0,0,0] ';白色:'[180,10,255]',较低:'[0,0,205]'。 Finetuning将是必要的 –

回答

3

这里的关键直觉是黑色坐落在HSV cylinder所有的色调和饱和度值,但仅在低价值的值。我发现一个下界[0, 0, 0]和上限[180, 255, 50]将定位黑色方形,像这样:

Located black box

我还要提到的是你的方法不适用于找到白色正方形,有以下几个原因有:

  • 存在着多个白色方块。你的方法只选择最大的轮廓,这意味着每种颜色只能检测到一个正方形。
  • 很难区分“白色正方形”与打印纸张的颜色。你可能会得到一个连接正方形和两侧纸条的轮廓。