Я также разместил эту тему в форуме Q & A на opencv.org, но я не знаю, сколько экспертов здесь читают этот форум - так простите меня, что я тоже здесь пытаюсь.
В настоящее время я изучаю OpenCV, и моя текущая задача - измерить расстояние между двумя шарами, которые лежат на тарелке. Мой следующий шаг - сравнить несколько камер и разрешений, чтобы понять, насколько важны разрешение, шум, искажения и т.д. И насколько тяжелые эти параметры влияют на точность. Если сообщество заинтересовано в результатах, я рад поделиться результатами, когда они будут готовы! Камера расположена над пластиной с помощью широкоугольного объектива. Известны ширина и высота пластины (1500 x 700 мм) и радиус шариков (40 мм).
Мои действия:
- калибровка камеры
- Неисправность изображения (искажение высокое из-за широкоугольного объектива)
- findHomography: я использую угловые точки пластины в качестве входных данных (4 точки в пикселях в неискаженном изображении) и угловые точки в миллиметрах (начиная с 0,0 в левом нижнем углу, до 1500 700 в верхний правый угол)
- используя HoughCircles, чтобы найти шары в неискаженном изображении
- Применение перспективыТрансформация по точкам окружности = > Центрирующие точки окружности теперь существуют в миллиметрах
- вычисление расстояния между двумя центральными точками: d = sqrt ((x1-x2) ^ 2 + (y1-y2) ^ 2)
Результаты: ошибка около 4 мм на расстоянии 300 мм, погрешность около 25 мм на расстоянии 1000 мм. Но если я измеряю прямоугольник, который печатается на пластине, ошибка меньше 0,2 мм, поэтому я думаю, что калибровка и искажение работают хорошо.
Я подумал об этом и выяснил три возможные причины:
- findHomography применялась к точкам, лежащим прямо на пластине, тогда как центральные точки шаров должны быть измерены на экваториальной высоте = > как я могу изменить результат findHomography, чтобы изменить это, то есть "переместить" самолет? Радиус в мм известен.
- ошибка увеличивается с увеличением расстояния шара до оптического центра, потому что камера не увидит мяч сверху, поэтому центральная точка в 2D-проекции изображения не такая, как в 3D-мире - я проедем дальше к границам изображения. = > Есть ли какие-либо геометрические операции, которые я могу применить в найденном центре, чтобы исправить значение?
- во время неисторификации, возможно, потеря информации, потому что я создаю новое неискаженное изображение и возвращаюсь к точности пикселей, хотя у меня много значений с плавающей запятой в матрице искажений. Должен ли я искать шары в искаженном изображении и преобразовывать только центральные точки с матрицей искажений? Но я не знаю, какой код для этой задачи.
Я надеюсь, что кто-то может помочь мне улучшить это, и я надеюсь, что эта тема интересна другим запускам OpenCV.
Спасибо и с наилучшими пожеланиями!