如何在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
相关产品推荐
相关产品推荐

