opencv不规则裁剪

首先是一张卡通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('裁剪后图片')

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值