Reputation: 3335
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)
Upvotes: 0
Views: 3663
Reputation: 13549
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()
Upvotes: 2
Reputation: 12709
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)
Upvotes: 1