乐于分享
好东西不私藏

.NET + OpenCV 系列教程(二):环境搭建——Visual Studio + OpenCvSharp 完整配置指南

.NET + OpenCV 系列教程(二):环境搭建——Visual Studio + OpenCvSharp 完整配置指南

.NET + OpenCV 系列教程(二):环境搭建——Visual Studio + OpenCvSharp 完整安装配置指南

万丈高楼平地起,工欲善其事,必先利其器。本篇手把手带你完成 .NET + OpenCV 开发环境的全套搭建,让你从零开始,10分钟内跑通第一个图像读取程序。

一、你需要准备什么?

在正式动手前,先明确本系列教程的技术选型:

组件
版本要求
说明
**Visual Studio**
2022(推荐)或 2019
主开发 IDE
**.NET SDK**
.NET 6 / 7 / 8 均可
推荐 .NET 8 LTS
**OpenCvSharp4**
4.9.x(最新稳定版)
OpenCV 的 C# 封装库
**OpenCvSharp4.runtime.win**
与上同版本
Windows 本地运行时(含 DLL)
**操作系统**
Windows 10/11(64位)
本系列以 Windows 为主
为什么用 OpenCvSharp 而不是直接用原版 OpenCV?
OpenCvSharp 是 OpenCV 的官方非官方 C# 绑定,API 设计与 Python 的 cv2 几乎一致,迁移成本低,且支持 NuGet 一键安装,无需手动编译 C++ 库。

二、安装 Visual Studio 2022

2.1 下载安装包

前往官网下载 Visual Studio 2022 Community(免费版):

https://visualstudio.microsoft.com/zh-hans/downloads/

2.2 选择工作负载

安装时,在"工作负载"界面勾选以下选项:

✅ .NET 桌面开发(包含 WinForms、WPF 项目模板)

✅ ASP.NET 和 Web 开发(可选,用于后续 Web 部署场景)

⚠️ 如果跳过工作负载选择,后期也可以通过 Visual Studio Installer 补装。

2.3 安装 .NET 8 SDK(如未自动安装)

打开 PowerShell,检查 .NET 版本:

powershell

dotnet --version # 输出示例:8.0.303

如果版本低于 6.0,前往以下地址下载最新 .NET 8 SDK:

https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0

三、创建第一个 OpenCvSharp 项目

3.1 新建控制台项目

打开 Visual Studio 2022:

1.点击 "创建新项目"

2.搜索 "控制台应用",选择 C# 版本

3.项目名称填写:OpenCvDemo

4.框架选择:.NET 8.0

5.点击 "创建"

3.2 通过 NuGet 安装 OpenCvSharp

在解决方案资源管理器中,右键点击项目名 → "管理 NuGet 程序包"

搜索并安装以下两个包(版本保持一致,如 4.9.0.20240103):

包一:核心 API 包

OpenCvSharp4

包二:Windows 运行时包(包含 opencv_world.dll)

OpenCvSharp4.runtime.win
⚠️ 必须同时安装这两个包!
OpenCvSharp4 只含 C# 接口定义
OpenCvSharp4.runtime.win 才含真正的 OpenCV 原生库(.dll 文件)
- 缺少后者运行时会抛出 DllNotFoundException

或者使用 .NET CLI 安装:

bash

cd OpenCvDemo dotnet add package OpenCvSharp4 --version 4.9.0.20240103 dotnet add package OpenCvSharp4.runtime.win --version 4.9.0.20240103

四、验证安装:Hello OpenCV 实例

4.1 下载测试图片

在项目根目录创建 images 文件夹,放入一张测试图片(如 test.jpg)。

或者用代码创建一张测试图像(无需准备图片文件):

4.2 编写第一个程序

将 Program.cs 替换为以下代码:

csharp

using OpenCvSharp;  // ===== 示例1:创建彩色图像并显示 ===== Console.WriteLine("=== .NET + OpenCV 环境验证 ==="); Console.WriteLine($"OpenCV 版本:{Cv2.GetVersionString()}");  // 创建一个 400x300 的 BGR 彩色图像(黑色背景) using var img = new Mat(300, 400, MatType.CV_8UC3, Scalar.Black);  // 在图像上绘制彩色文字 Cv2.PutText(     img,     "Hello OpenCV!",     new Point(80, 160),     HersheyFonts.HersheyDuplex,     1.5,     Scalar.LimeGreen,     2 );  // 绘制一个红色矩形 Cv2.Rectangle(img, new Rect(30, 30, 340, 240), Scalar.Red, 3);  // 显示图像窗口 Cv2.ImShow("Hello OpenCV - Press any key to exit", img); Cv2.WaitKey(0); // 等待按键 Cv2.DestroyAllWindows();  Console.WriteLine("程序运行成功!OpenCV 安装正常。");

4.3 运行结果

按 F5 运行,如果看到以下内容,说明环境配置成功:

