108 lines
2.7 KiB
Python
108 lines
2.7 KiB
Python
|
|
# -*- coding: UTF-8 -*-
|
|||
|
|
#!/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 contours_2_list(data):
|
|||
|
|
"""将opencv读取的边界numpy数组(3个维度)转化为list(2个维度)
|
|||
|
|
Args:
|
|||
|
|
data为数组
|
|||
|
|
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
list(2个维度)
|
|||
|
|
"""
|
|||
|
|
yyy = data[0]
|
|||
|
|
# print(yyy)
|
|||
|
|
list_contours = []
|
|||
|
|
for i in range(yyy.shape[0]):
|
|||
|
|
list_contours.append([yyy[i][0][0], yyy[i][0][1]])
|
|||
|
|
return list_contours
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
# 1.读入图片
|
|||
|
|
# img = cv2.imread('demo/171.png')
|
|||
|
|
img = cv2.imread('image/171.jpg')
|
|||
|
|
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|||
|
|
contours, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
|
|||
|
|
|
|||
|
|
# 2.寻找轮廓
|
|||
|
|
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, 2)
|
|||
|
|
|
|||
|
|
|
|||
|
|
list_contours=contours_2_list(contours)
|
|||
|
|
|
|||
|
|
# for i in range(yyy.shape[0]):
|
|||
|
|
# list_contours.append([yyy[i][0][0],yyy[i][0][1]])
|
|||
|
|
|
|||
|
|
data=list_contours
|
|||
|
|
|
|||
|
|
|
|||
|
|
data1 = scale(data,-150)
|
|||
|
|
print(data1)
|
|||
|
|
# temp = np.ones((img_gray.shape[0],img_gray.shape[1],3), np.uint8) * 255
|
|||
|
|
temp = np.zeros((img_gray.shape[0],img_gray.shape[1],3), np.uint8) * 255
|
|||
|
|
# cv2.polylines(temp, data1, 1, 255)
|
|||
|
|
cv2.polylines(temp,[np.array(data1, dtype=np.int32)],True, (255, 0, 0), 5)
|
|||
|
|
# cv2.polylines(temp , [np.array(data1 , dtype=np.int32)], True, (0, 0, 255), 1)
|
|||
|
|
|
|||
|
|
cv2.namedWindow("boundary",cv2.WINDOW_NORMAL);
|
|||
|
|
cv2.resizeWindow("boundary", 640, 480);
|
|||
|
|
cv2.imshow("boundary",temp)
|
|||
|
|
|
|||
|
|
# cv2.imshow ("img",temp)
|
|||
|
|
cv2.imwrite("1.jpg",temp)
|
|||
|
|
cv2.waitKey(0)
|