Подтвердить что ты не робот

Доступ к элементам cv:: Mat с помощью <float> (i, j). Это (x, y) или (строка, col)?

Когда мы обращаемся к определенным элементам структуры cv:: Mat, мы можем использовать mat.at(i, j) для доступа к элементу в позиции i, j. Однако не сразу понятно, относится ли (i, j) к координате x, y в матрице или к i-й строке и j-му столбцу.

4b9b3361

Ответ 1

OpenCV, как и другие библиотеки, обрабатывает матрицы (и изображения) в строчном порядке. Это означает, что каждый доступ определяется как (row, column).

Известными исключениями из этого общего правила являются библиотеки Matlab и Eigen.

Ответ 2

OpenCV, как и многие другие библиотеки, обрабатывает матрицу доступ в строчном порядке. Это означает, что каждый доступ определяется как (row, column). Обратите внимание: если вы работаете с координатами x и y изображения, это становится (y, x), если y - ваша вертикальная ось.

Большинство матричных библиотек одинаковы в этом отношении, доступ - (row, col), а также, например, в Matlab или Eigen (библиотека матриц С++).

Если эти приложения и библиотеки отличаются друг от друга, это то, как данные на самом деле сохранены в памяти. OpenCV хранит данные в основном порядке в памяти (т.е. Первые строки), в то время как, например, Matlab хранит данные в основном порядке по порядку в памяти. Но если вы просто являетесь пользователем этих библиотек и получаете доступ к данным через аксессуар (row, col), вы никогда не увидите эту разницу в порядке хранения памяти.

Ответ 3

Итак, OpenCV справляется с этим немного странно. OpenCV хранит Mat в строчном порядке, но обращение к нему по методу Mat:: at() ложно предлагает основной порядок столбцов. Я думаю, что документация Opencv в этом случае вводит в заблуждение. Я должен был написать этот тест, чтобы убедиться в этом.

cv::Mat m(3,3,CV_32FC1,0.0f);
m.at<float>(1,0) = 2;
cout << m << endl;

Таким образом, адресация выполняется с помощью Mat:: at (y, x):

[0, 0, 0;
 2, 0, 0;
 0, 0, 0]

Однако доступ к необработанному указателю показывает, что он фактически хранится в строке строки, например. "2" находится в 4-й позиции. Если он хранится в основном порядке столбца, он будет во 2-й позиции.

float* mp = &m.at<float>(0);
for(int i=0;i<9;i++)
    cout << mp[i] << " ";

0 0 0 2 0 0 0 0 0

Как побочное замечание: Matlab хранит и адресует матрицу в основном порядке столбца. Это может раздражать, но, по крайней мере, это непротиворечиво.

Ответ 4

Из того, что я прочитал в документации, это at(y, x) (т.е. row, col).

Ответ 5

Так как cv::Mat на самом деле является общей матрицей, причем образы являются лишь частным случаем, то это следует за индексом матрицы, и поэтому строка (y) приходит перед столбцом (x):

mat.at(i, j) = mat.at(row, col) = mat.at(y, x)