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)
識別效果