【问题标题】:How to determine if a cv::Mat is a zero matrix?如何确定 cv::Mat 是否为零矩阵?
【发布时间】:2012-12-04 03:50:35
【问题描述】:

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

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

【问题讨论】:

    标签: c++ opencv matrix compare


    【解决方案1】:

    我用过

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

    这是一种非常简单(也许不是最优雅)的方法。

    【讨论】:

      【解决方案2】:

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

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

      更新:

      查看OpenCV源码后,其实可以NewData == 0检查所有元素是否等于0。

      【讨论】:

      • 当我尝试这个时,我收到以下错误消息:could not convert 'cv::operator==(const cv::Mat&, const cv::Mat&)(((const cv:: Mat&)((const cv::Mat*)(& cv::MatExpr::operator cv::Mat() const()))))' to 'bool'
      • 我复制了你的台词。你有编译的代码吗?什么版本的 OpenCV? cv::Mat 的标头显示运算符 '==' 没有重载
      • @Spaceghost,你可以检查你的opencv的mat.hpp,1306行附近有一些东西。我当前是最新的repo,但是从2.0开始应该有这样的功能。
      • 我复制了您的行并在其前面加上了一个“如果”.. 这似乎是问题所在。你能在上下文中显示你的代码吗?
      • 显然,作者并没有要求检查 mat 是否为空。 “是否有一种简单的方法可以确定 cv::Mat 何时填充零?”
      【解决方案3】:

      countNonZero(Mat) 将给出 mat 中非零的数量

      【讨论】:

        【解决方案4】:

        这个怎么样..

        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.为什么迭代器的参数是,而不是矩阵的类型?
        • 2.为什么 C++ 代码会被 C 代码污染?例如,有 cv::Size() 而不是 cvSize()
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-13
          • 2012-07-17
          • 1970-01-01
          • 2016-01-30
          • 2021-06-11
          • 1970-01-01
          相关资源
          最近更新 更多