Python&OpenCV:第二大对象

问题描述:

我正在开发一个python脚本,以隔离图像中颜色匹配的最大和次大对象。我已经设法得到最大的物体,围绕它画一个轮廓并画一个盒子。然而,我很难找到找到第二大对象的解决方案。我想要分开检测第二大物体。Python&OpenCV:第二大对象

import numpy as np 
import cv2 

font = cv2.FONT_HERSHEY_SIMPLEX 
lineType = cv2.LINE_AA 

im = cv2.imread('Photos/test.jpg') 
im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 

ball_ycrcb_mint = np.array([0, 90, 100],np.uint8) 
ball_ycrcb_maxt = np.array([25, 255, 255],np.uint8) 
ball_ycrcb = cv2.inRange(im_ycrcb, ball_ycrcb_mint, ball_ycrcb_maxt) 
#cv2.imwrite('Photos/output2.jpg', ball_ycrcb) # Second image 
areaArray = [] 
count = 1 

_, contours, _ = cv2.findContours(ball_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
for i, c in enumerate(contours): 
    area = cv2.contourArea(c) 
    areaArray.append(area) 
    areaLargest = np.argmax(areaArray) 
    areaLargestMax = max(areaArray) 
    areaLargestCnt = contours[areaLargest] 
    x, y, w, h = cv2.boundingRect(areaLargestCnt) 
    if area == areaLargestMax and area > 10000: 
     cv2.drawContours(im, contours, i, (255, 0, 0), 2) 
     cv2.rectangle(im, (x, y), (x+w, y+h), (0,255,0), 2) 
cv2.imwrite('Photos/output3.jpg', im) 

我用下面的图像用于测试目的:Image of balls

任何帮助表示赞赏!

首先,首先创建轮廓和轮廓区域的阵列,然后找到第n个最大轮廓更简单。

import numpy as np 
import cv2 
im = cv2.imread('Photos/test.jpg') 
im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 

ball_ycrcb_mint = np.array([0, 90, 100],np.uint8) 
ball_ycrcb_maxt = np.array([25, 255, 255],np.uint8) 
ball_ycrcb = cv2.inRange(im_ycrcb, ball_ycrcb_mint, ball_ycrcb_maxt) 
#cv2.imwrite('Photos/output2.jpg', ball_ycrcb) # Second image 
areaArray = [] 
count = 1 

contours, _ = cv2.findContours(ball_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
for i, c in enumerate(contours): 
    area = cv2.contourArea(c) 
    areaArray.append(area) 

#first sort the array by area 
sorteddata = sorted(zip(areaArray, contours), key=lambda x: x[0], reverse=True) 

#find the nth largest contour [n-1][1], in this case 2 
secondlargestcontour = sorteddata[1][1] 

#draw it 
x, y, w, h = cv2.boundingRect(secondlargestcontour) 
cv2.drawContours(im, secondlargestcontour, -1, (255, 0, 0), 2) 
cv2.rectangle(im, (x, y), (x+w, y+h), (0,255,0), 2) 
cv2.imwrite('Photos/output3.jpg', im) 

这应该基本上做你想要的。我剥离了导致我的opencv版本崩溃的不必要的代码。

+0

谢谢!有效。 – ahmadux 2014-08-29 15:01:42

你可以使用sorted(contours, key=cv2.contourArea, reverse=True)给你一个按地区降序的轮廓列表。

+0

这是一个好主意。从来没有想过它! – 2017-01-28 17:00:23