Перейти к содержимому
Compvision.ru
testkorob

нахождение характеристик дуги

Recommended Posts

как мне узнать центр окружности и радиус дуги, если видна только её часть?

 

дуга.PNG

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В OpenCV есть функция HoughCircles, не пробовал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, Nuzhny сказал:

В OpenCV есть функция HoughCircles, не пробовал?

она как то не адекватно работает, по крайней мере у меня, когда дуга такая как на фотке выше, она её не находит, когда больше похожа на окружность находит сразу штук 10, даже если использовать упрощения и убрать мусор

я думаю может как то можно просто определить линию, а после findContours даст мне координаты точек, по которым с смогу найти уравнение этой кривой, а дальше и центр, вопрос только как это определить в виде кривой, а не контура

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно найти контуры, почему нет. Это как раз и будут координаты точек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

проблема в том что там получается контур состоящий из двух рядов точек, внешней и внутренней и как их разделить или усреднить не понимаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если точки знаем точно, окружность определяется тремя точками. Центр можно найти пересечением нормалей, радиус - расстояние от центра до любой точки.
Есть много кода по этому поводу. 


Если координаты с шумом, или точность хромает, то 
есть метод RANSAC который использует статистические методы для улучшения точности. 

https://sdg002.github.io/ransac-circle/index.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Smorodov сказал:

Если точки знаем точно, окружность определяется тремя точками. Центр можно найти пересечением нормалей, радиус - расстояние от центра до любой точки.
Есть много кода по этому поводу. 


Если координаты с шумом, или точность хромает, то 
есть метод RANSAC который использует статистические методы для улучшения точности. 

https://sdg002.github.io/ransac-circle/index.html

в том то и дело, что вопрос, как найти точки, если использовать метод findContours, то в массиве оказывается две линии (внешний край дуги и внутренний)при чём они мам перепутаны и как их разделить я не знаю, между ними хоть расстояние и не большое, но это существенно влияет на детектирование окружности методом трёх точек

а как найти центр окружности и радиус по трём точкам вообще вопросов нет, это ж система из трёх уравнений с тремя неизвестными, немного алгебраических преобразований и координаты центра находятся решением системы из двух линейных уравнений, радиус же находится подставив точки в уравнение окружности

вот что получается после findContours  с апроксимацией, извините за кривые руки

дуга1.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Двойной контур не должен быть проблемой ни для RANSAC (он найдёт одну большую окружность), ни для МНК (он найдёт окружность между контурами).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

но ведь для МНК нужно обрабатывать все найденные точки, ведь если я буду брать только часть нет уверенности что они будут нормально распределены, а точек то там огого сколько боюсь не справится комп при работе в реальном времени...

может быть в opencv есть какой то встроенный метод усреднения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так а RANSAC не сработал? Он уж точно должен был.

По поводу всех точек: можно брать только точки контура. Контур также можно брать не целиком по точкам, а аппроксимированный методом Дугласа-Рамера-Пекера - OpenCV это умеет. И точек будет совсем немного

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
26 минут назад, Nuzhny сказал:

Так а RANSAC не сработал? Он уж точно должен был.

По поводу всех точек: можно брать только точки контура. Контур также можно брать не целиком по точкам, а аппроксимированный методом Дугласа-Рамера-Пекера - OpenCV это умеет. И точек будет совсем немного

сколько умных людей Вы упомянули...

я имел ввиду все точки контуров у меня их получается, в зависимости от ситуации конечно, где то  600-800 каждый кадр и каждый кадр считать всю эту громоздкую математику?

как пользоваться RANSAC так и не разобрался, МНК для прямых понятен, для старших порядков не очень, математика и объем вычислений огромный, разве что случайным образом выбирать десяток точек из контура, в надежде что они будут нормально распределены...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, чуть выше Smorodov скинул ссылку на репозиторий с RANSAC, его же можно просто проверить, работает или нет.
Далее про Дугласа-Пекера. Раз уж ищутся контуры, то можно их там же упростить/апроксимировать встроенными средствами. Можно даже просто так брать не все точки, а, скажем, каждую десятую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 минут назад, Nuzhny сказал:

Ну, чуть выше Smorodov скинул ссылку на репозиторий с RANSAC, его же можно просто проверить, работает или нет.
Далее про Дугласа-Пекера. Раз уж ищутся контуры, то можно их там же упростить/апроксимировать встроенными средствами. Можно даже просто так брать не все точки, а, скажем, каждую десятую.

извините, не заметил, что по той ссылке есть ссылка на гитхаб:rolleyes: там всё равно как то все очень сложно

я только за апроксимацию/упрощение встроенными средствами, вот только какими? я только эрозию пытался использовать, линии всё равно толстые. про метод Дугласа-Пекера если честно впервые слышу:( беглое гугленье опять меня напугало большим количеством непонятного кода

неужели в opencv нельзя получить кривую? прямую же там можно найти, оно как то её усредняет, а почему с кривыми такая беда?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сейчас с телефона, но по памяти параметр типа  approxPolyDP - это как раз Дуглас-Пекер. Встроен уже много лет как, можно пользоваться.

 

Почему прямую так просто, потому что её усреднение с МНК сводится к решению системы линейных уравнений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

так всё в конечном итоге сводится к линейным уравнениям, даже та же окружность от системы из 3 уравнений преходим к двум, квадраты пропадают и уравнения становятся линейными

за approxPolyDP  спасибо, пойду изучать

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да возьмите или все координаты пикселей дуги, или каждую N-нную, или точки, и прогоните рансаком https://github.com/aerolalit/RANSAC-Algorithm , или скелетизируйие,  например так:  https://github.com/LingDong-/skeleton-tracing  или https://stackoverflow.com/questions/22058485/how-to-implement-an-function-equivalent-to-bwmorph-matlab-function-in-opencv/22060992#22060992

MSE более чувствителен к шуму и равномерности плотности семплирования точек, чем рансак, но если данные чистые, то большой разницы не будет. Но чистые данные, это обычно большая редкость )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×