1. 项目概述
在图像处理和计算机视觉领域,经常需要在图片上标记特定位置或区域。十字标是一种简单直观的标记方式,广泛应用于目标定位、图像对齐、测量标定等场景。本文将详细介绍如何使用C#和OpenCvSharp库在图片上绘制精确的十字标记,并实现十字中心点的自动检测功能。
OpenCvSharp是.NET平台下对OpenCV的封装,提供了丰富的图像处理功能。相比其他图像处理库,它具有以下优势:
- 原生支持C#语言,与.NET生态无缝集成
- 性能接近原生OpenCV,处理速度快
- 提供完善的图像处理算法和工具
- 跨平台支持Windows/Linux/macOS
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 安装OpenCvSharp
首先需要通过NuGet安装必要的包:
bash复制Install-Package OpenCvSharp4
Install-Package OpenCvSharp4.runtime.win
注意:如果使用非Windows平台,需要安装对应平台的runtime包,如OpenCvSharp4.runtime.ubuntu.20.04-x64等。
2.2 基础图像操作
在开始绘制十字标前,我们需要掌握基本的图像创建和操作:
csharp复制// 创建空白画布
Mat canvas = new Mat(480, 640, MatType.CV_8UC3, new Scalar(255, 255, 255));
// 加载现有图片
Mat image = Cv2.ImRead("input.jpg", ImreadModes.Color);
// 保存图片
Cv2.ImWrite("output.png", canvas);
3. 十字标绘制实现
3.1 十字标配置类设计
我们首先定义一个配置类CrossConfig来封装十字标的绘制参数:
csharp复制public class CrossConfig
{
/// <summary>
/// 十字架颜色(B,G,R格式)
/// </summary>
public Scalar CrossColorBgr { get; set; }
/// <summary>
/// 线条宽度(像素)
/// </summary>
public int CrossThickness { get; set; }
/// <summary>
/// 十字线总长度(像素)
/// </summary>
public int CrossTotalPixelLength { get; set; }
public CrossConfig(Scalar crossColorBgr, int crossThickness, int crossTotalPixelLength)
{
if (crossThickness <= 0)
throw new ArgumentOutOfRangeException(nameof(crossThickness), "线条宽度必须大于0");
if (crossTotalPixelLength <= 0)
throw new ArgumentOutOfRangeException(nameof(crossTotalPixelLength), "十字长度必须大于0");
CrossColorBgr = crossColorBgr;
CrossThickness = crossThickness;
CrossTotalPixelLength = crossTotalPixelLength;
}
}
提示:使用配置类封装参数可以避免方法参数过多,提高代码可读性和可维护性。
3.2 核心绘制方法实现
下面是绘制十字标的核心方法:
csharp复制public static Mat DrawCrossMat(Mat sourceMat, CrossConfig cross, int pointX, int pointY)
{
// 参数校验
if (sourceMat == null || sourceMat.Empty())
throw new ArgumentException("输入图像无效");
if (cross == null)
throw new ArgumentNullException(nameof(cross));
if (pointX < 0 || pointY < 0)
throw new ArgumentOutOfRangeException("坐标不能为负数");
// 创
