2015-02-06 46 views
1

我正在嘗試做一些非常簡單的事情:從視頻中減去bg圖像以進行對象跟蹤。我知道圖像可以簡單地相互減去img3 = img2 - img1。然而,即使當我從一個圖像開始簡單時,添加一條黑色線條並將其存儲爲img2,img3不會顯示線條。當我運行下面的代碼如何使用opencv減去python中的兩個視頻幀

import cv2 
img1 = cv2.imread("img1.png") 
img2 = cv2.imread("img2.png") 
img3 = img2 - img1 
cv2.imwrite("img3.png",img3) 

與波紋管IMG1和IMG2:

Img1 Img2

我得到的圖像下面的左邊,而不是右邊的圖像: img3 im3wanted

我想在視頻中使用此方法進行背景提取,例如在那裏我有一個bg圖像文件,顯示一個靜態場景和一個視頻,其中有時候物體會進入和退出屏幕。我用下面的代碼,但同樣收到B/W圖像,而不是隻看到沒有場景中的物體的..

import cv2 
import numpy as np 
from PIL import Image 

capture = cv2.VideoCapture("video.mov")  
while True: 
    f, frame = capture.read() 
    frame = cv2.GaussianBlur(frame,(15,15),0) 
    frame = frame - bg 
    cv2.imshow("window", frame) 

PS:我知道自動背景減法,但我有很好的背景文件,並很清楚空非常明顯的對象的場景,所以認爲這應該很容易工作!

更新:我剛剛發現了關於PIL ImageChops差函數,用來獲取什麼,我想有兩個圖像,但似乎不可能與OpenCV的視頻開通使用工作。也可以使用numpy數組手動執行ImageChops.difference(img1,img2)嗎?

回答

1

最接近於預期的結果,你可以得到使用此代碼:

img3 = 255 - cv2.absdiff(img1,img2) 

這個代碼將會給你:
enter image description here
注意只使用cv2.absdiff(img1,img2)會給這個結果的oposite,因爲基本上此操作會告訴你什麼是2個圖像之間的差異 - 如果在某些位置沒有差別,結果(INT這個位置)爲0
爲了實現「完美的結果」(你期望什麼),你需要應用一些閾值(或其他類型的)過濾器將刪除圖像的左側部分)。

相關問題