Как следует из названия, я хочу вычислить нормали поверхности заданного изображения глубины, используя перекрестное произведение соседних пикселей. Я хотел бы использовать для этого Opencv и избегать использования PCL, однако я не совсем понимаю процедуру, так как мои знания в этой области весьма ограничены. Поэтому буду признателен, если кто-нибудь подскажет. Упомянем здесь, что у меня нет никакой другой информации, кроме изображения глубины и соответствующего изображения RGB, поэтому нет информации о K
матрице камеры.
Итак, допустим, что у нас есть следующее изображение глубины:
и я хочу найти вектор нормали в соответствующей точке с соответствующим значением глубины, как на следующем изображении:
Как я могу сделать это, используя перекрестное произведение соседних пикселей? Я не возражаю, если нормали не отличаются высокой точностью.
Спасибо.
Обновление:
Хорошо, я пытался следовать ответу @timday и портировать его код в Opencv. Со следующим кодом:
Mat depth = <my_depth_image> of type CV_32FC1
Mat normals(depth.size(), CV_32FC3);
for(int x = 0; x < depth.rows; ++x)
{
for(int y = 0; y < depth.cols; ++y)
{
float dzdx = (depth.at<float>(x+1, y) - depth.at<float>(x-1, y)) / 2.0;
float dzdy = (depth.at<float>(x, y+1) - depth.at<float>(x, y-1)) / 2.0;
Vec3f d(-dzdx, -dzdy, 1.0f);
Vec3f n = normalize(d);
normals.at<Vec3f>(x, y) = n;
}
}
imshow("depth", depth / 255);
imshow("normals", normals);
Я получаю правильный следующий результат (мне пришлось заменить double
на float
и Vecd
на Vecf
, хотя я не знаю, почему это имеет значение):
imshow()
их, то я получу хорошее изображение по сравнению с изображением выше. - person ttsesm   schedule 08.01.2016