C# OpenCvSharp 基于直线检测的文本图像倾斜校正

效果

代码

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenCvSharp;
 
namespace OpenCvSharp_基于直线检测的文本图像倾斜校正
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string path = "1.jpg";
 
            pictureBox1.Image = new Bitmap(path);
            Mat mat = new Mat(path);
 
            Mat gray = new Mat(path, ImreadModes.Grayscale);
 
            Mat binary = new Mat();
            Cv2.Threshold(gray, binary, 50, 255, ThresholdTypes.BinaryInv);
 
            Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(7, 1));
 
            Mat dilation = new Mat();
            Cv2.Dilate(binary, dilation, element);
 
            Mat cannyDst = new Mat();
            Cv2.Canny(dilation, cannyDst, 150, 200);
 
            Mat houghDst = new Mat();
            mat.CopyTo(houghDst);
 
            LineSegmentPolar[] lineing = Cv2.HoughLines(cannyDst, 1, Cv2.PI / 180, 110, 0, 0);
            Scalar color = new Scalar(0, 255, 255);
 
            double meanAngle = 0.0;
            int numCnt = 0;
 
            for (int i = 0; i < lineing.Length; i++)
            {
                double rho = lineing[i].Rho;//线长
                double theta = lineing[i].Theta;//角度
 
                OpenCvSharp.Point pt1 = new OpenCvSharp.Point();
                OpenCvSharp.Point pt2 = new OpenCvSharp.Point();
                double a = Math.Cos(theta);
                double b = Math.Sin(theta);
                double x0 = a * rho, y0 = b * rho;
 
                pt1.X = (int)Math.Round(x0 + 600 * (-b));
                pt1.Y = (int)Math.Round(y0 + 600 * a);
                pt2.X = (int)Math.Round(x0 - 600 * (-b));
                pt2.Y = (int)Math.Round(y0 - 600 * a);
 
                Cv2.Line(houghDst, pt1, pt2, color, 1, LineTypes.Link4);
 
                theta = theta * 180 / Cv2.PI - 90;
 
                meanAngle += theta;
                numCnt++;
            }
            //Cv2.ImShow("houghDst", houghDst);
 
            meanAngle /= numCnt;
            Point2f center = new Point2f(mat.Cols / 2.0f, mat.Rows / 2.0f);
 
            Mat warpDst = new Mat();
            Mat rot_mat = Cv2.GetRotationMatrix2D(center, meanAngle, 1.0);
            OpenCvSharp.Size dst_sz = new OpenCvSharp.Size(mat.Cols, mat.Rows);
 
            Cv2.WarpAffine(mat, warpDst, rot_mat, dst_sz);
 
            pictureBox2.Image = new Bitmap(warpDst.ToMemoryStream());
        }
    }
}

下载

Demo下载

相关推荐
沃达德软件6 分钟前
图像处理与复原技术
图像处理·人工智能·深度学习·神经网络·目标检测·计算机视觉·目标跟踪
坐在地上想成仙7 分钟前
人工智能商业落地思考:从人类行为图谱到技术栈映射
人工智能
zhangfeng11337 分钟前
ModelScope(魔搭社区)介绍与模型微调全指南 中国版Hugging Face GPU租借平台 一站式开源模型社区与服务平台
人工智能·开源
PaperRed ai写作降重助手7 分钟前
如何选择适合自己的AI智能降重写作软件
人工智能·深度学习·aigc·ai写作·论文降重·论文查重·智能降重
友思特 智能感知9 分钟前
友思特案例 | 金属行业视觉检测案例三:彩涂钢板表面纹理检测
人工智能·视觉检测
李永奉17 分钟前
杰理芯片SDK开发-ENC双麦降噪配置/调试教程
人工智能·单片机·嵌入式硬件·物联网·语音识别
Dfreedom.27 分钟前
图像滤波:非线性滤波与边缘保留技术
图像处理·人工智能·opencv·计算机视觉·非线性滤波·图像滤波
小白跃升坊38 分钟前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
kicikng41 分钟前
走在智能体前沿:智能体来了(西南总部)的AI Agent指挥官与AI调度官实践
人工智能·系统架构·智能体协作·ai agent指挥官·ai调度官·应用层ai
测试者家园44 分钟前
测试用例智能生成:是效率革命,还是“垃圾进,垃圾出”的新挑战?
人工智能·职场和发展·测试用例·测试策略·质量效能·智能化测试·用例设计