I've been modifying squares.py to be able to detect contours of 3D objects. My goal is for it to extract the shapes of 3D objects (i.e. get the squares of a cube). However, whenever I run my code on the image below, drawing the contours gives me a hexagon and a green Y. Is there any way to modify this so that for each contour, I get the polygon of a square/ shape? Thanks!
!/usr/bin/env python
'''
Usage:
ObjectDescriptors.py [<image source="">]
Converts visual objects into basic shapes.
'''
import cv2
import numpy as np
relative module
import video
built-in module
import sys
from bulbs.neo4jserver import Graph
def findShapes(img):
img = cv2.GaussianBlur(img, (1, 1), 0)
cv2.imshow("test", img)
shapeList =
[]
[]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 11, 17, 17)
edged = cv2.Canny(gray, 0, 200)
cv2.imshow("test", edged)
contours, hierarchy = cv2.findContours(edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
cnt_len = cv2.arcLength(cnt, True)
cnt = cv2.approxPolyDP(cnt, 0.01*cnt_len, True)
shapeList.append(cnt)
keyVertices = []
for i in shapeList:
print("Shape Coordinates:", [pts for pts in i])
return
shapeList
shapeList def removeDuplicates(contours):
print(2) print(2)
if __name__ == '__main__':
from glob import glob
for fn in glob('../data/perfectcube/png'):
img = cv2.imread(fn)
squares = findShapes(img)
cv2.drawContours( img, squares, 0, (0, 255, 0), 3 )
cv2.drawContours( img, squares, 1, (255, 0, 0), 3 )
cv2.drawContours( img, squares, 2, (0, 0, 255), 3 )
cv2.imshow('squares', img)
ch = 0xFF & cv2.waitKey()
if ch == 27:
break
cv2.destroyAllWindows()cv2.destroyAllWindows()