У меня есть набор чертежей объектов, где некоторые изображения непропорционально масштабированы. Три-четыре измерения были сделаны на каждом из оригинальных объектов. Я хотел бы использовать эти измерения, чтобы найти и исправить неправильно масштабированные изображения.
Используя OpenCV, я написал небольшой скрипт, чтобы найти точки интереса на чертежах. Евклидово расстояние между этими точками соответствует измерениям, которые были выполнены на исходном объекте, т.е. используя точки a и b, я могу найти дельту измерения:
(1) delta = math.sqrt((ax - (alpha * bx)) ** 2 + (ay - (beta * by)) ** 2)
, где альфа и бета - соответственно коэффициенты для x а оси у и неизвестны. Поскольку измерения не совсем точны, мой подход заключается в том, чтобы найти наилучшие альфа и бета с использованием метода наименьших квадратов. Из (1) я получаю следующее уравнение:
(2) -2 * ax * bx * alpha - 2 * ay * by * beta + epsilon = delta ** 2 - (ax ** 2 + bx ** 2 + ay ** 2 + by ** 2)
Вот мой код:
def least_square(self):
rows = []
y = []
for key, value in self.known_dimensions.items():
a = self.points[value["pts"][0]]
b = self.points[value["pts"][1]]
delta_cm = value["cm"]
y.append(delta_cm ** 2 - (a[0] ** 2 + a[1] ** 2 + b[0] ** 2 + b[1] ** 2))
rows.append([-2 * a[0] * b[0], -2 * a[1] * b[1], 1])
y = np.array(y)
m = np.array(rows)
result = np.linalg.lstsq(m, y, rcond=None)
У меня есть два вопроса:
- Этот подход Имеет ли смысл?
- Как вы, возможно, заметили, мои измерения в сантиметрах, но расстояние между точками в пикселях. Как я могу включить отношение см к пикселю в этом уравнении? Поскольку пропорции не соблюдаются, я думаю, что у меня другое соотношение для осей x и y. Альфа и бета уже включают это соотношение?
Большое спасибо!