16

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

 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 にゼロが入力されたときを判断する簡単な方法はありますか?

4

5 に答える 5

28

使った

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

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

于 2012-12-17T05:50:10.107 に答える
23

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

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

アップデート:

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

于 2012-12-17T03:01:07.933 に答える
1

これはどう..

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;
    }
}
于 2012-12-17T03:25:01.817 に答える