2011-07-09 93 views
0

所以我們嘗試這樣的代碼:OpenCV如果圖像爲「==」則如何獲得bool true,如果不是則爲false?

cv::Mat m1, m2; 
cv::VideoCapture cap(0); 

do { 
    cap >> m1; 
    cap >> m2; 
} while(cv::norm(m1,m2)==0); 
frames+=2; 
    //... 

,但它似乎沒有工作。那麼,如果從相機捕獲的幀數據內容相同,如何獲得布爾值?

+0

你可以做一個'差異'並檢查它是否爲零。 – Blender

+0

cv :: norm()是一種簡單/快速的方法,但它沒有考慮光照變化和視點變化,因此對這些屬性的任何修改都會導致方法失敗。 – karlphillip

+1

檢查http://stackoverflow.com/q/4196453/176769 – karlphillip

回答

0

在OpenCV中我沒有意識到這樣的功能,但它很容易實現。任何返回元素總和的函數都是錯誤的,因爲一個像素的差異可以通過其他像素的差異來補償。確保正確性的唯一方法是逐像素檢查。下面是一個簡單的例子:

template<typename T> 
bool identical(cv::Mat m1, cv::Mat m2) 
{ 
    if(m1.cols != m2.cols || m1.rows != m2.rows) 
     return false; 

    for(int i=0; i<m1.rows; i++) 
    { 
     for(int j=0; j<m1.cols; j++) 
     { 
      if(m1.at<T>(i, j) != m2.at<T>(i, j)) 
      return false; 
     } 
    } 

    return true; 
} 

我沒有檢查代碼,所以,小心只是做'ctrl + c'。

+0

其實'cv :: norm(...)== 0'也是做同樣的事情...... – ArtemStorozhuk

+0

不!一點也不!。 cv :: norm將使用像素之間的距離來返回差分和。因此,一個像素的差異可以通過其他差異來彌補。例如,假設範數返回0.所有像素都是相同的,不包括像素(50,50)和(51,51)。 (50,50)中的區別是-1,並且(51,51)中的區別是1.這種情況仍然返回0,但不會傳入我的循環中。 –

+0

Emm ...看看doc:http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html#cv-norm差異不能小於零(使用任何normType)... – ArtemStorozhuk

2

你的方法失敗,因爲在真正的攝像頭的視頻流(從你的代碼,我看到您從相機捕獲)每兩幀是不相等的,因爲噪音,改變照明,小相機運動等,你可以改變你的支票本:

cv::norm(m1,m2) < epsilon 

哪裏epsilon一些,你可以自己找到的無符號數(這取決於你的標準)。這是非常快速和簡單的解決方案。

看看karlphillip的鏈接,以獲得更有效的解決方案。

+0

我是upvoting,因爲我沒有注意到他正在使用cv :: capture來獲取幀,這當然不會傳遞我的答案。 –

相關問題