138 lines
5.5 KiB
Python
138 lines
5.5 KiB
Python
#!/usr/bin/env python
|
|
# -*- encoding: utf-8 -*-
|
|
'''
|
|
@File : dot_detection.py
|
|
@Contact : zpyovo@hotmail.com
|
|
@License : (C)Copyright 2018-2019, Lab501-TransferLearning-SCUT
|
|
@Description :
|
|
|
|
@Modify Time @Author @Version @Desciption
|
|
------------ ------- -------- -----------
|
|
2022/4/21 17:53 Pengyu Zhang 1.0 None
|
|
'''
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
|
|
import cv2
|
|
from common import automatedMSRCR, save_figure
|
|
from component.utile import return_img_stream
|
|
import numpy as np
|
|
import math
|
|
'''
|
|
采用realesrgan模型实现图像增强后进行网线角度检测
|
|
'''
|
|
def dots_angle_measure_dl_sr(dots_region,realesrgan,save_dots=False,res_code=None):
|
|
|
|
original_img_stream = None
|
|
process_dots_img_stream = None
|
|
detection_dots_img_stream = None
|
|
lines_arctan = None
|
|
if save_dots:
|
|
result_path = save_figure(dots_region, 'original', res_code)
|
|
original_img_stream = return_img_stream(result_path)
|
|
# 超分计算处理
|
|
process_dots = realesrgan(dots_region)
|
|
|
|
|
|
if save_dots:
|
|
b, g, r = cv2.split(process_dots)
|
|
process_dots_ = cv2.merge([r, g, b])
|
|
result_path = save_figure(process_dots_, 'process_dots', res_code)
|
|
process_dots_img_stream = return_img_stream(result_path)
|
|
|
|
# 斑点检测
|
|
found, corners = cv2.findCirclesGrid(process_dots, (3, 3), cv2.CALIB_CB_SYMMETRIC_GRID)
|
|
|
|
if corners is None or corners.any() != None and corners.shape[0] < 2:
|
|
# print("---------------------------------------------------------------")
|
|
# print("corners status,", found)
|
|
# print("---------------------------------------------------------------")
|
|
return lines_arctan, [original_img_stream, process_dots_img_stream]
|
|
|
|
elif corners.shape[0] >= 2:
|
|
A1 = corners[0]
|
|
A2 = corners[1]
|
|
if (A1 == A2).all():
|
|
# 斑点检测
|
|
found, corners = cv2.findCirclesGrid(process_dots, (4, 4), cv2.CALIB_CB_SYMMETRIC_GRID)
|
|
A1 = corners[0]
|
|
A2 = corners[1]
|
|
if (A1 == A2).all():
|
|
return lines_arctan, [original_img_stream, process_dots_img_stream]
|
|
B1 = corners[1]
|
|
B2 = np.array([[0, corners[1][:, 1]]],dtype=object)
|
|
|
|
kLine1 = (A2[:, 1] - A1[:, 1]) / (A2[:, 0] - A1[:, 0])
|
|
kLine2 = (B2[:, 1] - B1[:, 1]) / (B2[:, 0] - B1[:, 0])
|
|
tan_k = (kLine2 - kLine1) / (1 + kLine2 * kLine1)
|
|
lines_arctan = math.atan(tan_k)
|
|
lines_arctan = float('%.2f' % abs(-lines_arctan * 180.0 / 3.1415926))
|
|
if save_dots:
|
|
dbg_image_circles = process_dots.copy()
|
|
dbg_image_circles = cv2.drawChessboardCorners(dbg_image_circles, (3, 3), corners, found)
|
|
result_path = save_figure(dbg_image_circles, 'detection_dots', res_code)
|
|
detection_dots_img_stream = return_img_stream(result_path)
|
|
|
|
return lines_arctan, [original_img_stream, process_dots_img_stream, detection_dots_img_stream]
|
|
'''
|
|
采用传统方式实现图像增强后进行网线角度检测
|
|
'''
|
|
def dots_angle_measure_tr_sr(dots_region,save_dots=False,res_code=None):
|
|
|
|
original_img_stream = None
|
|
process_dots_img_stream = None
|
|
detection_dots_img_stream = None
|
|
lines_arctan = None
|
|
if save_dots:
|
|
result_path = save_figure(dots_region, 'original', res_code)
|
|
original_img_stream = return_img_stream(result_path)
|
|
# 锐化插值处理
|
|
sigma_list = [15, 80, 200]
|
|
process_dots = automatedMSRCR(
|
|
dots_region,
|
|
sigma_list
|
|
)
|
|
size = 4
|
|
process_dots = cv2.resize(process_dots, None, fx=size, fy=size, interpolation=cv2.INTER_CUBIC)
|
|
|
|
if save_dots:
|
|
result_path = save_figure(process_dots, ' process_dots', res_code)
|
|
process_dots_img_stream = return_img_stream(result_path)
|
|
|
|
# 斑点检测
|
|
found, corners = cv2.findCirclesGrid(process_dots, (3, 3), cv2.CALIB_CB_SYMMETRIC_GRID)
|
|
|
|
if corners is None or corners.any() != None and corners.shape[0] < 2:
|
|
# print("---------------------------------------------------------------")
|
|
# print("corners status,", found)
|
|
# print("---------------------------------------------------------------")
|
|
return lines_arctan, [original_img_stream, process_dots_img_stream]
|
|
|
|
elif corners.shape[0] >= 2:
|
|
A1 = corners[0]
|
|
A2 = corners[1]
|
|
if (A1 == A2).all():
|
|
# 斑点检测
|
|
found, corners = cv2.findCirclesGrid(process_dots, (4, 4), cv2.CALIB_CB_SYMMETRIC_GRID)
|
|
A1 = corners[0]
|
|
A2 = corners[1]
|
|
if (A1 == A2).all():
|
|
return lines_arctan, [original_img_stream, process_dots_img_stream]
|
|
B1 = corners[1]
|
|
B2 = np.array([[0, corners[1][:, 1]]],dtype=object)
|
|
|
|
kLine1 = (A2[:, 1] - A1[:, 1]) / (A2[:, 0] - A1[:, 0])
|
|
kLine2 = (B2[:, 1] - B1[:, 1]) / (B2[:, 0] - B1[:, 0])
|
|
tan_k = (kLine2 - kLine1) / (1 + kLine2 * kLine1)
|
|
lines_arctan = math.atan(tan_k)
|
|
lines_arctan = float('%.2f' % abs(-lines_arctan * 180.0 / 3.1415926))
|
|
if save_dots:
|
|
dbg_image_circles = process_dots.copy()
|
|
dbg_image_circles = cv2.drawChessboardCorners(dbg_image_circles, (3, 3), corners, found)
|
|
result_path = save_figure(dbg_image_circles, 'detection_dots', res_code)
|
|
detection_dots_img_stream = return_img_stream(result_path)
|
|
|
|
return lines_arctan, [original_img_stream, process_dots_img_stream, detection_dots_img_stream]
|