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

使用Python+OpenCV控制Edmund Optics UI-154xSE-M相机定时拍照失败求助

使用Python+OpenCV控制Edmund Optics UI-154xSE-M相机定时拍照失败求助

嗨,我完全理解你作为新手遇到这个问题的困惑——相机明明在IDS管理器里显示一切正常,但用OpenCV写的代码就是抓不到图像,确实挺让人挠头的。我来给你梳理几个可能的原因和实用的解决办法:

一、先排查OpenCV的适配问题

你的代码里cv2.VideoCapture(0)能成功初始化相机,但camera.read()返回失败,大概率是OpenCV默认的视频捕捉后端(也就是它和相机通信的底层工具)不支持这款工业相机的图像格式。试试这两个调整:

  1. 指定Windows专用后端:
    把初始化相机的代码改成下面两种之一,Windows上这两个后端对工业相机的兼容性更好:
    # 方案1:用DirectShow后端
    camera = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    # 方案2:用Media Foundation后端
    # camera = cv2.VideoCapture(0, cv2.CAP_MSMF)
    
  2. 确认相机索引是否正确:
    有时候系统里可能有虚拟摄像头(比如OBS、微信的虚拟相机),导致索引0不是你的EO相机。你可以用这个小脚本快速排查所有可用相机的索引:
    import cv2
    for i in range(10):
        cap = cv2.VideoCapture(i)
        if cap.isOpened():
            print(f"相机索引 {i} 可用")
            cap.release()
    
    找到你的EO相机对应的索引后,替换代码里的0即可。

二、修复代码里的明显漏洞

你的代码里output_directory =是空的,这会导致后续保存图片时os.path.join报错,哪怕抓帧成功也存不了图。记得给它赋值一个有效路径,还要确保目录存在:

output_directory = "C:/CameraPhotos"  # Windows路径用/或者双反斜杠\\
# 自动创建目录(如果不存在的话)
os.makedirs(output_directory, exist_ok=True)

三、改用相机官方SDK(最推荐的方案)

这款Edmund Optics相机是基于IDS uEye平台的,OpenCV这类通用库对工业相机的支持本来就有限,用官方SDK能获得更好的兼容性和稳定性。这里给你一个简化的定时拍照示例:

  1. 先确保你已经安装了IDS uEye SDK(你有IDS Camera Manager的话应该已经装了),然后安装Python绑定:
    pip install pyueye
    
  2. 直接可用的示例代码:
    from pyueye import ueye
    import os
    import time
    from datetime import datetime, timedelta
    
    # 设置保存目录
    output_directory = "C:/CameraPhotos"
    os.makedirs(output_directory, exist_ok=True)
    
    # 初始化相机
    h_cam = ueye.HIDS(0)
    ret = ueye.is_InitCamera(h_cam, None)
    if ret != ueye.IS_SUCCESS:
        print(f"初始化相机失败,错误码:{ret}")
        exit()
    
    # 设置图像格式(适配相机的BGR格式,方便后续保存)
    ret = ueye.is_SetColorMode(h_cam, ueye.IS_CM_BGR8_PACKED)
    if ret != ueye.IS_SUCCESS:
        print(f"设置颜色模式失败,错误码:{ret}")
    
    # 为相机分配图像内存
    mem_ptr = ueye.c_mem_p()
    mem_id = ueye.int()
    # 这里的1280x1024是相机的默认分辨率,你可以根据实际情况调整
    ret = ueye.is_AllocImageMem(h_cam, 1280, 1024, 24, mem_ptr, mem_id)
    if ret != ueye.IS_SUCCESS:
        print(f"分配图像内存失败,错误码:{ret}")
    ret = ueye.is_SetImageMem(h_cam, mem_ptr, mem_id)
    
    # 开始视频流捕捉
    ret = ueye.is_CaptureVideo(h_cam, ueye.IS_DONT_WAIT)
    if ret != ueye.IS_SUCCESS:
        print(f"开始捕捉失败,错误码:{ret}")
    
    try:
        end_time = datetime.now() + timedelta(hours=24)
        capture_interval = 10 * 60  # 每10分钟拍一次
    
        while datetime.now() < end_time:
            # 冻结一帧图像(相当于拍照)
            ret = ueye.is_FreezeVideo(h_cam, ueye.IS_WAIT)
            if ret != ueye.IS_SUCCESS:
                print("捕捉图像失败,重试中...")
                time.sleep(1)
                continue
    
            # 把相机内存里的图像转换成OpenCV可识别的格式
            array = ueye.get_data(mem_ptr, 1280, 1024, 24, False, False)
            frame = array.reshape((1024, 1280, 3))
    
            # 生成带时间戳的文件名并保存
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            file_path = os.path.join(output_directory, f"photo_{timestamp}.jpg")
            ueye.is_ImageFileSave(ueye.IS_IMG_JPG, file_path.encode(), mem_ptr, mem_id, 1280, 1024, 24)
            print(f"照片已保存到 {file_path}")
    
            time.sleep(capture_interval)
    except KeyboardInterrupt:
        print("用户手动中断了拍照")
    finally:
        # 释放相机资源,一定要做!
        ueye.is_StopVideo(h_cam)
        ueye.is_FreeImageMem(h_cam, mem_ptr, mem_id)
        ueye.is_ExitCamera(h_cam)
        print("相机已释放,拍照结束")
    

四、不用代码的替代方案

如果你觉得写代码太麻烦,也可以试试IDS Camera Manager自带的功能——比如IDS的uEye Cockpit工具,里面有现成的定时捕捉选项,不用写一行代码就能实现“每隔x分钟拍一张,持续y分钟”的需求,对你来说可能更友好。

备注:内容来源于stack exchange,提问作者bbbbsp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:38:02