1. 程式人生 > >opencv 圖片最大連通區域識別

opencv 圖片最大連通區域識別

這裡用的opencv 的python api可能跟c的api 有少許區別

1. 圖片初期處理

    gray = cv.cvCreateImage (cv.cvSize (image.width, image.height), 8, 1)
    edge = cv.cvCreateImage (cv.cvSize (image.width, image.height), 8, 1)
    cv.cvCvtColor (image, gray, cv.CV_BGR2GRAY)
    cv.cvSmooth (gray, edge, cv.CV_BLUR, 3, 3, 0)
    cv.cvNot (gray, edge)
    cv.cvCanny (gray, edge, position, position * 3, 3)
    # 連線相近的邊緣
    cv.cvSmooth(edge, edge, cv.CV_GAUSSIAN)
    # 連通小區域
    cv.cvDilate(edge, edge)

2. 用cvFindContours 尋找圖片所有輪廓 如果底色是純色 只用獲取外輪廓 加速

這個函式明顯跟c版本區別很多 注意第三個引數 不用傳cvseq物件 返回的 contours 是個所有輪廓的 cvseq物件

    # 分配記憶體
    store = cv.cvCreateMemStorage(0)
    # 獲取所有輪廓
    num_contours, contours = cv.cvFindContours(edge, store, cv.sizeof_CvContour, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
    # 獲取物體外輪廓
    #num_contours, contours = cv.cvFindContours(edge, store, cv.sizeof_CvContour, cv.CV_RETR_EXTERNAL, cv.CV_CHAIN_APPROX_SIMPLE)

3. 找到所有連通區域中 面積最大的區域

  for contour in contours.hrange():
        # 繪畫區所有區域
        if debug == 1:
            color = cv.CV_RGB( random.randint(0,255)&255, random.randint(0,255)&255, random.randint(0,255)&255 )
            cv.cvDrawContours( col_edge, contour, color, color, -1, cv.CV_FILLED, 8 )
        # 圖片中找到我們需要的目標 一般是最大連通區域
        #獲取當前輪廓面積
        area = abs(cv.cvContourArea( contour ))

4. 得到連通區域的cvRect物件 獲取區域影象拷貝

    # 獲取最大區域矩形塊
    aRect = cv.cvBoundingRect( contmax, 0 )

    #原始區域的不加邊框
    #rcenter = cv.cvPoint2D32f(aRect.x + aRect.width/2.0, aRect.y + aRect.height/2.0)
    #dstimg = cv.cvCreateImage (cv.cvSize (aRect.width, aRect.height), 8, 3)
    #cv.cvSetZero(dstimg)
    
    # 獲取我們需要的矩形區域
    cv.cvGetRectSubPix(image, dstimg, rcenter)

識別效果