2012-07-13 90 views
2

我正試圖找出使用Opencv的2張圖像之間的差異。代碼如下:圖像處理 - 2張圖像之間的差異

#include "cv.h" 
#include "highgui.h" 
#include <stdio.h> 
#include<iostream> 

int main() 
{ 
char a,b; 
cv::Mat frame; 
cv::Mat frame2; 
VideoCapture cap(0); 
if(!cap.isOpened()) 
{ 
    cout<<"Camera is not connected"<<endl; 
    getchar(); 
    exit(0); 

} 
Mat edges; 
namedWindow("Camera Feed",1); 
cout<<"Ready for background?(y/Y)"<<endl; 
cin>>a; 
if(a=='y'||a=='Y') 
{ 
cap>>frame; 
cv::cvtColor(frame,frame,CV_RGB2GRAY); 
cv::GaussianBlur(frame,frame,cv::Size(3,3),2.00,0,BORDER_DEFAULT); 
} 

cout<<"Ready for foreground?(y/Y)"<<endl; 
cin>>b; 
if(b=='y'||b=='Y') 
{ 
cap>>frame2; 
cv::cvtColor(frame2,frame2,CV_RGB2GRAY); 
cv::GaussianBlur(frame2,frame2,cv::Size(3,3),2.00,0,BORDER_DEFAULT); 
} 

cv::absdiff(frame,frame2,frame); 


imwrite("img_bw.jpg",frame); 

return 0; 
} 

該代碼運行良好,但輸出並不是完全黑白的,就像我想要的。我哪裏錯了?

+2

由於您顯然是從網絡攝像頭捕捉圖像或某些其他視頻源連續幀可能不完全相等。另外,以「前景」和「背景」爲兩個框架,前景與背景不同似乎是自然的。你能否詳細說明你的目標是什麼? – AruniRC 2012-07-13 04:12:48

+0

假設背景是牆壁,前景是站在牆前的男人,那麼最終的圖像應該顯示男人是白色的,而其他的背景是黑色的。根據我所讀到的,圖像之間的差異用白色表示,相同的部分用黑色表示。瞄準那個。 – 2012-07-13 04:17:11

+0

啊好的,這是有道理的。所以你可以鏈接到你正在獲得什麼樣的圖像?一次完美的背景減法不會發生 - 您可以嘗試對圖像進行形態學操作以減少虛假的白色斑點,根據形狀,面積等丟棄小的白色點。 – AruniRC 2012-07-13 04:25:51

回答

1

您輸入的代碼將輸出灰度陰影,對應於兩個圖像之間各個像素的差異。僅僅因爲相機傳感器的噪聲或可變性,即使在沒有改變的元件之間也總會有一些小的差異。如果您需要純黑色和白色,則需要選擇差異顯着的閾值,並將低於該閾值的每個像素都轉換爲0,並將閾值以上的所有內容轉換爲255.

+0

您可以提供的任何鏈接或任何代碼?我試圖用高斯濾波器來減少噪音。爲什麼這不起作用? – 2012-07-13 04:28:28

+0

@PrakharMohan,對不起,我不熟悉OpenCV。減少噪音與消除噪音並不相同,恐怕這是不可能的 - 噪音並不是差異的唯一來源。 – 2012-07-13 04:30:47

+0

@ MarkRansom-Ok。 – 2012-07-13 04:33:17