次のコードに従って動的に変更されるマトリックスがあります。
for( It=all_frames.begin(); It != all_frames.end(); ++It)
{
ItTemp = *It;
subtract(ItTemp, Base, NewData);
cout << "The size of the new data for ";
cout << " is \n" << NewData.rows << "x" << NewData.cols << endl;
cout << "The New Data is: \n" << NewData << endl << endl;
NewData_Vector.Push_back(NewData.clone());
}
私がやりたいことは、cv :: Mat NewDataがゼロ行列であるフレームを決定することです。 cv :: compare()関数と単純な演算子(NewData == NoData)の両方を使用して、同じサイズのゼロ行列と比較してみましたが、プログラムをコンパイルすることさえできません。
Cv :: Matがゼロで埋められる時期を決定する簡単な方法はありますか?
使った
if (countNonZero(NewData) < 1)
{
cout << "Eye contact occurs in this frame" << endl;
}
これは、非常に単純な(おそらく最もエレガントではないとしても)方法です。
マットが空かどうかを確認するには、empty()
を使用します。NewDataがcv :: Matの場合、NewData.empty()
はNewDataに要素がない場合にtrueを返します。
すべてがゼロかどうかを確認するには、単純にNewData == Mat::zeros(NewData.size(), NewData.type())
を使用します。
更新:
OpenCVソースコードを確認した後、実際にNewData == 0
すべての要素が0に等しいことを確認します。
countNonZero(Mat)は、マットの非ゼロのu数を返します
Matオブジェクトには empty プロパティがあるため、Matに何かがあるか空かを通知するように要求できます。結果はtrue
またはfalse
になります。
これはどう..
Mat img = Mat::zeros(cvSize(1024, 1024), CV_8UC3);
bool flag = true;
MatConstIterator_<double> it = img.begin<double>();
MatConstIterator_<double> it_end = img.end<double>();
for(; it != it_end; ++it)
{
if(*it != 0)
{
flag = false;
break;
}
}