ymj_data_collect/imgProcess.py
2025-04-20 21:44:06 +08:00

370 lines
17 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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:
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)
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 i in range(record.roi_size):
roi2 = record.subRois[i]
if not roi2.isGood: continue
mInfo = roi2.mInfo
print(f"mInfo====={mInfo}")
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 =================")