# How to connect center of detected objects/contours to form a polygon?

Like for example, I've detected all the objects I want to detect. I already find each of its centers. Now, I want to connect all of its center to form closed polygon. Here are the coordinates of the center of the objects: [(412, 429), (249, 418), (400, 193), (561, 181), (541, 57), (256, 50)] I used convexHull and drawContours, it works fine with shapes like squares and rectangles but the problem is it didn't work out like in the sample image. It just connect all the outer objects. Btw, I used python for programming language.

Here is my sample code snippet:

centers = [(412, 429), (249, 418), (400, 193), (561, 181), (541, 57), (256, 50)]

pts = cv2.convexHull(np.array(centers))

cv2.drawContours(img, [pts], 0, (0,0,0), 3)

edit retag close merge delete

1

your points are NOT convex

( 2020-02-27 02:02:09 -0500 )edit

Sort by ยป oldest newest most voted

The problem have been solved. I am using Raspberry pi 4B. Using OpenCV 4.2.0. Not Opencv 3.x. Code:

#!/usr/bin/python37
#Date: 19th March, 2020
#Raspberry pi 4B, Buster, Thonny IDE 3.5, OpenCV 4.2.0

import cv2
import numpy as np

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 3)
thresh = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)[1]

cnts = cv2.findContours(thresh.copy(), cv2.RETR_TREE,
cv2.CHAIN_APPROX_NONE)[0]

for c in cnts:
# compute the center of the contour
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# draw the contour and center of the shape on the image
#cv2.drawContours(image, [c], -1, (0, 255, 0), 4)
#cv2.circle(image, (cX, cY), 2, (0, 0, 255), -1)
#cv2.line(image,(152, 340), (328, 338),(255,0,0),5)
#cv2.line(image,(328, 338), (322, 189),(255,0,0),5)
#cv2.line(image,(322, 189), (491, 176),(255,0,0),5)
#cv2.line(image,(491, 176), (492,67),(255,0,0),5)
#cv2.line(image,(492, 67), (153, 62),(255,0,0),5)
#cv2.line(image,(153, 62), (152, 340),(255,0,0),5)

corners = np.int32([[152, 340], [328, 338],
[322, 189], [491, 176],
[492, 67], [153, 62]])

cv2.polylines(image, [corners], True, (255, 0, 0), 2, cv2.LINE_AA)

# show the image
cv2.imshow("Image", image)
cv2.waitKey(0)


Output:

more

concave hulls, active contours or snakes should be a solution I think

more

Official site

GitHub

Wiki

Documentation

## Stats

Asked: 2020-02-26 10:02:20 -0500

Seen: 86 times

Last updated: Mar 19