写在前面:
关于本次的数独识别项目,我先说明下情况:
这是本人18年6月份做的,现在把当时的笔记整理出来(口吻的描述是以当时的时间来描述)。
这个数独的项目分别做了两次,
第一次做的还没做完,第二次可以识别数字(虽然不完美)
第一次就是以下准备写的,第二次迟点也会给出来。
区别:第一第二次有什么区别呢?
区别就是第一次用的图片是现实中的图片,第二次用的是数字图片。

那么第一第二次做到哪个地步呢?

现在想来第二次识别的不够精确有可能是训练样本不够多的问题!

那么为什么我还要把没做完的,做的有瑕疵的东西发出来呢?不能完善好才发出来吗?
主要是最近事情多,等往后自己的经验积累多了,技术提高了,再搞个终极版。
然后也迫不及待想和大家分享下我的思路,提供下大家可能遇到了我遇到的问题的解决方法。
当然如果有刚入门的小白(虽然我也是,哈哈),看到两次做到的程度对比之后想学第二次的,我认为是不可取的,因为这个过程是循序渐进的,第一次做的时候我就学到了很多东西,加深了对OpenCV的印象,同时遇到问题并且自己解决了,还写下来自己的理解,对自己的学习是非常大的帮助的。


这是在 @冰不语 的博客看到的一个小项目
OpenCV 实践之路 ——opencv 玩数独之二九宫格小方格的提取和数字的提取
觉得学这个会了可以学到很多东西,于是就马上尝试.

今天先实现作者提供的思路的第一步

  • 一、 高斯滤波去掉部分噪音 GaussianBlur();
    • 1. 先看效果图:
  • 二、 拉普拉斯锐化增强轮廓以便于检测提取
    • 1. 先看效果图(1):这是对原图直接进行拉普拉斯锐化的图像
    • 2. 再看效果图(2):先进行高斯滤波后拉普拉斯锐化
  • 三、自适应阈值化得到二值图像 adaptiveThreshold();

一、 高斯滤波去掉部分噪音 GaussianBlur();

1. 先看效果图:

Talk is cheap,show you the code.

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
//using namespace std;
using namespace cv;
int main()
{Mat src = imread("01.jpg");Mat out(src.size(),src.type(),Scalar::all(0));GaussianBlur(src, out, Size(5, 5), 0, 0);imshow("src", src);imshow("out", out);waitKey(0);
}

应用高斯滤波其实很简单。只要设好 高斯内核大小 就可以了。

二、 拉普拉斯锐化增强轮廓以便于检测提取

1. 先看效果图(1):这是对原图直接进行拉普拉斯锐化的图像

Talk is cheap,show you the code.

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
int main()
{Mat src = imread("01.jpg");Mat out(src.size(),src.type(),Scalar::all(0));imshow("src", src);
​//拉普拉斯锐化Mat kernel(3, 3, CV_32F, Scalar(-1));kernel.at<float>(1, 1) = 8.9;filter2D(src, src, src.depth(), kernel);imshow("拉普拉斯锐化", src);
​waitKey(0);
}

看到拉普拉斯锐化后面那段代码会觉得好像很难,其实仔细看可以看出,只是先定义一个Mat对象,并且先全部初始化为-1,再对矩阵的中心赋值,再调用filter2D调用函数进行卷积。
关于更多拉普拉斯锐化可以看 拉普拉斯锐化图像
关于更多图像卷积运算函数filter2D()可以看 opencv学习(七)之图像卷积运算函数filter2D()

2. 再看效果图(2):先进行高斯滤波后拉普拉斯锐化

Talk is cheap,show you the code.

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
int main()
{Mat src = imread("01.jpg");Mat out(src.size(),src.type(),Scalar::all(0));imshow("src", src);GaussianBlur(src, src, Size(5, 5), 0, 0);imshow("高斯滤波", src);//拉普拉斯锐化Mat kernel(3, 3, CV_32F, Scalar(-1));kernel.at<float>(1, 1) = 8.9;filter2D(src, src, src.depth(), kernel);imshow("高斯滤波后拉普拉斯锐化", src);waitKey(0);
}

三、自适应阈值化得到二值图像 adaptiveThreshold();

要注意的是 输入图像是单通道的
超清晰理解:【OpenCV3】阈值化操作——cv::threshold()与cv::adaptiveThreshold()详解

