最近接入百度云的人像分割接口,返回人像分割好的图片和灰度图,但是接口返回的图片是按源图片的尺寸返回,业务需求是只要人像大小的图片
源图:
百度云API返回(按照源图的尺寸返回了):
百度云还返回了灰度图:
业务需求是只要人像大小的图片返回,需求是返回这样的:
因此需要对百度云返回的图片进行裁剪。
解决思路:通过百度云返回的灰度图找到图像边框信息,然后对百度云返回的图片进行裁剪即可
python获取图像边框效果:
通过cv2即可实现,代码:
import cv2
import numpy as np
validate_img_path = 'xxx.png' # 灰度图地址
img = cv2.imread(validate_img_path)
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
# 因为cv2版本不同返回的参数个数不同,所以下面用了兼容写法
try:
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
except Exception as r:
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
min_width = 100
min_height = 100
result_count = len(contours) # 检索边界有时候会不止一个结果,所以需要循环检查多个结果
if result_count == 1:
x, y, w, h = cv2.boundingRect(contours[0]) # 将边界结果转成坐标信息
else:
for i in range(result_count):
x, y, w, h = cv2.boundingRect(contours[i])
if w >= min_width and h >= min_height:
break
print(x, y, w, h)