ymj_data_collect/imgProcess.py

234 lines
9.7 KiB
Python
Raw Normal View History

2025-02-25 10:15:21 +08:00
# -- 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 =================")