当前位置: 首页 > news >正文

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下载

相关文章:

  • Python爬虫——入门爬取网页数据
  • Wix使用velo添加Google ads tag并在form表单提交时向谷歌发送事件
  • AI由许多不同的技术组成,其中一些最核心的技术如下
  • 【手动创建UIWindow Objective-C语言】
  • 使用 pubsub-js 进行消息发布订阅
  • Django——orm模块创建表关系
  • 键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵解决方案(亲测可以解决)
  • 【狂神说Java】Dubbo + Zookeeper
  • Kotlin基本语法
  • 深度学习pytorch之hub模块
  • Flutter笔记:光影动画按钮、滚动图标卡片组等
  • QT基础与细节理解
  • 开机自启动笔记本的小键盘
  • 【Spring之底层核心架构概念解析】
  • Docker快速安装kafka
  •  D - 粉碎叛乱F - 其他起义
  • input的行数自动增减
  • java小心机(3)| 浅析finalize()
  • JS函数式编程 数组部分风格 ES6版
  • Less 日常用法
  • Nacos系列:Nacos的Java SDK使用
  • python 装饰器(一)
  • Python3爬取英雄联盟英雄皮肤大图
  • ReactNativeweexDeviceOne对比
  • scrapy学习之路4(itemloder的使用)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • tab.js分享及浏览器兼容性问题汇总
  • 高程读书笔记 第六章 面向对象程序设计
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端自动化解决方案
  • 删除表内多余的重复数据
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 异常机制详解
  • 在weex里面使用chart图表
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (C++17) optional的使用
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (五)IO流之ByteArrayInput/OutputStream
  • .gitattributes 文件
  • .net framework profiles /.net framework 配置
  • .NET MVC第三章、三种传值方式
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET构架之我见
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)