Подтвердить что ты не робот

Как определить, является ли cv:: Mat нулевой матрицей?

У меня есть матрица, которая динамически изменяется в соответствии со следующим кодом:

 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 заполняется нулями?

4b9b3361

Ответ 1

Я использовал

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

Это довольно простой (возможно, не самый элегантный) способ сделать это.

Ответ 2

Чтобы проверить, является ли матовый, если он пуст, используйте empty(), если NewData является cv:: Mat, NewData.empty() возвращает true, если в NewData нет элемента.

Чтобы проверить, все ли это ноль, просто NewData == Mat::zeros(NewData.size(), NewData.type()).

Update:

После проверки исходного кода OpenCV вы действительно можете сделать NewData == 0, чтобы проверить, что все элементы равны 0.

Ответ 3

countNonZero (Mat) даст u число не нулей в 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;
    }
}

Ответ 5

Объект Mat имеет пустое свойство, так что вы можете просто попросить Mat сказать вам, есть ли у него что-то или оно пустое. Результат будет либо true либо false.