使用C#調(diào)用OpenCvSharp庫實(shí)現(xiàn)核心圖像處理功能的方法
1、簡述
圖像處理是計(jì)算機(jī)視覺的核心環(huán)節(jié)之一,而在 C# 中,我們可以使用開源的 OpenCvSharp 庫來快速完成各種圖像操作。
本文將從零開始,帶你實(shí)戰(zhàn)幾個典型的圖像任務(wù):
- 圖像糾偏(Perspective Correction)
- 背景擦除(Background Removal)
- 圖像裁切(Crop)
- 圖像分割(Segmentation)
2、OpenCvSharp 是什么
OpenCvSharp 是對 OpenCV 的 .NET 封裝,提供與 Python/C++ OpenCV 幾乎一致的 API。
特點(diǎn):
- 跨平臺(Windows / Linux / macOS)
- 與 .NET 無縫集成
- 支持 OpenCV 全部特性(濾波、特征、OCR、檢測等)
- 可與 WPF / WinForms / ASP.NET 一起使用
3、實(shí)踐樣例
3.1 環(huán)境準(zhǔn)備
1、創(chuàng)建控制臺項(xià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ù)時角度不正,想要自動“拉正”。
核心步驟
- 找到文檔的四個頂點(diǎn);
- 使用
Cv2.GetPerspectiveTransform()計(jì)算變換矩陣; - 使用
Cv2.WarpPerspective()進(jìn)行透 視矯正。
var src = Cv2.ImRead("document.jpg");
// 模擬已檢測的四個角點(diǎn)(順時針)
Point2f[] srcPoints = {
new Point2f(320, 150),
new Point2f(700, 130),
new Point2f(750, 600),
new Point2f(280, 620)
};
// 目標(biāo)矩形區(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();
運(yùn)行后,文檔會自動被“拉平”。
3.4 背景擦除(背景去除)
目標(biāo): 去除背景,僅保留主要前景(如人物、物體)。
常用方法: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)
目標(biāo): 提取圖像中指定區(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)
目標(biāo): 按顏色或亮度分割區(qū)域,例如提取藍(lán)天、綠草、白紙。
方法一:顏色閾值分割(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);
// 提取目標(biāo)區(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 實(shí)現(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)域最強(qiáng)大的工具之一,既可用于工業(yè)檢測、票據(jù)識別、OCR 前處理,也能應(yīng)用在智能拍照與 AI 視覺項(xiàng)目中。
以上就是使用C#調(diào)用OpenCvSharp庫實(shí)現(xiàn)核心圖像處理功能的方法的詳細(xì)內(nèi)容,更多關(guān)于C# OpenCvSharp圖像處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
通過LinQ查詢字符出現(xiàn)次數(shù)的實(shí)例方法
這篇文章主要介紹了通過LinQ查詢字符出現(xiàn)次數(shù)的實(shí)例方法,大家參考使用吧2013-11-11
C#實(shí)現(xiàn)將Excel表格轉(zhuǎn)換為圖片(JPG/?PNG)
Excel表格可能會因?yàn)椴煌O(shè)備或字體缺失等問題,導(dǎo)致格式錯亂或數(shù)據(jù)顯示異常,轉(zhuǎn)換為圖片后,能確保數(shù)據(jù)的排版等保持一致,下面我們看看如何使用C#實(shí)現(xiàn)將Excel表格轉(zhuǎn)換為圖片吧2025-04-04
c#入門之實(shí)現(xiàn)簡易存款利息計(jì)算器示例
這篇文章主要介紹了c#入門之實(shí)現(xiàn)簡易存款利息計(jì)算器示例,需要的朋友可以參考下2014-04-04
C# JSON格式化轉(zhuǎn)換輔助類 ConvertJson
本文介紹使用C#原生代碼實(shí)現(xiàn) JSON格式化以及各種類型轉(zhuǎn)化JSON的輔助類,幫助開發(fā)人員快速開發(fā)。2016-04-04

