ymj_data_collect/imgProcess.py
2025-02-25 10:15:21 +08:00

234 lines
9.7 KiB
Python
Raw 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 --
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 =================")