2016-09-01 18 views
0

Dies ist mein erstes Projekt in Python (3.5.1) und OpenCV (3), also tut mir leid für meine Fehler. Ich habe ein paar Bilder wie diese: https://s12.postimg.org/ox8gw5l8d/gado.jpgZählen Sie die Anzahl der Objekte OpenCV - Python

Ich muss zählen, wie viele weiße Objekte auf diesem Bild hat. Ich habe versucht, SimpleBlobDetector, aber ich habe nicht so gearbeitet, wie ich es erwartet hatte.

# Standard imports 
import cv2 
import numpy as np; 

# Read image 
im = cv2.imread("C:/opencvTests/cattle.jpg", cv2.IMREAD_GRAYSCALE) 

# Setup SimpleBlobDetector parameters. 
params = cv2.SimpleBlobDetector_Params() 

#filter by color 
params.filterByColor = True 
params.blobColor = 255 

# Filter by Convexity 
params.filterByConvexity = True 
params.minConvexity = 0.87 

# Filter by Inertia 
params.filterByInertia = True 
params.minInertiaRatio = 0.08 

# Create a detector with the parameters 
ver = (cv2.__version__).split('.') 
if int(ver[0]) < 3 : 
    detector = cv2.SimpleBlobDetector(params) 
else : 
detector = cv2.SimpleBlobDetector_create(params) 

# Detect blobs. 
keypoints = detector.detect(im) 

# Draw detected blobs as red circles. 
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle  corresponds to the size of blob 
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255),  cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

# Show keypoints 
cv2.imwrite("C:/opencvTests/blobSave.jpg",im_with_keypoints) 
print("Total of objects") 
print(len(keypoints)) 

Jede Hilfe wäre wirklich zu schätzen! Vielen Dank im Voraus

Antwort

2

Wahrscheinlich werden Sie falsch gezählt, wenn Sie weiter an diesem Bild arbeiten. Führen Sie einige Vorverarbeitungsvorgänge aus, z. B. morphologische Operationen, um Rauschen zu entfernen und das Objekt voneinander zu trennen. Danach nutzen Sie "findcontours" eine eingebaute opencv-Funktion. Dann lesen Sie die Größe von "findcontours", dies gibt die Anzahl der Objekte an.

+0

Vielen Dank für das Teilen Sie mir Ihr Wissen Herr Arjun. –

+0

@EcheverryaAvila Ich bin froh, dass es dir geholfen hat. Alles Gute..! – Arjun

0

Ich bin sehr nah an der Antwort, ich glaube, ich muss nur einige Parameter gemäß dem Bild ändern. Wenn jemand etwas auf dieser Hinsicht braucht, das ist mein Code:

# Standard imports 
import cv2 
import numpy as np; 

# Read image 
im = cv2.imread("C:/opencvTests/original.jpg", cv2.IMREAD_GRAYSCALE) 

#Apply treshold 
ret,im = cv2.threshold(im,240,255,cv2.THRESH_BINARY) 

kernel = np.ones((6,6),np.uint8) 
erosion = cv2.erode(im,kernel,iterations = 1) 
opening = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel) 
im = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel) 


# Setup SimpleBlobDetector parameters. 
params = cv2.SimpleBlobDetector_Params() 

#filter by color 
params.filterByColor = True 
params.blobColor = 255 

# Filter by Convexity 
params.filterByConvexity = True 
params.minConvexity = 0.87 

# Filter by Inertia 
params.filterByInertia = True 
params.minInertiaRatio = 0.08 

# Create a detector with the parameters 
ver = (cv2.__version__).split('.') 
if int(ver[0]) < 3 : 
    detector = cv2.SimpleBlobDetector(params) 
else : 
    detector = cv2.SimpleBlobDetector_create(params) 

# Detect blobs. 
keypoints = detector.detect(im) 

# Draw detected blobs as red circles. 
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle  corresponds to the size of blob 
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255),  cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

# Show keypoints 
cv2.imwrite("C:/opencvTests/keypoints.jpg",im_with_keypoints) 
print("Total of objects") 
print(len(keypoints)) 

Thank you very much!

Verwandte Themen