控制台打印 OpenCV 版本号(如 4.9.0

弹出窗口显示绿色文字 "Hello OpenCV!" 和红色边框


五、常见报错与解决方案

错误1:`DllNotFoundException: opencv_world490.dll`

原因:没有安装 OpenCvSharp4.runtime.win 包,或版本不匹配。

解决

bash

# 确认两个包版本一致 dotnet list package | grep OpenCvSharp # 应显示:OpenCvSharp4 4.9.x 和 OpenCvSharp4.runtime.win 4.9.x

错误2:`BadImageFormatException`

原因:项目目标平台设置为 x86,但 OpenCV 是 64 位库。

解决

1.右键项目 → 属性 → 生成

2.将 "平台目标" 改为 x64 或 Any CPU(取消勾选"首选 32 位")

错误3:NuGet 包下载超时

原因:网络访问 nuget.org 较慢。

解决:配置国内镜像源(以腾讯云镜像为例):

在项目根目录创建 NuGet.Config 文件:

xml

<?xml version="1.0" encoding="utf-8"?> <configuration>   <packageSources>     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />     <add key="tencent" value="https://mirrors.tencent.com/nuget/" />   </packageSources> </configuration>

六、进阶配置:项目结构最佳实践

对于正式项目,建议采用以下目录结构:

OpenCvProject/ ├── OpenCvProject.csproj ├── Program.cs              # 入口程序 ├── images/                 # 测试图片目录 │   └── test.jpg ├── output/                 # 处理结果输出目录 ├── Processors/             # 图像处理器类 │   ├── ImageFilter.cs │   └── ShapeDetector.cs └── Utils/                  # 工具类     └── ImageHelper.cs

csproj 配置示例

在 .csproj 文件中添加图片自动复制配置:

xml

<Project Sdk="Microsoft.NET.Sdk">   <PropertyGroup>     <OutputType>Exe</OutputType>     <TargetFramework>net8.0</TargetFramework>     <Nullable>enable</Nullable>     <ImplicitUsings>enable</ImplicitUsings>     <PlatformTarget>x64</PlatformTarget>  <!-- 确保64位 -->   </PropertyGroup>    <ItemGroup>     <PackageReference Include="OpenCvSharp4" Version="4.9.0.20240103" />     <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.9.0.20240103" />   </ItemGroup>    <!-- 自动复制 images 目录到输出目录 -->   <ItemGroup>     <None Update="images\**">       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>     </None>   </ItemGroup> </Project>

七、完整实例:读取并保存图像

下面是一个完整的实战示例,综合演示读取、处理、保存图像的基本流程:

csharp

using OpenCvSharp; using System.IO;  // 创建输出目录 Directory.CreateDirectory("output");  // ===== 示例:读取图像 → 转灰度 → 保存 =====  // Step 1: 创建一张彩色测试图(模拟真实图片读取) using var colorImg = new Mat(480, 640, MatType.CV_8UC3);  // 填充渐变色背景 for (int y = 0; y < colorImg.Rows; y++) {     for (int x = 0; x < colorImg.Cols; x++)     {         // B通道随列变化,G通道随行变化         colorImg.At<Vec3b>(y, x) = new Vec3b(             (byte)(x * 255 / colorImg.Cols),   // Blue             (byte)(y * 255 / colorImg.Rows),   // Green             128                                 // Red 固定         );     } }  // 添加标注文字 Cv2.PutText(colorImg, "Original Color Image",     new Point(100, 240), HersheyFonts.HersheySimplex,     1.2, Scalar.White, 2);  // Step 2: 保存彩色图像 string colorPath = "output/color_sample.jpg"; Cv2.ImWrite(colorPath, colorImg); Console.WriteLine($"彩色图像已保存:{colorPath}");  // Step 3: 转换为灰度图 using var grayImg = new Mat(); Cv2.CvtColor(colorImg, grayImg, ColorConversionCodes.BGR2GRAY);  // Step 4: 保存灰度图像 string grayPath = "output/gray_sample.jpg"; Cv2.ImWrite(grayPath, grayImg); Console.WriteLine($"灰度图像已保存:{grayPath}");  // Step 5: 打印图像信息 Console.WriteLine($"\n图像信息对比:"); Console.WriteLine($"彩色图 - 尺寸: {colorImg.Cols}x{colorImg.Rows}, 通道数: {colorImg.Channels()}, 类型: {colorImg.Type()}"); Console.WriteLine($"灰度图 - 尺寸: {grayImg.Cols}x{grayImg.Rows}, 通道数: {grayImg.Channels()}, 类型: {grayImg.Type()}");  // Step 6: 同时显示两张图 Cv2.ImShow("Original Color", colorImg); Cv2.ImShow("Gray Scale", grayImg); Cv2.WaitKey(0); Cv2.DestroyAllWindows();

运行输出示例:

彩色图像已保存:output/color_sample.jpg 灰度图像已保存:output/gray_sample.jpg  图像信息对比: 彩色图 - 尺寸: 640x480, 通道数: 3, 类型: CV_8UC3 灰度图 - 尺寸: 640x480, 通道数: 1, 类型: CV_8UC1

八、小结

本篇完成了 .NET + OpenCV 开发环境的全套搭建,核心要点:

1.必须安装两个 NuGet 包OpenCvSharp4 + OpenCvSharp4.runtime.win,版本号保持一致

2.目标平台设为 x64,避免 BadImageFormatException

3.用 using 关键字管理 Mat 对象,防止内存泄漏(后面的篇章会详细讲)

4.Cv2.WaitKey(0) 是必须的,否则窗口会一闪而过


预告

下一篇《图像基础——读取、显示、保存图像》将深入讲解:

Cv2.ImRead() 的各种读取模式(彩色/灰度/原始)

Mat 对象的内存结构与生命周期管理

批量处理图像文件的实战案例


本系列教程持续更新,欢迎关注,一起用 .NET 玩转计算机视觉!