web-dev-qa-db-ja.com

cv :: Matがゼロ行列かどうかを判断する方法は?

次のコードに従って動的に変更されるマトリックスがあります。

 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がゼロで埋められる時期を決定する簡単な方法はありますか?

14
JM92

使った

if (countNonZero(NewData) < 1) 
{
    cout << "Eye contact occurs in this frame" << endl;
}

これは、非常に単純な(おそらく最もエレガントではないとしても)方法です。

23
JM92

マットが空かどうかを確認するには、empty()を使用します。NewDataがcv :: Matの場合、NewData.empty()はNewDataに要素がない場合にtrueを返します。

すべてがゼロかどうかを確認するには、単純にNewData == Mat::zeros(NewData.size(), NewData.type())を使用します。

更新:

OpenCVソースコードを確認した後、実際にNewData == 0すべての要素が0に等しいことを確認します。

14
tomriddle_1234

countNonZero(Mat)は、マットの非ゼロのu数を返します

3
malli

Matオブジェクトには empty プロパティがあるため、Matに何かがあるか空かを通知するように要求できます。結果はtrueまたはfalseになります。

1
David Gatti

これはどう..

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;
    }
}
1
Spaceghost