Probleme beim Finden der Kontur in einem Videobild mit C ++ FindContours

Das Programm, an dem ich gerade arbeite, istfast getan, aber ich bin nicht sehr zufrieden mit dem Ergebnis. Mit dem Canny-Algorithmus konnte ich die Kontur des Objekts sehr genau bestimmen, aber das Programm hat einige Probleme, die Kontur zu erkennen und die Kontur mit einer roten Linie zu zeichnen. Das Programm:

void setwindowSettings(){
    namedWindow("Contours", CV_WINDOW_AUTOSIZE);

    createTrackbar("LowerC", "Contours", &lowerC, 255, NULL);
    createTrackbar("UpperC", "Contours", &upperC, 255, NULL);
}

void wait(void)
{
    long t=30000000;
    while(t--);
}

int main(void)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened())  // check if we succeeded
    return -1;

Mat frame,foreground,image;
double pt1, pt2, area;
Rect rect;
int i;

vector<vector<Point> > contours;
vector<vector<Point> > largest_contours;

namedWindow("Capture", CV_WINDOW_AUTOSIZE);
setwindowSettings();

while(1){
    cap >> frame; // get a new frame from camera
    if( frame.empty() )
            break;
    image=frame.clone();

    cvtColor(image,foreground,CV_BGR2GRAY);
    GaussianBlur(foreground,foreground,Size(9,11),0,0);
    Canny(foreground,foreground,lowerC,upperC,3);

    findContours(foreground,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);  

    if(contours.empty())
        continue;

    double largest_area = 0;

    for( i= 0; i < contours.size(); i++){  // get the largest contour
        area = fabs(contourArea(contours[i]));
        if(area >= largest_area){
            largest_area = area;
            largest_contours.clear(); 
            largest_contours.push_back(contours[i]);
        }
    }

    if(largest_area>=3000){   // draw the largest contour if exceeded minimum largest area 
        drawContours(image,largest_contours,-1,Scalar(0,0,255),2);
        printf("area = %.f\n",largest_area);
    }

    wait();

    imshow( "Capture",image );
    imshow("Contours",foreground);

    if(waitKey(30) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}

Programmübersicht:

Holen Sie sich Bilder von der KameraRauschfilterung (In Grau umwandeln → Unschärfe → Canny)Konturen findenFinden Sie die größte Kontur und ihren Bereich im Bild, auch bekannt als das ObjektZeichnen Sie eine rote Linie um das Objekt und drucken Sie den größten Bereich ausSpülen und wiederholen

Und die Ergebnisse:

Selten habe ich bekommen, was ich will; Kontur erkannt, rote Linie gezeichnet (GUT):

... und normalerweise habe ich das bekommen; Keine Kontur erkannt, keine rote Linie (SCHLECHTES):

Die Chancen das zu bekommenGUT sind über1/20 das ist nicht sehr gut. Auch die Linie der Objektkontur inContours Der Bildschirm blinkt, wenn die rote Linie um das Objekt herum erscheint (siehe das Bild GOOD ONE). Ich benutze eines meiner Objekte (ein kleines schwarzes Quadrat) für diese Frage. Beachten Sie jedoch, dass das Hauptziel dieses Objekterkennungsprogramms darin bestehtum das Objekt unabhängig von seiner Form oder Farbe zu erkennen.

Meine Fragen sind also:

Warum bekomme ich immer noch die SCHLECHTEN, obwohl die Kontur so klar wie der Tag ist?Kann jemand eine bessere Idee teilen, wie die Konturerfassung verbessert werden kann? (d. h. besserer Unschärfealgorithmus)Wie kann verhindert werden, dass die Konturlinie blinkt, wenn die rote Linie um das Objekt gezogen wird?

BEARBEITEN: Ich habe gerade festgestellt, dass das Blinken der Kontur nicht auf die rote Linie zurückzuführen ist (auch nicht mitdrawContoursoderline Dies geschieht jedoch, nachdem die größte Kontur von erkannt wurdefindContours Funktion und berechnet als größte Kontur.

Bei Frage zu Nr. 3 Klicken Sie aufHIER. VIDEO HIER KLICKEN !!!

Danke im Voraus.

PS: Ich verwende OpenCV 2.4.3 unter MS Visual C ++ 2010 Exp.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage