使用C#调用OpenCvSharp库实现核心图像处理功能的方法

 更新时间:2025年11月06日 09:57:05   作者:拾荒的小海螺  
图像处理是计算机视觉的核心环节之一,而在 C# 中,我们可以使用开源的 OpenCvSharp 库来快速完成各种图像操作,本文就给大家介绍了如何使用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 视觉项目中。

以上就是使用C#调用OpenCvSharp库实现核心图像处理功能的方法的详细内容,更多关于C# OpenCvSharp图像处理的资料请关注脚本之家其它相关文章!

相关文章

  • 用 C# Winform做出全透明的磨砂玻璃窗体效果代码

    用 C# Winform做出全透明的磨砂玻璃窗体效果代码

    就是一个简单的例子, 调用系统的 dwm 去重绘窗口. 只能在 Vista 和 7 之后才可以, 并且要确保已经开启主题服务等等, 总之不是非常实用, 好玩而已
    2011-05-05
  • C#中使用Split方法拆分字符串实例

    C#中使用Split方法拆分字符串实例

    这篇文章主要介绍了C#中使用Split方法拆分字符串实例,本文给出了使用一个分隔符和多个分隔符拆分字符串的例子,需要的朋友可以参考下
    2014-08-08
  • C# 命名空间(Namespace)相关知识总结

    C# 命名空间(Namespace)相关知识总结

    这篇文章主要介绍了C# 命名空间(Namespace)的相关知识,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以参考下
    2020-06-06
  • c#如何显式实现接口成员

    c#如何显式实现接口成员

    这篇文章主要介绍了c#如何显式实现接口成员,帮助大家更好的利用c#处理接口,感兴趣的朋友可以了解下
    2020-10-10
  • c# winform 解决PictureBox 无法打印全部图片的问题

    c# winform 解决PictureBox 无法打印全部图片的问题

    这篇文章主要介绍了c# winform 解决PictureBox 无法打印全部图片的问题,帮助大家更好进行c# winform开发,感兴趣的朋友可以了解下
    2020-12-12
  • unity中实现Edge浏览器鼠标手势的功能思路详解

    unity中实现Edge浏览器鼠标手势的功能思路详解

    这篇文章主要介绍了unity中实现Edge浏览器鼠标手势的功能思路详解,实现起来其实并不复杂,涉及的技术点有pc端和移动端屏幕拖动事件,二维向量的相关运算,手势匹配算法,事件系统设计模式,需要的朋友可以参考下
    2023-12-12
  • C#中Linq的入门教程

    C#中Linq的入门教程

    这篇文章介绍了C#中Linq的基础操作,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C# 枚举的使用简介

    C# 枚举的使用简介

    这篇文章主要介绍了C# 枚举的简单使用,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#中抽象类与接口的区别详解

    C#中抽象类与接口的区别详解

    本文主要介绍了C#中抽象类与接口的区别。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 使用C#实现RTP数据包传输 参照RFC3550

    使用C#实现RTP数据包传输 参照RFC3550

    本篇文章小编为大家介绍,使用C#实现RTP数据包传输 参照RFC3550,需要的朋友参考下
    2013-04-04

最新评论