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

如何使用C#在Linux系统下调用相机拍摄照片并支持多相机枚举区分

.NET Core 3.1/.NET 5 跨平台相机采集实现方案

可采用OpenCvSharp4库实现需求,该库支持跨Linux、Windows平台运行,兼容目标框架版本,无需额外定制开发即可覆盖所有要求。

功能匹配说明

  • 多相机枚举区分:库内部封装了Windows下DirectShow、Linux下V4L2的设备枚举逻辑,可直接获取所有可用相机的ID、设备标识,可精准区分不同相机设备调用。
  • 单张图像采集:通过VideoCapture类绑定指定相机ID,调用Read()方法即可获取单帧图像,支持自定义分辨率、编码格式,生成的字节流可直接发送至服务端。
  • 跨平台适配:同一份业务代码无需修改即可在Windows、Linux下运行,仅需对应安装对应平台的运行时依赖包即可。

前置依赖安装

Nuget包安装

  • 基础库:OpenCvSharp4
  • Windows运行时:OpenCvSharp4.runtime.win
  • Linux x64运行时:OpenCvSharp4.runtime.linux-x64

Linux系统额外依赖

需提前安装系统层面依赖,Debian/Ubuntu系列执行命令:
sudo apt update && sudo apt install -y libopencv-dev libv4l-dev
其他发行版可通过对应包管理器安装opencv、v4l2开发依赖即可。

核心代码示例

using OpenCvSharp;
using System.Collections.Generic;

// 枚举可用相机ID列表
public static List<int> GetAvailableCameraIds()
{
    var cameraIds = new List<int>();
    // 可根据实际设备数量调整检测上限
    for (int i = 0; i < 10; i++)
    {
        using var cap = new VideoCapture(i);
        if (cap.IsOpened())
        {
            cameraIds.Add(i);
            cap.Release();
        }
    }
    return cameraIds;
}

// 指定相机ID拍摄单张图,返回JPG格式字节流
public static byte[] CaptureImage(int cameraId, int width = 1920, int height = 1080)
{
    using var cap = new VideoCapture(cameraId);
    cap.Set(VideoCaptureProperties.FrameWidth, width);
    cap.Set(VideoCaptureProperties.FrameHeight, height);

    using var frame = new Mat();
    // 连续读3次清除缓存帧,避免拿到旧帧
    for (int i = 0; i < 3; i++)
    {
        cap.Read(frame);
    }

    // 编码为JPG,质量参数可按需调整
    var encodeParams = new int[] { (int)ImwriteFlags.JpegQuality, 90 };
    byte[] imgBytes = frame.ToBytes(".jpg", encodeParams);
    
    cap.Release();
    return imgBytes;
}

// 拿到字节流后可直接通过HTTP/WebSocket等方式发送到服务器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 16:06:03