Я использую cv::divide
и обнаружил странную ошибку:
Предположим, что в Mat есть NAN, а Mat содержит более 3 элементов.Если Мат является знаменателем, результатом будет все NAN, независимо от того, какая позиция является NAN.
Я определил NAN таким образом:
float const NAN_f = numeric_limits<float>::quiet_NaN();
И вот код:
Mat A4 = (Mat_<float>(1, 4) << 1, NAN_f, 2, 3);
Mat B4 = (Mat_<float>(1, 4) << 4, 5, 5, 6);
Mat A4_B4;
Mat B4_A4;
divide(A4, B4, A4_B4);
divide(B4, A4, B4_A4);
cout << A4_B4 << endl;
cout << B4_A4 << endl;
вывод:
[0.25, nan, 0.40000001, 0.5]
[nan, nan, nan, nan]
кстати, косая черта /
получит тот же неправильный результат:
cout << A4 / B4 << endl;
cout << B4 / A4 << endl;
результат:
[0.25, nan, 0.40000001, 0.5]
[nan, nan, nan, nan]
НО, если Mat меньше 4 элементов, функция деления или /
выдаст правильный результат:
Mat A3 = (Mat_<float>(1, 3) << 1, 2, NAN_f);
Mat B3 = (Mat_<float>(1, 3) << 4, 5, 6);
Mat A3_B3;
Mat B3_A3;
divide(A3, B3, A3_B3);
divide(B3, A3, B3_A3);
cout << A3_B3 << endl;
cout << B3_A3 << endl;
cout << A3 / B3 << endl;
cout << B3 / A3 << endl;
result:
[0.25, 0.40000001, nan]
[4, 2.5, nan]
[0.25, 0.40000001, nan]
[4, 2.5, nan]
И если в мате 5 элементов, 5-й элемент результата корректен, а остальные 4 являются NAN:
Mat A5 = (Mat_<float>(1, 5) << 1, NAN_f, 2, 3, 4);
Mat B5 = (Mat_<float>(1, 5) << 4, 5, 6, 7, 8);
Mat A5_B5;
Mat B5_A5;
divide(A5, B5, A5_B5);
divide(B5, A5, B5_A5);
cout << A5_B5 << endl;
cout << B5_A5 << endl;
cout << A5 / B5 << endl;
cout << B5 / A5 << endl;
result:
[0.25, nan, 0.33333334, 0.42857143, 0.5]
[nan, nan, nan, nan, 2]
[0.25, nan, 0.33333334, 0.42857143, 0.5]
[nan, nan, nan, nan, 2]
Мне просто интересно, является ли это бором или это просто особая характеристика деления в opencv. Моя версия opencv - 2.4.8.
#define CV_VERSION_EPOCH 2
#define CV_VERSION_MAJOR 4
#define CV_VERSION_MINOR 8
#define CV_VERSION_REVISION 0
И есть ли решение для решения проблемы разделения NAN кроме написать поэлементную функцию деления в цикле?
Спасибо!