Opencv TypeError: точки не являются массивом numpy, ни скалярным

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

Traceback (most recent call last): File "cam2.py", line 28, in <module> vertices = cv2.boundingRect(list(contours)) TypeError: points is not a numpy array, neither a scalar 

Код:

 import cv2 import numpy as np c = cv2.VideoCapture(0) _,f = c.read() avg1 = np.float32(f) while(1): _,f = c.read() cv2.accumulateWeighted(f,avg1,0.1) res1 = cv2.convertScaleAbs(avg1) absdiff = cv2.absdiff(f,res1) graydiff = cv2.cvtColor(absdiff, cv2.COLOR_BGR2GRAY) retval, mask = cv2.threshold(graydiff, 50,255,cv2.THRESH_BINARY) mask = cv2.dilate(mask, None, 18) mask = cv2.erode(mask, None, 10) contours = cv2.findContours(mask, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) #not right while contours: vertices = cv2.boundingRect(list(contours)) interest = vertices point1 = (interest[0], interest[1]) point2 = (interest[0] + interest[2], interest[1] + interest[3]) cv2.rectangle(f, point1, point2, cv2.RGB(255,0,0), 1) cv2.rectangle(mask, point1, point2, cv2.RGB(255,255,255), 1) contours = contours.h_next() cv2.imshow('mask',mask) cv2.imshow('img',f) cv2.imshow('avg1',res1) k = cv2.waitKey(20) if k == 27: break cv2.destroyAllWindows() c.release() в import cv2 import numpy as np c = cv2.VideoCapture(0) _,f = c.read() avg1 = np.float32(f) while(1): _,f = c.read() cv2.accumulateWeighted(f,avg1,0.1) res1 = cv2.convertScaleAbs(avg1) absdiff = cv2.absdiff(f,res1) graydiff = cv2.cvtColor(absdiff, cv2.COLOR_BGR2GRAY) retval, mask = cv2.threshold(graydiff, 50,255,cv2.THRESH_BINARY) mask = cv2.dilate(mask, None, 18) mask = cv2.erode(mask, None, 10) contours = cv2.findContours(mask, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) #not right while contours: vertices = cv2.boundingRect(list(contours)) interest = vertices point1 = (interest[0], interest[1]) point2 = (interest[0] + interest[2], interest[1] + interest[3]) cv2.rectangle(f, point1, point2, cv2.RGB(255,0,0), 1) cv2.rectangle(mask, point1, point2, cv2.RGB(255,255,255), 1) contours = contours.h_next() cv2.imshow('mask',mask) cv2.imshow('img',f) cv2.imshow('avg1',res1) k = cv2.waitKey(20) if k == 27: break cv2.destroyAllWindows() c.release() 

Как я могу это решить? Благодарю.

2 Solutions collect form web for “Opencv TypeError: точки не являются массивом numpy, ни скалярным”

Согласно документу findContour, он возвращает две вещи:

 cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → contours, hierarchy 

Измените строку так:

 contours, hierarchy = cv2.findContours(mask, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) 

Это может сработать!

Контуры на самом деле представляют собой двойной массив. внешний – это список контуров, внутренние – точки одного контура.

поэтому замените:

 while contours: vertices = cv2.boundingRect(list(contours)) 

с:

 for cnt in contours: vertices = cv2.boundingRect(cnt) 

и отбросить

 contours = contours.h_next() 

(вы, вероятно, путали cv2 со старым подходом c-api / cv, который использовал связанные списки под капотом)

  • OpenCV - применить маску к цветному изображению
  • Отслеживание объектов в python
  • Соответствие BFMatcher в ошибке запуска OpenCV
  • OCR текста с низким разрешением из скриншотов
  • Как преобразовать Mat из opencv в формат caffe
  • Как удалить горизонтальные и вертикальные линии из изображения
  • Круговое преобразование Hough пропускает круги
  • Как найти желтую координату окна изображения?
  • Как узнать общее количество кадров в файле cv2 в python
  • Ошибка OpenCV-Python cv2.CV_CAP_PROP_POS_FRAMES
  • Ошибка opencv python: утверждение не выполнено (size.width> 0 && size.height> 0)
  • Python - лучший язык программирования в мире.