ymj_data_collect/imgProcess.py

370 lines
17 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:
2025-04-20 21:44:06 +08:00
bim_result = []
for i in range(record.roi_size):
roi2 = record.subRois[i]
if not roi2.isGood: continue
mInfo = roi2.mInfo.decode('utf-8')
mInnerConners3D = list(roi2.mInnerConners3D)
mInnerLineCenter = list(roi2.mInnerLineCenter)
mInnerLineCenter3D = list(roi2.mInnerLineCenter3D)
mInnerCenter = list(roi2.mInnerCenter)
mInnerCenter3D = list(roi2.mInnerCenter3D)
mEdgesLen = list(roi2.mEdgesLen)
print(f"mEdgesLen={mEdgesLen}")
print(f"mInfo={mInfo}")
# 单位换算
for i in range(3):
mInnerCenter3D[i] = mInnerCenter3D[i] * 1000
mInnerCenter3D[i] = round(mInnerCenter3D[i], 2)
for i in range(12):
# 米 单位 换算成毫米。# 留下小数
mInnerConners3D[i] = mInnerConners3D[i] * 1000
mInnerConners3D[i] = round(mInnerConners3D[i], 2)
mInnerLineCenter3D[i] = mInnerLineCenter3D[i] * 1000
mInnerLineCenter3D[i] = round(mInnerLineCenter3D[i], 2)
# mEdgesLen换算
for i in range(4):
# 米 单位 换算成毫米
mEdgesLen[i] = mEdgesLen[i] * 1000
# 留下小数
mEdgesLen[i] = round(mEdgesLen[i], 2)
# 从bim数据数组中获取code等于mInfo的元素
# this_bim_data = None
# for bim_data_item in bim_data:
# if str(bim_data_item["code"]) == mInfo:
# this_bim_data = bim_data_item
# break
# if this_bim_data is None:
# print(f"🟡返回的值为mInfo={mInfo},无法在bim数据中找到code相同的")
# continue
# else:
# print(f"🟢{mInfo}预埋件匹配成功")
# 临时测试
bim_data = [
{'code': 'BFX1101VBPT003', 'type': '300x248', 'x': '778', 'y': '250', 'center': '0.317', 'w': '300',
'h': '248', 'angle': '', 'm_x': '0', 'm_y': '0', 'm_z': '0', 'base': '3'}]
this_bim_data = bim_data[0]
print(f"🟢{mInfo}预埋件匹配成功")
# bim的长度 和 计算出来的长度进行计算,取优的值
bim_data_width = float(this_bim_data["w"])
bim_data_height = float(this_bim_data["h"])
print(f"bim_data_width:{bim_data_width}")
print(f"bim_data_height:{bim_data_height}")
# 上右下左
cal_up_width = mEdgesLen[0] # 上边宽度
cal_down_width = mEdgesLen[2] # 下边宽度
cal_left_height = mEdgesLen[3] # 左边高度
cal_right_height = mEdgesLen[1] # 右边宽度
print("mEdgesLen:==", mEdgesLen)
# 取差值最小width 和 height的值
if abs(cal_up_width - bim_data_width) < abs(cal_down_width - bim_data_width):
best_cal_width = cal_up_width
else:
best_cal_width = cal_down_width
if abs(cal_left_height - bim_data_height) < abs(cal_right_height - bim_data_height):
best_cal_height = cal_left_height
else:
best_cal_height = cal_right_height
print("best_cal_width:==", best_cal_width)
print("best_cal_height:==", best_cal_height)
# 画到图上
cv2.putText(im, "w:" + str(best_cal_width), \
(int((ptsInnerConners[0][0] + ptsInnerConners[(0 + 1) % 4][0]) / 2), \
int((ptsInnerConners[0][1] + ptsInnerConners[(0 + 1) % 4][1]) / 2 + 0 * 20)), \
cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (255, 0, 0), 2)
cv2.putText(im, "h:" + str(best_cal_height), \
(int((ptsInnerConners[0][0] + ptsInnerConners[(0 + 1) % 4][0]) / 2), \
int((ptsInnerConners[0][1] + ptsInnerConners[(0 + 1) % 4][1]) / 2 + 1 * 20)), \
cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (255, 0, 0), 2)
# 预埋件基础数据
dict = this_bim_data
# 四个点的3d坐标
dict["x1"] = mInnerConners3D[0]
dict["y1"] = mInnerConners3D[1]
dict["z1"] = mInnerConners3D[2]
dict["x2"] = mInnerConners3D[3]
dict["y2"] = mInnerConners3D[4]
dict["z2"] = mInnerConners3D[5]
dict["x3"] = mInnerConners3D[6]
dict["y3"] = mInnerConners3D[7]
dict["z3"] = mInnerConners3D[8]
dict["x4"] = mInnerConners3D[9]
dict["y4"] = mInnerConners3D[10]
dict["z4"] = mInnerConners3D[11]
# 四条边中各自中点的3d坐标
dict["top_line_center_x"] = mInnerLineCenter3D[0]
dict["top_line_center_y"] = mInnerLineCenter3D[1]
dict["top_line_center_z"] = mInnerLineCenter3D[2]
dict["right_line_center_x"] = mInnerLineCenter3D[3]
dict["right_line_center_y"] = mInnerLineCenter3D[4]
dict["right_line_center_z"] = mInnerLineCenter3D[5]
dict["bottom_line_center_x"] = mInnerLineCenter3D[6]
dict["bottom_line_center_y"] = mInnerLineCenter3D[7]
dict["bottom_line_center_z"] = mInnerLineCenter3D[8]
dict["left_line_center_x"] = mInnerLineCenter3D[9]
dict["left_line_center_y"] = mInnerLineCenter3D[10]
dict["left_line_center_z"] = mInnerLineCenter3D[11]
# 计算出的宽度和高度
dict["best_cal_width"] = best_cal_width
dict["best_cal_height"] = best_cal_height
# 中心点3d坐标
dict["x_center"] = mInnerCenter3D[0]
dict["y_center"] = mInnerCenter3D[1]
dict["z_center"] = mInnerCenter3D[2]
dict["actual_value"] = ""
dict["status"] = "good"
dict["base"] = "5"
# dict["x_center"] = mInnerConners3D[0]
# dict["y_center"] = mInnerConners3D[1]
# dict["z_center"] = mInnerConners3D[2]
bim_result.append(dict)
print(f"bim_result🟠={bim_result}")
# 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)
2025-02-25 10:15:21 +08:00
print("================== draw =================")
msg.im2D = im
2025-04-20 21:44:06 +08:00
# cv2.imshow("HQImage", im)
2025-02-25 10:15:21 +08:00
# 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:
2025-04-20 21:44:06 +08:00
for i in range(record.roi_size):
roi2 = record.subRois[i]
if not roi2.isGood: continue
mInfo = roi2.mInfo
print(f"mInfo====={mInfo}")
2025-02-25 10:15:21 +08:00
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 =================")