C#与WPF联手:输入条码回车触发多摄像头同步拍照并保存照片全攻略
# C# WPF 实现条码输入后多摄像头拍照保存 下面是一个完整的解决方案,实现输入条码后按回车键触发多个摄像头同时拍照并保存照片的功能。 ## 主要代码实现 ```csharp using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows; using System.Windows.Input; using System.Windows.Media.Imaging; using Emgu.CV; using Emgu.CV.Structure; namespace BarcodeCameraApp { public partial class MainWindow : Window { private List<VideoCapture> _captures = new List<VideoCapture>(); private int _cameraCount = 0; private string _savePath = @"C:\CameraCaptures"; public MainWindow() { InitializeComponent(); DiscoverCameras(); InitializeSaveDirectory(); } private void InitializeSaveDirectory() { if (!Directory.Exists(_savePath)) { Directory.CreateDirectory(_savePath); } } private void DiscoverCameras() { _captures.Clear(); _cameraCount = 0; // 尝试检测最多4个摄像头 for (int i = 0; i < 4; i++) { try { var capture = new VideoCapture(i); if (capture.IsOpened) { _captures.Add(capture); _cameraCount++; } } catch { break; } } CameraCountText.Text = $"检测到 {_cameraCount} 个摄像头"; } private void BarcodeTextBox_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter && !string.IsNullOrWhiteSpace(BarcodeTextBox.Text)) { CaptureImages(BarcodeTextBox.Text); BarcodeTextBox.Clear(); } } private void CaptureImages(string barcode) { string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss"); string barcodeFolder = Path.Combine(_savePath, barcode); if (!Directory.Exists(barcodeFolder)) { Directory.CreateDirectory(barcodeFolder); } for (int i = 0; i < _captures.Count; i++) { try { var frame = new Mat(); _captures[i].Read(frame); if (!frame.IsEmpty) { string filename = Path.Combine(barcodeFolder, $"Camera_{i + 1}_{timestamp}.jpg"); CvInvoke.Imwrite(filename, frame); } } catch (Exception ex) { MessageBox.Show($"摄像头 {i + 1} 拍照失败: {ex.Message}"); } } MessageBox.Show($"已为条码 {barcode} 保存 {_captures.Count} 张照片"); } protected override void OnClosed(EventArgs e) { foreach (var capture in _captures) { capture.Dispose(); } base.OnClosed(e); } } } ``` ## XAML 界面代码 ```xml <Window x:Class="BarcodeCameraApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="条码拍照系统" Height="200" Width="400"> <Grid Margin="10"> <StackPanel> <TextBlock x:Name="CameraCountText" Margin="0,0,0,10" Text="正在检测摄像头..." FontWeight="Bold"/> <Label Content="输入条码后按回车键:"/> <TextBox x:Name="BarcodeTextBox" KeyDown="BarcodeTextBox_KeyDown" Height="30" FontSize="16"/> <Button Content="重新检测摄像头" Margin="0,10,0,0" Click="DiscoverCameras_Click" Height="30"/> </StackPanel> </Grid> </Window> ``` ## 实现说明 1. 摄像头检测:程序启动时会自动检测可用的摄像头。 2. 条码输入:在文本框中输入条码后按回车键触发拍照。 3. 照片保存: - 照片按条码分类保存到不同文件夹 - 文件名包含摄像头编号和时间戳 - 默认保存路径为 C:\CameraCaptures ## 需要安装的NuGet包 ``` Install-Package Emgu.CV Install-Package Emgu.CV.runtime.windows ``` ## 注意事项 1. 代码中使用了EmguCV库处理摄像头操作,这是一个.NET封装的OpenCV库。 2. 程序会尝试检测最多4个摄像头,可根据需要调整。 3. 照片保存路径可根据需求修改 `_savePath` 变量。 4. 确保摄像头驱动已正确安装且未被其他程序占用。 ## 三条额外需要注意的逻辑点 1. 多线程处理:如果摄像头数量多或分辨率高,应考虑使用多线程处理拍照操作以避免界面卡顿。 2. 异常处理:当前代码已包含基本异常处理,但实际应用中可能需要更详细的错误日志记录。 3. 资源释放:确保在程序退出时正确释放所有摄像头资源,当前已在OnClosed方法中实现。 ######[AI写代码神器 | 1146点数解答 | 2025-04-10 17:06:44]
- Python开发必懂:同步、异步、阻塞、非阻塞概念全解析(阿里通义 | 263点数解答 | 2023-11-08 00:56:38)247
- WPF MVVM:如何依据 TextBlock 内容长度调整窗口大小并在 ViewModel 中控制?(字节豆包 | 371点数解答 | 2024-10-23 23:24:52)187
- WPF MVVM:实现通过 TextBlock 内容长度调整窗口大小并在 ViewModel 中改变的方法(GPT | 1276点数解答 | 2024-10-23 23:27:23)173
- 全套代码框架:用B4A与PHP打造手机多数据远程备份及GPS轨迹记录系统,附开发避雷指南 (DeepSeek | 1130点数解答 | 2025-08-19 19:40:09)155
- 超详细!B4A客户端与PHP服务端实现手机数据远程备份及GPS轨迹记录全代码揭秘(阿里通义 | 1773点数解答 | 2025-08-19 19:41:05)156
- 超详细!B4A客户端与PHP服务端实现手机数据备份、定位轨迹记录及用户认证全代码示例(百度文心 | 1695点数解答 | 2025-08-19 19:44:37)154
- C++编程:冒泡排序函数模板、txtdata类与bindata类的实现及应用(GPT | 1551点数解答 | 2024-06-01 16:02:33)339
- Python在Linux下用openpyxl库实现Excel数据跨文件转移及异常处理(字节豆包 | 429点数解答 | 2025-01-07 19:22:42)182
- Python 在 Linux 下用 openpyxl 实现 Excel 单元格值转移及错误处理(字节豆包 | 240点数解答 | 2025-01-09 17:09:26)196
- Linux 终端操作全攻略:用户创建、文件处理、权限设置与日志查找(字节豆包 | 592点数解答 | 2025-06-12 21:19:29)188
- Python 实现二叉树操作:构建、遍历、计算高度、找祖先及释放内存(字节豆包 | 848点数解答 | 2024-12-21 16:32:32)290
- C语言实现二叉树多操作:构建、遍历、求高、查祖先及内存管理(字节豆包 | 1114点数解答 | 2024-12-21 16:32:51)312