opencv多边形按像素放大或缩小,可用于缩放提取后的轮廓

代码示例如下:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   多边形等距缩放.py      
@data    :2021/7/5 15:53
@Desciption :
@Version  :
@License : 
'''

import cv2
import numpy as np
def scale(data, sec_dis):
    """多边形等距缩放
    Args:
        data: 多边形按照逆时针顺序排列的的点集
        sec_dis: 缩放距离

    Returns:
        缩放后的多边形点集
    """
    num = len(data)
    scal_data = []
    for i in range(num):
        x1 = data[(i) % num][0] - data[(i - 1) % num][0]
        y1 = data[(i) % num][1] - data[(i - 1) % num][1]
        x2 = data[(i + 1) % num][0] - data[(i) % num][0]
        y2 = data[(i + 1) % num][1] - data[(i) % num][1]

        d_A = (x1 ** 2 + y1 ** 2) ** 0.5
        d_B = (x2 ** 2 + y2 ** 2) ** 0.5

        Vec_Cross = (x1 * y2) - (x2 * y1)
        if (d_A * d_B==0):
            continue
        sin_theta = Vec_Cross / (d_A * d_B)
        if (sin_theta==0):
            continue
        dv = sec_dis / sin_theta

        v1_x = (dv / d_A) * x1
        v1_y = (dv / d_A) * y1

        v2_x = (dv / d_B) * x2
        v2_y = (dv / d_B) * y2

        PQ_x = v1_x - v2_x
        PQ_y = v1_y - v2_y

        Q_x = data[(i) % num][0] + PQ_x
        Q_y = data[(i) % num][1] + PQ_y
        scal_data.append([Q_x, Q_y])
    return scal_data


data = [[454 , 76],
 [448 ,78],
 [444,  81],
 [440 , 85],
 [438,  90],
 [437,  96],
 [436 ,101],
 [434, 107],
 [432 ,112],
 [431 ,117],
 [430 ,123],
 [429, 129],
 [428, 134],
 [427, 140],
 [427, 145],
 [427, 151],
 [427 ,157],
 [427 ,163],
 [427, 169],
 [427, 175],
 [427, 181],
 [427, 187],
 [428, 193],
 [428 ,199],
 [429, 204],
 [429, 210],
 [429 ,216],
 [430, 222],
 [431, 227],
 [431, 233],
 [431, 239],
 [432, 245],
 [433, 250],
 [434, 256],
 [435 ,261],
 [436 ,267],
 [437 ,272],
 [438, 278],
 [439, 283],
 [441, 289],
 [442, 294],
 [443, 300],
 [445, 305],
 [446, 310],
 [448, 316],
 [450, 321],
 [453, 330],
 [461, 334],
 [466, 336],
 [471, 338],
 [477 ,340],
 [482, 340],
 [488, 341],
 [494, 341],
 [500, 341],
 [506 ,341],
 [511 ,340],
 [517, 339],
 [523 ,338],
 [528, 337],
 [533, 335],
 [539, 333],
 [544, 331],
 [549, 329],
 [553, 326],
 [558, 322],
 [562, 318],
 [566, 313],
 [568, 308],
 [569, 303],
 [570, 297],
 [570, 291],
 [569, 285],
 [569, 280],
 [568, 274],
 [567, 268],
 [566 ,263],
 [566 ,257],
 [564 ,252],
 [564 ,246],
 [562, 241],
 [561, 235],
 [560, 230],
 [560, 224],
 [558 ,219],
 [558, 213],
 [556, 207],
 [555, 202],
 [554, 196],
 [553, 191],
 [552, 185],
 [550, 180],
 [549, 174],
 [548, 169],
 [547 ,164],
 [545 ,158],
 [543 ,153],
 [541 ,148],
 [539 ,143],
 [536 ,138],
 [533 ,133],
 [530, 128],
 [528 ,124],
 [524 ,119],
 [520 ,115],
 [515, 111],
 [511, 108],
 [506 ,106],
 [501 ,104],
 [495 ,102],
 [490, 101],
 [485 , 99],
 [480 , 97],
 [475 , 93],
 [471 , 89],
 [468 , 84],
 [465,  80],
 [460 , 76]]

data1 = scale(data,-10)
print(data1)
temp = np.ones((1300,1000,3), np.uint8) * 255
#cv2.polylines(temp, data1, 1, 255)
cv2.polylines(temp , [np.array(data , dtype=np.int32)], True, (255, 0, 0), 1)
cv2.polylines(temp , [np.array(data1 , dtype=np.int32)], True, (0, 0, 255), 1)
cv2.imshow ("img",temp)
cv2.imwrite("1.jpg",temp)
cv2.waitKey(0)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