【OpenCV 学习之路】(8)数独提取之一
写在前面:
关于本次的数独识别项目,我先说明下情况:
这是本人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)数独提取之一相关推荐
- OpenCV学习之路(附加资料分享)
目录 一.前言 二.学习历程 三.学习资料 书籍 网站 视频教程 四.学习建议 入门 强化 灵通 一.前言 有人问我,学习opencv从哪里学起?有人问我,我学习opencv用到了哪些资料?所以在今天 ...
- Opencv 学习之路(一)
前面很长一段时间一直在用opencv库但是一直没有去系统的学习,都是遇到问题直接百度,连库内大多数函数都不认识.最近闲下来了打算系统将opencv学习下 1.打开图片 2.读取视频 3.打开摄像头拍照 ...
- OpenCV学习之路之OpenCV安装(VS2013版)
开始学习OpenCV,首先就是成功的将OpenCV装载到电脑上. 版本选择的是目前官网上可以下载的2.4.13,我的vs版本是2013. 花了差不多四个小时的时间才算是安装加调试全部完成. http: ...
- Opencv学习笔记(二) 提取图像中的水平线和垂直线
提取图像中的水平线和垂直线属于基础的形态学操作的应用,原理:根据要提取图形来定义一个特定的结构元素,然后以这个结构相素去遍历图像,进行一系列形态学操作,以此过滤掉其他特征的图形,达到提取的效果. 示例 ...
- OpenCV学习第十三篇:提取水平和垂直线(去除干扰线)
1.结构元素 可以是任意形状的结构元素:矩形,圆,直线,磁盘形状,砖石形状等 2.提取步骤 输入图像彩色图像imread 转换为灰度图像cvtColor 转换为二值图像adaptiveThreshol ...
- OpenCV学习之路
痛定思痛,还是决定要学习opencv,光学C++和MATLAB还是不够的,网上很多现成的图像方面的资源都是用opencv写的,不会opencv的话还得用MATLAB自己重新编,所以还是用opencv吧 ...
- Opencv 学习之路(一)cmake +vs2015+Opencv3.4
目录 大佬的环境配置方案 遇到问题总结: 一.重新生成Opencv.sln项目报错 1. 重新安装Python 2. 给VS OPENCV.sln 添加Python36_d.lib的路径 2.1 ...
- OpenCV学习之路(七)——角点检测
角点检测(Corner Detection)是计算机视觉中用来获得图像特征的一种方法,广泛应用于运动检测.视频追踪.目标识别等领域中,也称特征点检测. 一.兴趣点与角点 对于角点,到目前为止还没有明确 ...
- opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形
一.简介 二.外接矩形的查找绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 void main() 4 { 5 ...
最新文章
- 字符编码简介 ANSI Unicode Unicode big endian UTF-8
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- _VARIANT_T 到 CSTRING 转换
- Laravel 清空配置缓存
- Spring Boot集成Swagger
- linux内核驱动之 驱动程序的角色
- Python `__enter__` `__exit__`(with)
- java自画快递单,使用画图功能绘制快递单,并调用打印机打印
- Python 实现单词翻译
- 瞬变抑制二极管TVS原理简介
- Nginx源码分析之ngx_hash_t
- 群晖挂载玩客云网络磁盘
- GIS的基本概念二:大地水准面、旋转椭球体(椭球体)、大地基准面
- selenium下Edge()配置错误问题
- toString方法和String方法
- eclipse/UAP debug模式
- 什么是CSMA/CD
- 年薪百万单身程序员的枯燥生活
- 多元一次不定方程解的个数
- JavaScript------JS相关难题,做对一半算你牛牪犇