博客
关于我
【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中很常用的10个内置函数整理(初学必备)
    查看>>
    python中打印二维列表数据
    查看>>
    python中打散数组shuffle
    查看>>
    Python中执行外部命令
    查看>>
    Python中拼接numpy数组-ChatGPT4o作答
    查看>>
    Python中提示:no module named 'PIL'
    查看>>
    Python中提示:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position
    查看>>
    python中数据类型存储_浅谈Python中的数据类型
    查看>>
    python中文件最重要的功能是什么-学 Python 都用来干嘛的?
    查看>>
    python中文版语言_高盛最新调查:Python超过汉语成为未来最重要技能,你准备学哪种编程语言?...
    查看>>
    Python中文问题SyntaxError
    查看>>
    Python中方括号和括号括起来的列表有什么区别?
    查看>>
    python中时间处理_Python中处理时间的几种方法小结
    查看>>
    Python中枚举串口(包括虚拟端口)的跨平台方法是什么?
    查看>>
    python中根号下a怎么写_python中根号怎么表示
    查看>>
    Python中正则表达式的巧妙使用
    查看>>
    Python中浮点数的二进制表示(位不是十六进制)
    查看>>
    Python中特殊函数和表达式 filter,map,reduce,lambda
    查看>>
    python中用socket检测端口_Python 用socket模块实现检测端口和检测web服务
    查看>>
    python中用于列表操作的plus和append有什么区别?
    查看>>