Каковы основы OpenCV Circle reshape() и синтаксиса?

#python #opencv

#python #opencv

Вопрос:

Я только что написал этот простой код для отслеживания кругов, он вообще не настроен, и я хочу исправить свою ошибку, прежде чем продолжить. В нем говорится:

Ошибка значения: невозможно преобразовать массив размером 6 в форму (3,)

Я пытался искать в Интернете, но у меня голова идет кругом. Может кто-нибудь указать мне правильное направление?

 import cv2
import numpy as np


cap = cv2.VideoCapture(0)
def circle_image(image, circles):
    image_circles = np.zeros_like(image)
    if circles is not None:
        for circle in circles:
            rad, x1, y1 = circle.reshape(3)
            cv2.circle(image_circles,(x1,y1),rad,(255,0,0), 10)
    return  image_circles

while cap.isOpened():
    ret, frame = cap.read()
    if ret == True:
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        blur_frame = cv2.GaussianBlur(gray_frame, (5, 5), 0)
        canny_frame = cv2.Canny(blur_frame, 100, 100)
        tires = cv2.HoughCircles(canny_frame,cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)

        circles_to_blend = circle_image(canny_frame, tires)
        combo_image = cv2.addWeighted(canny_frame, 0.8, circles_to_blend, 1, 1)

        cv2.imshow('frame', combo_image)
    if cv2.waitKey(1) amp; 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
  

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

1. Добро пожаловать в SO !… Попробуйте circle.reshape((3, -1)) , посмотрите numpy.reshape .

Ответ №1:

На самом деле мне пришлось протестировать HoughCircles в python, чтобы понять проблему. Я не знаю почему, но функция HoughCircles возвращает в python список списков кругов. Итак, вы хотите сделать

 for circle in circles[0,:]:
  

чтобы это работало. Однако в документации вы можете ясно видеть, что это неправильно:

 rad, x1, y1 = circle.reshape(3)
  

Окружность должна быть x, y, rad, а также вам не нужно изменять форму. В некоторых случаях это может быть 4 значения (голоса), и эта строка завершится ошибкой, поскольку 4 значения не могут быть преобразованы в 3, но вы можете сделать следующее:

 x1, y1, rad = circle[:3] # this takes the first 3 numbers
  

Я думаю, что после этих изменений ваш код должен работать.