Der Algorithmus ist folgende:
- Konvertieren Eingangsbild zu YCbCr color space der blau zu erkennen ist gut (und auch rot) Farbe:
Um etwas Bild auf einem anderen cvtColor Verwendung Farbraum zu konvertieren.
- Blaukanal daraus extrahieren:
Verwenden Sie die Funktion extractChannel
, um den benötigten Kanal zu extrahieren.
- Bereiche mit dem größten Wert [0-255] der blauen Farbe erkennen. Ich habe die Funktion minMaxIdx verwendet und dann die maximale Multiplikation mit 0.8 (dies ist der Schwellenwert). Sie können komplexere Methoden wie die Histogrammanalyse verwenden.
- Machen Sie eine Maske der blauen Farbe:
Dafür verwendete ich threshold Funktion mit in Schritt 3 berechnet Schwelle (als Parameter).
- Finden Sie alle blauen Konturen in der Maske. In OpenCV ist es einfach - verwenden Sie einfach findContours.
- Und schließlich erkennen Kontur mit größten Quadrat und finden Sie seine Koordinaten (Mitte). Um die Kontur mit dem größten Quadrat zu berechnen, können Sie die Funktion contourArea verwenden.
auch anstelle der Schritte 1-4 Sie Bild zu HSV umwandeln kann und inRange blaue Farbe erkennen verwenden.
Hier ist mein C++ impementation:
Mat inMat = imread("input.jpg"), blueMat, threshMat;
cvtColor(inMat, blueMat, CV_BGR2YCrCb);//convert to YCrCb color space
extractChannel(blueMat, blueMat, 2);//get blue channel
//find max value of blue color
//or you can use histograms
//or more complex mathod
double blueMax;
minMaxIdx(blueMat, 0, &blueMax);
blueMax *= 0.8;
//make binary mask
threshold(blueMat, threshMat, blueMax, 255, THRESH_BINARY);
//finding all blue contours:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(blueMat, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
double maxSquare = 0;
vector<Point> maxContour;
//finding contours with biggest square:
for (size_t i=0; i<contours.size(); i++)
{
double square = contourArea(contours[i]);
if (square > maxSquare)
{
maxContour = contours[i];
maxSquare = square;
}
}
//output results:
Point center = centerPolygon(maxContour);
cout << "square = " << maxSquare << endl;
cout << "position: x: " << center.x << ", y: " << center.y << endl;
Hier centerPolygon
Funktion:
Point centerPolygon(const vector<Point>& points)
{
int x=0, y=0;
for (size_t i=0; i<points.size(); i++)
{
x += points[i].x;
y += points[i].y;
}
return Point(x/points.size(), y/points.size());
}
Die Ausgabe des Programms ist neben:
square = 263525
position: x: 318, y: 208
Sie diesen Code umwandeln kann JavaCV - siehe this tutorial.
ein neuer Benutzer kann nur 2 Links hinzufügen:/hier ist die Maske ich denke, mit dem zweiten Bild zu vergleichen [siehe Bild 3] (http://img441.imageshack.us/img441/8231/maskt.jpg) –
Möchten Sie blaue Farbe oder Farbe mit größtem Quadrat erkennen? – ArtemStorozhuk
Ich möchte die Größe und die Position des größten Quadrats/Fläche, die blaue Farbe haben –