OpenCV cv::Mat 'lieben' für die multi-channel-matrix?
Beim arbeiten mit 1-Kanal (z.B. CV_8UC1
) Mat Objekte in OpenCV schafft eine Matte für alle diejenigen: cv::Mat img = cv::Mat::ones(x,y,CV_8UC1)
.
Jedoch, wenn ich 3-Kanal-Bilder (z.B. CV_8UC3
), werden die Dinge ein wenig komplizierter. Dabei cv::Mat img = cv::Mat::ones(x,y,CV_8UC3)
stellt diejenigen, die in Kanal 0, aber die Kanäle 1 und 2 enthalten Nullen. So, wie benutze ich cv::Mat::ones()
für multi-Kanal-Bilder verwendet werden?
Hier ist etwas code, der helfen könnte, Sie zu sehen, was ich meine:
void testOnes() {
int x=2; int y=2; //arbitrary
//1 channel
cv::Mat img_C1 = cv::Mat::ones(x,y,CV_8UC1);
uchar px1 = img_C1.at<uchar>(0,0); //not sure of correct data type for px in 1-channel img
printf("px of 1-channel img: %d \n", (int)px1); //prints 1
//3 channels
cv::Mat img_C3 = cv::Mat::ones(x,y,CV_8UC3); //note 8UC3 instead of 8UC1
cv::Vec3b px3 = img_C3.at<cv::Vec3b>(0,0);
printf("px of 3-channel img: %d %d %d \n", (int)px3[0], (int)px3[1], (int)px3[2]); //prints 1 0 0
}
So, ich hätte erwartet, um zu sehen, dieser Ausdruck: px of 3-channel img: 1 1 1
, aber stattdessen sehe ich dieses: px of 3-channel img: 1 0 0
.
P. S. ich habe eine Menge suchen, bevor dieses posting. Ich war nicht in der Lage, diese zu lösen, indem die Suche SO für "[opencv] Mat::ones" oder "[opencv] +mat +ones".
- Sidenote: ich bin nicht sicher, ob ich verwenden soll
uchar
im Ortcv::Vec3b
für einen 1-Kanal-Bild pixel. OpenCV bietet eine Vielzahl von 2-, 3-, und 4-Element-Vektor-Klassen, aber keine Analogie für ein singleton. (Suche nachVec3b
auf diese Seite: opencv.willowgarage.com/documentation/cpp/...)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nicht verwenden OpenCV, aber ich glaube zu wissen, was hier Los ist. Definieren Sie einen Datentyp, sondern fordern Sie den Wert '1' für, die. Die
Mat
Klasse scheinbar nicht zahlen Aufmerksamkeit auf die Tatsache, dass Sie eine multi-channel-Datentyp ist, so ist es einfach wirft '1' als eine 3-byte-unsigned-char.Anstatt also mit der
ones
- Funktion, verwenden Sie einfach die Skalare Konstruktor:cv::Mat img_C3 = cv::Mat::ones(x,y,CV_8UC3) * CV_RGB(1,1,1);
nicht kompilieren, da gibt es nicht einen überladenen operator*
für diecv::Mat
geben.cv::Mat img_C3( x,y,CV_8UC3,CV_RGB(1,1,1) );
kompiliert, aber es definiert ein pixel, Kanäle1 0 0
haben, wie in derones
Beispiel aus meiner Frage. Ich bin Graben in Ihre Antwort, tiefer jetzt.cv::Mat img_C3( x,y,CV_8UC3,CV_RGB(1,1,1) );
funktioniert einwandfrei!CV_RGB
. Ursprünglich schrieb ich 0x10101 vor stolpern über das makro. Versuchen Sie, und wenn es funktioniert ich werde passen Sie Ihre vorgeschlagenen änderungen.cv::Mat img_C3 = cv::Mat::ones(x,y,CV_8UC3) * CV_RGB(1,1,1);
, der code drucktpx of 3-channel img: 255 0 0
. Teil des Problems ist, dass, wenn wir beginnen, mit Pixeln der Wert {1,0,0}, multipliziert das Bild von einer Zahl gibt uns {n,0,0}. Allerdings wurde ich falsch über die*
- operator nicht überladen ist-es ganz offensichtlich funktioniert, wenn Sie durch Multiplikation mit einem primitiven Datentyp. Vielen Dank für das follow-up und verbringen so viel Zeit auf dieser. 🙂ones
Methode ist nirgendwo nahe so gut wie nur mit einem Skalar-Konstruktor. Es ist also win-win für dich =)*
Betreiber nicht wirklich vermehren sich auf der Stelle. Es speichert einen Skalierungsfaktor für später. Klingt dodgey zu mir.Können Sie auch initialisiert werden, wie diese: