Расчет центра объекта на изображении - PullRequest
0 голосов
/ 27 января 2019

Я читал этот пост , чтобы вычислить центр изображения, используя OpenCV, который использует Moments.Но я пытаюсь вычислить центр объекта, который я обнаружил, используя HoughLinesP.Есть ли способ с OpenCV, я мог бы сделать это?

Вот изображение, для которого я пытаюсь вычислить центры.

enter image description here

Сегменты линии былинайдено, и выходное изображение выглядит следующим образом:

enter image description here

import cv2
import numpy as np
import math

img = cv2.imread("./images/octa.jpg")

b,g,r = cv2.split(img)

smoothed = cv2.GaussianBlur(g, (3,3), 0)

edges = cv2.Canny(smoothed, 15, 60, apertureSize = 3)

lines = cv2.HoughLinesP(edges,1,np.pi/180,35, 30, 20)


print("length of lines detected ", lines.shape)


for line in lines:
        for x1,y1,x2,y2 in line:
          cv2.line(img,(x1,y1),(x2,y2),(255,0,0),2)
          print("x1,y1", x1,",",y1, " --- ", "x2,y2", x2,",",y2)



cv2.imshow('detected',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Используя координаты, как я могу вычислить центр этого изображения?Как я могу использовать Moments здесь?

У меня есть одно ограничение: я не могу использовать Contour методы, включенные в OpenCV.

1 Ответ

0 голосов
/ 27 января 2019

Следующий код был использован с cv2 версией 3.3.1.

Я внимательно следил за документами opencv , и все работало нормально.

import cv2

img = cv2.imread("octa.jpg", 0)
ret,thresh = cv2.threshold(img,100,255,0)
im2, contours, hierachy = cv2.findContours(thresh, 1, 2)
cnt = contours[0]

M = cv2.moments(cnt)

cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

im2 = cv2.cvtColor(im2, cv2.COLOR_GRAY2RGB)

cv2.polylines(im2, cnt, True, (0, 0, 255), 2)

cv2.circle(im2, (cx, cy), 5, (0, 0, 255), 1)

cv2.imshow("res", im2)

Два примечания:

  • вам необходимо добавить аргумент 0 к imread, иначе поиск контура не будет работать
  • Я установилпорог чуть ниже, поэтому были найдены только контуры восьмиугольника

Результат:

result

Если выиспользуйте другую версию cv2, вы можете просто изменить документацию на вашу версию;документация действительно хорошая.

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

РЕДАКТИРОВАТЬ Без контура:

Я взял полезные комментарии из этого поста и немного повозился.Это не использует контуры.Он находит линии и использует их, чтобы найти центр

import cv2
import numpy as np

mg = cv2.imread('octa.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size),0)
ret,thresh = cv2.threshold(blur_gray,100,255,0)

low_threshold = 50
high_threshold = 150
edges = cv2.Canny(thresh, low_threshold, high_threshold)

rho = 1  # distance resolution in pixels of the Hough grid
theta = np.pi / 180  # angular resolution in radians of the Hough grid
threshold = 15  # minimum number of votes (intersections in Hough grid cell)
min_line_length = 50  # minimum number of pixels making up a line
max_line_gap = 50  # maximum gap in pixels between connectable line segments
line_image = np.copy(img) * 0  # creating a blank to draw lines on

# Run Hough on edge detected image
# Output "lines" is an array containing endpoints of detected line segments
lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),
                    min_line_length, max_line_gap)

for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),2)

lines_edges = cv2.addWeighted(img, 0.5, line_image, 1, 0)

line_image_gray = cv2.cvtColor(line_image, cv2.COLOR_RGB2GRAY)

M = cv2.moments(line_image_gray)

cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

cv2.circle(lines_edges, (cx, cy), 5, (0, 0, 255), 1)

cv2.imshow("res", lines_edges)

Результат: enter image description here Найденные линии нарисованы синим цветом;центр в красном

...