使用C#調(diào)用OpenCvSharp庫實現(xiàn)核心圖像處理功能的方法
1、簡述
圖像處理是計算機視覺的核心環(huán)節(jié)之一,而在 C# 中,我們可以使用開源的 OpenCvSharp 庫來快速完成各種圖像操作。
本文將從零開始,帶你實戰(zhàn)幾個典型的圖像任務(wù):
- 圖像糾偏(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 環(huán)境準備
1、創(chuàng)建控制臺項目
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 載入圖像基礎(chǔ)操作
using OpenCvSharp;
using System;
class Program
{
static void Main()
{
var src = Cv2.ImRead("input.jpg"); // 讀取圖像
Cv2.ImShow("原圖", src);
Cv2.WaitKey();
}
}
3.3 圖像糾偏(透 視變換)
場景: 例如拍攝文件或票據(jù)時角度不正,想要自動“拉正”。
核心步驟
- 找到文檔的四個頂點;
- 使用
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)
};
// 目標矩形區(qū)域
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();
// 定義前景區(qū)域(大致框住主體)
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("背景擦除結(jié)果", foreground);
Cv2.WaitKey();
輸出:背景被透明或黑色替換,僅保留人物部分。
3.5 圖像裁切(Crop)
目標: 提取圖像中指定區(qū)域,例如人臉或物體。
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("裁切區(qū)域", cropped);
Cv2.WaitKey();
也可以結(jié)合人臉檢測結(jié)果自動生成 ROI。
3.6 圖像分割(Segmentation)
目標: 按顏色或亮度分割區(qū)域,例如提取藍天、綠草、白紙。
方法一:顏色閾值分割(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);
// 提取目標區(qū)域
Mat result = new Mat();
Cv2.BitwiseAnd(src, src, result, mask);
Cv2.ImShow("顏色分割結(jié)果", 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();
輸出:將圖像按顏色聚類成多個區(qū)域。
4、結(jié)語
通過本文,你學(xué)會了如何在 C# 中利用 OpenCvSharp 實現(xiàn)多種常見圖像操作,包括:
- 透 視糾偏;
- 背景去除;
- 圖像裁切;
- 分割提取。
| 功能 | 方法 |
|---|---|
| 圖像糾偏 | Cv2.GetPerspectiveTransform + Cv2.WarpPerspective |
| 背景擦除 | Cv2.GrabCut |
| 圖像裁切 | new Mat(src, Rect) |
| 圖像分割 | Cv2.InRange / Cv2.Kmeans |
| 圖像顯示 | Cv2.ImShow |
| 圖像保存 | Cv2.ImWrite("output.jpg", mat) |
OpenCvSharp 是 .NET 圖像處理領(lǐng)域最強大的工具之一,既可用于工業(yè)檢測、票據(jù)識別、OCR 前處理,也能應(yīng)用在智能拍照與 AI 視覺項目中。
以上就是使用C#調(diào)用OpenCvSharp庫實現(xiàn)核心圖像處理功能的方法的詳細內(nèi)容,更多關(guān)于C# OpenCvSharp圖像處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 命名空間(Namespace)相關(guān)知識總結(jié)
這篇文章主要介紹了C# 命名空間(Namespace)的相關(guān)知識,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下2020-06-06
c# winform 解決PictureBox 無法打印全部圖片的問題
這篇文章主要介紹了c# winform 解決PictureBox 無法打印全部圖片的問題,幫助大家更好進行c# winform開發(fā),感興趣的朋友可以了解下2020-12-12
unity中實現(xiàn)Edge瀏覽器鼠標手勢的功能思路詳解
這篇文章主要介紹了unity中實現(xiàn)Edge瀏覽器鼠標手勢的功能思路詳解,實現(xiàn)起來其實并不復(fù)雜,涉及的技術(shù)點有pc端和移動端屏幕拖動事件,二維向量的相關(guān)運算,手勢匹配算法,事件系統(tǒng)設(shè)計模式,需要的朋友可以參考下2023-12-12
使用C#實現(xiàn)RTP數(shù)據(jù)包傳輸 參照RFC3550
本篇文章小編為大家介紹,使用C#實現(xiàn)RTP數(shù)據(jù)包傳輸 參照RFC3550,需要的朋友參考下2013-04-04

