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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:05:24