我有一个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点似乎是原点。 请指出我做错了。
答案 0 :(得分:0)
您使用的是哪个版本的OpenCV?我没有在潮流文档中看到任何cv::Mat::data
。
此外,无法保证vtkPoints
或cv::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。