Widen_boundary/main_jicheng.py

108 lines
2.7 KiB
Python
Raw Normal View History

2023-12-27 14:38:11 +08:00
# -*- 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个维度转化为list2个维度
Args:
data为数组
Returns:
list2个维度
"""
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)