问题
大家好,我正在尝试制作一个系统,可以使用 OpenCV 在天花板上绘制标记。为此,我需要能够使用旧标记的已知位置来计算新标记的位置。当我运行下面的脚本时,出现以下错误:
TypeError:fsolve:输入和输出之间不匹配 “func”参数“unknown_point_equations”的形状。形状应该是 (2,) 但它是 (3,)。
预期结果
预期结果当然是 (x,y) 的正确坐标,而不是错误。
代码
import numpy as np
from scipy.optimize import fsolve
def unknown_point_equations(variables, x1, y1, d1, x2, y2, d2, x3, y3, d3):
x, y = variables
eq1 = (x - x1)**2 + (y - y1)**2 - d1**2
eq2 = (x - x2)**2 + (y - y2)**2 - d2**2
eq3 = (x - x3)**2 + (y - y3)**2 - d3**2
return [eq1, eq2, eq3]
def calculate_unknown_point(x1, y1, d1, x2, y2, d2, x3, y3, d3):
# Initial guess for the unknown point
initial_guess = [0, 0]
# Solve the system of equations
result, infodict, ier, msg = fsolve(unknown_point_equations, initial_guess, args=(x1, y1, d1, x2, y2, d2, x3, y3, d3), full_output=True)
if ier != 1:
raise RuntimeError(f"fsolve did not converge: {msg}")
# Extract the coordinates of the unknown point
x_p, y_p = result[0], result[1]
return x_p, y_p
复制价值
x1, y1, d1 = 324,300,147
x2, y2, d2 = 278,414,224
x3, y2, d3, = 357,437,276
您的输入和输出不匹配。您的输入是
initial_guess = [0, 0]
你的输出是,根据
unknown_point_equations
的函数签名:
[eq1, eq2, eq3]
您可以通过使用虚拟变量来解决此问题。如果你的函数没有从 N 长度向量到 N 长度向量,
fsolve
会很不高兴(本质上,你的函数必须是线性映射)。
我的直觉是,你最初的猜测应该是
[0, 0, 0]
,你不应该对第三个变量做任何事情。狩猎快乐!
import numpy as np
from scipy.optimize import fsolve
def unknown_point_equations(variables, x1, y1, d1, x2, y2, d2, x3, y3, d3):
x, y, _ = variables
eq1 = (x - x1)**2 + (y - y1)**2 - d1**2
eq2 = (x - x2)**2 + (y - y2)**2 - d2**2
eq3 = (x - x3)**2 + (y - y3)**2 - d3**2
return [eq1, eq2, eq3]
def calculate_unknown_point(x1, y1, d1, x2, y2, d2, x3, y3, d3):
# Initial guess for the unknown point
initial_guess = [0, 0, 0]
# Solve the system of equations
result, infodict, ier, msg = fsolve(
unknown_point_equations,
initial_guess,
args=(x1, y1, d1, x2, y2, d2, x3, y3, d3),
full_output=True
)
if ier != 1:
raise RuntimeError(f"fsolve did not converge: {msg}")
# Extract the coordinates of the unknown point
x_p, y_p, _ = result
return x_p, y_p
(尽管如此,就其价值而言,它对于您提供的值并不收敛。您需要一个不同的起点。)