OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)
来源:互联网 发布:中国海关数据统计 编辑:程序博客网 时间:2024/05/22 21:43
本系列学习笔记参考自OpenCV2.4.10之opencv\sources\samples\cpp\tutorial_code和http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html
本博文接下来将介绍图像变换相关的Demo,如下图所示:
CannyDetector_Demo.cpp(Canny边缘检测)
demo源码如下:
#include "stdafx.h" //预编译头文件 /** * Canny边缘检测示例 */#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include <stdlib.h>#include <stdio.h>using namespace cv;///全局变量Mat src, src_gray;Mat dst, detected_edges;int edgeThresh = 1;int lowThreshold;int const max_lowThreshold = 100;int ratio = 3;int kernel_size = 3;const char* window_name = "Edge Map";/** * 滑动条回调函数,根据阈值进行Canny边缘检测 */static void CannyThreshold(int, void*){ /// 用3x3的矩形核对src图像平滑 blur( src_gray, detected_edges, Size(3,3) ); /// Canny边缘检测 Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size ); dst = Scalar::all(0); src.copyTo( dst, detected_edges); imshow( window_name, dst );}/** * 主函数 */int main( int, char** argv ){ /// 加载图片 src = imread("D:\\opencv\\lena.png"); if( !src.data ) { return -1; } /// 创建一个和源图像大小和类型一样的目标图像 dst.create( src.size(), src.type() ); /// 将图像转换为灰度图 cvtColor( src, src_gray, COLOR_BGR2GRAY ); /// 创建窗口 namedWindow( window_name, WINDOW_AUTOSIZE ); /// 创建用于用户输入阈值大小的滑动条 createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold ); /// 显示图像 CannyThreshold(0, 0); waitKey(0); return 0;}运行截图:
首先介绍cvtColor;函数原型为:C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )该函数的功能是将图像从一种颜色空间转换到另一种颜色空间。第一个参数为源图像,第二个参数为目的图像,第三个参数code为转换代码COLOR_BGR2GRAY,即将RGB三通过彩色图像转换为灰度图(GRAY),转换公式为:
第一个参数image为单通道8位图像,这就是为什么我们要将src通过cvtColor转换为灰度图。第二个参数为边缘检测的结果。其大小和类型与src相同。threshold1为第一阈值(低阈值),threshold2为第二阈值(高阈值)。
这里有必要简单介绍一个Canny边缘检测,具体的原理请读者自行参考相关文献,这里主要介绍两个阈值的作用。其中一个阈值为高阈值,一个阈值为低阈值。可以这样认为高阈值用于提取图像的强边缘,将边缘和背景区分出来。那么问题来了如果只是提取强边缘难免会造成图像边缘链接不到一起。因而,低阈值便是用来提取弱边缘,将这些弱边缘提取出来链接图像的强边缘,这样可以使得提取出的边缘图像更加平滑。
下面是(低阈值,高阈值)分别为(80,80)(40,80)(20,80)(5,80)的Canny边缘检测效果。
Ok.需要说明的是,本博文系列主要侧重在opencv库的应用。具体各个函数接口内部的图像原理请读者自行查阅资料。
0 0
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Laplace边缘检测和Sobel边缘检测,图像重映射)
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(仿射变换)
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Hough变换)
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(图片边框与图片卷积)
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgProc(图像处理)
- OpenCV2.4.10之samples_cpp_tutorial-code_learn------安装配置与第一个Opencv程序
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ml(SVM支持向量机一)
- 图像处理--opencv2 canny边缘检测
- 边缘检测之Canny算子
- 边缘检测算子之Canny
- opencv之canny边缘检测
- Canny边缘检测源码与图像结果(OpenCV2.0)
- 边缘检测:canny边缘检测
- opencv之边缘检测 canny算子
- 边缘检测之Canny算法详谈
- opencv之边缘检测(canny)
- OpenCV参考手册之Canny边缘检测
- Spring Task定时任务
- CM GPRS DTU技术参数
- 错误排查总结-eclipse中junit test或者run main方法报错
- 如何快速的制作多层分组-数据汇总
- 二叉树的创建--(3)遍历二叉树(递归与非递归、Level)
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)
- Android开发-API指南-<grant-uri-permission>
- LeetCode 第 343 题 (Integer Break)
- QQ空间技术架构之深刻揭秘
- Mysql Hash索引
- Android使用MVP的好处
- 什么是真静态
- SpringMVC 中无缓存的BasicController的设计
- 根据两点的经纬度求方位角和距离,等