程式碼 :
#include
<cv.h>
#include
<highgui.h>
#include
"Header.h"
void
BW(IplImage* img
, int RGB
)//二值化
{
int
Height=cvGetDimSize(img,0);//讀取矩陣高度
int
Width=cvGetDimSize(img,1);//讀取矩陣寬度
//背景相減後二值化
for(int
y = 0 ; y < Height ; y++)
for(int
x = 0 ; x < Width ; x++ )
{
if(!(cvGet2D(img,
y , x ).val[2] < RGB
&& cvGet2D(img,
y , x ).val[1] < RGB
&& cvGet2D(img,
y , x ).val[0] < RGB))
cvSet2D(img,y,x,CV_RGB(255,255,255));//特別注意 給值是
(y,x)
else
cvSet2D(img,y,x,CV_RGB(0,0,0));//特別注意 給值是
(y,x)
}
}
int
main(int argc,
char
*argv[])
{
IplImage*
img1, *img2, *img3;
img1=cvLoadImage("D:/image/car/p200.JPG",0);
img2=cvLoadImage("D:/image/car/p1800.JPG",0);
//分別給loading兩個圖片
//先轉換為灰階 給 0
//fun(10);
if(!img1
|| !img2)//判斷有無讀取到
{
printf("Could
not load image file\n");
system("pause");
exit(0);
}
img3 =
cvCreateImage(cvGetSize(img1),img1->depth,img1->nChannels);
//建立新圖片img3 仿冒 img1
cvSmooth(img1, img1, CV_GAUSSIAN,
3, 0, 0);//平滑處理
cvSmooth(img2, img2, CV_GAUSSIAN,
3, 0, 0);
cvAbsDiff(img1,img2,img3);
//做背景相減
int
Height=cvGetDimSize(img3,0);//讀取矩陣高度
int
Width=cvGetDimSize(img3,1);//讀取矩陣寬度
BW(img3 ,40);//二值化
cvErode(img3,img3,0,1);//cvErode(輸入圖像,輸出圖像,element,腐蝕的次數);
cvDilate(img3,img3,0,1);//擴張
cvSaveImage("D:/image/car/ADS.PNG",
img3);
//img3 = saturate_sv(img3);
//img3 = saturate_sv(img3);
//2值化用 目前這裡用不到
//開視窗 顯示 釋放
cvNamedWindow("img1",
CV_WINDOW_AUTOSIZE);
cvNamedWindow("img2",
CV_WINDOW_AUTOSIZE);
cvNamedWindow("img3",
CV_WINDOW_AUTOSIZE);
cvShowImage("img1",
img1 );
cvShowImage("img2",
img2 );
cvShowImage("img3",
img3 );
cvWaitKey(0);
cvReleaseImage(&img1);
cvReleaseImage(&img2);
cvReleaseImage(&img3);
return 0;
}

