2015-07-07 15:43:39 -0600 commented question How Does Contour Extraction Work? Do you have any suggestions for approximating 3D shapes? I've looked into PCL as well, but it didn't seem like it could create a 3D representation. 2015-07-07 11:32:46 -0600 commented question How Does Contour Extraction Work? Sorry, added code for reference. 2015-07-07 11:22:36 -0600 received badge ● Editor (source) 2015-07-07 01:34:13 -0600 asked a question How Does Contour Extraction Work? 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 [] 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 def removeDuplicates(contours): 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()