如何确定cv :: Mat是否为零矩阵?

时间:2012-12-17 02:30:12

标签: c++ opencv matrix compare

我有一个根据以下代码动态更改的矩阵;

 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何时被零填充?

5 个答案:

答案 0 :(得分:23)

我用过

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

这是一种非常简单(如果不是最优雅)的方式。

答案 1 :(得分:13)

要检查mat是否为空,请使用empty(),如果NewData是cv :: Mat,如果NewData中没有元素,则NewData.empty()返回true。

要检查它是否全为零,只需NewData == Mat::zeros(NewData.size(), NewData.type())

<强>更新

检查OpenCV源代码后,您实际上可以NewData == 0检查所有元素是否等于0.

答案 2 :(得分:3)

countNonZero(Mat)将在mat中提供许多非零值

答案 3 :(得分: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;
    }
}

答案 4 :(得分:1)

Mat对象具有empty属性,因此您可以要求Mat告诉您它是否有东西或为空。结果将为truefalse