# -- 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 =================")