Wie der Titel sagt, möchte ich die Oberflächennormalen eines gegebenen Tiefenbildes berechnen, indem ich das Kreuzprodukt benachbarter Pixel verwende. Ich würde gerne Opencv dafür verwenden und die Verwendung von PCL vermeiden, aber ich verstehe das Verfahren nicht wirklich, da mein Wissen in dem Thema ziemlich begrenzt ist. Daher wäre ich dankbar, wenn jemand einige Hinweise geben könnte. Zu erwähnen ist hier, dass ich außer dem Tiefenbild und dem entsprechenden RGB-Bild keine weiteren Informationen habe, also keine K
Kameramatrix-Informationen.Berechnen von Oberflächennormalen aus dem Tiefenbild mit benachbarten Pixeln cross product
So kann sagen, dass wir die folgende Tiefenbild haben:
und ich mag mit einem entsprechenden Tiefenwert den Normalvektor an einem entsprechenden Punkt zu finden, wie im folgende Bild:
Wie kann ich das mit dem Kreuzprodukt der benachbarten Pixel tun? Es macht mir nichts aus, wenn die Normalen nicht sehr genau sind.
Danke.
Update:
Ok, ich habe versucht, @ timday Antwort und Port seinen Code zu OpenCV zu folgen. Mit dem folgenden Code:
Mat depth = <my_depth_image> of type CV_32FC1
Mat normals(depth.size(), CV_32FC3);
for(int x = 0; x < depth.rows; ++x)
{
for(int y = 0; y < depth.cols; ++y)
{
float dzdx = (depth.at<float>(x+1, y) - depth.at<float>(x-1, y))/2.0;
float dzdy = (depth.at<float>(x, y+1) - depth.at<float>(x, y-1))/2.0;
Vec3f d(-dzdx, -dzdy, 1.0f);
Vec3f n = normalize(d);
normals.at<Vec3f>(x, y) = n;
}
}
imshow("depth", depth/255);
imshow("normals", normals);
ich das richtige folgende Ergebnis bekommen (ich hatte double
mit float
und Vecd
zu Vecf
ersetzen, ich weiß nicht, warum das einen Unterschied allerdings machen würde):
Hängt was OpenCV tut, wenn Sie ein Bild von Vektoren Dump. Es sieht nicht so aus, als ob XYZ auf RGB mappt, und der positive/negative Komponentenbereich kann möglicherweise nicht ohne Skalierung auf Werte von 0-255 Pixel abgebildet werden. Deshalb enthält mein Code auch ein einfaches Schattierungsmodell, um ein Graustufenbild von den Normalen zu erzeugen. – timday
Hi @timday Ich denke nicht, dass es ein Opencv-Problem ist, denn wenn ich die Normalen von einem Matlab-Skript zu Opencv und 'imshow()' lade, dann bekomme ich ein schönes Bild im Vergleich zu dem oben genannten. – ThT
Sie könnten [this] (http://stackoverflow.com/q/31217122/2571705) nützlich finden. – dhanushka