【图片识别分类】如何快速识别照片中的水印文字,对图片进行关键字分类,快速整理水印相机拍摄图片,基于WPF和腾讯OCR的技术实现

项目背景

在施工现场,施工人员通常会使用水印相机拍摄照片,这些照片带有时间、地点、施工阶段等水印信息。为了便于管理和归档,需要快速识别照片中的水印文字,并根据关键字对照片进行分类和整理。

界面设计

界面设计简洁直观,方便用户快速上手:

  • 主窗口:包含一个图片选择区域、一个识别结果展示区域、一个关键字分类区域以及几个操作按钮(如"选择图片"、"开始识别"、"导出结果"等)。

  • 图片选择区域:用户可以通过按钮选择需要处理的图片文件,支持批量选择。

  • 识别结果展示区域:显示图片中识别到的文字内容。

  • 关键字分类区域:用户可以输入关键字,系统会根据关键字对图片进行分类。

  • 操作按钮

    • 选择图片:打开文件选择对话框,选择图片。

    • 开始识别:调用腾讯 OCR API 对选中的图片进行文字识别。

    • 导出结果:将识别结果和分类结果导出到表格或文件中。

详细代码步骤

以下是基于 WPF 和腾讯 OCR 的实现代码:

1. 引入必要的命名空间
复制代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Newtonsoft.Json;
using TencentCloud.Common;
using TencentCloud.Common.Profile;
using TencentCloud.Ocr.V20181119;
using TencentCloud.Ocr.V20181119.Models;
2. 主窗口代码

csharp

复制

复制代码
public partial class MainWindow : Window
{
    private string secretId = "your_secret_id";
    private string secretKey = "your_secret_key";
    private List<string> imagePaths = new List<string>();

    public MainWindow()
    {
        InitializeComponent();
    }

    private async void btnSelectImages_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog
        {
            Multiselect = true,
            Filter = "Image files (*.jpg;*.jpeg;*.png)|*.jpg;*.jpeg;*.png"
        };
        if (openFileDialog.ShowDialog() == true)
        {
            imagePaths = openFileDialog.FileNames.ToList();
            txtResults.Text = "Selected images: " + string.Join(", ", imagePaths);
        }
    }

    private async void btnStartRecognition_Click(object sender, RoutedEventArgs e)
    {
        if (imagePaths.Count == 0)
        {
            MessageBox.Show("Please select images first.");
            return;
        }

        List<string> results = new List<string>();
        foreach (var imagePath in imagePaths)
        {
            string result = await RecognizeImageText(imagePath, secretId, secretKey);
            results.Add(result);
            txtResults.Text += $"\n\nImage: {imagePath}\nResult: {result}";
        }
    }

    private async Task<string> RecognizeImageText(string imagePath, string secretId, string secretKey)
    {
        try
        {
            Credential cred = new Credential(secretId, secretKey);

            HttpProfile httpProfile = new HttpProfile
            {
                Endpoint = "ocr.tencentcloudapi.com"
            };

            ClientProfile clientProfile = new ClientProfile
            {
                HttpProfile = httpProfile
            };

            OcrClient client = new OcrClient(cred, "ap-guangzhou", clientProfile);

            GeneralBasicOCRRequest req = new GeneralBasicOCRRequest
            {
                ImageBase64 = Convert.ToBase64String(File.ReadAllBytes(imagePath))
            };

            GeneralBasicOCRResponse resp = await client.GeneralBasicOCR(req);
            return JsonConvert.SerializeObject(resp, Formatting.Indented);
        }
        catch (Exception ex)
        {
            return $"OCR recognition failed: {ex.Message}";
        }
    }

    private void btnExportResults_Click(object sender, RoutedEventArgs e)
    {
        SaveFileDialog saveFileDialog = new SaveFileDialog
        {
            Filter = "Text files (*.txt)|*.txt"
        };
        if (saveFileDialog.ShowDialog() == true)
        {
            File.WriteAllText(saveFileDialog.FileName, txtResults.Text);
            MessageBox.Show("Results exported successfully.");
        }
    }
}
3. XAML 界面代码
复制代码
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OCR Image Recognition" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <Button x:Name="btnSelectImages" Content="Select Images" Grid.Row="0" Margin="10" Click="btnSelectImages_Click"/>
        <TextBox x:Name="txtResults" Grid.Row="1" Margin="10" VerticalScrollBarVisibility="Auto" TextWrapping="Wrap"/>
        <Button x:Name="btnStartRecognition" Content="Start Recognition" Grid.Row="2" Margin="10" Click="btnStartRecognition_Click"/>
        <Button x:Name="btnExportResults" Content="Export Results" Grid.Row="2" Margin="10" HorizontalAlignment="Right" Click="btnExportResults_Click"/>
    </Grid>
</Window>

总结优化

  1. 性能优化:对于大量图片的处理,可以考虑使用多线程或异步编程来提高识别效率。

  2. 功能扩展:可以增加更多功能,如支持更多图片格式、支持对识别结果的编辑和校正。

  3. 用户体验:进一步优化界面设计,使其更加友好和直观。

  4. 错误处理:增强错误处理机制,确保在识别失败或网络问题时能够给用户清晰的提示。

通过上述实现,可以快速识别施工现场照片中的水印文字,对图片进行关键字分类,并快速整理水印相机拍摄的图片,提高工作效率

相关推荐
普罗米修斯Aaron_Swartz1 天前
LeRobot Sim2Real相机配置参数详解
数码相机
线束线缆组件品替网1 天前
Aries Electronics 定制线缆选型与设计建议
数码相机·测试工具·智能手机·电脑·pcb工艺
风途知识百科1 天前
小型车载自动气象站
人工智能·数码相机
nvd111 天前
PDFLoader 中的 OCR 文字提取实现详解
llm·ocr
代码s贝多芬的音符1 天前
IOS webview打开相机 相册 选择文件上传
数码相机·ios
格林威2 天前
跨设备图像拼接:统一色彩偏差的8个核心策略,附OpenCV+Halcon实战代码!
人工智能·数码相机·opencv·机器学习·计算机视觉·视觉检测·工业相机
私人珍藏库2 天前
[Windows] 天若ocr开源版6.1-增加openai兼容接口
ocr
DaLiangChen2 天前
Unity 导览相机实现:键鼠控制自由漫游(WASD 移动 + 右键旋转)
数码相机·unity·游戏引擎
bugcome_com3 天前
WPF 核心布局控件全解析:从 Grid 到 UniformGrid 的实战应用
c#·wpf