#包含“cxcore.h”
#包含“highgui.h”
# include & ltcmath & gt
#pragma註釋(lib,“cv.lib”)
#pragma註釋(lib," highgui.lib ")
#pragma註釋(lib," cxcore.lib ")
#定義閾值150
IplImage * src//原圖
IplImage * tar//邊緣檢測後生成的新圖形
IplImage*灰色;//灰色貼圖
//sobel算子
int Func_Sobel(IplImage *src,IplImage* tar,int limit)
{
int sobelmask1[3][3],Sobel mask 2[3][3];
//水平模板
Sobel mask 1[0][0]=-1;//{-1,0,1,-2,0,2,-1,0,1};
Sobel mask 1[0][1]=-2;
Sobel mask 1[0][2]=-1;
Sobel mask 1[1][0]= 0;
Sobel mask 1[1][1]= 0;
Sobel mask 1[1][2]= 0;
Sobel mask 1[2][0]= 1;
Sobel mask 1[2][1]= 2;
Sobel mask 1[2][2]= 1;
//垂直模板
Sobel mask 2[0][0]=-1;//{-1,-2,-1,0,0,0,1,2,1};
Sobel mask 2[0][1]= 0;
Sobel mask 2[0][2]= 1;
Sobel mask 2[1][0]=-2;
Sobel mask 2[1][1]= 0;
Sobel mask 2[1][2]= 2;
Sobel mask 2[2][0]=-1;
Sobel mask 2[2][1]= 0;
Sobel mask 2[2][2]= 1;
int H = src-& gt;身高;
int W = src-& gt;寬度;
int i,j,h,w,temp1,temp2
for(h = 1;h & lth-1;h++)
{
for(w = 1;w & ltw-1;w++)
{
temp 1 = temp 2 = 0;
for(I = 0;我& lt3;i++)
{
for(j = 0;j & lt3;j++)
{
temp 1+=(src-& gt;imageData+(h-1+I)* src-& gt;width step)[(w-1+j)]* Sobel mask 1[I][j];
temp 2+=(src-& gt;imageData+(h-1+I)* src-& gt;width step)[(w-1+j)]* Sobel mask 2[I][j];
}
}
雙k = sqrt(temp 1 * temp 1+temp 2 * temp 2);
if(k & gt;極限)
{
(tar->;imageData+tar-& gt;width step * h)[w]=(uchar)255;//從固定值到變量的轉換需要強制轉換數據類型。
}
其他
(tar->;imageData+tar-& gt;width step * h)[w]=(uchar)0;
}
}
返回0;
}
//獲取灰度圖像
void Func _ GetGrayImage(IPL image * src,IplImage *tar)
{
int H = src-& gt;身高;
int W = src-& gt;寬度;
int w,h;
for(h = 0;h & lth;h++)
{
for(w = 0;w & ltw;w++)
{
(tar->;imageData+h * tar-& gt;width step)[w]=(unsigned char)((unsigned char)(src-& gt;imageData+h * src-& gt;widthStep)[3*w+2]*0.136+(無符號字符)(src-& gt;imageData+h * src-& gt;width step)[3 * w+1]* 0.514+(無符號字符)(src-& gt;imageData+h * src-& gt;width step)[3 * w]* 0.350);
}
}
}
void Func_ShowWindow()
{
CvNamedWindow("原始",0);//CV庫函數,窗口定義函數,窗口定義,用於下壹次顯示。
CvShowImage("原圖",src);//cv庫函數,標題欄是“原圖”,顯示的是src指向的圖像。
CvNamedWindow("灰度圖",0);
CvShowImage(" gray ");
CvNamedWindow("邊緣檢測圖",0);
CvShowImage(“邊緣檢測圖”,tar);
}
void Func_SaveWindow()
{
CvSaveImage("灰度。jpg”,灰色);
CvSaveImage("邊緣檢測圖。jpg”、tar);
}
void Func_CloseWindow()
{
cvReleaseImage(& amp;src);
cvReleaseImage(& amp;灰色);
cvReleaseImage(& amp;焦油);
CvDestroyWindow(" original ");
CvDestroyWindow("灰度貼圖");
CvDestroyWindow("邊緣檢測圖");
}
void main()
{
if ( (src=cvLoadImage("test.bmp "))
{
tar = cvCreateImage(cvSize(src-& gt;寬度,src-& gt;height),IPL_DEPTH_8U,1);
gray = cvCreateImage(cvSize(src-& gt;寬度,src-& gt;height),IPL_DEPTH_8U,1);
Func_GetGrayImage(src,gray);
Func_Sobel(灰度、焦油、閾值);//默認閾值是150。
func _ ShowWindow();
Func_SaveWindow()。
cvWaitKey(100000);
func _ close window();
}
返回;
}