# -*- 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个维度)转化为list(2个维度) Args: data为数组 Returns: list(2个维度) """ # 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)