You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenCV的C#椭圆检测与内部文本OCR识别技术求助

嘿,我刚好做过类似的需求,结合你给出的C#代码片段,我来帮你梳理完整的实现思路和代码细节吧!

实现图像椭圆检测与椭圆内文本OCR识别(C# + OpenCV)

一、整体思路拆解

你需要的功能可以拆成两个核心环节:椭圆检测定位和椭圆区域文本OCR识别,咱们一步步把这些环节落地成可运行的代码。

二、椭圆检测的具体实现(基于OpenCVSharp)

首先确保你已经在项目里安装了OpenCVSharp4和OpenCVSharp4.runtime.win这两个NuGet包,接下来补全你的startDetection方法:

using OpenCvSharp;
using System.Drawing;

private void startDetection(Image inputImage, CamEnum _camName) 
{ 
    try 
    { 
        if (inputImage == null) { return; } 
        // 将System.Drawing.Image转换为OpenCV的Mat格式
        using (Mat srcMat = BitmapConverter.ToMat((Bitmap)inputImage.Clone()))
        {
            // 1. 预处理:转灰度图+高斯模糊降噪
            Mat grayMat = new Mat();
            Cv2.CvtColor(srcMat, grayMat, ColorConversionCodes.BGR2GRAY);
            Cv2.GaussianBlur(grayMat, grayMat, new Size(5, 5), 0);

            // 2. Canny边缘检测,提取轮廓基础
            Mat edgesMat = new Mat();
            Cv2.Canny(grayMat, edgesMat, 50, 150);

            // 3. 查找图像中的所有轮廓
            Point[][] contours;
            HierarchyIndex[] hierarchy;
            Cv2.FindContours(edgesMat, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);

            foreach (var contour in contours)
            {
                // 轮廓点数足够才尝试拟合椭圆(椭圆拟合至少需要5个点)
                if (contour.Length >= 5)
                {
                    try
                    {
                        // 拟合椭圆,得到椭圆的位置、大小和旋转角度
                        RotatedRect ellipse = Cv2.FitEllipse(contour);
                        
                        // 可选:在原图上绘制椭圆,方便可视化检测结果
                        Cv2.Ellipse(srcMat, ellipse, Scalar.Red, 2);

                        // 调用OCR方法识别椭圆内部的文本
                        string recognizedText = RecognizeEllipseInnerText(srcMat, ellipse);
                        // 输出识别结果,你也可以把它显示到界面控件上
                        Console.WriteLine($"当前椭圆内识别文本:{recognizedText}");
                    }
                    catch
                    {
                        // 部分轮廓无法拟合出有效椭圆,直接跳过即可
                        continue;
                    }
                }
            }

            // 把处理后的图像显示到pictureBox(如果需要)
            pictureBox1.Image = BitmapConverter.ToBitmap(srcMat);
        }
    } 
    catch (Exception ex) 
    { 
        Console.WriteLine($"检测过程出错:{ex.Message}"); 
    } 
}

三、椭圆区域文本OCR识别(基于Tesseract)

接下来用Tesseract实现椭圆内的文本识别,先安装Tesseract NuGet包,还要下载对应的语言包(比如英文eng或中文chi_sim),放到项目根目录的tessdata文件夹里。

using Tesseract;

private string RecognizeEllipseInnerText(Mat srcMat, RotatedRect ellipse)
{
    // 1. 创建椭圆掩码:只保留椭圆内部的区域,屏蔽外部干扰
    Mat mask = Mat.Zeros(srcMat.Size(), MatType.CV_8UC1);
    Cv2.Ellipse(mask, ellipse, Scalar.White, -1); // -1表示填充整个椭圆区域

    // 2. 提取椭圆范围内的图像
    Mat ellipseRegion = new Mat();
    srcMat.CopyTo(ellipseRegion, mask);

    // 3. OCR预处理:转灰度+二值化,提升识别准确率
    Mat grayRegion = new Mat();
    Cv2.CvtColor(ellipseRegion, grayRegion, ColorConversionCodes.BGR2GRAY);
    Mat binaryRegion = new Mat();
    // 自动阈值二值化,适配不同亮度的图像
    Cv2.Threshold(grayRegion, binaryRegion, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);

    // 4. 调用Tesseract识别文本
    string resultText = string.Empty;
    using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default))
    {
        // 将OpenCV的Mat转换为Bitmap格式供Tesseract处理
        using (var targetImg = BitmapConverter.ToBitmap(binaryRegion))
        using (var page = engine.Process(targetImg))
        {
            resultText = page.GetText().Trim();
        }
    }

    return resultText;
}

四、几个关键注意事项

  • 图像预处理优先级最高:如果原始图像噪声多,可以加一步中值模糊;如果椭圆边缘不清晰,调整Canny的高低阈值,确保轮廓能被准确捕捉。
  • Tesseract语言包要对应:一定要把下载好的语言包放到./tessdata目录,初始化引擎时指定的语言代码要和包名一致(比如中文用chi_sim)。
  • 椭圆拟合容错:不是所有轮廓都能拟合出有效椭圆,所以必须加try-catch跳过异常情况,避免程序崩溃。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:39:20