我正试图找到T恤附图的轮廓。 FindContours在T恤周围返回一个矩形框,但没有找到任何其他轮廓。 我的目标是找到T恤的外部轮廓。 知道我做错了什么吗?
以下代码。 谢谢。 李
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)
答案 0 :(得分:2)
这适用于此特定图像,可能不适用于其他图像。例如,模糊可能需要调整。从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 :(得分: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)