OPENCV中Canny学习笔记

官网C++语言版本

#include "cv.hpp"
#include "cxcore.hpp"
#include "opencv2\highgui\highgui.hpp"
 
using namespace cv;
using namespace std;
 
int edgeThresh = 1;
 
// 声明 原始图片,灰度图片,和 canny边缘图片
	Mat image, cedge;
	Mat gray, edge;
 
void onTrackbar(int, void*)
{
	//blur 灰度图片
	blur(gray, edge, Size(3,3));
 
	// Canny 边缘检测
	Canny(gray,edge, edgeThresh, edgeThresh*3, 3);
 
	//全部设为0
	cedge = Scalar::all(0);
 
	//拷贝边缘的象素点
	image.copyTo(cedge, edge);
 
	imshow("Edge map", edge);
 
}
 
int main(int argc, char** argv)
{
 
 
	// 载入图片
	image = imread(argv[1], 1);
 
	// 判断载入图片是否成功
	if(image.empty())
	{
		printf("miss the image file: %d \n", argv[1]);
		return -1;
	}
 
	// 生成灰度图片,因为只有灰度图片才能生成边缘图片
         cedge.create(image.size(), image.type());
	cvtColor(image,gray, CV_BGR2GRAY);
 
	//新建一个窗口
	namedWindow("Edge map", 1);
 
	// 生成一个进度条来控制边缘检测
	createTrackbar("Canny Threshold", "Edge map", &edgeThresh, 100, onTrackbar);
 
	//初始化图像
	onTrackbar(0,0);
 
	waitKey(0);
 
	return 0;
}}


Canny

采用 Canny 算法做边缘检测

void cvCanny( const CvArr* image, CvArr* edges, double threshold1,
              double threshold2, int aperture_size=3 );
image
单通道输入图像.
edges
单通道存储边缘的输出图像
threshold1
第一个阈值
threshold2
第二个阈值
aperture_size
Sobel 算子内核大小 (见 cvSobel).

函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。

  • 注意事项:cvCanny只接受单通道图像作为输入。
  • 外部链接:经典的canny自调整阈值算法的一个opencv的实现见在OpenCV中自适应确定canny算法的分割门限

实现例题为:

    #include "StdAfx.h"  
    #include "cv.h"  
    #include "cxcore.h"  
    #include "highgui.h"  
    int main( int argc, char** argv )  
    {  
        //声明IplImage指针  
        IplImage* img = NULL;  
        IplImage* cannyImg = NULL;  
        char *filename;  
        filename="lena.png";  
        img=cvLoadImage(filename,1);  
        //载入图像,强制转化为Gray  
        if((img = cvLoadImage(filename, 0)) != 0 )  
        {  
            //为canny边缘图像申请空间  
            cannyImg = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);  
            //canny边缘检测  
            cvCanny(img, cannyImg, 50, 150, 3);  
            //创建窗口  
            cvNamedWindow("src", 1);  
            cvNamedWindow("canny",1);  
            //显示图像  
            cvShowImage( "src", img );  
            cvShowImage( "canny", cannyImg );  
            cvWaitKey(0); //等待按键  
            //销毁窗口  
            cvDestroyWindow( "src" );  
            cvDestroyWindow( "canny" );  
            //释放图像  
            cvReleaseImage( &img );  
            cvReleaseImage( &cannyImg );  
            return 0;  
        }  
        return -1;  
    }  



你可能感兴趣的:(C/C++,计算机视觉,OPENCV)