http://wiki.opencv.org.cn/index.php/Canny%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B
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)