Общий подсчет объектов Python OpenCV - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь создать общий алгоритм подсчета объектов с использованием python и openCV (открыть, чтобы попробовать другие методы), однако я не могу получить хороший счетчик для различных объектов и не знаю, как их разместить длячто

https://imgur.com/a/yAkRxWH являются примерами тестовых изображений.

Это для ускорения инвентаризации меньших объектов.

** РЕДАКТИРОВАТЬ Это мой текущийкод (простой детектор BLOB-объектов)

# Standard imports
import cv2
import numpy as np;

# Read image
im = cv2.imread("./images/screw_simple.jpg", cv2.IMREAD_GRAYSCALE)
im = cv2.resize(im, (1440, 880))

# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()

# Change thresholds
params.minThreshold = 10 #10
params.maxThreshold = 200 #200

# Filter by Area.
params.filterByArea = True # True
params.minArea = 500 #1500

# Filter by Circularity
params.filterByCircularity = True #True
params.minCircularity = 0.1 #0.1

# Filter by Convexity
params.filterByConvexity = True #True
params.minConvexity = 0.0 #0.87

# Filter by Inertia
params.filterByInertia = True #True
params.minInertiaRatio = 0.0 #0.01

# Create a detector with the parameters
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3:
    detector = cv2.SimpleBlobDetector(params)
else:
    detector = cv2.SimpleBlobDetector_create(params)

# Detect blobs.
keypoints = detector.detect(im)

# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures
# the size of the circle corresponds to the size of blob
total_count = 0
for i in keypoints:
    total_count = total_count + 1


im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show blobs
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

print(total_count)

Вот результаты, которые я получаю: https://imgur.com/a/id6OlIA

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

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Для лучшей читабельности я бы поставил это во втором ответе: использовать подход сегментации, например алгоритм водораздела

Любое изображение в градациях серого можно рассматривать как топографическую поверхность, где высокая интенсивность обозначает пики и холмы, а низкая интенсивность обозначает долины. Вы начинаете заполнять каждую изолированную долину (локальные минимумы) разноцветной водой (метки). Когда вода поднимается, в зависимости от пиков (градиентов) поблизости, вода из разных долин, очевидно, с разными цветами, начнет сливаться. Чтобы избежать этого, вы строите барьеры в местах слияния воды. Вы продолжаете заполнять водой и строить барьеры, пока все пики не окажутся под водой. Тогда созданные вами барьеры дают вам результат сегментации. Это «философия» позади водораздела.

Original image Segmented image

0 голосов
/ 10 апреля 2019

Вы можете попробовать подход OpenCV, вы можете использовать SimpleBlobDetector

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

Это то, что делает детектор (см. Подробности здесь ):

  1. Определение порога : преобразование исходных изображений в несколько двоичных изображений путем установки порогового значения исходного изображения с пороговыми значениями, начинающимися с minThreshold. Эти пороговые значения увеличиваются на thresholdStep до maxThreshold. Таким образом, первый порог равен minThreshold, второй - minThreshold + thresholdStep, третий - minThreshold + 2 x thresholdStep и т. Д.
  2. Группировка : В каждом двоичном изображении связанные белые пиксели сгруппированы вместе. Давайте назовем эти двоичные двоичные объекты.
  3. Объединение : центры двоичных объектов в двоичных изображениях вычисляются, а объекты, расположенные ближе, чем minDistBetweenBlobs, объединяются.

  4. Расчет центра и радиуса : Центры и радиусы новых слитых капель вычисляются и возвращаются.

Найдите код под изображением.

Output Image

# Standard imports
import cv2
import numpy as np

# Read image
im = cv2.imread("petri.png", cv2.IMREAD_COLOR)

# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()

# Change thresholds
params.minThreshold = 0
params.maxThreshold = 255

# Set edge gradient
params.thresholdStep = 5

# Filter by Area.
params.filterByArea = True
params.minArea = 10

# Set up the detector with default parameters.
detector = cv2.SimpleBlobDetector_create(params)

# Detect blobs.
keypoints = detector.detect(im)

# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0, 0, 255),
                                      cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show keypoints
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...