2011-07-09 2 views
0

だから我々は次のようなコードを試してみてください。OpenCV画像が `==`ならboolを真にする方法、そうでない場合は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

Check http://stackoverflow.com/q/4196453/176769 – karlphillip

答えて

0
+0

私はOpenCV 2.2 C++ APIのためにオープンフレームワークを使用せず、ネイティブに固執したくありません。またopencv.absDiff()は私が求めたboolを返しません。 – Rella

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はピクセル間の距離を使って差の合計を返します。したがって、1つの画素の差は、他の画素の差によって補償することができる。たとえば、ノルムが0を返すとします。ピクセル(50,50)と(51,51)を除くすべてのピクセルは同じです。 (50,50)の差は-1で、on(51,51)は1です。この場合もノルムで0が返されますが、ループには入りません。 –

+0

Emm ... docを見てください:http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html#cv-normの差はゼロより小さくなることはできません(ノーマルタイプ)... – ArtemStorozhuk

2

実際のカメラビデオストリーム(コードからカメラからキャプチャしていることがわかります)では、ノイズ、変化する照明、小さなカメラの動きなどのために、2つのフレームがすべて同じではないため、方法は失敗します。 epsilonは、あなたが自分で見つけることができるいくつかの未署名の数がある

cv::norm(m1,m2) < epsilon 

は(それはあなたの基準に依存します)。これは非常に速く簡単な解決法です。

をご覧ください。karlphillipのリンクを使用すると、より効率的なソリューションを得ることができます。

+0

私は彼がフレームを取得するためにcv :: captureを使用していることに気付かなかったので、私はupvotingしています。もちろん、私の答えは決して通過しません。 –

関連する問題