Widen_boundary/main_jicheng.py

108 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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)