程式碼 :
#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;
}
為啥我跑不出來??
回覆刪除你可能要先安裝好OPENCV 或是你的圖片有置入有錯喔
刪除請問Header.h是什麼啊?
回覆刪除需要另外抓嗎?
不用喔 那行是我多打的
刪除請問作者大大有寫過前景相減嗎?
回覆刪除或是整張圖片相減?有點看不懂 背景是怎麼產生跟怎麼相減的 可以跟我說一下嗎??
謝謝
簡單的說 純背景 跟 有車子的背景 相減之後 重複的部分就會消失 ,
刪除最後留下的 就是不相同的部分 也就是車子了
然後再對車子 跟雜訊做一些處理
3Q 謝謝你
刪除作者已經移除這則留言。
回覆刪除請問一下 我有些照片可以讀取 可是有些照片 會被中斷掉
回覆刪除他會顯示出
於0x75e5c42d的za.exe中發生未處理的例外狀況:Microsoft C++在記憶體位置
0x0021e740,發生例外狀況: cv::Exception
你 img1 跟 img2 大小一模一樣嗎 不一樣可能會發生錯誤
刪除請問加入讀取影片後 能夠做到背景相減 二值化並且不會延遲嗎?
回覆刪除目前我讀取一個影片 要將影片的前景抓出來
但是前景二值化的結果超級慢 大概一秒一張左右
會延遲 這邊只是用最好理解的方式寫 二值化
刪除正確來說要使用 OpenCV內建的函式效能才會好
另外可以用開多執行緒 來減少等待二值化塞車的情形