C#如何进行图像识别?附完整项目实例与源码

来源:网络编程作者:多肉头衔:草根站长
导读:本期聚焦于小伙伴创作的《C#如何进行图像识别?附完整项目实例与源码》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何进行图像识别?附完整项目实例与源码》有用,将其分享出去将是对创作者最好的鼓励。

C#实现图像识别可以借助成熟的计算机视觉库,不需要从零搭建算法模型,目前主流的方案有OpenCvSharp和Emgu CV两种,两者都是OpenCV的C#封装,功能覆盖图像读取、预处理、特征提取、目标识别等全流程需求。

C#如何进行图像识别?附完整项目实例与源码

C#图像识别常用框架对比

在选择框架时可以根据项目需求参考以下对比:

框架名称优势适用场景
OpenCvSharp更新频率高,兼容最新OpenCV特性,社区活跃,部署简单新项目开发,需要用到最新视觉算法
Emgu CV历史更久,文档完善,支持更多旧版本.NET框架维护旧项目,或者需要兼容.NET Framework 4.0以下版本

项目实例:基于OpenCvSharp的二维码识别

下面通过一个二维码识别的实例演示完整实现流程,该实例可以读取本地图片或者摄像头画面,自动识别其中的二维码内容并输出。

第一步:环境配置

首先创建.NET 6控制台项目,然后通过NuGet安装OpenCvSharp相关包,需要安装的包如下:

  • OpenCvSharp4
  • OpenCvSharp4.runtime.win

如果是Linux或者Mac系统,需要安装对应平台的runtime包。

第二步:核心代码实现

完整源码如下,包含图像读取、二维码检测、结果输出的完整逻辑:

using OpenCvSharp;
using System;

namespace CSharpImageRecognitionDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 初始化二维码检测器
            using var qrDetector = new QRCodeDetector();
            // 读取本地测试图片,也可以替换为摄像头帧
            using Mat srcImage = Cv2.ImRead("test_qr.png");
            if (srcImage.Empty())
            {
                Console.WriteLine("图片读取失败,请检查路径");
                return;
            }
            // 检测二维码并获取内容
            string decodedText = qrDetector.DetectAndDecode(srcImage, out Point2f[] points);
            if (!string.IsNullOrEmpty(decodedText))
            {
                Console.WriteLine($"识别到二维码内容:{decodedText}");
                // 在图像上绘制二维码边框
                if (points != null && points.Length == 4)
                {
                    for (int i = 0; i < 4; i++)
                    {
                        Cv2.Line(srcImage, points[i], points[(i + 1) % 4], new Scalar(0, 255, 0), 2);
                    }
                }
                // 保存标注后的图片
                Cv2.ImWrite("result.png", srcImage);
                Console.WriteLine("标注后的图片已保存为result.png");
            }
            else
            {
                Console.WriteLine("未识别到二维码");
            }
        }
    }
}

第三步:代码说明

上述代码的核心逻辑分为三部分:

  • 使用QRCodeDetector类初始化二维码检测器,这是OpenCvSharp内置的二维码识别工具
  • 调用DetectAndDecode方法同时完成二维码检测和内容的解析,返回的points数组是二维码的四个顶点坐标
  • 如果识别到内容,就在原图上绘制绿色边框,并将结果保存到本地

扩展:其他图像识别场景实现

如果需要实现人脸识别、物体分类等其他识别场景,只需要替换对应的检测模型即可,例如人脸识别可以使用以下代码片段:

using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;

namespace FaceRecognitionDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 加载人脸检测模型,模型文件可以从OpenCV官方仓库下载
            using Net faceNet = CvDnn.ReadNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000.caffemodel");
            using Mat srcImage = Cv2.ImRead("test_face.jpg");
            // 图像预处理,转换为模型需要的输入格式
            using Mat blob = CvDnn.BlobFromImage(srcImage, 1.0, new Size(300, 300), new Scalar(104, 117, 123));
            faceNet.SetInput(blob);
            // 前向推理获取检测结果
            using Mat detections = faceNet.Forward();
            // 解析检测结果,绘制人脸框
            for (int i = 0; i < detections.Rows; i++)
            {
                float confidence = detections.At<float>(i, 2);
                if (confidence > 0.5)
                {
                    int x1 = (int)(detections.At<float>(i, 3) * srcImage.Width);
                    int y1 = (int)(detections.At<float>(i, 4) * srcImage.Height);
                    int x2 = (int)(detections.At<float>(i, 5) * srcImage.Width);
                    int y2 = (int)(detections.At<float>(i, 6) * srcImage.Height);
                    Cv2.Rectangle(srcImage, new Rect(x1, y1, x2 - x1, y2 - y1), new Scalar(255, 0, 0), 2);
                }
            }
            Cv2.ImWrite("face_result.png", srcImage);
        }
    }
}

实际开发中可以根据需求调整置信度阈值,或者替换为其他预训练模型实现更多识别功能。

C#图像识别OpenCvSharpEmgu_CV图像特征提取修改时间:2026-07-19 13:00:35

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。