2016-04-13 3 views
-1

Ich habe ein Projekt, wo ich bestimmte Farben aus Blättern Bilder, wie grün, braun und gelb erkennen muss. Ich habe dieses Tutorial (http://opencv-srf.blogspot.com.br/2010/09/object-detection-using-color-seperation.html) gefunden, das erklärt, wie man eine Echtzeitspur erstellt, um die besten Werte dafür zu finden, aber es verwendet Bilder von einer Webcam, und ich möchte es mit Bildern verwenden. Kannst du mir bitte helfen, das zu tun?Opencv: Ändern eines Codes, der Video verwendet, um ein Bild für die Farberkennung mit Trackbars

Vielen Dank.

+0

Bitte beachten Sie, dass dies eine Frage-und-Antwort-Website, kein Code schriftlich Service. Wenn Sie Ihre Frage zu bearbeiten [bearbeiten], was Sie bis jetzt versucht haben und wo Sie stecken bleiben, dann können wir versuchen, mit spezifischen Problemen zu helfen. Sie sollten auch lesen [fragen]. –

+0

Es tut mir wirklich leid. Ich stellte diese Frage auf eine Anfrage von einem anderen Benutzer in einer anderen Frage, fragte ich (http://stackoverflow.com/questions/36586924/having-difficultties-to-detect-certain-colors-using-opencv) und in Eile, wenn ich war an meinem Job, weil ich es später studieren wollte, bevor meine Klassen anfingen und ich vergaß, Ihnen den Code zu zeigen, den ich schrieb, der nicht funktionierte. Ich nehme deinen Rat und ich werde keine Fragen in so einer Eile stellen, damit ich nicht vergessen werde, dir mehr Details zu zeigen. Vielen Dank. – Nicholas

Antwort

1

Hier ist der Code für die Schwellenwertbildung eines HSV-Bildes, Auswahl der Bereiche mit Trackbars.

anzumerken, dass im Unterschied zu einem Video (wie here beschrieben), I morphologyEx morphologische Operationen auszuführen verwendet und ersetzt C style cvCreateTrackbar mit der C++ Funktion createTrackbar.

Die Kommentare im Code sollten klar sein. Bitte pingen Sie mich, wenn etwas nicht klar ist:

#include <opencv2/opencv.hpp> 
#include <iostream> 
using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    // Load BGR image 
    Mat3b bgr = imread("path_to_image"); 
    if (bgr.empty()) 
    { 
     cout << "Cannot open the image" << endl; 
     return -1; 
    } 

    // Transform to HSV 
    Mat3b hsv; 
    cvtColor(bgr, hsv, COLOR_BGR2HSV); 

    // Create a window called "Control" 
    namedWindow("Control", CV_WINDOW_AUTOSIZE); 

    // Set starting values for ranges 
    int iLowH = 0; 
    int iHighH = 179; 

    int iLowS = 0; 
    int iHighS = 255; 

    int iLowV = 0; 
    int iHighV = 255; 

    //Create trackbars in "Control" window 
    createTrackbar("LowH", "Control", &iLowH, 179); //Hue (0 - 179) 
    createTrackbar("HighH", "Control", &iHighH, 179); 

    createTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255) 
    createTrackbar("HighS", "Control", &iHighS, 255); 

    createTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255) 
    createTrackbar("HighV", "Control", &iHighV, 255); 

    //Show the original image 
    imshow("Original", bgr); 

    // Create kernel for morphological operation 
    Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5)); 

    // Infinte loop, until user press "esc" 
    while (true) 
    { 
     Mat mask; 
     inRange(hsv, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), mask); //Threshold the image 

     //morphological opening (remove small objects from the foreground) 
     morphologyEx(mask, mask, MORPH_OPEN, kernel); 

     //morphological closing (fill small holes in the foreground) 
     morphologyEx(mask, mask, MORPH_CLOSE, kernel); 

     //Show the thresholded image 
     imshow("Thresholded Image", mask); 

     if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop 
     { 
      cout << "esc key is pressed by user" << endl; 
      break; 
     } 
    } 
    return 0; 
} 
+0

Miki, vielen Dank! Es ist genau das, was ich brauchte. – Nicholas