2015-05-04 4 views
0

Я работаю с доступом к OpenCv Mat и копирую в (C++). Учитывая следующий пример:Метод строки Opencv имеет странное поведение

cv::Mat values = cv::Mat::zeros(100, 1, CV_32FC1); 
for (int i = 0; i < 100; i++) { 
     values.at<float>(i, 1) = 10 + i; 

} 

cout<<values.at<float>(0, 1)<<endl; // prints 10 
cout<<values.at<float>(1, 1)<<endl; // prints 11 
cout<<values.row(0) <<endl; // prints 0 
cout<<values.row(1)<<endl; // prints 10 
cout<<values.row(2)<<endl; // prints 11 

Проблема заключается в том, что row(0) всегда возвращает 0 и доступ к Mat с row(1)...row(n) имеет смещение +1 по отношению к методу at<>() который выглядит странно для меня. Я что-то пропустил или является известной проблемой OpenCv?

+3

'values.at (i, 1)' уже выходит за пределы для 1-столбцового мата. здесь справедливо только (i, 0). пожалуйста, запустите отладочную сборку, поэтому вы получите правильные исключения, которые вы выбрали здесь (будучи «одноразовым», - вы не инициализировали 1-й элемент) – berak

ответ

2

Посмотрите на Mat::zeros(), так, как вы говорите, rows = 100cols = 1. Когда вы вызываете values.at<float>(i, 1) с i = 0, вы получаете доступ к элементу в строке 0 и col 1, что, конечно же, выходит за пределы вашего Mat.

Изменить values.at<float>(i, 1) на values.at<float>(i, 0) и для дальнейшего использования выполните свои сборки в режиме отладки, где утверждения OpenCV поймают ваши ошибки, подобные этому.

+0

Спасибо, я полностью пропустил, что я обращался к Mat за пределы! – gcswoosh

Смежные вопросы