|
|
|
|
@ -1,45 +1,45 @@
|
|
|
|
|
# Measuring Size of Objects with OpenCV
|
|
|
|
|
### Calculates the size of objects based on a given reference object
|
|
|
|
|
|
|
|
|
|
Cool object size estimator with just OpenCV and python
|
|
|
|
|
|
|
|
|
|
All thanks to Adrian Rosebrock (from [pyimagesearch](https://www.pyimagesearch.com/)) for making
|
|
|
|
|
great tutorials. This project is inspired from his blog: [Measuring size of objects in an image with OpenCV](https://www.pyimagesearch.com/2016/03/28/measuring-size-of-objects-in-an-image-with-opencv/). I have included the author's code and the one i wrote my self as well.
|
|
|
|
|
|
|
|
|
|
## **Key Points**
|
|
|
|
|
1. Steps involved:
|
|
|
|
|
1. Find contours in the image.
|
|
|
|
|
2. Get the minimum area rectangle for the contours.
|
|
|
|
|
3. Draw the mid points and the lines joining mid points of the bounding rectangle of the contours.
|
|
|
|
|
4. Grab the reference object from the contours and calculate **Pixel Per Metric** ratio.
|
|
|
|
|
5. Calculate and print the bounding rectangle's dimensions based on the reference object's dimensions.
|
|
|
|
|
2. Assumptions:
|
|
|
|
|
1. There is a reference object in the image which is easy to find and it's width/height is know to us.
|
|
|
|
|
3. Uses "Pixel Per Metric" ratio to calculate the size based on the given reference object.
|
|
|
|
|
4. Reference object properties:
|
|
|
|
|
1. We should know the dimensions of this object (in terms of width or height).
|
|
|
|
|
2. We should be able to easily find this reference object in the image, either based on the placement of the object (like being placed in top-left corner, etc.) or via appearances (like distinctive color and/or shape).
|
|
|
|
|
5. Used the United States quarter as the reference object.
|
|
|
|
|
6. Used the OpenCV's find contours method to find the objects in the image and calculated their dimensions.
|
|
|
|
|
|
|
|
|
|
## **Requirements: (with versions i tested on)**
|
|
|
|
|
1. python (3.7.3)
|
|
|
|
|
2. opencv (4.1.0)
|
|
|
|
|
3. numpy (1.61.4)
|
|
|
|
|
4. imutils (0.5.2)
|
|
|
|
|
|
|
|
|
|
## **Commands to run the detection:**
|
|
|
|
|
```
|
|
|
|
|
python object_size.py --image images/example_01.png --width 0.955
|
|
|
|
|
# Измерение размера объектов с помощью OpenCV
|
|
|
|
|
### Вычисляет размер объектов на основе заданного эталонного объекта
|
|
|
|
|
|
|
|
|
|
Классный оценщик размера объекта с помощью только OpenCV и python
|
|
|
|
|
|
|
|
|
|
Выражаю благодарность Адриану Роузброку (из [pyimagesearch](https://www.pyimagesearch.com /)) за создание
|
|
|
|
|
отличных руководств. Этот проект вдохновлен его блогом: [Измерение размера объектов на изображении с помощью OpenCV](https://www.pyimagesearch.com/2016/03/28/measuring-size-of-objects-in-an-image-with-opencv/). Я включил код автора и тот, который я написал сам.
|
|
|
|
|
|
|
|
|
|
## ** Ключевые моменты**
|
|
|
|
|
1. Необходимые шаги:
|
|
|
|
|
1. Найдите контуры на изображении.
|
|
|
|
|
2. Получите прямоугольник минимальной площади для контуров.
|
|
|
|
|
3. Нарисуйте средние точки и линии, соединяющие средние точки ограничивающего прямоугольника контуров.
|
|
|
|
|
4. Выделите опорный объект из контуров и вычислите соотношение **Пиксель на метрику**.
|
|
|
|
|
5. Вычислите и распечатайте размеры ограничивающего прямоугольника на основе размеров эталонного объекта.
|
|
|
|
|
2. Допущения:
|
|
|
|
|
1. На изображении есть эталонный объект, который легко найти, и его ширина / высота нам известна.
|
|
|
|
|
3. Использует соотношение "Пиксель на метрику" для вычисления размера на основе данного эталонного объекта.
|
|
|
|
|
4. Свойства ссылочного объекта:
|
|
|
|
|
1. Мы должны знать размеры этого объекта (в пересчете на ширину или высоту).
|
|
|
|
|
2. Мы должны быть в состоянии легко найти этот эталонный объект на изображении, либо основываясь на размещении объекта (например, в верхнем левом углу и т.д.), либо по внешнему виду (например, отличительному цвету и / или форме).
|
|
|
|
|
5. Использовал квартал Соединенных Штатов в качестве эталонного объекта.
|
|
|
|
|
6. Использовал метод поиска контуров в OpenCV, чтобы найти объекты на изображении и вычислить их размеры.
|
|
|
|
|
|
|
|
|
|
## ** Требования: (с версиями, на которых я тестировал)**
|
|
|
|
|
1. python (3.7.3)
|
|
|
|
|
2. opencv (4.1.0)
|
|
|
|
|
3. numpy (1.61.4)
|
|
|
|
|
4. imutils (0.5.2)
|
|
|
|
|
|
|
|
|
|
## **Команды для запуска обнаружения:**
|
|
|
|
|
```
|
|
|
|
|
питон object_size.py --изображение images/example_01.png --ширина 0.955
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## **Results:**
|
|
|
|
|
The results are pretty decent even though not perfect. This is due the limitations of the image itself as its not perfect top-down view of the objects and some calibrations could have also been done in the camera before clicking the picture.
|
|
|
|
|
## **Результаты:**
|
|
|
|
|
Результаты довольно приличные, хотя и не идеальные. Это связано с ограничениями самого изображения, поскольку на нем не идеальный вид объектов сверху вниз, и некоторые калибровки также могли быть выполнены в камере перед щелчком по изображению.
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|

|
|
|
|
|

|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## **The limitations**
|
|
|
|
|
1. This technique requires the image to be near perfect top-down view of the objects to calculate the accurate results. Otherwise the dimensions of the objects in the image may be distorted.
|
|
|
|
|
2. The photos are prone to radial and tangential lens distortion which would lead to uneven object dimensions.
|
|
|
|
|
## ** Ограничения**
|
|
|
|
|
1. Для получения точных результатов этот метод требует, чтобы изображение объектов было почти идеальным при просмотре сверху вниз. В противном случае размеры объектов на изображении могут быть искажены.
|
|
|
|
|
2. Фотографии подвержены радиальному и тангенциальному искажению объектива, что может привести к неравномерным размерам объекта.
|