Как видно из заголовка, я хочу вычислить нормали поверхности данного изображения глубины, используя перекрестное произведение соседних пикселей. Я хотел бы использовать 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
, Vecf
я не знаю, почему это будет иметь какое-то значение):