2016-02-08 59 views
0

我有一個opencv 3通道墊,每個像素包含一個3D點。 現在我想複製這個墊(點)到VTK點,然後polydata可視化它。 有一個示例here顯示了這一點,但我想直接使用memcpy將cv :: Mat複製到vtkPoints。使用GetVoidPointer方法memcpy vtkPoints

我所做的:

// Create colored point clodu in opencv format 
cv::Mat cld_cv = cv::Mat::zeros(1, 3, CV_32FC3); 
int num_points = cld_cv.cols * cld_cv.rows; 

// Fill cld_cv code here 
// ..... 

vtkSmartPointer<vtkPoints> points = 
     vtkSmartPointer<vtkPoints>::New(); 
points->SetNumberOfPoints(num_points); 
::memcpy(points->GetVoidPointer(0), cld_cv.data, sizeof(float) * num_points * 3); 

vtkSmartPointer<vtkPolyData> pointsPolydata = 
     vtkSmartPointer<vtkPolyData>::New(); 

pointsPolydata->SetPoints(points); 

// Normal VTK pipeline as shown in the example 

但是我只能看到1點,這似乎是在原點。 請指出我犯錯的地方。

回答

0

你使用的是什麼版本的OpenCV?我在電流文檔中沒有看到任何cv::Mat::data

此外,不保證vtkPointscv::Mat存儲在連續的內存塊中。查看VTK 6.2源,vtkPoints中的數據默認存儲爲FloatArray,它具有連續的存儲空間,因此您應該在那裏確定。 OpenCV提供了一種檢查方法。嘗試

if (cld_cv.isContinuous()) 
    ::memcpy(points->GetVoidPointer(0), cld_cv.ptr<float>(), sizeof(float) * num_points * 3); 
else { 
    std::cerr << "cv Mat not contiguous" << std::endl; 
    // other, perhaps not as fast, method of copy 
} 

有關詳細信息,請參閱OpenCV docs for isContinous

+0

'uchar * cv :: Mat :: data'似乎仍然保留在Cv 3.1中。 – mainactual

+0

我使用OpenCV 2.4.11,但是@mainactual表示它也應該在OpenCV3中可用。我會測試我的情況下墊子是否連續。謝謝 –