C#实现图像识别可以借助成熟的计算机视觉库,不需要从零搭建算法模型,目前主流的方案有OpenCvSharp和Emgu CV两种,两者都是OpenCV的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