Обнаружение объектов в изображении с использованием cv2 и Python

#python #computer-vision #object-detection #cv2

#python #компьютерное зрение #обнаружение объектов #cv2

Вопрос:

У меня есть это изображение изображение

и мне интересно найти объект (т. Е. Точки) На этом изображении и нарисовать прямоугольник вокруг каждого объекта. Я узнал, что с cv2 помощью и обнаружил, что это можно сделать легко. Итак, я написал до сих пор следующие коды с помощью быстрого поиска в Google:

 import numpy as np
import matplotlib.pyplot as plt
import cv2 

print( cv2.__version__ )

# source data
img_file= "data1.png"

# create an OpenCV image
img= cv2.imread(img_file)

plt.imshow(img, cmap='gray')

# Define the classifiers

# pre-trained classifiers 
Point_classifier="haarcascade_eye.xml"   

# convert color image to grey image

gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# CREATE TRACKER

point_tracker=cv2.CascadeClassifier(Point_classifier)

# detect points
points= point_tracker.detectMultiScale(gray_img)
print(points)

Here I used `haarcascade_eye.xml` it looks similar to the point feature of the image, Is this correct? or do I need to use another classifier for this object?
 

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

Любая помощь по этому или где я допускаю ошибку в своих кодах. Заранее спасибо.

это

Ответ №1:

haarcascade_eye.xml используется для обнаружения человеческого глаза. Есть даже отдельные для левого и правого глаза. Не используйте это.

Ваша строка кода points= point_tracker.detectMultiScale(gray_img) завершается с ошибкой, потому что на вашем изображении не обнаружено глаза. SimpleBlobDetector В этом случае вы должны использовать. Внутри SimpleBlobDetector вы можете отфильтровать порог, площадь, округлость, выпуклость, инерцию и т.д. в соответствии с вашими требованиями. Я пробовал это, но мое ядро продолжает умирать, возможно, потому, что это большое изображение. Попробуйте меньший.

Но мы можем попробовать другие методы — я нашел контуры, а затем отфильтровал их по площади, чтобы избежать мелких точек.

 import matplotlib.pyplot as plt
import cv2 

# source data
img_file= "data1.jpg"

# create an OpenCV image
img= cv2.imread(img_file)

# convert color image to grey image
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

im_gauss = cv2.GaussianBlur(gray_img, (5, 5), 0)
ret, thresh = cv2.threshold(im_gauss, 127, 255, 0)
# get contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

margin = 40
# calculate area and filter 
for con in contours:
    area = cv2.contourArea(con)
    if 100 < area < 500:
        x,y,w,h = cv2.boundingRect(con)
        cv2.rectangle(img, (x-margin, y-margin), (x   w margin, y   h margin), (0,255,0), 2)
        
plt.imshow(img, cmap='gray')
 

введите описание изображения здесь

Если вы хотите объединить 3-4 пункта в один — вы можете попробовать :

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

2- Операция закрытия — (Расширение с последующей эрозией) перед нахождением контуров.

Комментарии:

1. Спасибо, что сработало для меня. Но очень сложно увидеть прямоугольную область, когда точки данных расположены близко друг к другу. Есть ли какой-либо способ, с помощью которого мы можем легко идентифицировать эти точки данных?. Кроме того, когда я увеличиваю разрешение изображения, оно ухудшается, есть ли какой-либо способ получить это. Я имею в виду получение конечного изображения с высоким качеством.

2. Рад помочь. Да, близлежащие точки данных — это боль. Готового решения нет. Попробуйте два варианта, которые я перечислил в конце моего ответа. Пожалуйста, примите ответ, если он сработал для вас. Вместо масштабирования отобразите изображение в большем разрешении (используйте plt figsize). Мы нигде не касаемся исходного изображения при обработке, поэтому это не имеет никакого отношения к ухудшению разрешения

3. Прошу вас снова побеспокоить. Как я могу вычислить координаты (верх, низ, ширину, длину) каждого прямоугольника каждой точки?