0

I'm trying to find the contour of the attached image of a tshirt. FindContours returns a rectangular frame around the tshirt, and doesn't find any additional contours. My goal is to find the external contour of the tshirt. Any idea what am I doing wrong?

Code below. Thanks. Li

from PIL import Image
import os
import numpy
import bs4
import scipy
import cv2

STANDARD_SIZE = (200, 200)

# read image file
image_obj_orig = cv2.imread(image_file)
image_name = os.path.split(image_file)[-1]
name, extension = os.path.splitext(image_name)

# normalize to a standard size
image_obj = cv2.resize(image_obj_orig, STANDARD_SIZE)

# convert to grey-scale
greyscale_image = cv2.cvtColor(image_obj,cv2.COLOR_BGR2GRAY)
cv2.imwrite(os.path.join(trg_dir, name + '_GS' + extension), greyscale_image)

h, w = greyscale_image.shape[:2]
contours, hierarchy = cv2.findContours( greyscale_image.copy(), cv2.RETR_TREE , cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours( greyscale_image, contours, -1, (128,255,255))
cv2.imshow('image', greyscale_image)
2
  • 1
    there's some binarization ( threshold,canny,etc) needed between the greyscale and findContours Commented Dec 23, 2013 at 12:46
  • Gaussian blur -> threshold -> find contours. Commented Dec 23, 2013 at 13:39

2 Answers 2

2

This works for this specific image, it may not work for other images. The blur might need adjusting for example. Look up any of the function parameters from the opencv documentation:

import cv2
import matplotlib.pyplot as plt
image = cv2.imread('t1NHA.jpg')
#padding since the t-shirt is touching the border, without this we cant get a continious contour around it.
image = cv2.copyMakeBorder(image, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=[255, 255, 255])
imgray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
imgray = cv2.GaussianBlur(imgray, (9, 9), 0)
ret, thresh = cv2.threshold(imgray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
plt.imshow(image)
plt.show()
Sign up to request clarification or add additional context in comments.

Comments

1

Have you tried this:

ret,thresh = cv2.threshold(greyscale_image.copy(),127,255,cv2.THRESH_BINARY_INV)   # add this line before findContours
contours, hierarchy = cv2.findContours( thresh, cv2.RETR_TREE , cv2.CHAIN_APPROX_SIMPLE)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.