Tengo una nube de puntos 3D (escaneado láser) y una ortofoto, georreferenciadas mediante un archivo TIFF World File (.tfw). Quiero proyectar cada punto 3D de la nube de puntos en la imagen 2D.
He aquí un ejemplo de archivo .TFW:
2.4384
0.0000
0.0000
-2.4384
441794.4342
5094101.4520
Son los 6 coeficientes de una matriz de transformación de tres por tres. Indican que un píxel tiene 2,4384 metros cuadrados, y que el centro del píxel superior izquierdo tiene una coordenada x de 441794,4342 y 5094101,4520. Véase aquí .
Así puedo obtener la X,Y de la nube de puntos (suponiendo que la Z es 0):
x_cloud = 2.4384 * column + 0.0 * row + 441794.4342
y_cloud = (-2.4384) * row + 0.0 * column + 5094101.4520
¿Cómo puedo encontrar (X_pixel, Y_pixel) de un punto 3D utilizando el archivo TFW?
Solución
He encontrado una solución para mi problema, era simple. vamos a ver nuestro archivo TIFF Mundo
2.4384 -> A
0.0000 -> B
0.0000 -> C
-2.4384 -> D
441794.4342 -> E
5094101.4520 ->F
aquí está mi pseudocódigo:
forEach point cloud {
x_cloud = currentX_cloud;
y_cloud = currentY_cloud;
z_cloud = currentZ_cloud;
x_pixel = (x_cloud - E) / A;
y_pixel = img.rows - (y_cloud - F + A * img.rows) / A;
//accessing to pixel values
R = img.at<cv::Vec3b>(y_pixel, x_pixel)[0];
G = img.at<cv::Vec3b>(y_pixel, x_pixel)[1];
B = img.at<cv::Vec3b>(y_pixel, x_pixel)[2];
}
(Estoy usando OpenCV para manipular la ortofoto y LidarFormat para tratar los datos de la nube de puntos (archivo LAS))