Как получить доступ к мату OpenCV Vec3f с .data?

#c #opencv

#c #opencv

Вопрос:

Для целей визуализации у меня есть мат, созданный как

 Mat_<Vec3f> I
  

Если это мат Vec3b, то я знаю, как использовать метод .data для доступа к его элементам.

 I.data[j*I.step   i*3   x], where x={0,1,2}, j is row and i is column
  

Я попытался сделать то же самое с Vec3f, но все приведенное ниже не работает (выдает ошибку):

 I.data[j*I.step   i*12   x], where x={0,4,8}
I.data[j*I.step[0]   i*I.step[1]*3   x], where x={0,4,8}
I.data[j*I.step[0]   i*I.step[1]*3   x], where x={0,I.step[1],I.step[1]*2}
  

Каков правильный способ сделать это? Я выбираю использовать .данные для достижения большей скорости выполнения (по сравнению с .at и .ptr).

Ответ №1:

просто попробуйте сначала использовать входную дверь 😉

 Vec3f amp; pixel = I.at<Vec3f>(j,i); // row, col world
  

если вам действительно нужен указатель, по крайней мере, используйте:

 Vec3f *pv = I.ptr<Vec3f>(j); // ptr to row j
pv[3][2] = 17; // 4th pixel, red channel
  

другими словами, по возможности избегайте доступа к необработанным данным uchar *

Комментарии:

1. Спасибо. Кажется, использование ptr в режиме выпуска уже очень эффективно. Я пытался снизить производительность в режиме отладки, что теперь кажется ненужным.

Ответ №2:

Ваша проблема в том, что I.данные — это a uchar * , поэтому вы извлекаете только один байт вашего числа с плавающей запятой.

Вам нужно что-то вроде

 float component = ((float*)(I.data   I.step.p[0]*j))[i * 3   x];  // where x = {0, 1, 2}
  

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

Комментарии:

1. Спасибо, что указали на это. Я должен был искать ответ в исходном коде. Тем не менее, это выглядит довольно сложно.