Jump to content
Compvision.ru
testkorob

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
5 часов назад, Nuzhny сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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


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

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

Share this post


Link to post
Share on other sites
1 час назад, Smorodov сказал:

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


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

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

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

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

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

дуга1.png

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
26 минут назад, Nuzhny сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
5 минут назад, Nuzhny сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

Да возьмите или все координаты пикселей дуги, или каждую 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 более чувствителен к шуму и равномерности плотности семплирования точек, чем рансак, но если данные чистые, то большой разницы не будет. Но чистые данные, это обычно большая редкость )

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×