2013-12-23 107 views
0

我试图找到附加图像的t恤的轮廓。 FindContours会在T恤周围返回一个矩形框,并且不会找到任何其他轮廓。 我的目标是找到t恤的外部轮廓。 任何想法我做错了什么?python opencv发现轮廓错误

下面的代码。 谢谢。 李

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) 
+1

有一些二值化(阈值,精明的,等等)的灰度和findContours – berak

+0

高斯模糊之间需要 - >门槛 - >找到轮廓。 – M4rtini

回答

1

这适用于这个特定的图像,它可能不适合其它图像工作。例如,模糊可能需要调整。来自OpenCV的文档查找任何一个功能参数:

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() 
1

你有没有尝试过这样的:

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)