OpenCV: детектор краев Canny получает minEnclosingCircle - PullRequest
1 голос
/ 13 мая 2019

Я использую детектор краев Canny для обнаружения объекта на белом фоне и хотел бы нарисовать прямоугольник и окружность вокруг него. Я могу получить координаты для ограничивающего прямоугольника, но не для функций OpenCV minAreaRect и minEnclosingCircle.

import cv2
import numpy as np

img = cv2.imread(image.path, 0)
edges = cv2.Canny(img, 100, 200)

#Bounding Rectangle works
x, y, w, h = cv2.boundingRect(edges)

#This does not work
(x,y),radius = cv2.minEnclosingCircle(edges)

#This also does not work
rect = cv2.minAreaRect(edges)

Ошибка:

Traceback (most recent call last):
  File "/home/hschneider/workspace/onspiration/website/venv/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3296, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-28-f9e34ac01335>", line 1, in <module>
    cv2.minEnclosingCircle(edges)
cv2.error: OpenCV(4.1.0) /io/opencv/modules/imgproc/src/shapedescr.cpp:160: error: (-215:Assertion failed) count >= 0 && (depth == CV_32F || depth == CV_32S) in function 'minEnclosingCircle'

Полагаю, это потому, что результат детектора контуров Canny имеет неверный формат, но я не могу понять, как его преобразовать, чтобы он работал.

1 Ответ

2 голосов
/ 13 мая 2019

Разница между этими функциями заключается в том, что boundingRect работает с изображением, а minEnclosingCircle и minAreaRect работают с набором точек 2D.Чтобы получить точку, заданную на выходе Canny, вы можете использовать findCountours, как предложено в этого урока :

# im2, contours, hierarchy = cv.findContours(thresh, 1, 2) # OpenCV 3.x
contours, hierarchy = cv.findContours(thresh, 1, 2)        # OpenCV 4.x
cnt = contours[0]

rect = cv.minAreaRect(cnt)

(x,y),radius = cv.minEnclosingCircle(cnt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...