• Open Source Computer Vision Library

Canny边缘检测

Wikipedia,自由的百科全书

目录

C语言版本

来自于仕琪的讲稿《使用OpenCV进行图像处理》中的例程

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

Insertformulahere=函数说明= 请参见 Cv图像处理#Canny


C++语言版本

/**************************************************
 * C++ Canny:Canny边缘检测
 **************************************************/
 
/***********************************************************************
 * OpenCV example
 * By Min Qi February 26, 2012, Indianapolis, IN
 ***********************************************************************/
 
#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;
}

Python版本

# -*- coding:utf-8 -*-
###########################################################
# OpenCV example
#
# cvCanny:Canny边缘检测
#
# By ChaiShushan 2008
###########################################################
 
import sys
 
# 导入OpenCV模块
 
from opencv.cv import *
from opencv.highgui import *
 
if __name__ == '__main__':
 
    if len(sys.argv) == 2:
 
        # 载入图像,强制转化为Gray
        # 0表示Gray,1表示Origin,因为cvCanny函数参数要求图像必须是单通道的
 
        pImg = cvLoadImage(sys.argv[1], 0)
        if not pImg: sys.exit(-1)
 
        # 为canny边缘图像申请空间
 
        pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1)
 
        # canny边缘检测
        # 50和150是检测阀值,opencv必须手工输入阀值,如需自动匹配阀值参考cvCanny函数介绍
 
        cvCanny(pImg, pCannyImg, 50, 150, 3)
 
        # 创建窗口
 
        cvNamedWindow("src", 1)
        cvNamedWindow("canny",1)
 
        # 显示图像
 
        cvShowImage( "src", pImg )
        cvShowImage( "canny", pCannyImg )
 
        # 等待按键
 
        cvWaitKey(0); 
 
        # 销毁窗口
 
        cvDestroyWindow( "src" )
        cvDestroyWindow( "canny" )
 
        # 释放图像
 
        cvReleaseImage( pImg )
        cvReleaseImage( pCannyImg )
 
        sys.exit(0)

注: Python版本由chai2010改写.

Python2.7-OpenCV2.2版本

'''
Created on 2011-8-17
 
@author: Sunny
'''
# -*- coding:utf-8 -*-
# 导入OpenCV模块
import cv
import sys
 
if __name__ == '__main__':
 
    # 载入图像,强制转换成Gray
    # 表示Gray,1表示Origin,因为cv.Canny函数要求图像必须是单通道的
    Img1 = cv.LoadImage("Lena.jpg",0)
    # 创建一个canny图像
 
    PCannyImg = cv.CreateImage(cv.GetSize(Img1), cv.IPL_DEPTH_8U, 1)
 
 
    # canny边缘检测
    # 50和150是检测阈值,opencv必须手工输入阈值,如需自动匹配阈值,请参考cvCanny介绍
    cv.Canny(Img1, PCannyImg, 50, 150, 3)
 
    # 创建窗口
    cv.NamedWindow("src", 1)
    cv.NamedWindow("canny", 1)
 
     # 显示窗口
    cv.ShowImage("src", Img1)
    cv.ShowImage("canny", PCannyImg)
 
     # 等待按键
    cv.WaitKey(0)
 
    # OpenCV2.2的Python接口没有Release函数,所以直接销毁窗口
    cv.DestroyWindow("src")
    cv.DestroyWindow("canny")
 
    sys.exit(0)

注: Python2.7-OpenCV2.2版本由sunny2020改写.

Views
Personal tools