opencv学习之路(16)、膨胀腐蚀应用之走迷宫
一、分析
贴出应用图片以供直观了解


红色部分,因图而异(某些参数,根据图片的不同需要进行相应的修改)
二、代码
#include "opencv2/opencv.hpp"
#include<iostream>
using namespace cv;
using namespace std; void main(){
Mat img=imread("E://9.jpg");
int thres_min=; //二值化最小阈值
if(!img.empty()){
//二值化
threshold(img, img, thres_min, , THRESH_BINARY);
imshow("img_thres",img);
//img备份
Mat copy=img.clone();//拷贝原图,且不会随着原图改变
cvtColor(copy,copy,CV_BGR2GRAY);//彩色图转灰度图
threshold(copy, copy, thres_min, , THRESH_BINARY_INV);//反转:白色变黑色,黑色变白色
imshow("copy", copy);
//查找copy的轮廓
vector<vector<Point>>contours;
findContours(copy, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
//将轮廓画在全黑图像上
Mat draw;
draw = Mat::zeros(img.size(), CV_32FC1);//定义一个img大小的全黑图像
drawContours(draw, contours, , Scalar(), -);
imshow("img2", draw);
//进行膨胀腐蚀操作
Mat dilated, eroded;
Mat kernel=getStructuringElement(MORPH_RECT,Size(,));//定义结构元素
dilate(draw, dilated, kernel, Point(-,-), );//膨胀两次
imshow("dilate", dilated);
erode(dilated, eroded, kernel, Point(-,-), );
imshow("erode", eroded);
//膨胀腐蚀相减
Mat diff;
absdiff(dilated, eroded, diff);
diff.convertTo(diff, CV_8UC1);//转换为单通道图(即灰度图)
imshow("diff", diff);
//在差异图diff中查找轮廓,然后在原图中绘制轮廓
vector<vector<Point>>contours2;
findContours(diff, contours2, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
drawContours(img, contours2, , Scalar(,,),-);//-1表示绘制轮廓内部,正数表示轮廓线条粗细
imshow("result", img);
}
waitKey();
destroyAllWindows();
}
轮廓的相关知识,后面会学到。
三、效果图
二值图如下

原图备份后反二值化阈值图copy,如下

copy的轮廓画在全黑图像上,如下

膨胀腐蚀如下

膨胀腐蚀相减(diff)如下

diff轮廓绘制在原图上,如下

其他效果图
绘制轮廓时,若继续选择-1(即绘制轮廓内部),会出现异常情况

将-1更改为轮廓线条粗细程度,则可以正确走出迷宫


opencv学习之路(16)、膨胀腐蚀应用之走迷宫的更多相关文章
- opencv学习之路(14)、形态学之膨胀腐蚀
一.膨胀腐蚀概述(对高亮部分进行操作) 二.膨胀 三.腐蚀 四.代码 1.查看结构元素 #include<opencv2/opencv.hpp> #include<iostream& ...
- C++ Opencv 自写函数实现膨胀腐蚀处理
一.膨胀腐蚀学习笔记 二.代码及结果分享 #include <opencv2/opencv.hpp> #include <iostream> using namespace s ...
- opencv学习之路(15)、形态学其他操作(开、闭、顶帽、黑帽、形态学梯度)
一.形态学其他操作(用的不多,如果忘了也可以通过膨胀腐蚀得到相同效果) 1.开运算 2.闭运算 3.形态学梯度 4.顶帽 5.黑帽 #include "opencv2/opencv.hpp& ...
- opencv学习之路(37)、运动物体检测(二)
一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...
- opencv学习之路(36)、运动物体检测(一)
一.简介 二.背景减法 图片说明 #include "opencv2/opencv.hpp"using namespace cv; void main() { Mat img1 = ...
- opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH
一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...
- opencv学习之路(31)、GrabCut & FloodFill图像分割
一.GrabCut 1.利用Rect做分割 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat ...
- opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形
一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...
- opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形
一.简介 二.外接矩形的查找绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //外接矩形的查找 ...
随机推荐
- 多么痛的领悟---关于RMB数据类型导致的元转分分转元的bug
关于金额的数据类型,以及元转分分转元之间这种转换,以及元和分的比较,我相信很多人都踩过坑. 反正我是踩过. 而且,昨天和今天又重重的踩了两脚. 代付查询接口,支付中心给溢+响应的报文里,amount的 ...
- 字符串ASCII码排序
在对接第三方支付渠道的时候,第三方会要求参数按照ASCII码从小到大排序. 如下是渠道方有关生成签名规则的java代码示例: //初始化0010merkey.private文件: String mer ...
- c#中枚举类型的定义与使用
介绍枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.定义默认基数从O开 ...
- jQuery-导航下拉菜单-实用简单
/*CSS代碼*/ /*導航*/ .nav{background: url("../img/menu_bar.gif") repeat-x;} .nav ul li{display ...
- 将Web项目War包部署到Tomcat服务器基本步骤
参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1. 常识: 1.1 War包 War包一般是在进行Web ...
- DBA角色职责
MySQL DBA分架构DBA,运维DBA和开发DBA三种角色,职责介绍如下: MySQL数据库系统日常管理职责 日常管理的主要职责是对MySQL服务器程序mysqld的运行情况进行管理,使数据库用户 ...
- URL List by Category
URLs List AI https://www.cnblogs.com/zlel/p/8882129.html Javascript Promise http://liubin.org/promis ...
- c++ 常用的数据结构
set // constructing sets #include <iostream> #include <set> void checkin(std::set<int ...
- html5-css边框img
div{ width: 500px; height: 300px; background: rgb(122,30,60); border:15px solid black; ...
- Chess (SG + 状态压缩预处理)
#include<bits/stdc++.h> #define bit(t) (1 << t) using namespace std; <<; ;//k是集合s的 ...