2024年睿抗机器人大赛智能侦查省赛(预选赛)总结上篇

引言

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

任务一

任务描述
智能侦察机器人小车电池满电状态下电压为29.4V,主控板MCU的ADC测量电压范围为0~3.3V。下图为智能侦察机器人小车电池电压的测量电路,请从电阻阻值表中,选取合适的R11和R12的阻值,完成电路的设计。
下面是电阻阻值表:
分析过程

        假设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:兵人识别
        根据给定的图片,识别出图片中虚拟人物的总数以及红色、蓝色、黑色各多少个。 编程语言:C++或 Python。 基础数据:组委会提供 200 张的图片作为识别训练集,比赛时的图片另外提供。
        比赛要求:编写代码,从 100 张赛题图片中随机选出 20 张图片,识别出图片中的人物,统计人物的总数和其中红色、蓝色、黑色各多少个,在终端中以文字形式输出相应的数量。
思路分析

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:距离检测

        根据给定的图片,识别标记物的颜色及其离相机的距离。编程语言:C++或Python。基础数据:组委会提供5张图片作为识别训练集,比赛的10张图片另外提供。
        比赛要求:在比赛的10张图片中检测出标记物与相机的距离并输出。标记物的大小为高度147mm,宽度119mm。
1.技术选型
        编程语言:Python
        图像处理库:OpenCV
        深度学习库:可选(用于复杂背景下的目标检测)
2. 数据准备
        训练集:组委会提供的5张图片用于训练模型。
        测试集:比赛时提供的10张图片。
3. 图像预处理
        色彩空间转换:将RGB图像转换为HSV色彩空间,便于颜色分离。
        颜色分割:根据已知的颜色范围,使用阈值分割提取每种颜色的区域。
        形态学操作:使用膨胀和腐蚀操作去除噪声,增强边缘。
4. 物体检测
        颜色范围定义:定义标记物的颜色范围。
        对象计数:检测标记物的位置和尺寸。
5. 距离估计
        基于标记物尺寸:使用标记物的实际尺寸和图像中的尺寸比例来计算距离。
        相机焦距估算:可以通过标定或已知的焦距来计算。
6. 实现细节
        加载图像:使用OpenCV加载图像。
        颜色范围定义:定义标记物的颜色范围。
        颜色分割:使用HSV色彩空间进行颜色分割。
        形态学操作:使用膨胀和腐蚀操作去除噪声。
        轮廓检测:使用OpenCV的轮廓检测函数找到轮廓。
        结果输出:输出标记物的颜色及其离相机的距离。
以下是一个距离检测原理的demo
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()

小结

以上是我们结合省赛个人实践和参考资料撰写的总结,仅供参考。示例代码中实现了上述步骤,包括加载图像、颜色分割、轮廓检测、计算相机焦距和估计距离等功能。通过调整颜色范围和优化图像处理流程,可以进一步提高识别的准确性和稳定性。通过上述技术选型和实现步骤,我们能够有效地识别标记物的颜色,并准确地估计标记物与相机之间的距离。这种方法适用于多种应用场景,特别是在机器人竞赛、自动化检测等领域。

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值