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

How to determine if a cv::Mat is a zero matrix?

本文关键字:Mat 何确定 cv 是否      更新时间:2023-10-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何时由零填充?

我用过

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 ) 将在 mat

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

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