0

我試圖找出2張圖像中的差異。場景:假設我有2張圖片,一張背景和另一張背景前面的人物,我想以這樣一種方式減去兩張圖片,以獲得人物的位置,即該程序是否可以檢測到該人站在哪裏,並將減去的圖像作爲輸出。OpenCV圖像處理

我設法得到的代碼是從相機拍攝兩張圖像並重新調整大小,並將兩張圖像轉換爲灰度。在此之後我想知道該怎麼做。我檢查了OpenCV提供的減法函數,但它將數組作爲輸入,所以我不知道如何進展。

我寫的代碼是:

cap>>frame; //gets the first image 
cv::cvtColor(frame,frame,CV_RGB2GRAY); //converts it to gray scale 
cv::resize(frame,frame,Size(30,30)); //re-sizes it 

cap>>frame2;//gets the second image 
cv::cvtColor(frame2,frame2,CV_RGB2GRAY); //converts it to gray scale 
cv::resize(frame2,frame2,Size(30,30)); //re-sizes it 

現在我簡單地使用像減函數:

cv::subtract(frame_gray,frame,frame); 

還是我先辦理一些過濾器,然後用減函數?

+0

_「它需要數組作爲輸入,所以我不知道如何進步」_圖像的內容不過是一個字節數組,對嗎?無論如何,你真的嘗試過用'cv :: subtract'做什麼嗎? – Rook 2012-07-10 10:27:20

+0

不,當我看到文檔時,我只是在代碼中添加了減法語句作爲註釋。在減去圖像之前,我不需要任何濾鏡來處理圖像?我是否需要將圖像加載到內存中才減去它們?我在某處讀過,不知道我是否有必要。 – 2012-07-10 10:32:26

+1

你也許應該搜索關於opencv圖像或背景減法的更多信息。例如,一個非常快速的搜索引起[相關的stackoverflow問題](http://stackoverflow.com/questions/9742591/opencv-issue-of-image-subtraction)。看看它是如何在其他地方完成的,並詢問是否卡住,而不是在嘗試任何事情之前求助於;-) – Rook 2012-07-10 10:39:28

回答

1

正如其他人已經注意到的,這是一個棘手的問題:容易想出一個有時會起作用的黑客,很難想出一個解決方案,將只需最少的人工干預就能在大多數時間工作。而且,如果你能夠嚴格控制背景的材質和照明,就會容易得多。專業應用程序在計算機視覺領域被稱爲「chromakeying」(尤其是電視行業),「bluescreening」,「matting」或「travelling matte」(電影攝影),「背景消除」。

許多年前由Petro Vlahos完成了用於消光準均勻背景的突破性工作。其基本算法的專利已經過期,所以你可以和他們一起去鎮上(並找到各種質量的開源實現)。毋庸贅言,IANAL,您的專利主題也是如此。

消除更復雜的背景仍然是一個活躍的研究領域,特別是在沒有3D信息的情況下。您可能需要查看一些研究報告,這些報告是半年前MS Research發佈的(A. Criminisi在該領域做了一些工作)。

+0

IANAL?這是什麼? – 2012-07-10 13:23:32

+1

你有試過谷歌嗎? https://www.google.com/search?q=IANAL – 2012-07-10 14:23:03

+0

另外,你如何做到這一點,鏈接名稱與鏈接? – 2012-07-10 15:29:00

0

使用減法並不合適,因爲它可能會導致一些值變爲負值,並且只有在您試圖查看是否存在差異(布爾值true/false)時纔有效。

如果你需要得到它的不同的像素,你應該通過像素比較做一個像素 - 是這樣的:

int rows = frame.rows; 
int cols = frame.cols; 
cv::Mat diffImage = cv::Mat::zeros(rows, cols, CV_8UC1); 
for(int i = 0; i < rows; ++i) 
{ 
    for(int j = 0; j < cols; ++j) 
    { 

     if(frame.at<uchar>(i,j) != frame2.at<uchar>(i,j)) 
      diffImage.at<uchar>(i, j) = 255; 
    } 
} 

現在,您可以顯示或保存diffImage。所有不同的像素將是白色的,而相似的將會是黑色的

+0

frame.at()是一個有效的語句嗎?我正在使用Visual Studio 2008和opencv 2.3,並引發錯誤。 – 2012-07-10 10:38:32

+0

對不起!我錯過了數據類型。我編輯了該程序以添加數據類型「」。 – go4sri 2012-07-10 10:40:04

+0

OpenCV提供了減法的替代方法,例如'cvAbsDiff'。順便提一下,如果正在比較的圖像是來自實景的相機幀而不是合成生成的,則相同主體的兩幀之間像素值相同的機會相當渺茫! – Rook 2012-07-10 10:42:52