You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Webots中正确保存机器人相机捕获的图像?

机器人相机图像保存代码的正确位置问题

我在项目里写了get_camera_image函数,用来获取机器人相机图像并返回RGB值做颜色检测,同时想保存图像用于CNN模型的图像识别。现在已经加了self.camera.saveImage("image.jpg", 100)语句,但不确定该代码的正确位置。

当前的get_camera_image函数代码

def get_camera_image(self, interval):
    width = self.camera.getWidth()
    height = self.camera.getHeight()
    image = self.camera.getImage()
    self.camera.saveImage("image.jpg", 100)
    
    # Capture new image after interval (no. of steps) has passed
    if self.camera_interval >= interval:
        for x in range(width):
            for y in range(height):
                self.red += self.camera.imageGetRed(image, self.camera.getWidth(), x, y)
                self.green += self.camera.imageGetGreen(image, self.camera.getWidth(), x, y)
                self.blue += self.camera.imageGetBlue(image, self.camera.getWidth(), x, y)
        self.red = int(self.red / (width * height))  # normalise wrt image size
        self.green = int(self.green / (width * height))  # normalise wrt image size
        self.blue = int(self.blue / (width * height))  # normalise wrt image size
        self.camera_interval = 0
    else:
        self.red = 0
        self.green = 0
        self.blue = 0
        self.camera_interval += 1
    
    #print("Camera: R =", self.red, ", G =", self.green, ", B =", self.blue)  # DEBUG
    return self.red, self.green, self.blue, image

主控制器代码

import robot

def main():
    red = 0
    green = 0
    blue = 0
    range = 0.0
    ground = 0.0
    robot1 = robot.ARAP()
    robot1.init_devices()
    flag1 = True
    flag2 = True
    flag3 = True
    flag4 = True
    flag5 = True
    summary = []
    
    while True:
        robot1.reset_actuator_values()
        range = robot1.get_sensor_input()
        robot1.blink_leds()
        ground = robot1.get_ground_sensor_values()
        red, green, blue, img = robot1.get_camera_image(5)
        #id = robot1.get_recognised_object()
        #print(red, green, blue) #debug
        #print(ground) #debug
        #if red >= 200 and green >= 200 and blue >= 200:
            #pass
        if flag1 == True:
            if  ground >= 700 and red > 150:
                #print(red, green, blue) #debug
                if red > blue and red > green:
                    print("I see red")
                    flag1 = False
                    summary.append("Red")  
                    print(summary)
                           
        if flag2 == True:
            if blue > 180 and ground >= 690:
                #print(red, green, blue) #debug
                if blue > red and blue > green:
                    print("I see blue")
                    flag2 = False
                    summary.append("blue")
                    print(summary)          
        
        if flag3 == True:
            if ground >= 700 and green > 180:
                #print(red, green, blue) #debug
                if green > red and green > blue:
                    print("I see green")
                    flag3 = False
                    summary.append("green")
                    print(summary)
        
        if flag4 == True:
            if ground >= 300 and ground <= 310 and blue >= 150:
                #print(ground, blue) #debug
                print("I found water")
                flag4 = False
                summary.append("water")
                print(summary)
        
        if flag5 == True:
            if ground >= 300 and ground <= 700 and green >= 150:
                #print(ground, green) #debug
                print("I found food")
                flag5 = False
                summary.append("food")
                print(summary)
           
                   
        if robot1.front_obstacles_detected():
            robot1.move_backward()
            robot1.turn_left()
        
        if robot1.right_obstacles_detected():
            robot1.move_backward()
            robot1.turn_left()
        
        if robot1.left_obstacles_detected():
            robot1.move_backward()
            robot1.turn_right()
        
        else:
            robot1.run_braitenberg()
        robot1.set_actuators()
        robot1.step()

if __name__ == "__main__":
    main()

代码位置分析与修正

核心需求是保存用于CNN识别的图像,同时不影响颜色检测逻辑,可根据保存时机调整位置:

情况1:每次获取图像都保存

如果需要每次调用get_camera_image都保存当前帧,当前位置是正确的——放在image = self.camera.getImage()之后即可。但要注意,固定文件名会覆盖旧文件,若需保留多帧,可改成带时间戳的文件名:

import datetime
filename = f"image_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
self.camera.saveImage(filename, 100)

情况2:只保存用于计算RGB的有效帧

你的颜色检测逻辑是每隔interval步才计算一次平均RGB值,这些帧是触发颜色判断的有效数据,若要保存对应图像,需把保存代码放到if self.camera_interval >= interval:代码块内:

def get_camera_image(self, interval):
    width = self.camera.getWidth()
    height = self.camera.getHeight()
    image = self.camera.getImage()
    
    # Capture new image after interval (no. of steps) has passed
    if self.camera_interval >= interval:
        # 仅在计算RGB时保存对应图像
        self.camera.saveImage("image.jpg", 100)
        for x in range(width):
            for y in range(height):
                self.red += self.camera.imageGetRed(image, self.camera.getWidth(), x, y)
                self.green += self.camera.imageGetGreen(image, self.camera.getWidth(), x, y)
                self.blue += self.camera.imageGetBlue(image, self.camera.getWidth(), x, y)
        self.red = int(self.red / (width * height))  # normalise wrt image size
        self.green = int(self.green / (width * height))  # normalise wrt image size
        self.blue = int(self.blue / (width * height))  # normalise wrt image size
        self.camera_interval = 0
    else:
        self.red = 0
        self.green = 0
        self.blue = 0
        self.camera_interval += 1
    
    #print("Camera: R =", self.red, ", G =", self.green, ", B =", self.blue)  # DEBUG
    return self.red, self.green, self.blue, image

这种方式保存的图像与颜色检测逻辑完全对应,更适合CNN模型的训练或验证。

情况3:检测到特定颜色时保存

如果想在机器人识别到目标颜色(红/绿/蓝)或场景(水/食物)时才保存图像,可把保存逻辑移到主函数的对应判断分支里,比如检测到红色时:

if flag1 == True:
    if  ground >= 700 and red > 150:
        if red > blue and red > green:
            print("I see red")
            # 保存当前触发事件的帧
            robot1.camera.saveImage("red_detected.jpg", 100)
            flag1 = False
            summary.append("Red")  
            print(summary)

这种方式能精准收集特定场景的CNN训练数据。


内容的提问来源于stack exchange,提问作者Rohin Prasanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:42:02