Widen_boundary/main_jicheng_multiple_area.py

221 lines
6.5 KiB
Python
Raw Permalink 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
import time
def contours_2_list(data):
"""将opencv读取的边界numpy数组3个维度转化为list2个维度
Args:
data为数组
Returns:
list2个维度
"""
# yyy = data[0]
yyy = data
# 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
t1=time.time()
# 1.读入图片
# img = cv2.imread('demo/171.png')
img = cv2.imread('demo1/10.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
t2=time.time()
contours, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 2.寻找轮廓(多边界)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, 2)
t3=time.time()
# 3.轮廓数组转为列表(多边界)
list_contours=[]
# xxx=contours[0]
# yyy=contours[1]
for i in range(len(contours)):
list_contours.append(contours_2_list(contours[i]))
# for i in range(yyy.shape[0]):
# list_contours.append([yyy[i][0][0],yyy[i][0][1]])
data=list_contours
# 4.等距离扩大或缩小(多边界)
data1=[]
for i in range(len(data)):
data1.append(scale(data[i],-15)) #减号是往外扩
print(data1)
t4=time.time()
# 5.在原图尺寸上绘制出扩充后边界(多边界)
# 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 #黑色底图
temp = cv2.imread('demo1/10.jpg') #原图
t5=time.time()
# cv2.polylines(temp, data1, 1, 255)
# cv2.polylines(temp,[np.array(data1, dtype=np.int32)],True, (255, 0, 0), 1,lineType=cv2.LINE_AA)
for i in range(len(data1)):
cv2.polylines(temp,[np.array(data1[i], dtype=np.int32)],True, (255, 0, 255), 5)
# cv2.polylines(temp , [np.array(data1 , dtype=np.int32)], True, (0, 0, 255), 1)\
t6=time.time()
cv2.namedWindow("boundary",cv2.WINDOW_NORMAL);
cv2.resizeWindow("boundary", 640, 480);
cv2.imshow("boundary",temp);
cv2.imwrite("demo1/24_detected.jpg",temp)
t7=time.time()
print('总耗时',t7-t1)
print("读二值图像耗时:%s 形成轮廓耗时:%s 等距离缩放耗时:%s 读取原图:%s 绘制多段线: %s 保存图像耗时:%s" %(t2-t1,t3-t2,t4-t3,t5-t4,t6-t5,t7-t6))
cv2.waitKey(0)
# import os
# from flask import Flask, request, redirect, url_for, jsonify
# from werkzeug.utils import secure_filename
#
# import cv2
# import numpy as np
#
# UPLOAD_FOLDER = './images'
# CONVERTED_FOLDER = './static'
# ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
#
# app = Flask(__name__, static_folder='static', static_url_path='/static')
# app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# app.config['CONVERTED_FOLDER'] = CONVERTED_FOLDER
#
# def allowed_file(filename):
# return '.' in filename and \
# filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
#
# @app.route('/', methods=['POST'])
# def upload_file():
# if request.method == 'POST':
# if 'file' not in request.files:
# return jsonify(error = 'No file part')
# file = request.files['file']
#
# if file.filename == '':
# return jsonify(error = 'No selected file')
# if file and allowed_file(file.filename):
# filename = secure_filename(file.filename)
# file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
#
# filename_no_ext = file.filename.split('.')[0]
#
# BLUR = 21
# CANNY_THRESH_1 = 1
# CANNY_THRESH_2 = 200
# MASK_DILATE_ITER = 10
# MASK_ERODE_ITER = 10
# MASK_COLOR = (0.0,0.0,1.0)
#
# img = cv2.imread(os.path.join(app.config['UPLOAD_FOLDER'], filename))
# gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#
# edges = cv2.Canny(gray, CANNY_THRESH_1, CANNY_THRESH_2)
# edges = cv2.dilate(edges, None)
# edges = cv2.erode(edges, None)
#
# contour_info = []
# img2, contours, _ = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# for c in contours:
# contour_info.append((
# c,
# cv2.isContourConvex(c),
# cv2.contourArea(c),
# ))
# contour_info = sorted(contour_info, key=lambda c: c[2], reverse=True)
# max_contour = contour_info[0]
#
# mask = np.zeros(edges.shape)
#
# cv2.fillConvexPoly(mask, max_contour[0], (255))
#
# mask = cv2.dilate(mask, None, iterations=MASK_DILATE_ITER)
# mask = cv2.erode(mask, None, iterations=MASK_ERODE_ITER)
# mask = cv2.GaussianBlur(mask, (BLUR, BLUR), 0)
#
#
# mask_stack = np.dstack([mask]*3)
#
# mask_stack = mask_stack.astype('float32') / 255.0
# img = img.astype('float32') / 255.0
#
# masked = (mask_stack * img) + ((1-mask_stack) * MASK_COLOR)
# masked = (masked * 255).astype('uint8')
# c_red, c_green, c_blue = cv2.split(img)
# img_a = cv2.merge((c_red, c_green, c_blue, mask.astype('float32') / 255.0))
#
# cv2.imwrite('./static/' + filename_no_ext + '.png', img_a*255)
#
# return jsonify(url = os.path.join(app.config['UPLOAD_FOLDER'],filename))
#
# app.run(host='0.0.0.0',threaded=True)