对一副图像进行不同scale的高斯模糊和Canny边缘提取
#include<iostream>
#include<sstream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;
#define SCALESIZE 20
void main()
{
IplImage* src = cvLoadImage("1.png",0);
int winSize[SCALESIZE],i;
IplImage* scaleImage[SCALESIZE];
IplImage* edgeImage[SCALESIZE];
char filename[256];
char filename2[256];
char windowName[256];
char windowName1[256];
winSize[0] = 3;
scaleImage[0] = cvCreateImage(cvGetSize(src),8,1);
edgeImage[0] = cvCreateImage(cvGetSize(src),8,1);
for(i = 1;i < SCALESIZE;i++)
{
winSize[i] = winSize[i-1]+2;//要为奇数
scaleImage[i] = cvCreateImage(cvGetSize(src),8,1);
edgeImage[i] = cvCreateImage(cvGetSize(src),8,1);
}
for(i = 0;i < SCALESIZE;i++)
{
cvSmooth(src,scaleImage[i],CV_GAUSSIAN,winSize[i],winSize[i]);
//作winSize[i]*winSize[i]的高斯卷积,
//一般为卷积核的水平方向直径(选择CV_GAUSSIAN平滑时必须为奇数,否则会触发assert错误)
cvCanny(scaleImage[i],edgeImage[i],30,90,3);
//在做完高斯卷积的图片上提取Canny边缘信息
}
//显示图片
for( i = 0;i<SCALESIZE;i++)
{
stringstream name;
string s1 = "scale";
string s2 = "edge";
name<<s1<<i;
name>>windowName;
cvNamedWindow(windowName);
cvShowImage(windowName,scaleImage[i]);
name.clear();
cvWaitKey(1000);
name<<s2<<i;
name>>windowName1;
cvNamedWindow(windowName1);
cvShowImage(windowName1,edgeImage[i]);
name.clear();
cvWaitKey(1000);
}
for( i = 0;i < SCALESIZE;i++)
{
string s1 = "scale_";
string jpg = ".jpg";
stringstream ss;
ss<<s1<<i<<jpg;
ss>>filename;
cvSaveImage(filename,scaleImage[i]);
ss.clear();
string s2 = "edge_";
ss<<s2<<i<<jpg;
ss>>filename2;
cvSaveImage(filename2,edgeImage[i]);
ss.clear();
}
for(i = 0;i <SCALESIZE;i++)
{
cvReleaseImage(&scaleImage[i]);
cvReleaseImage(&edgeImage[i]);
cvDestroyWindow(windowName);
cvDestroyWindow(windowName1);
}
cvReleaseImage(&src);
}