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;
}
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]. –
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