Widen_boundary/main_jicheng_multiple_area.py

221 lines
6.5 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
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)