memcpy vtkPoints使用GetVoidPointer方法

时间:2016-02-08 12:13:45

标签: c++ opencv vtk

我有一个opencv 3通道Mat,每个像素包含一个3D点。 现在我想将这个Mat(点)复制到VTK点,然后将polydata复制到可视化它。 有一个示例here显示了这一点,但我想使用memcpy直接将cv :: Mat复制到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点似乎是原点。 请指出我做错了。

1 个答案:

答案 0 :(得分: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