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!

  • Split Textzeilen im gescannten Dokument
  • Circular Hough Transform verfehlt Kreise
  • OpenCV Python bindet unglaublich langsame Iterationen durch Bilddaten
  • Konvertieren von openCV-Bildern in PIL-Bild in Python (zur Verwendung mit Zbar-Bibliothek)
  • Einfache Lösung zur Stereo-Kalibrierung und Rektifikation OpenCV?
  • Einstellen der Belichtung (Helligkeit / Kontrast) basierend auf Histogramm mit Python
  • 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.