234 lines
9.7 KiB
Python
234 lines
9.7 KiB
Python
![]() |
# -- coding: utf-8 --
|
|||
|
from ctypes import *
|
|||
|
import numpy as np
|
|||
|
from numpy.ctypeslib import as_array
|
|||
|
import cv2
|
|||
|
from clog import logger
|
|||
|
|
|||
|
TO_CLIENT_NOTIFY_BASE = 1000
|
|||
|
|
|||
|
|
|||
|
def process(msg):
|
|||
|
record = msg.record
|
|||
|
if msg.msg_type == 0 and record.code == (6 + TO_CLIENT_NOTIFY_BASE):
|
|||
|
return doLocationProcessing(msg)
|
|||
|
elif msg.msg_type == 1 and (
|
|||
|
record.code == (2 + TO_CLIENT_NOTIFY_BASE) or record.code == (8 + TO_CLIENT_NOTIFY_BASE) or record.code == (
|
|||
|
12 + TO_CLIENT_NOTIFY_BASE)):
|
|||
|
return doDetectionProcessing(msg)
|
|||
|
else:
|
|||
|
pass
|
|||
|
return msg
|
|||
|
|
|||
|
|
|||
|
def _darw_rect(im):
|
|||
|
cv2.rectangle(im, (130, 135), (430, 375), (0, 255, 0), 5)
|
|||
|
|
|||
|
|
|||
|
# 处理图像
|
|||
|
def doLocationProcessing(msg):
|
|||
|
if msg is None:
|
|||
|
return msg
|
|||
|
im = msg.im2D
|
|||
|
record = msg.record
|
|||
|
ptsRoiPoints = None
|
|||
|
ptsInnerConners = None
|
|||
|
ptsInnerConners3D = None
|
|||
|
if record.roi_size > 16:
|
|||
|
return msg
|
|||
|
for i in range(record.roi_size):
|
|||
|
roi = record.subRois[i]
|
|||
|
# if not roi.isGood: continue
|
|||
|
roiPoints = roi.mRoiPoints
|
|||
|
innerConners = roi.mInnerConners
|
|||
|
innerConners3D = roi.mInnerConners3D
|
|||
|
ptsRoiPoints = np.array([
|
|||
|
[roiPoints[0], roiPoints[1]],
|
|||
|
[roiPoints[2], roiPoints[3]],
|
|||
|
[roiPoints[4], roiPoints[5]],
|
|||
|
[roiPoints[6], roiPoints[7]]], dtype=np.int32)
|
|||
|
|
|||
|
# ptsInnerConners = np.array([
|
|||
|
# [innerConners[0],innerConners[1]],
|
|||
|
# [innerConners[2],innerConners[3]],
|
|||
|
# [innerConners[4],innerConners[5]],s
|
|||
|
# [innerConners[6],innerConners[7]]], dtype=np.int32)
|
|||
|
|
|||
|
# ptsInnerConners3D = np.array([
|
|||
|
# [innerConners3D[0],innerConners3D[1],innerConners3D[2]],
|
|||
|
# [innerConners3D[3],innerConners3D[4],innerConners3D[5]],
|
|||
|
# [innerConners3D[6],innerConners3D[7],innerConners3D[8]],
|
|||
|
# [innerConners3D[9],innerConners3D[10],innerConners3D[11]]])
|
|||
|
|
|||
|
cv2.polylines(im, [ptsRoiPoints], True, (255, 0, 0), 2)
|
|||
|
# cv2.polylines(im, [ptsInnerConners], True, (255,0,0) , 2)
|
|||
|
_darw_rect(im)
|
|||
|
|
|||
|
return msg
|
|||
|
|
|||
|
|
|||
|
def doDetectionProcessing(msg):
|
|||
|
if msg is None:
|
|||
|
return msg
|
|||
|
if msg.im2D is not None:
|
|||
|
im = cv2.resize(msg.im2D, (int(msg.im2D.shape[1] / 16), int(msg.im2D.shape[0] / 16)))
|
|||
|
record = msg.record
|
|||
|
ptsRoiPoints = None
|
|||
|
ptsInnerConners = None
|
|||
|
ptsInnerConners3D = None
|
|||
|
ptsRoiPointslist = []
|
|||
|
ptsInnerConnerslist = []
|
|||
|
ptsInnerConners3Dlist = []
|
|||
|
if record.roi_size > 16:
|
|||
|
return msg
|
|||
|
for i in range(record.roi_size):
|
|||
|
roi = record.subRois[i]
|
|||
|
if not roi.isGood: continue
|
|||
|
roiPoints = roi.mRoiPoints
|
|||
|
innerConners = roi.mInnerConners
|
|||
|
innerConners3D = roi.mInnerConners3D
|
|||
|
ptsRoiPoints = np.array([
|
|||
|
[roiPoints[0], roiPoints[1]],
|
|||
|
[roiPoints[2], roiPoints[3]],
|
|||
|
[roiPoints[4], roiPoints[5]],
|
|||
|
[roiPoints[6], roiPoints[7]]], dtype=np.int32)
|
|||
|
|
|||
|
ptsInnerConners = np.array([
|
|||
|
[innerConners[0], innerConners[1]],
|
|||
|
[innerConners[2], innerConners[3]],
|
|||
|
[innerConners[4], innerConners[5]],
|
|||
|
[innerConners[6], innerConners[7]]], dtype=np.int32)
|
|||
|
|
|||
|
ptsInnerConners3D = np.array([
|
|||
|
[innerConners3D[0], innerConners3D[1], innerConners3D[2]],
|
|||
|
[innerConners3D[3], innerConners3D[4], innerConners3D[5]],
|
|||
|
[innerConners3D[6], innerConners3D[7], innerConners3D[8]],
|
|||
|
[innerConners3D[9], innerConners3D[10], innerConners3D[11]]])
|
|||
|
print(ptsInnerConners3D)
|
|||
|
|
|||
|
for i in range(4):
|
|||
|
ptsRoiPoints[i][0] = int(ptsRoiPoints[i][0] / 16)
|
|||
|
ptsRoiPoints[i][1] = int(ptsRoiPoints[i][1] / 16)
|
|||
|
ptsInnerConners[i][0] = int(ptsInnerConners[i][0] / 16)
|
|||
|
ptsInnerConners[i][1] = int(ptsInnerConners[i][1] / 16)
|
|||
|
ptsRoiPointslist.append(ptsRoiPoints)
|
|||
|
ptsInnerConnerslist.append(ptsInnerConners)
|
|||
|
ptsInnerConners3Dlist.append(ptsInnerConners3D)
|
|||
|
|
|||
|
cv2.polylines(im, ptsRoiPointslist, True, (0, 255, 0), 1)
|
|||
|
cv2.polylines(im, ptsInnerConnerslist, True, (0, 255, 255), 1)
|
|||
|
cv2.imwrite("result.png", im)
|
|||
|
print("================== cv2.imwrite success =================")
|
|||
|
|
|||
|
if record.code == 12 + TO_CLIENT_NOTIFY_BASE:
|
|||
|
for j in range(record.roi_size):
|
|||
|
roi = record.subRois[j]
|
|||
|
if not roi.isGood: continue
|
|||
|
ptsInnerConners = ptsInnerConnerslist[j]
|
|||
|
ptsInnerConners3D = ptsInnerConners3Dlist[j]
|
|||
|
if len(ptsInnerConners) == 4:
|
|||
|
for i in range(4):
|
|||
|
p3d = ptsInnerConners3D[i]
|
|||
|
p3d_next = ptsInnerConners3D[(i + 1) % 4]
|
|||
|
p2d = ptsInnerConners[i]
|
|||
|
p2d_next = ptsInnerConners[(i + 1) % 4]
|
|||
|
edge = np.sqrt(pow((p3d[0] - p3d_next[0]), 2)
|
|||
|
+ pow((p3d[1] - p3d_next[1]), 2)
|
|||
|
+ pow((p3d[2] - p3d_next[2]), 2))
|
|||
|
cv2.putText(im, str(edge)[:6], \
|
|||
|
(int((ptsInnerConners[0][0] + ptsInnerConners[(0 + 1) % 4][0]) / 2), \
|
|||
|
int((ptsInnerConners[0][1] + ptsInnerConners[(0 + 1) % 4][1]) / 2 + i * 20)), \
|
|||
|
cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (255, 0, 0), 2)
|
|||
|
print("================== draw =================")
|
|||
|
msg.im2D = im
|
|||
|
cv2.imshow("HQImage", im)
|
|||
|
# cv2.waitKey(1)
|
|||
|
return msg
|
|||
|
|
|||
|
|
|||
|
# detect结果处理
|
|||
|
def detectionResProcessing(msg,data_img_path,data_detect_res_save_path):
|
|||
|
# im = cv2.resize(msg.im2D, (int(msg.im2D.shape[1] / 16), int(msg.im2D.shape[0] / 16)))
|
|||
|
# Read the image from the local directory
|
|||
|
im = cv2.imread(data_img_path)
|
|||
|
|
|||
|
# Resize the image
|
|||
|
im = cv2.resize(im, (int(im.shape[1] / 16), int(im.shape[0] / 16)))
|
|||
|
record = msg.record
|
|||
|
ptsRoiPoints = None
|
|||
|
ptsInnerConners = None
|
|||
|
ptsInnerConners3D = None
|
|||
|
ptsRoiPointslist = []
|
|||
|
ptsInnerConnerslist = []
|
|||
|
ptsInnerConners3Dlist = []
|
|||
|
logger.debug(f"record.roi_size:{record.roi_size}")
|
|||
|
if record.roi_size > 16:
|
|||
|
logger.warn(f"roi_size大于:{record.roi_size}个,请检查!")
|
|||
|
for i in range(record.roi_size):
|
|||
|
roi = record.subRois[i]
|
|||
|
logger.debug(f"roi=====:{roi.isGood}")
|
|||
|
# if not roi.isGood: continue
|
|||
|
roiPoints = roi.mRoiPoints
|
|||
|
innerConners = roi.mInnerConners
|
|||
|
innerConners3D = roi.mInnerConners3D
|
|||
|
ptsRoiPoints = np.array([
|
|||
|
[roiPoints[0], roiPoints[1]],
|
|||
|
[roiPoints[2], roiPoints[3]],
|
|||
|
[roiPoints[4], roiPoints[5]],
|
|||
|
[roiPoints[6], roiPoints[7]]], dtype=np.int32)
|
|||
|
|
|||
|
ptsInnerConners = np.array([
|
|||
|
[innerConners[0], innerConners[1]],
|
|||
|
[innerConners[2], innerConners[3]],
|
|||
|
[innerConners[4], innerConners[5]],
|
|||
|
[innerConners[6], innerConners[7]]], dtype=np.int32)
|
|||
|
|
|||
|
ptsInnerConners3D = np.array([
|
|||
|
[innerConners3D[0], innerConners3D[1], innerConners3D[2]],
|
|||
|
[innerConners3D[3], innerConners3D[4], innerConners3D[5]],
|
|||
|
[innerConners3D[6], innerConners3D[7], innerConners3D[8]],
|
|||
|
[innerConners3D[9], innerConners3D[10], innerConners3D[11]]])
|
|||
|
print(ptsInnerConners3D)
|
|||
|
|
|||
|
for i in range(4):
|
|||
|
ptsRoiPoints[i][0] = int(ptsRoiPoints[i][0] / 16)
|
|||
|
ptsRoiPoints[i][1] = int(ptsRoiPoints[i][1] / 16)
|
|||
|
ptsInnerConners[i][0] = int(ptsInnerConners[i][0] / 16)
|
|||
|
ptsInnerConners[i][1] = int(ptsInnerConners[i][1] / 16)
|
|||
|
ptsRoiPointslist.append(ptsRoiPoints)
|
|||
|
ptsInnerConnerslist.append(ptsInnerConners)
|
|||
|
ptsInnerConners3Dlist.append(ptsInnerConners3D)
|
|||
|
# 打印三个list
|
|||
|
# for i in range(len(ptsRoiPointslist)):
|
|||
|
# logger.debug("ptsRoiPointslist:", ptsRoiPointslist[i])
|
|||
|
# logger.debug(("ptsInnerConnerslist:", ptsInnerConnerslist[i]))
|
|||
|
# logger.debug(("ptsInnerConners3Dlist:", ptsInnerConners3Dlist[i]))
|
|||
|
|
|||
|
cv2.polylines(im, ptsRoiPointslist, True, (0, 255, 0), 1)
|
|||
|
cv2.polylines(im, ptsInnerConnerslist, True, (0, 255, 255), 1)
|
|||
|
cv2.imwrite(f"{data_detect_res_save_path}/result.jpg", im)
|
|||
|
logger.success("================== cv2.imwrite result.jpg success =================")
|
|||
|
|
|||
|
if record.code == 12 + TO_CLIENT_NOTIFY_BASE:
|
|||
|
for j in range(record.roi_size):
|
|||
|
roi = record.subRois[j]
|
|||
|
# if not roi.isGood: continue
|
|||
|
ptsInnerConners = ptsInnerConnerslist[j]
|
|||
|
ptsInnerConners3D = ptsInnerConners3Dlist[j]
|
|||
|
if len(ptsInnerConners) == 4:
|
|||
|
for i in range(4):
|
|||
|
p3d = ptsInnerConners3D[i]
|
|||
|
p3d_next = ptsInnerConners3D[(i + 1) % 4]
|
|||
|
p2d = ptsInnerConners[i]
|
|||
|
p2d_next = ptsInnerConners[(i + 1) % 4]
|
|||
|
edge = np.sqrt(pow((p3d[0] - p3d_next[0]), 2)
|
|||
|
+ pow((p3d[1] - p3d_next[1]), 2)
|
|||
|
+ pow((p3d[2] - p3d_next[2]), 2))
|
|||
|
cv2.putText(im, str(edge)[:6], \
|
|||
|
(int((ptsInnerConners[0][0] + ptsInnerConners[(0 + 1) % 4][0]) / 2), \
|
|||
|
int((ptsInnerConners[0][1] + ptsInnerConners[(0 + 1) % 4][1]) / 2 + i * 20)), \
|
|||
|
cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (255, 0, 0), 2)
|
|||
|
cv2.imwrite(f"{data_detect_res_save_path}/result2.jpg", im)
|
|||
|
logger.success("================== cv2.imwrite result2.jpg success =================")
|
|||
|
|