21

I try to use checkContour() function in new python api (cv2) and it do works if I create contours to be checked using findContours e.g.

contours, hierarchy = cv2.findContours(imgGray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cv2.contourArea(contours[0])

however when I create contour on my own the following code doesn't work

contour = numpy.array([[0,0], [10,0], [10,10], [5,4]])
area = cv2.contourArea(contour)

and returns "error: (-215) contour.checkVector(2) >= 0 && (contour.depth() == CV_32F || contour.depth() == CV_32S) in function contourArea"

when I change to

contour = numpy.array([[0,0], [10,0], [10,10], [5,4]], dtype=numpy.int32)

I got "error: (-210) The matrix can not be converted to point sequence because of inappropriate element type in function cvPointSeqFromMat"

How to make the following code in C++ from documentation

vector<Point> contour;
contour.push_back(Point2f(0, 0));
contour.push_back(Point2f(10, 0));
contour.push_back(Point2f(10, 10));
contour.push_back(Point2f(5, 4));

double area0 = contourArea(contour);

work in latest python API (2.3)?

1 Answer 1

35

This one should work:

contour = numpy.array([[[0,0]], [[10,0]], [[10,10]], [[5,4]]])
area = cv2.contourArea(contour)
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks! This is the mad one-liner for calculating the area from a list of float tuples coordinates: area = cv2.contourArea(np.around(np.array([[pt] for pt in FLOAT_TUPLE_LIST])).astype(np.int32))

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.