Wie der Zugriff auf die RGB-Werte in Opencv?
Bin ich verwirrt über die Verwendung der Anzahl der Kanäle.
Welches ist das richtige von den folgenden?
//roi is the image matrix
for(int i = 0; i < roi.rows; i++)
{
for(int j = 0; j < roi.cols; j+=roi.channels())
{
int b = roi.at<cv::Vec3b>(i,j)[0];
int g = roi.at<cv::Vec3b>(i,j)[1];
int r = roi.at<cv::Vec3b>(i,j)[2];
cout << r << " " << g << " " << b << endl ;
}
}
Oder,
for(int i = 0; i < roi.rows; i++)
{
for(int j = 0; j < roi.cols; j++)
{
int b = roi.at<cv::Vec3b>(i,j)[0];
int g = roi.at<cv::Vec3b>(i,j)[1];
int r = roi.at<cv::Vec3b>(i,j)[2];
cout << r << " " << g << " " << b << endl ;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
das zweite ist das richtige,
die Zeilen und Spalten in der Matte gibt die Anzahl der Pixel,
während der Kanal hat nichts zu tun mit den Zeilen und Spalten Anzahl.
und Lebenslauf verwenden BGR standardmäßig, vorausgesetzt, die Matte ist nicht in RGB konvertiert dann den code korrekt ist
Verweis, persönliche Erfahrungen, OpenCV docs
Einen schnelleren Weg, um Farbe, Komponenten aus einer image ist das Bild, dargestellt als ein
IplImage
Struktur und dann machen Sie Gebrauch von den pixel-Größe und die Anzahl der Kanäle zu Durchlaufen, die es mit Zeiger-Arithmetik.Zum Beispiel, wenn Sie wissen, dass Ihr Bild ist ein 3-Kanal Bild mit 1 byte pro pixel und das format BGR (Standard in OpenCV), die folgenden code, erhält man Zugriff auf seine Komponenten:
(Im folgenden code
img
ist der TypIplImage
.)Für einen flexibleren Ansatz, die Sie verwenden können, die
CV_IMAGE_ELEM
makro definiert intypes_c.h
:Ich denke, die 2. ist richtig, trotzdem ist es sehr zeitaufwendig, um die Daten, wie Sie.
Eine schnellere Methode wäre, um die IplImage* Daten zu Struktur und erhöhen Sie die Adresse und zeigte mit der Größe der enthaltenen Daten roi...
IplImage*
an der Struktur der Daten und erhöhen Sie die Adresse und zeigte mit der Größe der enthaltenen Daten roi" - Sind Sie sicher? Sollte nicht kein wesentlicher Unterschied (wenn überhaupt einen Unterschied). Diese Methoden werden eingebettet überhaupt.cv::Vec3b
Daten und die Erhöhung, die vom 1 sollte es nicht anders sein, keine Notwendigkeit für eineIplImage
s. Sie können nicht über die Zeile Grenze mit dieser sowieso, da die Zeilen müssen nicht zusammenhängend sein, die in OpenCV (und das gilt fürcv::Mat
s die gleiche wie fürIplImage
s). Also die verschachtelte Schleife ist noch da, aber Ok, könnten Sie die Optimierung aus der Multiplikation vonwidthStep
wie du gesagt hast (wenn der compiler nicht das tut es).