【OpenCV 学习之路】(8)数独提取之一相关推荐

  1. OpenCV学习之路(附加资料分享)

    目录 一.前言 二.学习历程 三.学习资料 书籍 网站 视频教程 四.学习建议 入门 强化 灵通 一.前言 有人问我,学习opencv从哪里学起?有人问我,我学习opencv用到了哪些资料?所以在今天 ...

  2. Opencv 学习之路(一)

    前面很长一段时间一直在用opencv库但是一直没有去系统的学习,都是遇到问题直接百度,连库内大多数函数都不认识.最近闲下来了打算系统将opencv学习下 1.打开图片 2.读取视频 3.打开摄像头拍照 ...

  3. OpenCV学习之路之OpenCV安装(VS2013版)

    开始学习OpenCV,首先就是成功的将OpenCV装载到电脑上. 版本选择的是目前官网上可以下载的2.4.13,我的vs版本是2013. 花了差不多四个小时的时间才算是安装加调试全部完成. http: ...

  4. Opencv学习笔记(二) 提取图像中的水平线和垂直线

    提取图像中的水平线和垂直线属于基础的形态学操作的应用,原理:根据要提取图形来定义一个特定的结构元素,然后以这个结构相素去遍历图像,进行一系列形态学操作,以此过滤掉其他特征的图形,达到提取的效果. 示例 ...

  5. OpenCV学习第十三篇:提取水平和垂直线(去除干扰线)

    1.结构元素 可以是任意形状的结构元素:矩形,圆,直线,磁盘形状,砖石形状等 2.提取步骤 输入图像彩色图像imread 转换为灰度图像cvtColor 转换为二值图像adaptiveThreshol ...

  6. OpenCV学习之路

    痛定思痛,还是决定要学习opencv,光学C++和MATLAB还是不够的,网上很多现成的图像方面的资源都是用opencv写的,不会opencv的话还得用MATLAB自己重新编,所以还是用opencv吧 ...

  7. Opencv 学习之路(一)cmake +vs2015+Opencv3.4

    目录 大佬的环境配置方案 遇到问题总结: 一.重新生成Opencv.sln项目报错 1. 重新安装Python 2. 给VS OPENCV.sln 添加Python36_d.lib的路径 2.1    ...

  8. OpenCV学习之路(七)——角点检测

    角点检测(Corner Detection)是计算机视觉中用来获得图像特征的一种方法,广泛应用于运动检测.视频追踪.目标识别等领域中,也称特征点检测. 一.兴趣点与角点 对于角点,到目前为止还没有明确 ...

  9. opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

    一.简介 二.外接矩形的查找绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 void main() 4 { 5 ...

最新文章

  1. 字符编码简介 ANSI Unicode Unicode big endian UTF-8
  2. 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
  3. _VARIANT_T 到 CSTRING 转换
  4. Laravel 清空配置缓存
  5. Spring Boot集成Swagger
  6. linux内核驱动之 驱动程序的角色
  7. Python `__enter__` `__exit__`(with)
  8. java自画快递单,使用画图功能绘制快递单,并调用打印机打印
  9. Python 实现单词翻译
  10. 瞬变抑制二极管TVS原理简介
  11. Nginx源码分析之ngx_hash_t
  12. 群晖挂载玩客云网络磁盘
  13. GIS的基本概念二:大地水准面、旋转椭球体(椭球体)、大地基准面
  14. selenium下Edge()配置错误问题
  15. toString方法和String方法
  16. eclipse/UAP debug模式
  17. 什么是CSMA/CD
  18. 年薪百万单身程序员的枯燥生活
  19. 多元一次不定方程解的个数
  20. JavaScript------JS相关难题,做对一半算你牛牪犇

热门文章

  1. 操作系统 银行家算法及相关例题
  2. 电机、 电源等多条电路的接线方法
  3. cad导出pdf_快速导图-----橄榄山一键导出CAD、PDF
  4. 一个实现批量抓取淘女郎写真图片的爬虫
  5. Python爬虫大作业(仿虎牙直播客户端)
  6. 写一个宏,可以将一个整数字的奇数位和偶数位交换
  7. 企业微信公众号如何调用视频列表(视频专辑)
  8. 面试中常被问到(二)对齐方式
  9. AJAX 学习笔记[四] AJAX 对服务器返回的XML 的处理
  10. Android 如何通过 Mac 录制视频