酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

使用C#跟wpf完成输入条码后按回车键多摄像头同时拍照并保存照片 语言方向:C#

# 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方法中实现。 [2025-04-10 17:06:44 | AI写代码神器 | 1146点数解答]

相关提问