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

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

要检查它是否全为零,简单地说,NewData == Mat::zeros(NewData.size(), NewData.type()).

更新:

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

于 2012-12-17T03:01:07.933 回答
3

countNonZero(Mat) 将在 mat 中给出 u 个非零

于 2016-06-10T09:33:41.607 回答
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 回答
1

Mat 对象有一个属性,所以你可以让 Mat 告诉你它是否有东西或者它是空的。结果将是truefalse

于 2019-01-24T13:19:06.403 回答