OpenCV3.0 Examples学习笔记(6)-edge.cpp
发布时间:2020-12-13 21:19:30 所属栏目:PHP教程 来源:网络整理
导读:这个系列的目的是通过对OpenCV示例,进1步了解OpenCV函数的使用,不触及具体原理。 目录 简介 Example运行截图 Example分析 Example代码 简介 本文记录了对OpenCV示例 edge.cpp 的分析。 资料地址: http://docs.opencv.org/3.0.0/d3/d63/edge_8cpp-example.h
这个系列的目的是通过对OpenCV示例,进1步了解OpenCV函数的使用,不触及具体原理。
目录
简介
Example运行截图
Example分析
Example代码
简介
本文记录了对OpenCV示例edge.cpp的分析。首先这个示例,主要讲述了使用Canny函数获得图象边沿。
Canny算法原理
Canny 边沿检测算法 是
John F. Canny 于 1986年开发出来的1个多级边沿检测算法,也被很多人认为是边沿检测的 最优算法,最优边沿检测的3个主要评价标准是:
Canny步骤
Canny函数在OpenCV中的原型
Example截图
Example分析
示例主要步骤以下:
1.申明需要使用的变量:
int edgeThresh = 1;
Mat image, gray, edge, cedge;
PS:Canny函数由高低两个阈值,用户在本示例只设置低阈值edgeThresh,令高阈值为低阈值的3倍。
2.从命令行参数中加载图象:
CommandLineParser parser(argc, argv, keys);
string filename = parser.get<string>(0);
image = imread(filename, 1);
if(image.empty())
{
printf("Cannot read image file: %sn", filename.c_str());
help();
return ⑴;
}
3.创建与原图相同尺寸样式的图象,用于绘制边沿检测结果:
cedge.create(image.size(), image.type());
4.灰度化
cvtColor(image, COLOR_BGR2GRAY);
5创建预览窗口
namedWindow("Edge map", 1);
6.创建滑动条,用于用户交互,设置阈值
createTrackbar("Canny threshold", "Edge map", &edgeThresh, 100, onTrackbar);
PS:认为低阈值上限为100;
PS1:Trackbar变动改变edgeThresh,调用回调函数onTrackbar。
7.分析onTrackbar函数
7.1均值滤波,平滑图象
blur(gray, Size(3,3));
7.2使用Canny寻觅边沿
Canny(edge, edgeThresh, edgeThresh*3, 3);
7.3将cedge
填充为黑色(0)
cedge = Scalar::all(0);
7.4将Canny函数结果(边沿检测结果)复制到cedge(背景为黑色)
image.copyTo(cedge, edge);
7.5显示图象
imshow("Edge map", cedge);
Example代码
#include "opencv2/core/utility.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include <stdio.h> using namespace cv; using namespace std; int edgeThresh = 1; Mat image,gray,edge,cedge; // define a trackbar callback static void onTrackbar(int,void*) { blur(gray,Size(3,3)); // Run the edge detector on grayscale Canny(edge,edgeThresh,edgeThresh*3,3); cedge = Scalar::all(0); image.copyTo(cedge,edge); imshow("Edge map",cedge); } static void help() { printf("nThis sample demonstrates Canny edge detectionn" "Call:n" " /.edge [image_name -- Default is ../data/fruits.jpg]nn"); } const char* keys = { "{@image |../data/fruits.jpg|input image name}" }; int main( int argc,const char** argv ) { help(); CommandLineParser parser(argc,argv,keys); string filename = parser.get<string>(0); image = imread(filename,1); if(image.empty()) { printf("Cannot read image file: %sn",filename.c_str()); help(); return ⑴; } cedge.create(image.size(),image.type()); cvtColor(image,COLOR_BGR2GRAY); // Create a window namedWindow("Edge map",1); // create a toolbar createTrackbar("Canny threshold","Edge map",&edgeThresh,100,onTrackbar); // Show the image onTrackbar(0,0); // Wait for a key stroke; the same function arranges events processing waitKey(0); return 0; } 参考资料:
1.《【opencv 1日1练】
api 之 blur》
2.《【OpenCV入门指南】第3篇Canny边沿检测3.《【OpenCV】Canny
边沿检测4.《Canny
边沿检测》
5.《
图象边沿检测--OpenCV之cvCanny函数》
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |