например,
=========

тоящее время я работаю над проектом, в котором я пытаюсь обнаружить несколько монет, лежащих на плоской поверхности (то есть столе). Монеты не перекрываются и не скрыты другими предметами. Но могут быть видны другие объекты, и условия освещения могут быть не идеальными ... По сути, вы снимаете свой стол, на котором есть монеты.

Таким образом, каждая точка должна быть видна как эллипс. Поскольку я не знаю положение камеры, форма эллипсов может варьироваться от круга (вид сверху) до плоских эллипсов в зависимости от угла, из которого сняты монеты.

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

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

Другая идея заключалась в том, чтобы использовать метод сопоставления шаблонов эллипса на этом изображении, но, поскольку я не знаю ни угла камеры, ни размера эллипсов, я не думаю, что это сработает хорошо ...

Поэтому я хотел спросить, может ли кто-нибудь сказать мне метод, который будет работать в моем случае ...

**Есть ли быстрый способ извлечь три монеты из изображения? Расчеты должны быть выполнены в реальном времени на мобильных устройствах, и метод не должен быть слишком чувствительным для разных или меняющихся источников света или цвета фона.**

Было бы замечательно, если бы кто-нибудь мог дать мне какие-либо советы о том, какой метод может работать для меня ...

 реализующий традиционный подход (основанный на OpenCV[DOCO](http://www710.univ-lyon1.fr/~bouakaz/OpenCV-0.9.5/docs/ref/OpenCVRef_ImageProcessing.htm)):

Учитывая двоичное изображение, предоставленное Карньери, это вывод:

```
./opencv-contour.out coin-ohtsu.pbm
center x: 291 y: 328 A: 54 B: 42
center x: 286 y: 225 A: 46 B: 32
center x: 471 y: 221 A: 48 B: 33
center x: 140 y: 210 A: 42 B: 28
center x: 419 y: 116 A: 32 B: 19

```
И это выходное изображение:

![]()

Что вы могли бы улучшить:

Обработка различных ориентаций эллипса (в настоящее время я предполагаю, что оси перпендикулярны / горизонтальны). Это было бы не сложно сделать, используя моменты изображения.Проверьте выпуклость объекта (посмотрите на`cvConvexityDefects`)Ваш лучший способ отличить монеты от других предметов, вероятно, будет по форме. Я не могу думать о каких-либо других низкоуровневых функциях изображения (цвет явно отсутствует). Итак, я могу придумать два подхода:

Традиционное обнаружение объектовВаша первая задача - отделить объекты (монеты и не монеты) от фона. Метод Оцу, предложенный Карньери, будет хорошо работать здесь. Вы, кажется, беспокоитесь о том, что изображениядвураздельный но я не думаю, что это будет проблемой. До тех пор, пока видимое количество рабочих мест, вы гарантированно будете иметь один пик в гистограмме. И пока на столе есть пара визуально различимых предметов, вам гарантирован ваш второй пик.

[распространяться](https://en.wikipedia.org/wiki/Dilation_(morphology)#Binary_Operator) ваше двоичное изображение пару раз, чтобы избавиться от шума, оставленного порогом. Монеты относительно большие, поэтому они должны пережить эту морфологическую операцию.

Сгруппируйте белые пиксели в объекты, используя увеличение области - просто итеративно соедините смежные пиксели переднего плана. В конце этой операции у вас будет список непересекающихся объектов, и вы будете знать, какие пиксели занимает каждый объект.

Из этой информации вы узнаете ширину и высоту объекта (из предыдущего шага). Итак, теперь вы можете оценить размер эллипса, который будет окружать объект, а затем посмотреть, насколько хорошо этот конкретный объект соответствует эллипсу. Может быть проще просто использовать соотношение ширины и высоты.

Кроме того, вы можете использовать[моменты](https://en.wikipedia.org/wiki/Image_moment) определить форму объекта более точно.



 как я, но с использованием C ++:

После того, как вы использовали`findContours` чтобы найти контуры (как в ответе Миши выше), вы можете легко подогнать эллипсы, используя`fitEllipse`например,



 как лучше всего решить вашу проблему. Что касается порогового значения, в частности, однако, вы можете использовать метод Оцу, который автоматически находит оптимальное пороговое значение на основе анализа гистограммы изображения. Используйте OpenCV[порог](http://opencv.willowgarage.com/documentation/cpp/imgproc_miscellaneous_image_transformations.html#cv-threshold) метод с параметром`ThresholdType` равно`THRESH_OTSU`.

Имейте в виду, однако, что метод Оцу хорошо работает только на изображениях с бимодальными гистограммами (например, изображения с яркими объектами на темном фоне).

Вы, наверное, видели это, но есть также метод для[примерка эллипса](http://opencv.willowgarage.com/documentation/cpp/imgproc_structural_analysis_and_shape_descriptors.html#cv-fitellipse) вокруг набора 2D точек (например, связанный компонент).

**РЕДАКТИРОВАТЬ**: Метод Оцу, примененный к образцу изображения:

Изображение в градациях серого:![]()

Результат применения метода Оцу:![]()