雕刻时光

just do it……nothing impossible
随笔 - 547, 文章 - 0, 评论 - 82, 阅读 - 86万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Canny边缘检测

Posted on   huhuuu  阅读(20368)  评论(6编辑  收藏  举报

  有时候,我们需要提取一个图像的边缘利于计算。

  opencv实现了Canny边缘检测的函数,方便调用。Canny算子的原理是首先在x,y方向求一阶导数,然后组合为4个方向的导数。这些方向的导数达到局部最大值的点就是组成边缘的候选点。

  1.1cvCanny函数:

CVAPI(void)  cvCanny( const CvArr* image, CvArr* edges, double threshold1,
                      double threshold2, int  aperture_size CV_DEFAULT(3) );

  第一个参数:输入:是灰度图,就算是彩色图也会处理成灰度图

  第二个参数:输出的图的位置,输出的图式二值图

  第三第四个参数:是两个阈值,上限与下限,如果一个像素的梯度大于上限,则被认为是边缘像素,如果低于下限则被抛弃,如果介于两者之间,只有当其与高于上限阈值的像素连接时才会被接受。

  第五个参数:表示模板的大小,如果是3,则表示3*3矩阵的大小

  

  有时候在图像变化的时候需要实时的变化阈值,则可以用滑动条来处理。

  1.2 cvCreateTrackbar

CVAPI(int) cvCreateTrackbar( const char* trackbar_name, const char* window_name,
                             int* value, int count, CvTrackbarCallback on_change CV_DEFAULT(NULL));

  函数说明:

  第一个参数表示该trackbar的名称。

  第二个参数表示窗口名称,该trackbar将显示在这个窗口内。

  第三个参数表示创建时滑块的位置。

  第四个参数表示滑块位置的最大值,最小值固定为0。

  第五个参数表示回调函数。当滑块位置有变化时,系统会调用该回调函数。

  

  1.3 配合使用的回调函数

typedef void (CV_CDECL *CvTrackbarCallback)(int pos);

  当trackbar位置被改变的时,系统会调用这个回调函数,并将参数pos设置为表示trackbar位置的数值

 

演示程序:

  

复制代码
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

IplImage *g_pSrcImage, *g_pCannyImg;
const char *pstrWindowsCannyTitle = "边缘检测图";
//cvCreateTrackbar的回调函数
void on_trackbar(int threshold)
{
    //canny边缘检测
    cvCanny(g_pSrcImage, g_pCannyImg, threshold, threshold * 3, 3);
    cvShowImage(pstrWindowsCannyTitle, g_pCannyImg);
}
int main()
{
    const char *pstrImageName = "C:/from.bmp";
    const char *pstrWindowsSrcTitle = "原图";
    const char *pstrWindowsToolBar = "滑动条";

    //从文件中载入图像的灰度图CV_LOAD_IMAGE_GRAYSCALE - 灰度图
    g_pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE);
    g_pCannyImg = cvCreateImage(cvGetSize(g_pSrcImage), IPL_DEPTH_8U, 1);

    //创建窗口
    cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
    cvNamedWindow(pstrWindowsCannyTitle, CV_WINDOW_AUTOSIZE);

//创建滑动条
    int nThresholdEdge = 1;
    cvCreateTrackbar(pstrWindowsToolBar, pstrWindowsCannyTitle, &nThresholdEdge, 200, on_trackbar);

    //在指定窗口中显示图像
    cvShowImage(pstrWindowsSrcTitle, g_pSrcImage);
    on_trackbar(1);

    //等待按键事件
    cvWaitKey();

    cvDestroyWindow(pstrWindowsSrcTitle);
    cvDestroyWindow(pstrWindowsCannyTitle);
    cvReleaseImage(&g_pSrcImage);
    cvReleaseImage(&g_pCannyImg);
    return 0;
}
View Code
复制代码

  

  pos=0:

  

  pos=50:

  

 

  参考:http://blog.csdn.net/morewindows/article/details/8239625,学习opencv

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示