您的位置:首页 > 运维架构

OpenCV官方文档学习记录(16)

2014-12-14 23:06 585 查看
Canny边缘检测

先不说函数作用,来代码:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

using namespace std;
using namespace cv;

int main(void)
{
//载入图片
Mat src = imread("lena.jpg");
if (src.empty())
return -1;
namedWindow("src", CV_WINDOW_AUTOSIZE);
imshow("src", src);

//按照原图片格式构建结果图片
Mat dst;
dst.create(src.size(), src.type());

//灰度转化
Mat src_gray;
cvtColor(src, src_gray, CV_BGR2GRAY);
namedWindow("Step 1 - src_gray", CV_WINDOW_AUTOSIZE);
imshow("Step 1 - src_gray", src_gray);

int threshold = 100;
int kernel_size = 3;
//定义比例
int ratio = 3;

//高斯变换,降噪
Mat detected_edges;
blur(src_gray, detected_edges, Size(3, 3));
namedWindow("Step 2 - detected_edges", CV_WINDOW_AUTOSIZE);
imshow("Step 2 - detected_edges", detected_edges);

//应用Canny变换,使用降噪后的图片(Canny recommended a upper:lower ratio between 2:1 and 3:1.*来自文档*)
Canny(detected_edges, detected_edges, threshold, threshold*ratio, kernel_size);
namedWindow("Step 3 - detected_edges", CV_WINDOW_AUTOSIZE);
imshow("Step 3 - detected_edges", detected_edges);

//用0填充
dst = Scalar::all(0);

//进行遮罩处理
src.copyTo(dst, detected_edges);

namedWindow("dst", CV_WINDOW_AUTOSIZE);
imshow("dst", dst);

waitKey();
return 0;
}


先看看注释大概有个了解;

然后分析输出结果:











分析最后两个输出我们就知道,这是将倒数第二个直接蒙在了原图上,只有在那些不是黑色的区域会显露出来,起始倒数第二个就是检测出来的边缘了。

实现这种效果的就是copyTo这个函数,有这样两个参数的第一个参数是通过源图像和第二个参数共同作用的,当第二个参数对应像素不是黑点,就是不是像素为0时,才将src拷贝到dst中,其他情况下都是将0拷贝到dst中,因此会有这样的输出。

其他的理解起来就比较简单了。

另外注意阈值threshold,这个值设置的越小,显示出的边缘线会越多:

为10时



为50时



因为按照函数定义,阈值就是计算的结果比阈值大才被认为是边缘,所以越大的阈值,会筛掉更多的点。

以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: