-1

我在使用IDE VS2013使用OpenCV2(3.0.0)。我的要求是我們有一個三維點雲數據(帶參數XYZ),我可以將該三維點雲轉化爲二維圖像,並且我們可以使用Opencv將雲數據轉換爲圖像,而無需鏈接PCL。使用OpenCV將雲數據轉換爲2d圖像

它可能嗎?

如果可能的話,任何人都可以向我推薦如何使用OpenCV的示例代碼進行轉換。

任何建議將有助於 預先感謝

回答

0

的問題是不是真的清楚。將點雲「轉換」爲2D圖像意味着什麼?
我會假設通過「轉換」你的意思是項目。
在opencv中,使用projectpointshttp://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#projectpoints可以將投影上的點雲或任何3d點映射到二維圖像上。

這是基於針孔相機模型,看看這裏例如: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/FUSIELLO4/tutorial.html

可以alsot看看這個問題: OpenCV's projectPoints function

裸記住,你會不會能夠重建您原始的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; 
} 
+0

感謝您的回覆丹尼爾,我的工作就可以了,如果我遇到任何問題,我會盡快回復您。 – KHV