【图片识别分类】如何快速识别照片中的水印文字,对图片进行关键字分类,快速整理水印相机拍摄图片,基于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. 错误处理:增强错误处理机制,确保在识别失败或网络问题时能够给用户清晰的提示。

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

相关推荐
SEO-狼术15 小时前
Aspose.OCR for .NET v26 Crack
ocr
lingxiao1688816 小时前
Halcon之OCR应用
人工智能·ocr
Hello-FPGA16 小时前
PCIe-4005 相机模拟器在视觉系统开发中的实战应用
数码相机
开开心心就好1 天前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
开开心心就好1 天前
竖式除法出题工具,整除余数混合模式
运维·服务器·前端·javascript·ocr·perl·1024程序员节
椒颜皮皮虾྅2 天前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
avi91112 天前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
孙琦Ray3 天前
百度开源 Unlimited OCR 2:百页文档单请求解析,竞品得分仅其四成
百度·ocr·开源模型·unlimited ocr 2·长文档解析·sr-swa
FLJwu3 天前
《运动相机硬件防护选型实战》专栏|第二篇(PPTC 自恢复保险丝)
android·经验分享·数码相机·1024程序员节·运动相机
江苏久众新视3 天前
SOP流程AI视觉检测实战案例:基于安防相机与本地AI的产线防错防漏方案落地分享
人工智能·数码相机·视觉检测