2016-04-13 6 views
1

Ich habe ein Projekt, in dem ich 3 bestimmte Farben in vielen Blättern Bilder erkennen muss: Grün, Gelb und Braun.Ich habe Schwierigkeiten, bestimmte Farben mit openCV zu erkennen

Ich bin mit dem folgenden Bild als Beispiel:

enter image description here

Ziel, die verschiedenen Farben zu erfassen, um zu bestimmen, ob der Baum krank ist oder nicht, so ist es wirklich wichtig ist, in der Lage sein sagen Sie richtig, was grün, gelb und braun ist, selbst in kleinen Pixeln.

Ich schrieb den folgenden Code:

//Load the image 
Mat img_bgr = imread("c:\\testeimagem\\theeye\\greening32.jpg", 1); 
if (img_bgr.empty()){ 
    cout << "Nenhuma imagem foi carregada..." << endl; 
    return -1; 
} 

//Display the image 
namedWindow("Original Image", WINDOW_NORMAL); 
imshow("Original Image", img_bgr); 
waitKey(0); 
destroyAllWindows; 

//Conversion to HSV 
Mat img_hsv; 
cvtColor(img_bgr, img_hsv, CV_BGR2HSV_FULL); 

//Extracting colors - HSV 
Mat cores_divididas, green, yellow, brown; 

//Yellow 
inRange(img_hsv, Scalar(28, 240, 240), Scalar(33, 255, 255), yellow); 
imwrite("c:\\testeimagem\\theeye\\yellow.jpg", yellow); 

//Green 
inRange(img_hsv, Scalar(38, 100, 100), Scalar(70, 190, 190), green); 
imwrite("c:\\testeimagem\\theeye\\green.jpg", green); 

//Brown 
inRange(img_hsv, Scalar(10, 90, 90), Scalar(20, 175, 175), brown); 
imwrite("c:\\testeimagem\\theeye\\brown.jpg", brown); 

namedWindow("Yellow", WINDOW_NORMAL); 
imshow("Yellow", yellow); 

namedWindow("Green", WINDOW_NORMAL); 
imshow("Green", green); 

namedWindow("Brown", WINDOW_NORMAL); 
imshow("Brown", brown); 

waitKey(0); 
destroyAllWindows; 

return 0; 

Wenn du diesen Code kompilieren, werden Sie feststellen, dass die grüne Farbe nicht richtig erkannt wird und die anderen Farben nicht erfaßt.

Als Richtwerte für Referenzwerte, I used this trackbar.

Antwort

0

Probieren Sie diese Bereiche aus:

//Yellow 
inRange(img_hsv, Scalar(28, 0, 0), Scalar(33, 255, 255), yellow); 
imwrite("yellow.jpg", yellow); 

//Green 
inRange(img_hsv, Scalar(38, 0, 0), Scalar(70, 255, 255), green); 
imwrite("green.jpg", green); 

//Brown 
inRange(img_hsv, Scalar(10, 0, 0), Scalar(20, 255, 255), brown); 
imwrite("brown.jpg", brown); 

Auf dem Blatt Bild, um es scheint, gibt es kein braunes Pigment überhaupt. Ich habe es mit diesem Blatt getestet, Brownish leaf , und es sieht gut aus.

Der Grund, warum ich diese Bereiche ausprobierte, liegt hinter der Tatsache, dass die wahre Farbinformation (korrigiert mich, wenn ich falsch liege) in die Farbtonmenge eingebettet ist.

Obs .: Gehen Sie mit CV_BGR2HSV, wie bereits erwähnt.

+0

Adriano, ich war gestern bei meiner Arbeit, als ich zuerst Ihren Code überprüft habe, also konnte ich ihn nicht gut testen, aber später während des Unterrichts konnte ich ihn mit mehr Zeit und mit diesen Parametern betrachten, obwohl im Fall von Das Blatt, das ich am anderen Beitrag kommentierte, scheint mit anderen Bildern wirklich gut zu arbeiten, und ich kann eine bessere Weise nicht herausfinden, die Farben als this darzustellen. Ich habe nicht darüber nachgedacht, die niedrigeren Werte zum Minimum und zum höheren einzustellen Werte bis zum Maximum. Vielen Dank, du hast mir sehr geholfen! Wenn ich einen besseren Weg finden kann, werde ich zurückkommen und mit euch teilen. – Nicholas

0

Wenn Sie den Farbraum des Originalbilds konvertieren, versuchen Sie, CV_BGR2HSV anstelle von CV_BGR2HSV_FULL zu verwenden. Der Link, auf den Sie verwiesen haben, stellt Referenzwerte basierend auf CV_BGR2HSV zur Verfügung, in denen der Farbton einen anderen Wertebereich hat, sodass wahrscheinlich mindestens ein Faktor Ihre Probleme verursacht.

Verwandte Themen