博客
关于我
【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各进制的表述与转换
    查看>>
    python各种库安装
    查看>>
    python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
    查看>>
    python可维护性_使用这7大神器,让你的Python 代码更容易于维护
    查看>>
    Python只运行一次while循环
    查看>>
    python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
    查看>>
    Python变量命名方法-ChatGPT4o作答
    查看>>
    Python变量与运算符
    查看>>
    Python变量/运算符/函数/模块/string
    查看>>
    python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法
    查看>>
    python系列【仅供参考】:python flask框架 debug功能
    查看>>
    python发送notes邮件_使用python在Lotus Notes中发送邮件
    查看>>
    Python双版本下创建一个Scrapy(西瓜皮)项目
    查看>>
    Python双版本下No module named 'requests'
    查看>>
    python及pycharm2018软件安装教程
    查看>>
    python去重txt文本_Python实现的txt文件去重功能示例
    查看>>
    python去掉列表的逗号,从Python列表项中删除标点符号
    查看>>
    Python卸载所有包
    查看>>
    python单线程下实现多个socket并发
    查看>>
    Python单元测试框架介绍(超详细~)
    查看>>