如何为Allied Vision Manta G-201C相机代码添加按'c'连续存图功能?
实现相机按'c'键持续存图、'q'键退出的功能
需求说明
已完成Allied Vision Manta G-201C相机的Python集成,现有代码可正常实时显示图像并执行保存操作。需修改代码实现:按下一次c键后,持续调用do_something()函数保存图像,同时保持实时图像显示;按下q键时停止相机并关闭所有窗口。
修改后的完整代码
from datetime import datetime from functools import partial import queue import time from vimba import * import cv2 def setup_camera(cam): cam.set_pixel_format(PixelFormat.BayerRG8) cam.ExposureTimeAbs.set(10000) cam.BalanceWhiteAuto.set('Off') cam.Gain.set(0) cam.AcquisitionMode.set('Continuous') cam.GainAuto.set('Off') # 适配Manta G-201C的分辨率参数,可根据实际情况调整 cam.Height.set(492) cam.Width.set(656) # Vimba捕获线程回调函数,注意:此函数在独立线程中执行 def frame_handler(frame_queue, cam, frame): img = frame.as_numpy_ndarray() img_rgb = cv2.cvtColor(img, cv2.COLOR_BAYER_RG2RGB) try: frame_queue.put_nowait(img_rgb) except queue.Full: print('丢弃帧:队列已满') cam.queue_frame(frame) def do_something(img, count): filename = 'data/IMG_' + str(count) + '.jpg' cv2.putText(img, str(datetime.now()), (20, 40) , cv2.FONT_HERSHEY_PLAIN, 2, (255, 255, 255) , 2, cv2.LINE_AA) cv2.imwrite(filename, img) def run_processing(cam): try: frame_queue = queue.Queue(maxsize=10) cam.start_streaming(handler=partial(frame_handler, frame_queue), buffer_count=10) start = time.time() frame_count = 0 is_saving = False # 标记是否处于持续存图状态 while True: if frame_queue.qsize() > 0: try: frame = frame_queue.get_nowait() frame_count += 1 cv2.imshow('实时画面', frame) # 仅当存图状态开启时执行保存 if is_saving: do_something(frame, frame_count) except queue.Empty: pass key = cv2.waitKey(1) & 0xFF if key == ord('c'): # 切换存图状态:按下c键开启/关闭持续存图 is_saving = not is_saving status = '开启' if is_saving else '关闭' print(f'持续存图已{status}') elif key == ord('q'): # 按下q键退出循环 cv2.destroyAllWindows() break fps = int((frame_count + 1)/(time.time() - start)) print(f'帧率:{fps} FPS') finally: cam.stop_streaming() def main(): with Vimba.get_instance() as vimba: cameras = vimba.get_all_cameras() if not cameras: print('未检测到相机') return with cameras[0] as cam: setup_camera(cam) run_processing(cam) if __name__ == "__main__": main()
关键改动说明
- 添加
is_saving状态变量,用于控制是否持续执行存图操作 - 修改键盘事件处理逻辑:
- 按下
c键时切换is_saving状态,实现存图的开启/关闭切换 - 移除原代码中
frame_count >=100的退出条件,仅保留q键退出逻辑
- 按下
- 调整
do_something()的调用时机,仅当is_saving为True时才执行图像保存 - 增加相机检测逻辑,避免无相机时程序报错
- 优化提示信息,让操作状态更清晰
内容的提问来源于stack exchange,提问作者Hardik_Zalavadiya
相关产品推荐
相关产品推荐

