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

C#中tessnet2与Tesseract-OCR无法识别圆形文本的问题咨询

Fixing Circular Text Recognition with tessnet2/Tesseract-OCR in C#

Hey Thomas, great question—Tesseract (and tessnet2) is built to handle standard horizontal, left-to-right text, so circular/radial text throws it off because each character sits at a unique angle. Let’s break down practical fixes to get accurate recognition:

1. Preprocess the Image: Unwrap Circular Text to Horizontal

The most reliable fix is converting the circular text from polar coordinates to Cartesian, which "unrolls" the ring into a straight horizontal line. Tesseract can then process this like normal text.

Here’s how to do this with OpenCVSharp (a C# wrapper for OpenCV) to simplify the polar warp:

using OpenCvSharp;

// Load your target image
Mat src = Cv2.ImRead("circular_text.jpg", ImreadModes.Color);
// Define the circle's center (adjust if your text isn't centered)
Point center = new Point(src.Cols / 2, src.Rows / 2);
// Estimate radius (tweak the offset based on your image's padding)
int radius = Math.Min(src.Cols, src.Rows) / 2 - 10;

// Warp the circular area into a flat rectangle
Mat unwrapped = new Mat();
Cv2.WarpPolar(src, unwrapped, new Size(radius * 2, 100), center, radius, WarpPolarMode.Linear);

// Rotate to make text horizontal
Cv2.Rotate(unwrapped, unwrapped, RotateFlags.Rotate90Counterclockwise);

// Save or pass directly to tessnet2
unwrapped.SaveImage("unwrapped_text.jpg");

Feed this unwrapped image into your existing tessnet2 code—Tesseract will recognize the text as a standard horizontal line.

2. Restrict the Character Whitelist

Since you’re seeing @ get confused with ~, narrow down Tesseract’s recognition to only the characters you expect. This eliminates false matches:

using tessnet2;

var ocr = new Tesseract();
ocr.Init(@"path_to_your_tessdata_folder", "eng", false);
// Add only the characters your circular text uses (adjust as needed)
ocr.SetVariable("tessedit_char_whitelist", "@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");

3. Adjust Page Segmentation Mode (PSM)

After unwrapping, your text will be a single horizontal line. Set Tesseract’s PSM to focus on this use case:

// Set PSM to 7 (treats the image as a single text line)
ocr.SetVariable("tessedit_pageseg_mode", "7");

4. Dynamically Calculate Circle Size

If recognition varies with circle size, use edge detection to find the exact circle boundaries instead of hardcoding values:

// Convert to grayscale for edge detection
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
// Detect circles with Hough Transform
CircleSegment[] circles = Cv2.HoughCircles(gray, HoughMethods.Gradient, 1, 20, param1: 50, param2: 30, minRadius: 50, maxRadius: 200);
if (circles.Length > 0)
{
    CircleSegment circle = circles[0];
    center = new Point((int)circle.Center.X, (int)circle.Center.Y);
    radius = (int)circle.Radius;
}

This ensures you’re always unwrapping the exact circular text area, no matter its size.

Combine these steps—preprocessing to unwrap the circle, narrowing the character set, and tuning Tesseract’s parameters—and you’ll get consistent recognition for circular text.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:26:01