5

Trying to use findContours() but keep getting a cpp:197 error (-210:Unsupported format or combination of formats)

I have used the same format in other files and it works fine. Not sure why it doesn't work here.

full error:

Traceback (most recent call last):
  File "C:/Users/FreddyMac/PycharmProjects/TestProj/ballTrackingAbsDiff.py", line 33, in <module>
    cnts = cv2.findContours(th1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-cff9bdsm\opencv\modules\imgproc\src\contours.cpp:197: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'

I checked the type of my image and is the correct 'uint8' type.

see code below.

import cv2
import imutils

vs = cv2.VideoCapture('ballsFlying.MP4')
while True:
    # read frame1, resize and convert to grayscale
    ret, frame1 = vs.read()
    if frame1 is None:
        break
    frame1 = imutils.resize(frame1, width=600)
    gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

    # read frame2, resize and convert to grayscale
    ret2, frame2 = vs.read()
    if frame2 is None:
        break
    frame2 = imutils.resize(frame2, width=600)
    gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)

    # compute the difference between frames
    dist = cv2.absdiff(frame1, frame2)
    # blur image
    blurred = cv2.GaussianBlur(dist, (9, 9), 0)

    # global thresholding
    ret3, th1 = cv2.threshold(blurred, 85, 255, cv2.THRESH_BINARY)
    print(th1.dtype)

    cnts = cv2.findContours(th1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    # other way to find contours = same error
    # hierarchy, contours = cv2.findContours(th1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    cv2.imshow('dist', frame1)
    cv2.imshow('thresh', th1)
    cv2.imshow('blurred', blurred)

    # show the frame to our screen
    key = cv2.waitKey(100) & 0xFF
    # if the 'q' key is pressed, stop the loop
    if key == ord("q"):
        break

# otherwise, release the camera
vs.release()
# close all windows
cv2.destroyAllWindows()

1
  • error shows you in which line is problem so use print() to see values in variables which you use in this line. Maybe you have different value then you expect. Commented Sep 2, 2020 at 4:48

2 Answers 2

9

Well, the error says the answer:

FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function

Since you are not using CV_RETR_FLOODFILL, your image should be CV_32SC1 means a single-channel image. findContours works with a single channel image.

Use gray images and the problem will be solved.

dist = cv2.absdiff(gray1, gray2)

Results:

th


enter image description here

Blur


enter image description here

Sign up to request clarification or add additional context in comments.

Comments

3

This can also happen when the input image passed to the function is not uint8. Doing

array = np.array(array, np.uint8)

also might help.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.