gcswoosh
gcswoosh

Reputation: 1299

Opencv row method has a strange behavior

I'm working with OpenCv Mat access and copy in (C++). Considering the following example:

 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

The problem is that row(0) always returns 0 and accessing the Mat with row(1)...row(n) has an offset of +1 with respect to the method at<>() which looks strange to me. Am I missing something or is a known issue of OpenCv?

Upvotes: 0

Views: 61

Answers (1)

mirosval
mirosval

Reputation: 6822

Look at Mat::zeros(), the way you call it is rows = 100 cols = 1. When you call values.at<float>(i, 1) with i = 0 you are accessing the element at row 0 and col 1, which of course is out of bounds of your Mat.

Change values.at<float>(i, 1) to values.at<float>(i, 0) and for future reference run your builds in Debug mode where OpenCV assertions will catch your errors like this one.

Upvotes: 2

Related Questions