引言
2024年的睿抗机器人大赛智能侦查省赛预选赛圆满结束。本次比赛吸引了来自全省多所高校的机器人团队参加,旨在检验参赛队伍在机器人技术领域的创新能力和实际操作水平。本文将对比赛中的各个任务进行详细分析,并提供我们的解答方向和策略。
任务一
任务描述


分析过程
假设ADC的参考电压是Vref,并且ADC能够测量从0V到Vref的电压。在电压分压器电路中(由R11和R12组成),输出电压Vout和输入电压Vin之间是比例关系,这个比例由两个电阻的阻值决定。公式为:
Vout = (R12 / (R11 + R12)) * Vin
在这个问题中,Vin的最大值是29.4V,我们需要找到一个Vout的值,这个值在ADC的输入电压范围内。假设ADC的参考电压Vref是3.3V,那么我们需要找到R11和R12的值,使得当Vin=29.4V时,Vout接近或等于3.3V。将已知值代入公式,得到:3.3 = (R12 / (R11 + R12)) * 29.4;解这个方程,我们可以找到R12和R11+R12之间的关系
假设选择一个电阻值R12,然后计算另一个电阻值R11。例如,如果我们选择R12=10kΩ,我们可以解方程找到R11的值:
3.3 = (10kΩ / (R11 + 10kΩ)) * 29.4
解这个方程,我们得到:
R11 = (10kΩ * 29.4V / 3.3V) - 10kΩ
因此如果我们选择R12=10kΩ,那么R11应该大约是77.27kΩ。具体数值需要大家结合仿真结果和实际验证获取。
任务二
任务描述
思路分析
1.技术选型
由于Python在图像处理方面有着丰富的库支持,建议使用Python进行开发。我们可以利用OpenCV进行图像处理,并结合深度学习框架如TensorFlow或PyTorch进行模型训练。
2.数据准备
训练集:组委会提供的200张图片用于训练模型。这些图片应该包含红色、蓝色、黑色的不同兵人。
测试集:比赛时提供的100张图片中随机选择20张进行测试。这部分数据应事先不被模型接触过,以保证公平性。
3. 图像预处理
色彩空间转换:将RGB图像转换为HSV或LAB色彩空间,便于颜色分离。
颜色分割:根据已知的颜色范围,使用阈值分割提取每种颜色的区域。
形态学操作:使用膨胀和腐蚀操作去除噪声,增强边缘。
4. 物体检测
特征提取:可以使用SIFT、SURF或HOG等传统特征提取方法,也可以使用深度学习的方法YOLO来直接检测和分类对象。
训练模型:使用训练集数据训练模型,可以是传统的机器学习分类器(如SVM)或是深度学习模型。
5. 实现细节
颜色范围定义:对于红色、蓝色、黑色,定义每种颜色的HSV或LAB色彩空间的范围。
对象计数:对于每种颜色的对象,统计每个类别下的对象数量。
结果输出:将识别出的兵人总数及每种颜色的数量以文本格式输出到控制台。
以下是一个使用OpenCV进行基本的图像处理和颜色分割的demo
import cv2
import numpy as np
from random import sample
def preprocess_image(image):
# 转换到HSV色彩空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
return hsv
def color_segmentation(hsv, color):
if color == 'red':
lower_range = np.array([0, 100, 100])
upper_range = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_range, upper_range)
lower_range = np.array([170, 100, 100])
upper_range = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_range, upper_range)
mask = mask1 + mask2
elif color == 'blue':
lower_range = np.array([90, 50, 50])
upper_range = np.array([130, 255, 255])
mask = cv2.inRange(hsv, lower_range, upper_range)
elif color == 'black':
lower_range = np.array([0, 0, 0])
upper_range = np.array([180, 255, 30])
mask = cv2.inRange(hsv, lower_range, upper_range)
# 形态学操作
kernel = np.ones((5,5),np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
return mask
def count_objects(mask):
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
return len(contours)
def main():
# 加载训练集
train_images = load_train_images()
test_images = load_test_images()
# 随机选择20张测试图片
selected_test_images = sample(test_images, 20)
total_count = 0
red_count = 0
blue_count = 0
black_count = 0
for img_path in selected_test_images:
image = cv2.imread(img_path)
hsv = preprocess_image(image)
red_mask = color_segmentation(hsv, 'red')
blue_mask = color_segmentation(hsv, 'blue')
black_mask = color_segmentation(hsv, 'black')
red_count += count_objects(red_mask)
blue_count += count_objects(blue_mask)
black_count += count_objects(black_mask)
total_count += red_count + blue_count + black_count
print(f"Total: {total_count}, Red: {red_count}, Blue: {blue_count}, Black: {black_count}")
if __name__ == "__main__":
main()
任务2:距离检测
图像处理库:OpenCV
深度学习库:可选(用于复杂背景下的目标检测)
2. 数据准备
训练集:组委会提供的5张图片用于训练模型。
测试集:比赛时提供的10张图片。
3. 图像预处理
色彩空间转换:将RGB图像转换为HSV色彩空间,便于颜色分离。
颜色分割:根据已知的颜色范围,使用阈值分割提取每种颜色的区域。
形态学操作:使用膨胀和腐蚀操作去除噪声,增强边缘。
4. 物体检测
颜色范围定义:定义标记物的颜色范围。
对象计数:检测标记物的位置和尺寸。
5. 距离估计
基于标记物尺寸:使用标记物的实际尺寸和图像中的尺寸比例来计算距离。
相机焦距估算:可以通过标定或已知的焦距来计算。
6. 实现细节
加载图像:使用OpenCV加载图像。
颜色范围定义:定义标记物的颜色范围。
颜色分割:使用HSV色彩空间进行颜色分割。
形态学操作:使用膨胀和腐蚀操作去除噪声。
轮廓检测:使用OpenCV的轮廓检测函数找到轮廓。
结果输出:输出标记物的颜色及其离相机的距离。
import cv2
import numpy as np
from math import sqrt
# 定义颜色范围
COLOR_RANGE = {
'target': ((0, 100, 100), (10, 255, 255)) # 假设标记物颜色为红色
}
# 标记物的实际尺寸
REAL_WIDTH = 119 # mm
REAL_HEIGHT = 147 # mm
# 相机焦距
KNOWN_DISTANCE = 1000 # 已知标记物距离相机的距离,单位为mm
KNOWN_WIDTH = 119 # 已知标记物宽度,单位为mm
focal_length = 0
def calculate_focal_length(marker_width_in_image, known_distance, known_width):
"""计算相机的焦距"""
global focal_length
focal_length = (marker_width_in_image * known_distance) / known_width
return focal_length
def preprocess_image(image):
"""将图像转换为HSV色彩空间"""
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
return hsv
def color_segmentation(hsv, color):
"""根据颜色范围进行颜色分割"""
lower, upper = COLOR_RANGE[color]
mask = cv2.inRange(hsv, lower, upper)
# 形态学操作
kernel = np.ones((5, 5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
return mask
def find_target(mask):
"""检测并获取标记物的轮廓"""
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if contours:
# 找到面积最大的轮廓
max_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(max_contour)
return x, y, w, h
return None
def estimate_distance(w, h):
"""估计标记物与相机的距离"""
# 使用三角形相似原理计算距离
distance = (REAL_WIDTH * focal_length) / w
return distance
def load_images(image_paths):
"""加载图像列表"""
images = []
for path in image_paths:
img = cv2.imread(path)
if img is not None:
images.append(img)
return images
def main():
# 加载训练集
train_images = ['path/to/train/image1.jpg', 'path/to/train/image2.jpg']
train_images = load_images(train_images)
# 加载测试集
test_images = ['path/to/test/image1.jpg', 'path/to/test/image2.jpg']
test_images = load_images(test_images)
# 计算相机焦距
for img in train_images:
hsv = preprocess_image(img)
target_mask = color_segmentation(hsv, 'target')
target_info = find_target(target_mask)
if target_info:
x, y, w, h = target_info
calculate_focal_length(w, KNOWN_DISTANCE, KNOWN_WIDTH)
break
# 遍历测试集
for img in test_images:
hsv = preprocess_image(img)
target_mask = color_segmentation(hsv, 'target')
target_info = find_target(target_mask)
if target_info:
x, y, w, h = target_info
distance = estimate_distance(w, h)
print(f"Target found at ({x}, {y}) with size {w}x{h} pixels.")
print(f"Estimated distance: {distance:.2f} mm")
else:
print("No target found.")
if __name__ == "__main__":
main()
小结
以上是我们结合省赛个人实践和参考资料撰写的总结,仅供参考。示例代码中实现了上述步骤,包括加载图像、颜色分割、轮廓检测、计算相机焦距和估计距离等功能。通过调整颜色范围和优化图像处理流程,可以进一步提高识别的准确性和稳定性。通过上述技术选型和实现步骤,我们能够有效地识别标记物的颜色,并准确地估计标记物与相机之间的距离。这种方法适用于多种应用场景,特别是在机器人竞赛、自动化检测等领域。