博客
关于我
【OpenCV】基于Qt的“破产版”全能扫描王
阅读量:747 次
发布时间:2019-03-22

本文共 2015 字,大约阅读时间需要 6 分钟。

功能介绍

本项目主要包含证件扫描和文字纠正两个核心功能,软件界面简洁直观,用户可以通过菜单栏选择需要处理的图片文件。以下是主要功能的列表:

  • 图片打开和保存
  • 图片矫正(包括证件扫描和文字纠正)
  • 图片锐化增强
  • 图片清空
  • 阈值设置
  • 项目实现

    证件扫描基本思路

  • 抠图:提取图片轮廓
  • 矫正:透视变换
  • 锐化增强:二值化
  • 算法设计(证件扫描)

  • 提取边缘
    • 读取图像,转化为灰度图
    • 降噪,二值化(使用高斯滤波)
    • 适当膨胀,提高检测效率
    • 边缘检测(Canny算法)
  • 轮廓查找与筛选
    • 使用边缘检测结果找到轮廓
    • 应用霍夫直线检测,筛选出符合条件的直线
    • 排除距离过近或不相交的直线
  • 透视变换
    • 确定输出图像的长宽(可自适应)
    • 计算透视变换矩阵
    • 应用透视变换矩阵对图像进行变换
  • 锐化增强
    • 通过自适应二值化技术提升图像清晰度
  • UI设计

    文字纠正

    核心代码

    证件扫描

    Mat scanning() {    Mat src = imread(path);     Mat source = src.clone();    Mat bkup = src.clone();    Mat img = src.clone();    threshold(img, img, GRAY_THRESH, 255, CV_THRESH_BINARY);    GaussianBlur(img, img, Size(5, 5), 0, 0);    Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));    dilate(img, img, element);    Canny(img, img, 30, 120, 3);    vector
    contours; vector RaisePropertyChanged++}

    文字纠正

    Mat rotate(Mat srcImage) {    // 转换为灰度图      Mat grayImage;      cvtColor(srcImage, grayImage, CV_RGB2GRAY);      // 获取图片原尺寸      const int nRows = grayImage.row;      const int nCols = grayImage.col;      // 图像DFT变换      int mRows = getOptimalDFTSize(nRows);      int mCols = getOptimalDFTSize(nCols);      Mat newImage;      copyMakeBorder(grayImage, newImage, 0, mRows - nRows, 0, mCols - nCols, BORDER_CONSTANT, Scalar::all(0));      Mat groupImage[] = {Mat_c-gray, Mat_c-gray};      merge(groupImage, mergeImage);      dft(mergeImage, mergeImage);      split(mergeImage, groupImage);      magnitude(groupImage[0], groupImage[1], groupImage[0]);      magImage = Scalar::all(1);      log(magImage, magImage);      // 获得图像中心点      int cx = magImage.cols / 2;      int cy = magImage.rows / 2;      // 交换象限      Mat LT, RT, LB, RB;      // 绘制纠正后的图像      warpAffine(srcImage, resultImage, rotateMat, srcImage.size(), 1, 0, Scalar(255, 255, 255));      return resultImage;}

    项目截图

  • 证件扫描
  • 文字纠正
  • 效果对比
  • 效果对比(娱乐向)
  • 项目总结

  • 本项目实现了基本的证件扫描和文字纠正功能,类似“全能扫描王”我单独开发了一个版本,此页面中的扫描UI与原项目有所不同。
  • 项目的核心算法基于透视变换和傅里叶变换,现有的实现存在一定的局限性,关键参数(如直线阈值、轮廓标准等)对最终结果有一定影响,后续需要进一步优化。
  • 刚开始开发时对OCR概念理解不足,导致部分命名和设计存在疏漏,逐步学习后已明确其与本项目的区别。
  • 希望本文能为刚入门的图像处理爱好者提供参考,共同进步!
  • 转载地址:http://ziiwk.baihongyu.com/

    你可能感兴趣的文章
    Python pandas 数据清洗与数据绘图实战
    查看>>
    Python Pandas 用顶行替换标题
    查看>>
    Python pandas 通过 dt 访问器有效地将日期时间转换为时间戳
    查看>>
    Python Pandas-从DataFrame按类别绘制多个条形图
    查看>>
    Python Pandas:每月或每周拆分 TimeSerie
    查看>>
    python pandas中融化的对面
    查看>>
    python pandas从时间序列中提取唯一日期
    查看>>
    Python PyQt5 将不再显示此消息复选框添加到 QMessageBox
    查看>>
    Python PyQt5:如何使用 PyQt5 显示错误消息
    查看>>
    Python PYSFTP-以字符串/文本形式传递私钥,而不是传递文件路径
    查看>>
    Python pytest 面试题!
    查看>>
    Python pytz 时区函数返回一个相差 9 分钟的时区
    查看>>
    python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django
    查看>>
    Python random和json模块
    查看>>
    Python random模块seed理解
    查看>>
    python range()函数
    查看>>
    Python rdflib可传递查询
    查看>>
    python redis 集群_python 搭建redis集群
    查看>>
    python redis连接,在Python中使用Redis连接池的正确方法
    查看>>
    python regex_Python RegEx
    查看>>