#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. Спасибо, что указали на это. Я должен был искать ответ в исходном коде. Тем не менее, это выглядит довольно сложно.