2016-04-27 27 views
2

Ich habe versucht, die Konturen von rot gefärbten Objekten in Open Cv (Python 2.7) zu identifizieren und es ist uns gelungen, sie zu identifizieren. Aber ich möchte die Position des rot gefärbten Objekts (links oder rechts) erkennen und es ist mir nicht gelungen. Wenn jemand mir den Code oder die Schritte dazu geben könnte, wäre ich wirklich dankbar.Konturenerkennung in OpenCv Python 2.7

Unser aktueller Code für rot gefärbte Objekte zu identifizieren ist wie folgt:

import numpy as np 
import cv2 
cap = cv2.VideoCapture(0) 
while(1): 
    _, frame = cap.read() 
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
    lower_color = np.array([0, 50, 50]) 
    upper_color = np.array([60, 255, 255]) 
    mask = cv2.inRange(hsv, lower_color, upper_color) 
    mask = cv2.erode(mask, None, iterations=2) 
    mask = cv2.dilate(mask, None, iterations=2) 
    res = cv2.bitwise_and(frame, frame, mask=mask) 

    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] 
    cv2.drawContours(frame, cnts, 0, (127, 255, 0), 3) 
print cnts 
cv2.imshow('frame', frame) 
cv2.imshow('mask', mask) 
cv2.imshow('res', res) 
cv2.imshow('contours', frame) 



k = cv2.waitKey(5) & 0xFF 
if k == 27: 
    print "release" 

    break 
cap.release() 
cv2.destroyAllWindows() 

Antwort

1

Nun, Sie sind ein Schritt davon entfernt die Position zu bekommen. Sie können eine boundingrect um die Kontur (en) erstellen und dann können Sie ihren Mittelpunkt berechnen, um die Koordinaten des Objekts zu erhalten.

Sie können auch versuchen minEnclosingCircle Das wird Ihnen die Mitte und den Radius davon geben. Dies könnte ein wenig direkter sein, um das Zentrum zu finden :)

Here Sie können ein kleines Tutorial von beiden Funktionen finden, aber in C++.

in Python so etwas wie dies in diesem Fall

... 
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] 
cv2.drawContours(frame, cnts, 0, (127, 255, 0), 3) 
(x,y),radius = cv2.minEnclosingCircle(cnts[0]) 
center = (int(x),int(y)) 
radius = int(radius) 
cv2.circle(frame, center, radius, (255, 0, 0), 3) 
... 

wäre, wird Mitte die Position des Objekts sein. Dieser Code berücksichtigt nur die erste Kontur im Array ...

+0

danke für die Idee. Könnten Sie mir bitte auch das Programm dazu schicken ... –

+0

cv2.circle (frame, center, radius, (255, 0, 0), 3) TypeError: Integer-Argument erwartet, habe float ich habe diesen Fehler .. Könnten Sie mir bitte sagen, wo ich die Aussagen in meinem Programm hinzufügen muss ... Das ist wirklich dringend, da ich gerade an einem Projekt arbeite. –

+0

@AdhityanSridharan Welches Programm dafür? Ich habe dir bereits den Code gegeben, den du in deinen eigenen Code schreiben kannst. Ich habe den Code aktualisiert, um den Fehler zu beheben – api55