首先是一张卡通T袖十香,使用labelme标注,然后使用json里面标注的点坐标去裁剪
裁剪后的图片
下面附上代码
import cv2
import numpy as np
#opencv不规则裁剪
def ROI_byMouse(img,lsPointsChoose):
mask = np.zeros(img.shape, np.uint8)
pts = np.array(lsPointsChoose, np.int32) # pts是多边形的顶点列表(顶点集)
col0 =pts[:,0]
col1 =pts[:,1]
x1=np.min(col0)
y1=np.min(col1)
x2=np.max(col0)
y2 = np.max(col1)
pts = pts.reshape((-1, 1, 2))
# 这里 reshape 的第一个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。
# OpenCV中需要先将多边形的顶点坐标变成顶点数×1×2维的矩阵,再来绘制
# --------------画多边形---------------------
mask = cv2.polylines(mask, [pts], True, (255, 255, 255))
##-------------填充多边形---------------------
mask2 = cv2.fillPoly(mask, [pts], (255, 255, 255))
ROI = cv2.bitwise_and(mask2, img)
return ROI[y1:y2,x1:x2]
if __name__ =='__main__':
points = [
[
189.1232876712329,
117.12328767123287
],
[
177.47945205479454,
115.06849315068493
],
[
180.21917808219177,
131.5068493150685
],
[
182.95890410958907,
141.78082191780823
],
[
165.15068493150687,
152.73972602739727
],
[
156.9315068493151,
160.27397260273972
],
[
137.06849315068496,
170.54794520547946
],
[
133.64383561643837,
181.5068493150685
],
[
132.95890410958907,
185.6164383561644
],
[
148.71232876712327,
179.45205479452056
],
[
162.41095890410958,
169.17808219178082
],
[
143.2328767123288,
191.0958904109589
],
[
126.79452054794524,
200.0
],
[
87.06849315068496,
213.013698630137
],
[
50.082191780821915,
225.34246575342468
],
[
56.246575342465746,
246.57534246575344
],
[
75.42465753424659,
247.26027397260273
],
[
53.50684931506851,
276.027397260274
],
[
52.82191780821918,
318.4931506849315
],
[
61.72602739726028,
326.71232876712327
],
[
75.42465753424659,
354.1095890410959
],
[
50.76712328767124,
385.6164383561644
],
[
52.13698630136986,
398.63013698630135
],
[
80.90410958904113,
379.45205479452056
],
[
54.1917808219178,
407.5342465753425
],
[
299.3972602739726,
409.5890410958904
],
[
298.027397260274,
250.68493150684932
],
[
258.98630136986304,
176.7123287671233
],
[
279.5342465753425,
194.5205479452055
],
[
285.013698630137,
179.45205479452056
],
[
256.9315068493151,
147.94520547945206
],
[
270.6301369863014,
115.06849315068493
],
[
245.97260273972603,
118.4931506849315
],
[
226.79452054794524,
124.65753424657535
],
[
209.67123287671234,
128.76712328767124
],
[
198.71232876712332,
123.28767123287672
]
]
img = cv2.imread('1.jpg')
#points是从labelme标注的点坐标,从json从拿出来的
img = ROI_byMouse(img,points)
cv2.imshow('裁剪后图片',img)
cv2.waitKey(0)
cv2.destroyWindow('裁剪后图片')