当前位置: 首页 > news >正文

C#:OpenCvSharp 实现图像处理的技术指南

🧠1、简述

图像处理是计算机视觉的核心环节之一,而在 C# 中,我们可以使用开源的 OpenCvSharp 库来快速完成各种图像操作。
本文将从零开始,带你实战几个典型的图像任务:
✅ 图像纠偏(Perspective Correction)
✅ 背景擦除(Background Removal)
✅ 图像裁切(Crop)
✅ 图像分割(Segmentation)

在这里插入图片描述


2、OpenCvSharp 是什么

OpenCvSharp 是对 OpenCV 的 .NET 封装,提供与 Python/C++ OpenCV 几乎一致的 API。

特点:

  • 🧩 跨平台(Windows / Linux / macOS)
  • 🚀 与 .NET 无缝集成
  • 📦 支持 OpenCV 全部特性(滤波、特征、OCR、检测等)
  • 💡 可与 WPF / WinForms / ASP.NET 一起使用

3、实践样例

3.1 环境准备

1️⃣ 创建控制台项目
dotnet new console -n OpenCvSharpDemo
cd OpenCvSharpDemo
2️⃣ 安装依赖包
dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.runtime.win

(如果在 macOS/Linux,请改为 OpenCvSharp4.runtime.osx.linux

3.2 载入图像基础操作

using OpenCvSharp;
using System;class Program
{static void Main(){var src = Cv2.ImRead("input.jpg"); // 读取图像Cv2.ImShow("原图", src);Cv2.WaitKey();}
}

3.3 图像纠偏(透视变换)

场景: 例如拍摄文件或票据时角度不正,想要自动“拉正”。

🔧 核心步骤
  • 找到文档的四个顶点;
  • 使用 Cv2.GetPerspectiveTransform() 计算变换矩阵;
  • 使用 Cv2.WarpPerspective() 进行透视矫正。
var src = Cv2.ImRead("document.jpg");// 模拟已检测的四个角点(顺时针)
Point2f[] srcPoints = {new Point2f(320, 150),new Point2f(700, 130),new Point2f(750, 600),new Point2f(280, 620)
};// 目标矩形区域
Point2f[] dstPoints = {new Point2f(0, 0),new Point2f(500, 0),new Point2f(500, 700),new Point2f(0, 700)
};Mat matrix = Cv2.GetPerspectiveTransform(srcPoints, dstPoints);
Mat corrected = new Mat();
Cv2.WarpPerspective(src, corrected, matrix, new Size(500, 700));Cv2.ImShow("纠偏后", corrected);
Cv2.WaitKey();

📸 运行后,文档会自动被“拉平”。

3.4 背景擦除(背景去除)

目标: 去除背景,仅保留主要前景(如人物、物体)。

常用方法:GrabCut 算法。

var src = Cv2.ImRead("person.jpg");
var mask = new Mat();
var bgdModel = new Mat();
var fgdModel = new Mat();// 定义前景区域(大致框住主体)
Rect rect = new Rect(50, 50, src.Width - 100, src.Height - 100);// 使用 GrabCut 算法
Cv2.GrabCut(src, mask, rect, bgdModel, fgdModel, 5, GrabCutModes.InitWithRect);// 提取前景
mask = (mask == 1) + (mask == 3);
Mat foreground = new Mat();
src.CopyTo(foreground, mask);Cv2.ImShow("背景擦除结果", foreground);
Cv2.WaitKey();

✅ 输出:背景被透明或黑色替换,仅保留人物部分。

3.5 图像裁切(Crop)

目标: 提取图像中指定区域,例如人脸或物体。

var src = Cv2.ImRead("input.jpg");
Rect roi = new Rect(100, 50, 200, 200); // x, y, width, height
Mat cropped = new Mat(src, roi);
Cv2.ImShow("裁切区域", cropped);
Cv2.WaitKey();

💡 也可以结合人脸检测结果自动生成 ROI。

3.6 图像分割(Segmentation)

目标: 按颜色或亮度分割区域,例如提取蓝天、绿草、白纸。

方法一:颜色阈值分割(HSV 空间)
var src = Cv2.ImRead("flower.jpg");
Mat hsv = new Mat();
Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);// 定义颜色范围(例如红色)
Scalar lower = new Scalar(0, 100, 100);
Scalar upper = new Scalar(10, 255, 255);Mat mask = new Mat();
Cv2.InRange(hsv, lower, upper, mask);// 提取目标区域
Mat result = new Mat();
Cv2.BitwiseAnd(src, src, result, mask);Cv2.ImShow("颜色分割结果", result);
Cv2.WaitKey();
方法二:KMeans 聚类分割

将图像像素聚类为 K 类,从而自动分割前景/背景。

var src = Cv2.ImRead("scene.jpg");
Mat samples = src.Reshape(1, src.Rows * src.Cols);
samples.ConvertTo(samples, MatType.CV_32F);int K = 3;
Mat labels = new Mat();
Mat centers = new Mat();Cv2.Kmeans(samples, K, labels,new TermCriteria(CriteriaTypes.Eps | CriteriaTypes.MaxIter, 10, 1.0),3, KMeansFlags.PpCenters, centers);centers.ConvertTo(centers, MatType.CV_8U);
var segmented = new Mat(src.Size(), src.Type());for (int y = 0; y < src.Rows; y++)
{for (int x = 0; x < src.Cols; x++){int label = labels.Get<int>(y * src.Cols + x);var color = centers.At<Vec3b>(label);segmented.Set(y, x, color);}
}Cv2.ImShow("KMeans 图像分割", segmented);
Cv2.WaitKey();

🎨 输出:将图像按颜色聚类成多个区域。


💡 4、结语

通过本文,你学会了如何在 C# 中利用 OpenCvSharp 实现多种常见图像操作,包括:

  • 📐 透视纠偏;
  • 🧹 背景去除;
  • ✂️ 图像裁切;
  • 🧩 分割提取。
功能方法
图像纠偏Cv2.GetPerspectiveTransform + Cv2.WarpPerspective
背景擦除Cv2.GrabCut
图像裁切new Mat(src, Rect)
图像分割Cv2.InRange / Cv2.Kmeans
图像显示Cv2.ImShow
图像保存Cv2.ImWrite("output.jpg", mat)

OpenCvSharp 是 .NET 图像处理领域最强大的工具之一,既可用于工业检测、票据识别、OCR 前处理,也能应用在智能拍照与 AI 视觉项目中。

http://www.dtcms.com/a/573031.html

相关文章:

  • KingbaseES:从兼容到超越,详解超越MySQL的权限隔离与安全增强
  • 超详细Windows系统MySQL 安装教程
  • LeetCode 刷题【145. 二叉树的后序遍历】
  • 快速精通Zynq芯片与嵌入式系统实战
  • 【设计题】秒杀场景中的库存扣减并发控制
  • cpp_STL简介(了解)
  • 视觉Transformer实战——Vision Transformer(ViT)详解与实现
  • 个性化网站设计网站搜索系统
  • 机器视觉---光学变焦与数字变焦
  • 三种方式修改AI生成的流程图,实现无损放大
  • Spring AI使用知识库增强对话功能
  • 在类中强制规定编码约定:Python高级开发指南
  • 《GoF 23+1:设计模式的正确打开方式,清晰分组+巧妙记忆》
  • Java基础(十五):注解(Annotation)详解
  • 离散制造与流程制造 MES 应用核心差异对比表
  • 实战代码解析:京东获得 JD 商品详情 API (item_get_pro) 返回值说明
  • Agent 设计与上下文工程- 02 Workflow 设计模式(上)
  • UE安卓环境搭建
  • 【代码随想录算法训练营——Day59】图论——47.参加科学大会、94.城市间货物运输I
  • 做网站推广前途某互联网公司开发官网的首页
  • 网站未收录wordpress设置假阅读量
  • 将大规模shp白模贴图转3dtiles倾斜摄影,并可单体化拾取建筑
  • CMP7(类Cloudera CMP 7 404版华为Kunpeng)用开源软件Label Studio做数据标注
  • Go、DevOps运维开发实战(视频教程)
  • 25.Spring Boot 启动流程深度解析:从run()到自动配置
  • Spring Boot 实现多语言国际化拦截器
  • 神经网络—— 人工神经网络导论
  • 实时云渲染平台 LarkXR:2D/3D 应用云推流的高效解决方案
  • 厦门市建设局网站摇号如何自己搭建一个企业网站
  • 郑州市科协网站游戏推广员到底犯不犯法