-1

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

Возможно ли ???

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

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

ответ

0

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

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

Вы можете alsot взглянуть на этот вопрос: OpenCV's projectPoints function

Голые в виду, что вы не будете (поскольку информация о глубине была потеряна в процессе проецирования)

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

Вот пример:

#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; 
} 
+0

Спасибо за Ваш ответ Daniel, я работаю над этим, и если я никаких проблем я вернусь к вам. – KHV

 Смежные вопросы

  • Нет связанных вопросов^_^