#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. Прошу вас снова побеспокоить. Как я могу вычислить координаты (верх, низ, ширину, длину) каждого прямоугольника каждой точки?