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

