2012-05-01 3 views
8

Ich versuche, das Zentrum der schwarzen/weißen Punkt Ziele zu erkennen, wie in diesem Bild. Ich habe versucht, die cv2.HoughCircles-Methode zu verwenden, aber 1, bin nur in der Lage, 2 bis 3 Ziele zu erkennen, und 2, wenn ich die gefundenen Kreise wieder auf das Bild plotten, sind sie immer leicht versetzt.OpenCV Punkt Zielerkennung nicht alle Ziele zu finden, und gefundene Kreise sind Offset

Verwende ich die falsche Methode? Soll ich die findContours oder etwas ganz anderes benutzen?

import cv2 
from cv2 import cv 
import os 
import numpy as np 

def showme(pic): 
    cv2.imshow('window',pic) 
    cv2.waitKey() 
    cv2.destroyAllWindows() 


im=cv2.imread('small_test.jpg') 

gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 

#I've tried blur,bw,tr... all give me poor results. 

blur = cv2.GaussianBlur(gray,(3,3),0) 
n,bw = cv2.threshold(blur,120,255,cv2.THRESH_BINARY) 
tr=cv2.adaptiveThreshold(blur,255,0,1,11,2) 

circles = cv2.HoughCircles(gray, cv.CV_HOUGH_GRADIENT, 3, 100, None, 200, 100, 5, 16) 

try: 
    n = np.shape(circles) 
    circles=np.reshape(circles,(n[1],n[2])) 
    print circles 
    for circle in circles: 
     cv2.circle(im,(circle[0],circle[1]),circle[2],(0,0,255)) 
    showme(im) 
except: 
    print "no cicles found" 

Und das ist meine aktuelle Ausgabe:

Hier ist mein Code

+0

Würde gerne Ihre aktuelle Ausgabe sehen. Sie könnten Interesse haben, diesen Thread zu überprüfen: http://stackoverflow.com/q/10313602/176769 – karlphillip

+0

Hier ist die Ausgabe für den obigen Code. ! [Ergebnisse meines Codes] [1] [1]: http://i.stack.imgur.com/nd2Hr.jpg – hokiebird

+0

Vielleicht ist es Zeit, Ihre anderen Fragen zu überprüfen und die Antworten zu akzeptieren, die sie gelöst haben (falls vorhanden) sind irgendwelche). Es gibt ein kleines Kontrollkästchen neben jeder Antwort, klicken Sie darauf, um die offizielle Antwort auf Ihre Frage auszuwählen. – karlphillip

Antwort

8

den Code Spielen I in another post schrieb, konnte ich ein etwas besseres Ergebnis erzielen:

Es geht um die Parameter. Es ist immer so. In diesem Programm werden 3 wichtige Funktionen aufgerufen, mit denen Sie experimentieren sollten: cvSmooth(), cvCanny() und cvHoughCircles(). Jeder von ihnen hat das Potenzial, das Ergebnis drastisch zu ändern.

Und hier ist der C-Code:

IplImage* img = NULL; 
if ((img = cvLoadImage(argv[1]))== 0) 
{ 
    printf("cvLoadImage failed\n"); 
} 

IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); 
CvMemStorage* storage = cvCreateMemStorage(0); 

cvCvtColor(img, gray, CV_BGR2GRAY); 

// This is done so as to prevent a lot of false circles from being detected 
cvSmooth(gray, gray, CV_GAUSSIAN, 7, 9); 

IplImage* canny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 
IplImage* rgbcanny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3); 
cvCanny(gray, canny, 40, 240, 3); 

CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/8, 120, 10, 2, 25); 
cvCvtColor(canny, rgbcanny, CV_GRAY2BGR); 

for (size_t i = 0; i < circles->total; i++) 
{ 
    // round the floats to an int 
    float* p = (float*)cvGetSeqElem(circles, i); 
    cv::Point center(cvRound(p[0]), cvRound(p[1])); 
    int radius = cvRound(p[2]); 

    // draw the circle center 
    cvCircle(rgbcanny, center, 3, CV_RGB(0,255,0), -1, 8, 0); 

    // draw the circle outline 
    cvCircle(rgbcanny, center, radius+1, CV_RGB(0,0,255), 2, 8, 0); 

    printf("x: %d y: %d r: %d\n",center.x,center.y, radius); 
} 

cvNamedWindow("circles", 1); 
cvShowImage("circles", rgbcanny); 

cvSaveImage("out.png", rgbcanny); 
cvWaitKey(0); 

Ich vertraue Ihnen die Fähigkeiten, Port, dies zu Python haben.

+0

danke für die Hilfe. Ich werde daran arbeiten, es über Python zu portieren. Ich werde diese Ziele (ich kenne dort bereits 3D-Positionen, unter Verwendung eines TRITOP-Systems [link] http://www.capture3d.com/products-TRITOP.html) verwenden, um die Position/Orientierung des Teils zu berechnen. Nachdem ich diese Methode verwendet habe, um die Kreise zu finden, gibt es eine andere Methode, die Sie empfehlen würden, die Zentren der Ziele sehr genau zu berechnen? Nochmals vielen Dank – hokiebird

+0

Das gesamte Programm könnte eine einzelne Funktion, die ein paar Mal ausgeführt wird (mit unterschiedlichen Parametern), und nach jeder Iteration die Kreise zu einer vorherigen Iteration vergleichen, um sicherzustellen, dass alle Kreise gut sind. Dieser Ansatz könnte Ihnen möglicherweise sagen, dass der größte Kreis rechts kein guter Kreis ist. – karlphillip

+0

nennst du 'canny' und' rgbcanny' überhaupt in deiner Kreiserkennung? Es scheint nicht so, aber ich möchte sicher gehen – mga

0

Da das Kreismuster festgelegt ist und gut unterscheidet sich von dem Objekt, einfache Vorlage Matching sollte recht gut funktionieren, check out cvMatchTemplate. Bei komplexeren Bedingungen (Verwerfen aufgrund von Objektform oder Ansichtsgeometrie) können Sie robustere Features wie SIFT oder SURF (cvExtractSURF) ausprobieren.