Это ошибка при использовании cv :: div или / с NAN? - PullRequest
0 голосов
/ 06 июня 2018

Я использую 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 кроме написать поэлементную функцию деления в цикле?

Спасибо!

...