• Canny边缘检测


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

      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

  • 相关阅读:
    请求的详细资料级别没有事实表
    BIEE汇总数据如何放在后面
    Biee仪表盘中提示空值如何去掉
    UFT测试本地应用程序登陆小实例(描述性编程)
    Mysql找回丢失密码
    linux下Mysql多实例实现
    如何从零安装Mysql
    Linux系统下yum源配置(Centos 6)
    Linux系统管理常用命令用法总结(2)
    Linux系统管理常用命令用法总结(1)
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3538850.html
Copyright © 2020-2023  润新知