alex
alex

Reputation: 547

Opencv TypeError: points is not a numpy array, neither a scalar

Basically, I have this code that detects changes in background and boxed them. When I run the code, I get this error:

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

Code:

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()

How do i solve this? Thanks.

Upvotes: 3

Views: 19925

Answers (2)

Hadi
Hadi

Reputation: 5598

According to the findContour doc it returns two things:

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

Change the line to:

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

That may works!

Upvotes: 4

berak
berak

Reputation: 39796

contours is actually a double-array. the outer one is the list of contours, the inner ones are the points of a single contour.

so, replace:

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

with:

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

and drop the

contours = contours.h_next()

line (you probably confused cv2 with the old c-api/cv approach, which was using linked lists under the hood)

Upvotes: 1

Related Questions