Python & OpenCV: zweitgrößtes Objekt

Ich entwickle ein Python-Skript, um die größten und zweitgrößten Objekte zu isolieren, die mit der Farbe im Bild übereinstimmen. Ich habe es geschafft, das größte Objekt zu bekommen, eine Kontur um sie zu ziehen und eine Schachtel zu zeichnen. Allerdings bin ich stumped, um eine Lösung zu finden, um das zweitgrößte Objekt zu finden. Ich möchte, dass das zweitgrößte Objekt separat erkannt wird.

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) 

Ich benutze das folgende Bild für Testzwecke: Bild von Bällen

Jede Hilfe wird geschätzt!

  • OpenCV-python: cv2.imshow () zeigt nur die obere Leiste auf Mac
  • Zugriff auf Ximea API über OpenCV in Python
  • Opencv Der Stream kann nicht gestoppt werden: Unangemessenes ioctl für Gerät
  • Segmentationsfehler bei opencv, in python auf himbeere
  • ValueError: Die Gesamtgröße des neuen Arrays muss unverändert sein
  • Cv2.imshow und cv2.imwrite
  • 2 Solutions collect form web for “Python & OpenCV: zweitgrößtes Objekt”

    Zuerst ist es einfacher, zuerst das Array von Konturen und Konturbereichen zu kreieren, dann findet man die nthth größte Kontur.

     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) 

    Dies sollte im Grunde tun, was Sie wollen. Ich entkleidete den Code von unnötigen Sachen, die Abstürze auf meiner Version von opencv verursacht.

    Sie können sorted(contours, key=cv2.contourArea, reverse=True) , um Ihnen eine absteigende Liste der Konturen nach Gebiet zu geben.

    Python ist die beste Programmiersprache der Welt.