我们现在想要识别这个六边形物体与相机的相对位置,
相机镜头和六边形正面的方向垂直,
且在六边形中间的平面上,
我们有这个六边形的建模,
但是现在问题主要有以下几个
场地光线复杂
背景和六边形对比度低
用的是NUC小电脑,无法部署英伟达的模型


我们现在想要识别这个六边形物体与相机的相对位置,
相机镜头和六边形正面的方向垂直,
且在六边形中间的平面上,
我们有这个六边形的建模,
但是现在问题主要有以下几个
场地光线复杂
背景和六边形对比度低
用的是NUC小电脑,无法部署英伟达的模型


晚上好🌙🌙🌙
本答案参考通义千问
要识别黑色六边形物体与相机的相对位置,尤其是在光线复杂、背景对比度低的情况下,同时受限于硬件(如 NUC 小电脑无法部署 NVIDIA 的模型),我们可以采取一系列基于传统图像处理和轻量级深度学习的方法来实现目标。以下是详细的解决方案。
重点部分:
在光线复杂的环境下,增强图像的对比度是识别的第一步。
import cv2
# 读取图像
image = cv2.imread('input.jpg', 0) # 灰度图像
# 直方图均衡化
equalized = cv2.equalizeHist(image)
# 显示结果
cv2.imshow('Equalized Image', equalized)
cv2.waitKey(0)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(equalized)
# 使用Gamma校正增强对比度
gamma = 1.5
adjusted = np.power(image / 255.0, gamma) * 255.0
adjusted = np.uint8(adjusted)
重点部分:
六边形是一个规则多边形,通过边缘检测可以找到其轮廓,并进一步判断是否为六边形。
edges = cv2.Canny(equalized, 50, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)
if len(approx) == 6: # 六边形
# 找到中心点、外接矩形等
(x, y, w, h) = cv2.boundingRect(cnt)
center = (int(x + w/2), int(y + h/2))
print("Found hexagon at:", center)
重点部分:
如果已知六边形的建模(如 CAD 图纸或标准图像),可以通过模板匹配进行定位。
template = cv2.imread('hexagon_template.jpg', 0)
w, h = template.shape[::-1]
result = cv2.matchTemplate(equalized, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(result >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
重点部分:
由于 NUC 不支持 NVIDIA 模型,可以尝试使用 OpenVINO 或 ONNX 格式部署轻量级模型。
model_optimizer 转换模型为 IR 格式from openvino.inference_engine import IECore
ie = IECore()
net = ie.read_network(model='model.xml', weights='model.bin')
exec_net = ie.load_network(network=net, device_name="CPU")
重点部分:
一旦检测到六边形的中心点和外接矩形,就可以计算其相对于相机的位移和角度。
center_x, center_y = center
image_center_x = width // 2
image_center_y = height // 2
dx = center_x - image_center_x
dy = center_y - image_center_y
# 通过像素大小估算距离
actual_size = 100 # 实际六边形尺寸(单位:毫米)
pixel_size = 10 # 从图像中测量的六边形宽度(单位:像素)
distance = (actual_size * focal_length) / pixel_size
识别黑色六边形并计算其与相机相对位置的完整流程如下:
如果你需要我为你生成一个完整的 Python 脚本或进一步优化某个步骤,请告诉我!