When you capture with Zivid, you get a frame in return.
The point cloud is stored in the frame, and the frame is stored in the GPU memory.
The capture can contain color or not, depending of the method that you call.
For more information see this table with different capture modes.
이 메서드 Zivid::Frame::pointCloud() 는 GPU 메모리에서 복사를 수행하지 않습니다.
참고
Zivid::Camera::capture2D3D() and Zivid::Camera::capture3D() methods return at some moment in time after the camera completes capturing raw images.
The handle from Zivid::Frame::pointCloud() is available instantly.
However, the actual point cloud data becomes available only after the processing on the GPU is finished.
Any calls to data-copy functions (section below) will block and wait for processing to finish before proceeding with the requested copy operation.
Zivid.NET.Frame.PointCloud 특성을 얻을 때는 GPU 메모리에서 복사를 수행하지 않습니다.
참고
Zivid.NET.Camera.Capture2D3D() and Zivid.NET.Camera.Capture3D() methods return at some moment in time after the camera completes capturing raw images.
The handle from Zivid.NET.Frame.PointCloud is available instantly.
However, the actual point cloud data becomes available only after the processing on the GPU is finished.
Any calls to data-copy methods (section below) will block and wait for processing to finish before proceeding with the requested copy operation.
zivid.frame.point_cloud() 함수는 GPU 메모리에서 복사를 수행하지 않습니다.
참고
zivid.camera.capture_2d_3d() and zivid.camera.capture_3d() methods return at some moment in time after the camera completes capturing raw images.
The handle from zivid.frame.point_cloud() is available instantly.
However, the actual point cloud data becomes available only after the processing on the GPU is finished.
Any calls to data-copy functions (section below) will block and wait for processing to finish before proceeding with the requested copy operation.
It is possible to convert the organized point cloud to an unorganized point cloud.
While doing so, all NaN values are removed, and the point cloud is flattened to a 1D array.
You can now selectively copy data based on what is required.
This is the complete list of output data formats and how to copy them from the GPU.
Most of these APIs also applies to the unorganized point cloud.
Return type
Copy functions
Data per pixel
Total data
Zivid::Array2D<Zivid::PointXYZ>
PointCloud::copyPointsXYZ() 또는 PointCloud::copyData<Zivid::PointXYZ>()
12 bytes
28 MB
Zivid::Array2D<Zivid::PointXYZW>
PointCloud::copyPointsXYZW() 또는 PointCloud::copyData<Zivid::PointXYZW>()
16 bytes
37 MB
Zivid::Array2D<Zivid::PointZ>
PointCloud::copyPointsZ() 또는 PointCloud::copyData<Zivid::PointZ>()
4 bytes
9 MB
Zivid::Array2D<Zivid::ColorRGBA>
PointCloud::copyColorsRGBA() 또는 PointCloud::copyData<Zivid::ColorRGBA>()
4 bytes
9 MB
Zivid::Array2D<Zivid::SNR>
PointCloud::copySNRs() 또는 PointCloud::copyData<Zivid::SNR>()
4 bytes
9 MB
Zivid::Array2D<Zivid::PointXYZColorRGBA>
PointCloud::copyData<PointXYZColorRGBA>()
16 bytes
37 MB
Zivid::Array2D<Zivid::PointXYZColorBGRA>
PointCloud::copyPointsXYZColorsBGRA() 또는 PointCloud::copyData<PointXYZColorBGRA>()
std::cout<<"Capturing frame"<<std::endl;frame=camera.capture2D3D(settings);std::cout<<"Copying colors with Zivid API from GPU to CPU"<<std::endl;autocolors=frame.frame2D().value().imageBGRA_SRGB();std::cout<<"Casting the data pointer as a void*, since this is what the OpenCV matrix constructor requires."<<std::endl;auto*dataPtrZividAllocated=const_cast<void*>(static_cast<constvoid*>(colors.data()));std::cout<<"Wrapping this block of data in an OpenCV matrix. This is possible since the layout of \n"<<"Zivid::ColorBGRA_SRGB exactly matches the layout of CV_8UC4. No copying occurs in this step."<<std::endl;constcv::MatbgraZividAllocated(colors.height(),colors.width(),CV_8UC4,dataPtrZividAllocated);std::cout<<"Displaying image"<<std::endl;cv::imshow("BGRA image Zivid Allocated",bgraZividAllocated);cv::waitKey(CI_WAITKEY_TIMEOUT_IN_MS);
Copy selected data from GPU to CPU memory (user-allocated)
위 예에서 데이터의 소유권은 반환된 Zivid::Array2D<> 개체에 의해 유지됩니다. 또는 사전 Zivid::PointCloud::copyData(dataPtr) 에 할당된 메모리 버퍼를 제공할 수 있습니다. dataPtr 의 유형은 복사할 대상을 정의합니다(PointXYZ, ColorRGBA, 등.).
이제 위와 똑같은 사용 사례를 살펴보겠습니다. 그러나 이번에는 OpenCV가 필요한 스토리지를 할당하도록 허용합니다. 그런 다음 GPU에서 이 메모리 위치로 데이터를 직접 복사하도록 Zivid API에 요청합니다.
std::cout<<"Allocating the necessary storage with OpenCV API based on resolution info before any capturing"<<std::endl;autobgraUserAllocated=cv::Mat(resolution.height(),resolution.width(),CV_8UC4);std::cout<<"Capturing frame"<<std::endl;autoframe=camera.capture2D3D(settings);autopointCloud=frame.pointCloud();std::cout<<"Copying data with Zivid API from the GPU into the memory location allocated by OpenCV"<<std::endl;pointCloud.copyData(&(*bgraUserAllocated.begin<Zivid::ColorBGRA_SRGB>()));std::cout<<"Displaying image"<<std::endl;cv::imshow("BGRA image User Allocated",bgraUserAllocated);cv::waitKey(CI_WAITKEY_TIMEOUT_IN_MS);
Copy unorganized point cloud data from GPU to CPU memory (Open3D-tensor)
open3d::t::geometry::PointCloudcopyToOpen3D(constZivid::UnorganizedPointCloud&pointCloud){usingnamespaceopen3d::core;autodevice=Device("CPU:0");autoxyzTensor=Tensor({static_cast<int64_t>(pointCloud.size()),3},Dtype::Float32,device);autorgbTensor=Tensor({static_cast<int64_t>(pointCloud.size()),3},Dtype::Float32,device);pointCloud.copyData(reinterpret_cast<Zivid::PointXYZ*>(xyzTensor.GetDataPtr<float>()));// Open3D does not store colors in 8-bitconstautorgbaColors=pointCloud.copyColorsRGBA_SRGB();for(size_ti=0;i<pointCloud.size();++i){constautor=static_cast<float>(rgbaColors(i).r)/255.0f;constautog=static_cast<float>(rgbaColors(i).g)/255.0f;constautob=static_cast<float>(rgbaColors(i).b)/255.0f;rgbTensor.SetItem(TensorKey::Index(i),Tensor::Init({r,g,b}));}open3d::t::geometry::PointCloudcloud(device);cloud.SetPointPositions(xyzTensor);cloud.SetPointColors(rgbTensor);returncloud;}
The following example shows how create a new instance of Zivid::UnorganizedPointCloud with a transformation applied to it.
Note that in this sample is is not necessary to create a new instance, as the untransformed point cloud is not used after the transformation.
때로는 카메라에서 촬영되는 high spatial resolution 와 같은 포인트 클라우드가 필요하지 않을 수 있습니다. 직접 포인트 클라우드를 downsample 할 수 있습니다.
참고
Sampling (3D) describes a hardware-based sub-/downsample method that reduces the resolution of the point cloud during capture while also reducing the acquisition and capture time.
참고
Zivid::UnorganizedPointCloud does not support downsampling, but it does support voxel downsampling, see Voxel downsample.
Zivid::UnorganizedPointCloud supports voxel downsampling.
The API takes two arguments:
voxelSize - the size of the voxel in millimeters.
minPointsPerVoxel - the minimum number of points per voxel to keep it.
Voxel downsampling subdivides 3D space into a grid of cubic voxels with a given size.
If a given voxel contains a number of points at or above the given limit, all those source points are replaced with a single point with the following properties:
Position (XYZ) is an SNR-weighted average of the source points’ positions, i.e. a high-confidence source point will have a greater influence on the resulting position than a low-confidence one.
Color (RGBA) is the average of the source points’ colors.
Signal-to-noise ratio (SNR) is sqrt(sum(SNR^2)) of the source points’ SNR values, i.e. the SNR of a new point will increase with both the number and the confidence of the source points that were used to compute its position.
Using minPointsPerVoxel > 1 is particularly useful for removing noise and artifacts from unorganized point clouds that are a combination of point clouds captured from different angles.
This is because a given artifact is most likely only present in one of the captures, and minPointsPerVoxel can be used to only fill voxels that both captures “agree” on.
std::cout<<"Setting up visualization"<<std::endl;Zivid::Visualization::Visualizervisualizer;std::cout<<"Visualizing point cloud"<<std::endl;visualizer.showMaximized();visualizer.show(frame);visualizer.resetToFit();std::cout<<"Running visualizer. Blocking until window closes."<<std::endl;visualizer.run();
Console.WriteLine("Setting up visualization");using(varvisualizer=newZivid.NET.Visualization.Visualizer()){Console.WriteLine("Visualizing point cloud");visualizer.Show(frame);visualizer.ShowMaximized();visualizer.ResetToFit();Console.WriteLine("Running visualizer. Blocking until window closes.");visualizer.Run();}
std::cout<<"Getting point cloud from frame"<<std::endl;autopointCloud=frame.pointCloud();std::cout<<"Setting up visualization"<<std::endl;Zivid::Visualization::Visualizervisualizer;std::cout<<"Visualizing point cloud"<<std::endl;visualizer.showMaximized();visualizer.show(pointCloud);visualizer.resetToFit();std::cout<<"Running visualizer. Blocking until window closes."<<std::endl;visualizer.run();
Console.WriteLine("Getting point cloud from frame");varpointCloud=frame.PointCloud;Console.WriteLine("Setting up visualization");varvisualizer=newZivid.NET.Visualization.Visualizer();Console.WriteLine("Visualizing point cloud");visualizer.Show(pointCloud);visualizer.ShowMaximized();visualizer.ResetToFit();Console.WriteLine("Running visualizer. Blocking until window closes.");visualizer.Run();
자세한 내용은 다음을 확인하세요. Visualization Tutorial, 여기서 우리는 타사 라이브러리를 사용하여 포인트 클라우드, 컬러 이미지, 깊이 맵 및 법선 시각화를 다룹니다.
Added support for Zivid::UnorganizedPointCloud.
transformed is added as a function to Zivid::PointCloud (also available in Zivid::UnorganizedPointCloud).