Ответ 1
Я использовал
if (countNonZero(NewData) < 1)
{
cout << "Eye contact occurs in this frame" << endl;
}
Это довольно простой (возможно, не самый элегантный) способ сделать это.
У меня есть матрица, которая динамически изменяется в соответствии со следующим кодом:
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()
возвращает true, если в NewData нет элемента.
Чтобы проверить, все ли это ноль, просто NewData == Mat::zeros(NewData.size(), NewData.type())
.
Update:
После проверки исходного кода OpenCV вы действительно можете сделать NewData == 0
, чтобы проверить, что все элементы равны 0.
countNonZero (Mat) даст u число не нулей в 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 сказать вам, есть ли у него что-то или оно пустое. Результат будет либо true
либо false
.