一、分析

贴出应用图片以供直观了解

红色部分,因图而异(某些参数,根据图片的不同需要进行相应的修改)

二、代码

 #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)、膨胀腐蚀应用之走迷宫的更多相关文章

  1. opencv学习之路(14)、形态学之膨胀腐蚀

    一.膨胀腐蚀概述(对高亮部分进行操作) 二.膨胀 三.腐蚀 四.代码 1.查看结构元素 #include<opencv2/opencv.hpp> #include<iostream& ...

  2. C++ Opencv 自写函数实现膨胀腐蚀处理

    一.膨胀腐蚀学习笔记 二.代码及结果分享 #include <opencv2/opencv.hpp> #include <iostream> using namespace s ...

  3. opencv学习之路(15)、形态学其他操作(开、闭、顶帽、黑帽、形态学梯度)

    一.形态学其他操作(用的不多,如果忘了也可以通过膨胀腐蚀得到相同效果) 1.开运算 2.闭运算 3.形态学梯度 4.顶帽 5.黑帽 #include "opencv2/opencv.hpp& ...

  4. opencv学习之路(37)、运动物体检测(二)

    一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...

  5. opencv学习之路(36)、运动物体检测(一)

    一.简介 二.背景减法 图片说明 #include "opencv2/opencv.hpp"using namespace cv; void main() { Mat img1 = ...

  6. opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH

    一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...

  7. opencv学习之路(31)、GrabCut & FloodFill图像分割

    一.GrabCut 1.利用Rect做分割 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat ...

  8. opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

    一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...

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

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

随机推荐

  1. linux统计文件夹大小

    统计总大小: du -sh dirname 统计文件夹内部各文件大小及总大小: du -h dirname

  2. 巧用CurrentThread.Name来统一标识日志记录

    ▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...

  3. whu 643 Soul Artist(二维BIT 区间更新,单点查询)

    Soul Artis [题目链接]Soul Artis [题目类型]二维BIT &题解: 二维区间更新和一维相比,要容斥一下,更新一块区间就是更新4个点. 还有这个我先是写了2*n^2logn ...

  4. MyBatis基础入门《五》核心配置文件

    MyBatis基础入门<五>核心配置文件 描述: 在前面的章节中,简单的学习使用了一下mybatis,对于配置文件没有过多详细说明. 这里先描述项目中的一个核心配置文件:mybatis-c ...

  5. WebSocket.之.基础入门-后端响应消息

    WebSocket.之.基础入门-后端响应消息 在<WebSocket.之.基础入门-前端发送消息>的代码基础之上,进行添加代码.代码只改动了:TestSocket.java 和 inde ...

  6. NodeJs笔记 : express框架创建工程 ----- 路由设计

    一.搭建工程 1 .安装 express-generator $ npm install -g express-generator 2 .本地创建express项目 $ express -e blog ...

  7. CSS3 transition-timing-function 深入理解和技巧

    基础 语法: transition-timing-function : ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier( ...

  8. C# HtmlDocument和HtmlNode的使用以及节点的模糊查询

    C#HtmlAgilityPack.HtmlDocument和HtmlAgilityPack.HtmlNode的使用 HtmlAgilityPack.HtmlDocument response = n ...

  9. URL Resources

    Prezi 1. 官网   https://prezi.com/ 2. 入门教程   https://wenku.baidu.com/view/9bb234ac0029bd64783e2c6b.htm ...

  10. [ Windows BAT Script ] BAT 脚本获取windows权限

    BAT 脚本获取windows权限 @echo off echo I am trying to run as Administrator %1 %2 ver|find "5."&g ...