Contour.py 3.45 KB
import sys
import cv2
import numpy as np

def FindContours(img):
	imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
	#cv2.imshow("Gray", imgray)
	ret,thresh = cv2.threshold(imgray,127,255,0)
	#cv2.imshow("threshold", thresh)
	_,contours,hierarchy = cv2.findContours(thresh, 1, 2)
	return contours

def FindCenterofMass(contours):
	liste = []	
	area = []
	centerMass = []
	for i in range (0,len(contours)):
		cnt = contours[i]
		#print cnt
		M = cv2.moments(cnt)
		area.append(cv2.contourArea(cnt))
		tmp = cv2.contourArea(cnt)
		if (M['m00'] != 0) and (tmp > 1000):
			cx = int(M['m10']/M['m00'])
			cy = int(M['m01']/M['m00'])
			centerMass.append((cx,cy))
		else:
			liste.append(i)
	return 	liste, area, centerMass



def CleanContours(img):
	contours = FindContours(img)
	liste, _, _ = FindCenterofMass(contours)
	for j in range (0,len(liste)):
		a = liste[j]
		if (a < len(contours)): 
			contours.pop(a)
	return contours

def DrawBoundingBox(img):
	contours = FindContours(img)
	for cnt in contours:
		x,y,w,h = cv2.boundingRect(cnt)
		img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
	cv2.imshow('Bounding Box', img)
	return img

def DrawEnclosingCircle(img):
	contours = FindContours(img)
	for cnt in contours:
		(x,y),radius = cv2.minEnclosingCircle(cnt)
		center = (int(x),int(y))
		radius = int(radius)
		img = cv2.circle(img,center,radius,(0,255,0),2)
	cv2.imshow('Enclosing Circle', img)
	return img

def DrawContours(img, contours, titre):
	img = cv2.drawContours(img, contours, -1, (0,255,0), 3)
	cv2.imshow(titre, img)
	return img

def DrawCenterofMass(img):
	contours = FindContours(img)
	_, _, centerMass = FindCenterofMass(contours)
	for x, y in centerMass:
		img=cv2.circle(img, (x,y), 10, (124,255,255), 1)
	cv2.imshow('Center of Mass', img)
	return img

def DrawArea(img):
	contours = CleanContours(img)
	img = cv2.drawContours(img, contours, -1, (255, 0, 0), cv2.FILLED)
	cv2.imshow('Area', img)
	return img	

def ContourChoiceProcessing(img, choice):
	if choice == '1':
		contours = FindContours(img)
		img = DrawContours(img, contours, 'Contours')
		return img
	elif choice == '2':
		contours = CleanContours(img)
		img = DrawContours(img, contours, 'Clean Contours')
		return img
	elif choice == '3':
		img = DrawCenterofMass(img)
		return img
	elif choice == '4':
		img = DrawArea(img)
		return img
	elif choice == '5':
		img = ContourChoiceProcessing(img, '2')
		img = DrawCenterofMass(img)
		return img
	elif choice == '6':
		img = DrawArea(img)
		img = DrawCenterofMass(img)
		return img
	elif choice == '7':
		img = DrawBoundingBox(img)
		return img 
	elif choice == '8':
		img = DrawEnclosingCircle(img)
		return img
	else:
		return

def ContourChoice():
	image = None
	img = None
	print('\t\tContours Features Menu\n')
	while (image is None):
		if sys.version_info >= (3, 0):
			image = str(input('\tImage to use ? By default couleur.png \n'))
		else:
			image = str(raw_input('\tImage to use ? By default couleur.png \n'))
		if not image:
			image = 'couleur.png'
		image = cv2.imread(str(image))
	print ('\t1. Contours\n\t2. Clean Contours\n\t3. Center of Mass\n\t4. Area\n\t5. Contours + Center of Mass\n\t6. Area + Center of Mass\n\t7. Bounding Box\n\t8. Enclosing Circle\n')
	if sys.version_info >= (3, 0):
		choix = input('\n\tMultiple choices possible\n')
	else :
		choix = raw_input('\n\tMultiple choices possible\n')
	for i in range (0, len(choix)):
		img = image.copy()
		img = ContourChoiceProcessing(img, choix[i])
	if img is not None:
		cv2.waitKey(0)
		cv2.destroyAllWindows()
	return