Come dice il titolo, voglio calcolare le normali di superficie di una determinata immagine di profondità utilizzando il prodotto incrociato dei pixel vicini. Mi piacerebbe usare Opencv per questo ed evitare l'uso di PCL tuttavia, non capisco davvero la procedura, dal momento che la mia conoscenza è piuttosto limitata nell'argomento. Pertanto, sarei grato se qualcuno potesse fornire alcuni suggerimenti. Per citare qui che non ho altre informazioni tranne l'immagine di profondità e l'immagine rgb corrispondente, quindi nessuna informazione sulla matrice della telecamera K
.Calcola le normali della superficie dall'immagine di profondità utilizzando i pixel adiacenti traversi del prodotto
Così, permette di dire che abbiamo la seguente immagine di profondità:
e voglio trovare il vettore normale in un punto corrispondente con un valore di profondità corrispondente, come nell'immagine seguente:
Come posso farlo utilizzando il prodotto incrociato dei pixel adiacenti? Non mi importa se le normali non sono molto accurate.
Grazie.
Aggiornamento:
Ok, stavo cercando di seguire @ risposta e la porta il suo codice di timday a Opencv. Con il seguente codice:
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);
sto ottenendo il risultato corretto seguente (ho dovuto sostituire double
con float
e Vecd
a Vecf
, non so il motivo per cui sarebbe alcuna differenza però):
dipende da cosa OpenCV fa quando si dump un'immagine di vettori. Non sembra che la tua XYZ stia mappando su RGB, e la gamma di componenti positiva/negativa potrebbe non essere ben mappata a valori di 0-255 pixel senza alcun ridimensionamento. Ecco perché il mio codice include anche un semplice modello di ombreggiatura per produrre un'immagine in scala di grigi dalle normali. – timday
Salve @timday Non penso che sia un problema di Opencv perché se caricassi le normali da uno script Matlab a Opencv e 'imshow()' loro allora sto ottenendo una bella immagine rispetto a quella sopra. – ThT
È possibile trovare [questo] (http://stackoverflow.com/q/31217122/2571705) utile. – dhanushka