Преобразование облачных данных в 2D-изображение с использованием OpenCV

Я использую OpenCV2 (3.0.0) с IDE VS2013. Мое требование состоит в том, что у нас есть данные трехмерного облака точек (с параметрами XYZ), могу ли я преобразовать это трехмерное облако точек в двухмерное изображение и можем ли мы преобразовать данные облака в изображение с помощью Opencv без привязки PCL.

Является ли это возможным???

Если возможно, кто-нибудь может предложить мне, как конвертировать, с образцом кода OpenCV.

Любые предложения будут полезны Заранее спасибо


person KHV    schedule 18.11.2016    source источник


Ответы (1)


Вопрос не совсем ясен. Что вы подразумеваете под «преобразованием» облака точек в 2D-изображение?
Я предполагаю, что под «преобразованием» вы подразумеваете проект.
В opencv облако точек или любая 3D-точка в этом отношении может быть < strong>спроецировано на двухмерное изображение с использованием projectpoints: http://docs.opencv.org/2.4/modules/calib3d/doc/camera_dication_and_3d_reconstruction.html#projectpoints.

Это основано на модели камеры-обскуры, посмотрите, например, здесь: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/FUSIELLO4/tutorial.html

Вы также не можете взглянуть на этот вопрос: функция OpenCV projectPoints

Имейте в виду, что вы не сможете реконструировать исходные 3D-данные (поскольку информация о глубине была потеряна в процессе проецирования).

Для упрощения мы можем использовать «идеальную» проекционную модель (без искажений объектива камеры) с произвольным фокусным расстоянием (если вы хотите отобразить изображение, вам нужно поиграть с фокусным расстоянием в соответствии с вашими данными, чтобы значения проецируемых точек не слишком велики, например, не выше 2048, что соответствует ширине изображения с разрешением 2k).

Вот пример:

#include <string>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;


std::vector<cv::Point3d> Generate3DPoints();

int main(int argc, char* argv[])
{
    // Read 3D points
    std::vector<cv::Point3d> objectPoints = Generate3DPoints();
    std::vector<cv::Point2d> imagePoints;

    int f = 5;  //focal length

    for (unsigned int i = 0; i < objectPoints.size(); i++)
    {
        cv::Point3d orig_point = objectPoints[i];
        imagePoints.push_back(cv::Point2d(
            f*orig_point.x / orig_point.z,  //x' = f*x/z
            f*orig_point.y / orig_point.z)  //y' = f*y/z
            );
    }
}

std::vector<cv::Point3d> Generate3DPoints()
{
    std::vector<cv::Point3d> points;

    double x, y, z;

    x = .5; y = .5; z = -.5;
    points.push_back(cv::Point3d(x, y, z));

    x = .5; y = .5; z = .5;
    points.push_back(cv::Point3d(x, y, z));

    x = -.5; y = .5; z = .5;
    points.push_back(cv::Point3d(x, y, z));

    x = -.5; y = .5; z = -.5;
    points.push_back(cv::Point3d(x, y, z));

    x = .5; y = -.5; z = -.5;
    points.push_back(cv::Point3d(x, y, z));

    x = -.5; y = -.5; z = -.5;
    points.push_back(cv::Point3d(x, y, z));

    x = -.5; y = -.5; z = .5;
    points.push_back(cv::Point3d(x, y, z));

    for (unsigned int i = 0; i < points.size(); ++i)
    {
        std::cout << points[i] << std::endl << std::endl;
    }

    return points;
}
person Daniel    schedule 18.11.2016
comment
Спасибо за ваш ответ, Даниил, я работаю над этим, и если у меня возникнут какие-либо проблемы, я свяжусь с вами. - person KHV; 21.11.2016