agrobot_base/Python/OAK/test_camera_plot2.py

47 lines
1.6 KiB
Python
Raw Permalink Normal View History

2025-07-11 16:38:08 +00:00
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# Linhas zero-based (118 -> 017)
linhas = np.arange(18)
distancias_m = np.array([63,68,73,78,85,91,99,107,117,126,140,155,172,192,217,246,276,327]) / 100.0
grid_h = 20
altura_otim = 0.74
#fov_v_graus = 47.04
def modelo_distancia(linha, fov_v_graus, angulo_inclinacao_graus, altura_camera_m):
fov_v_rad = np.radians(fov_v_graus)
theta = np.radians(angulo_inclinacao_graus)
alpha_v = ((linha + 0.5) / grid_h - 0.5) * fov_v_rad
gamma = theta + alpha_v
d = altura_camera_m / np.tan(gamma)
d[gamma <= 0.01] = np.nan
return d
def modelo_fit(linha, fov_v_graus, angulo_inclinacao_graus):
return modelo_distancia(linha, fov_v_graus, angulo_inclinacao_graus, altura_otim)
# Chute inicial (valores aproximados)
p0 = [47.02, 26.29]
# Ajuste FOV e Inclinação ao mesmo tempo:
params_otimizados, _ = curve_fit(modelo_fit, linhas, distancias_m, p0=p0, maxfev=10000)
fov_otim, inclinacao_otim = params_otimizados
print(f"FOV_V ajustado: {fov_otim:.2f}°")
print(f"Inclinação ajustada: {inclinacao_otim:.2f}°")
#print(f"Altura ajustada: {altura_otim:.3f}m")
def dist_grid_calibrado(grid_h, i, fov, incl, altura):
#fov = 47.02 # graus
#incl = 23.29 # graus
#altura = 0.73
alpha_v = ((i + 0.5) / grid_h - 0.5) * np.radians(fov)
gamma = np.radians(incl) + alpha_v
d = altura / np.tan(gamma)
return d
grid_h = 20
dists = np.array([dist_grid_calibrado(grid_h, i, fov_otim, inclinacao_otim, altura_otim) for i in range(grid_h)])
print(np.round(dists,2))