本次实验使用了两种方法进行了边缘检测,分别使用到了opencv中的两个API函数为Canny()和Sobel()函数。实验后加了Scharr滤波器,它其实是基于Sobel()函数的。

这三个API中的参数可进行调整,实验中也可动态调整参数值来达到不同的检测效果。

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp> using namespace cv; //全局变量的定义
Mat src, gray, dst; //Canny边缘检测相关变量
Mat canny;
int CannyLowThreshold = ; //滑动条位置参数 //Sobel边缘检测相关变量
Mat SobelGradient_X, SobelGradient_Y;
Mat SobelAbsGradient_X, SobelAbsGradient_Y;
int SobelKernelSize = ; //滑动条位置参数 //Scharr滤波器相关变量
Mat ScharrGradient_X, ScharrGradient_Y;
Mat ScharrAbsGradient_X, ScharrAbsGradient_Y; //全局函数的声明
static void on_canny(int,void*); //canny边缘检测窗口滑动条回调函数
static void on_sobel(int,void*);//sobel边缘检测窗口滑动条回调函数
void Scharr(); int main(int argc,char **argv)
{
system("color 2F"); src = imread("D:/meinv.jpg"); //载入原图
namedWindow("原图", CV_WINDOW_AUTOSIZE);
imshow("原图", src); dst.create(src.size(), src.type()); //创建与src同类型和大小的矩阵
cvtColor(src, gray, COLOR_BGR2GRAY);//转化为灰度图像 namedWindow("Canny边缘检测", CV_WINDOW_AUTOSIZE);
namedWindow("Sobel边缘检测", CV_WINDOW_AUTOSIZE); //创建滑动条
createTrackbar("参数值: ", "Canny边缘检测", &CannyLowThreshold, , on_canny);
createTrackbar("参数值: ", "Sobel边缘检测", &SobelKernelSize, , on_sobel); //调用滑动条函数
on_canny(, );
on_sobel(, ); //调用封装了Scharr边缘检测代码函数
Scharr(); while ((char(waitKey())!= 'q'))
{ } return ; } void on_canny(int, void*)
{
blur(gray,canny,Size(, )); //先使用3*3内核来降噪
Canny(canny, canny, CannyLowThreshold, CannyLowThreshold * , ); //Canny算子
dst = Scalar::all(); //将dst内的所有元素设置为0
src.copyTo(dst,canny); //使用canny算子输出的边缘图作为掩码,来将原图拷贝到目标图中 imshow("Canny边缘检测", dst);
imwrite("D:/learn-opencv/canny.jpg", dst); } void on_sobel(int, void*)
{
//求X方向的梯度
Sobel(src, SobelGradient_X, CV_16S, , , ( * SobelKernelSize + ), , , BORDER_DEFAULT);
convertScaleAbs(SobelGradient_X, SobelAbsGradient_X); //计算绝对值 //求Y方向的梯度
Sobel(src, SobelGradient_Y, CV_16S, , , ( * SobelKernelSize + ), , , BORDER_DEFAULT);
convertScaleAbs(SobelGradient_Y, SobelAbsGradient_Y); //合并梯度
addWeighted(SobelAbsGradient_X, 0.5, SobelAbsGradient_Y, 0.5, , dst); imshow("Sobel边缘检测", dst);
imwrite("D:/learn-opencv/sobel.jpg", dst); } void Scharr()
{
Scharr(src, ScharrGradient_X, CV_16S, , ,,, BORDER_DEFAULT);
convertScaleAbs(ScharrGradient_X, ScharrAbsGradient_X); Scharr(src, ScharrGradient_Y, CV_16S, , , , , BORDER_DEFAULT);
convertScaleAbs(ScharrGradient_Y, ScharrAbsGradient_Y); addWeighted(ScharrAbsGradient_X, 0.5, ScharrAbsGradient_Y, 0.5, , dst); imshow("Scharr滤波器", dst);
imwrite("D:/learn-opencv/scharr.jpg", dst);
}

1.Canny 效果图

2.Sobel 效果图

3.Scharr滤波器

最新文章

  1. 30分钟学会XAML
  2. C# 从字符串中取出英文字母
  3. java GUI,贷款服务器
  4. 16位CPU多周期设计
  5. easyui中Tab的tools按钮刷新当前tab
  6. 日常bug及解决方法记录
  7. SQL中约束和触发器的停用与启用
  8. AutoResetEvent类的使用
  9. 201521123121 《Java程序设计》第3周学习总结
  10. vi命令加行号查找替换等命令
  11. JavaScript构造函数
  12. 以 SPI 方式获取 SD 卡容量(V2.0)
  13. SNF快速开发平台3.0之--系统里广播的作用--迅速及时、简明扼要的把信息发送给接收者
  14. Scrapy基本命令
  15. 原生JS不到30行,实现类似javascript MVC的功能-minTemplate
  16. 使用 data.table 包操作数据
  17. 安装nginx和nginx-gridfs和mongodb
  18. 3-1 实现简单的shell sed替换功能
  19. Java小项目迷你图书管理系统
  20. torchnet+VGG16计算patch之间相似度

热门文章

  1. 秒懂JSON.parse()与JSON.stringify()的区别
  2. android api 之Scroller
  3. SonarQube代码质量管理平台介绍与搭建
  4. python3绘图示例6-1(基于matplotlib,绘图流程介绍及设置等)
  5. 笨办法学Python(十八)
  6. java——类加载机制
  7. 119. Pascal&#39;s Triangle II (Amazon) from leetcode
  8. C++STL之set集合容器
  9. python剑指offer最小的K个数
  10. 怎么让Sublime Text不自动打开最近的文件/项目