|
from utils.utils_keypoints import KeypointsDB
|
|
from utils.utils_lines import LineKeypointsDB
|
|
from utils.utils_calib import FramebyFrameCalib
|
|
from utils.utils_heatmap import complete_keypoints
|
|
from PIL import Image
|
|
import torch
|
|
import numpy as np
|
|
|
|
|
|
cam3_line_dict = {
|
|
"Big rect. right top": [
|
|
{"x": 1342.8861505076343, "y": 1076.997434976179},
|
|
{"x": 1484.7446330310781, "y": 906.3705391217808}
|
|
],
|
|
"Big rect. right main": [
|
|
{"x": 1484.7446330310781, "y": 906.3705391217808},
|
|
{"x": 1049.6210183678218, "y": 748.0287797688992},
|
|
{"x": 828.6491513601493, "y": 668.8579000924583},
|
|
{"x": 349.8767728435256, "y": 500.9610345717304},
|
|
{"x": 32.736572890025556, "y": 397.21988189225624}
|
|
],
|
|
"Big rect. right bottom": [
|
|
{"x": 32.736572890025556, "y": 397.21988189225624},
|
|
{"x": 0.3753980224568448, "y": 407.0286292126068}
|
|
],
|
|
"Small rect. right top": [
|
|
{"x": 312.24913494809687, "y": 1075.6461846681693},
|
|
{"x": 426.66666666666663, "y": 999.9279904137233}
|
|
],
|
|
"Small rect. right main": [
|
|
{"x": 426.66666666666663, "y": 999.9279904137233},
|
|
{"x": 0, "y": 769.079837198949}
|
|
],
|
|
"Circle right": [
|
|
{"x": 828.6491513601493, "y": 668.8579000924583},
|
|
{"x": 821.7759602949911, "y": 612.2830792373484},
|
|
{"x": 782.8739995106773, "y": 564.5621490047902},
|
|
{"x": 722.6387053930304, "y": 529.3993583071158},
|
|
{"x": 623.5014504910696, "y": 503.02726528386006},
|
|
{"x": 494.24654853028534, "y": 492.980753655953},
|
|
{"x": 349.8767728435256, "y": 500.9610345717304}
|
|
],
|
|
"Side line bottom": [
|
|
{"x": 2.0193824656299317, "y": 266.2605192109321},
|
|
{"x": 399.0443993689428, "y": 186.14824976426013},
|
|
{"x": 645.5533017804819, "y": 132.93313314748357},
|
|
{"x": 1001.1088573360372, "y": 53.39824942655338},
|
|
{"x": 1208.1676808654488, "y": 7.351737798646435}
|
|
],
|
|
"Middle line": [
|
|
{"x": 645.5533017804819, "y": 132.93313314748357},
|
|
{"x": 1106.0585089650835, "y": 200.22939899146556},
|
|
{"x": 1580.7388158704541, "y": 269.8451725000601},
|
|
{"x": 1917.6527118636336, "y": 318.9857185061268}
|
|
],
|
|
"Circle central": [
|
|
{"x": 1580.7388158704541, "y": 269.8451725000601},
|
|
{"x": 1580.7388158704541, "y": 269.8451725000601},
|
|
{"x": 1533.8366024891266, "y": 288.8643838246303},
|
|
{"x": 1441.810458698277, "y": 302.46903498742097},
|
|
{"x": 1316.3202626198458, "y": 304.5620582432349},
|
|
{"x": 1219.0653606590615, "y": 292.0039187083512},
|
|
{"x": 1135.4052299401073, "y": 274.2132210339326},
|
|
{"x": 1069.522876998931, "y": 237.5853140571884},
|
|
{"x": 1106.0585089650835, "y": 200.22939899146556},
|
|
{"x": 1139.5882364760548, "y": 189.4457791734675},
|
|
{"x": 1224.2941188289963, "y": 177.9341512664908},
|
|
{"x": 1314.2287593518718, "y": 174.79461638276985},
|
|
{"x": 1392.6601319008914, "y": 180.02717452230473},
|
|
{"x": 1465.8627462799764, "y": 190.49229080137454},
|
|
{"x": 1529.6535959531789, "y": 204.09694196416518},
|
|
{"x": 1581.9411776525253, "y": 230.2597326618396},
|
|
{"x": 1580.7388158704541, "y": 269.8451725000601}
|
|
],
|
|
"Side line left": [
|
|
{"x": 1208.1676808654488, "y": 7.351737798646435},
|
|
{"x": 1401.9652021886754, "y": 20.565213248502545},
|
|
{"x": 1582.3573590514204, "y": 30.37625976013045},
|
|
{"x": 1679.416182580832, "y": 34.300678364781604},
|
|
{"x": 1824.5142217965183, "y": 41.23091697692868},
|
|
{"x": 1918.6318688553417, "y": 42.21202162809147}
|
|
],
|
|
"Big rect. left bottom": [
|
|
{"x": 1401.9652021886754, "y": 20.565213248502545},
|
|
{"x": 1283.3377512082834, "y": 53.98527744204496}
|
|
],
|
|
"Big rect. left main": [
|
|
{"x": 1283.3377512082834, "y": 53.98527744204496},
|
|
{"x": 1510.7887316004399, "y": 73.60737046530076},
|
|
{"x": 1808.8279472867146, "y": 94.21056813971936},
|
|
{"x": 1918.6318688553417, "y": 100.0971960466961}
|
|
],
|
|
"Circle left": [
|
|
{"x": 1510.7887316004399, "y": 73.60737046530076},
|
|
{"x": 1548.0436335612244, "y": 86.36173093041702},
|
|
{"x": 1620.5926531690673, "y": 95.19167279088215},
|
|
{"x": 1681.3769668945574, "y": 97.15388209320773},
|
|
{"x": 1746.0828492474989, "y": 100.0971960466961},
|
|
{"x": 1808.8279472867146, "y": 94.21056813971936}
|
|
],
|
|
"Small rect. left bottom": [
|
|
{"x": 1550.9848100318127, "y": 42.21202162809147},
|
|
{"x": 1582.3573590514204, "y": 30.37625976013045}
|
|
],
|
|
"Small rect. left main": [
|
|
{"x": 1550.9848100318127, "y": 42.21202162809147},
|
|
{"x": 1918.418689198772, "y": 60.49417894940041}
|
|
]
|
|
}
|
|
|
|
def transform_data(line_dict, width, height):
|
|
"""
|
|
Transform input line dictionary to normalized coordinates.
|
|
"""
|
|
transformed = {}
|
|
for line_name, points in line_dict.items():
|
|
transformed[line_name] = []
|
|
for point in points:
|
|
transformed[line_name].append({
|
|
"x": point["x"] / width,
|
|
"y": point["y"] / height
|
|
})
|
|
return transformed
|
|
|
|
def get_camera_parameters(image_path, line_dict):
|
|
"""
|
|
Extract camera parameters from image and line data.
|
|
|
|
Args:
|
|
image_path (str): Path to the image file
|
|
line_dict (dict): Dictionary containing line coordinates
|
|
|
|
Returns:
|
|
dict: Camera parameters
|
|
"""
|
|
|
|
image = Image.open(image_path)
|
|
image_tensor = torch.FloatTensor(np.array(image)).permute(2, 0, 1)
|
|
|
|
|
|
img_width, img_height = image.size
|
|
|
|
|
|
trans_data = transform_data(line_dict, img_width, img_height)
|
|
|
|
|
|
kp_db = KeypointsDB(trans_data, image_tensor)
|
|
ln_db = LineKeypointsDB(trans_data, image_tensor)
|
|
|
|
|
|
kp_db.get_full_keypoints()
|
|
ln_db.get_lines()
|
|
|
|
kp_dict = kp_db.keypoints_final
|
|
ln_dict = ln_db.lines
|
|
|
|
|
|
kp_dict, ln_dict = complete_keypoints(kp_dict, ln_dict, img_width, img_height)
|
|
|
|
|
|
cam = FramebyFrameCalib(img_width, img_height)
|
|
cam.update(kp_dict, ln_dict)
|
|
cam_params = cam.heuristic_voting(refine_lines=True)
|
|
|
|
return cam_params
|
|
|
|
def main():
|
|
|
|
image_path = "examples/input/cam3.jpg"
|
|
|
|
|
|
camera_params = get_camera_parameters(image_path, cam3_line_dict)
|
|
|
|
|
|
print("=== PARAMÈTRES DE LA CAMÉRA ===")
|
|
print(f"Position (mètres): {camera_params['cam_params']['position_meters']}")
|
|
print(f"Distance focale X: {camera_params['cam_params']['x_focal_length']:.2f}")
|
|
print(f"Distance focale Y: {camera_params['cam_params']['y_focal_length']:.2f}")
|
|
print(f"Point principal: {camera_params['cam_params']['principal_point']}")
|
|
print(f"Matrice de rotation:")
|
|
rotation_matrix = np.array(camera_params['cam_params']['rotation_matrix'])
|
|
print(rotation_matrix)
|
|
|
|
|
|
euler_angles = np.array([
|
|
np.arctan2(rotation_matrix[2,1], rotation_matrix[2,2]),
|
|
np.arctan2(-rotation_matrix[2,0], np.sqrt(rotation_matrix[2,1]**2 + rotation_matrix[2,2]**2)),
|
|
np.arctan2(rotation_matrix[1,0], rotation_matrix[0,0])
|
|
]) * 180 / np.pi
|
|
|
|
print(f"Angles d'Euler (degrés):")
|
|
print(f" Roll: {euler_angles[0]:.1f}°")
|
|
print(f" Pitch: {euler_angles[1]:.1f}°")
|
|
print(f" Yaw: {euler_angles[2]:.1f}°")
|
|
|
|
|
|
|
|
return camera_params
|
|
|
|
if __name__ == "__main__":
|
|
main() |