mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-19 02:16:34 +08:00
Merge pull request #2410 from savuor:fix/kinfu_fetch_checkzero
Fixed KinFu getCloud() at empty volume * KinFu getCloud(): an empty volume check added to OCL code * minor
This commit is contained in:

committed by
Alexander Alekhin

parent
9c3e86b7ae
commit
c8b405eb7f
@@ -1393,7 +1393,7 @@ void TSDFVolumeGPU::fetchPointsNormals(OutputArray points, OutputArray normals)
|
|||||||
(int)divUp(globalSize[2], (unsigned int)localSize[2]));
|
(int)divUp(globalSize[2], (unsigned int)localSize[2]));
|
||||||
|
|
||||||
const size_t counterSize = sizeof(int);
|
const size_t counterSize = sizeof(int);
|
||||||
size_t lsz = localSize[0]*localSize[1]*localSize[2]*counterSize;
|
size_t lszscan = localSize[0]*localSize[1]*localSize[2]*counterSize;
|
||||||
|
|
||||||
const int gsz[3] = {ngroups[2], ngroups[1], ngroups[0]};
|
const int gsz[3] = {ngroups[2], ngroups[1], ngroups[0]};
|
||||||
UMat groupedSum(3, gsz, CV_32S, Scalar(0));
|
UMat groupedSum(3, gsz, CV_32S, Scalar(0));
|
||||||
@@ -1409,7 +1409,7 @@ void TSDFVolumeGPU::fetchPointsNormals(OutputArray points, OutputArray normals)
|
|||||||
ocl::KernelArg::PtrReadOnly(volPoseGpu),
|
ocl::KernelArg::PtrReadOnly(volPoseGpu),
|
||||||
voxelSize,
|
voxelSize,
|
||||||
voxelSizeInv,
|
voxelSizeInv,
|
||||||
ocl::KernelArg::Local(lsz),
|
ocl::KernelArg::Local(lszscan),
|
||||||
ocl::KernelArg::WriteOnlyNoSize(groupedSum));
|
ocl::KernelArg::WriteOnlyNoSize(groupedSum));
|
||||||
|
|
||||||
if(!kscan.run(3, globalSize, localSize, true))
|
if(!kscan.run(3, globalSize, localSize, true))
|
||||||
@@ -1422,12 +1422,6 @@ void TSDFVolumeGPU::fetchPointsNormals(OutputArray points, OutputArray normals)
|
|||||||
|
|
||||||
// 2. fill output arrays according to per-group points count
|
// 2. fill output arrays according to per-group points count
|
||||||
|
|
||||||
ocl::Kernel kfill;
|
|
||||||
kfill.create("fillPtsNrm", source, options, &errorStr);
|
|
||||||
|
|
||||||
if(kfill.empty())
|
|
||||||
throw std::runtime_error("Failed to create kernel: " + errorStr);
|
|
||||||
|
|
||||||
points.create(gpuSum, 1, POINT_TYPE);
|
points.create(gpuSum, 1, POINT_TYPE);
|
||||||
UMat pts = points.getUMat();
|
UMat pts = points.getUMat();
|
||||||
UMat nrm;
|
UMat nrm;
|
||||||
@@ -1438,31 +1432,41 @@ void TSDFVolumeGPU::fetchPointsNormals(OutputArray points, OutputArray normals)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// it won't access but empty args are forbidden
|
// it won't be accessed but empty args are forbidden
|
||||||
nrm = UMat(1, 1, POINT_TYPE);
|
nrm = UMat(1, 1, POINT_TYPE);
|
||||||
}
|
}
|
||||||
UMat atomicCtr(1, 1, CV_32S, Scalar(0));
|
|
||||||
|
|
||||||
// mem size to keep pts (and normals optionally) for all work-items in a group
|
if (gpuSum)
|
||||||
lsz = localSize[0]*localSize[1]*localSize[2]*elemSize;
|
{
|
||||||
|
ocl::Kernel kfill;
|
||||||
|
kfill.create("fillPtsNrm", source, options, &errorStr);
|
||||||
|
|
||||||
kfill.args(ocl::KernelArg::PtrReadOnly(volume),
|
if(kfill.empty())
|
||||||
volResGpu.val,
|
throw std::runtime_error("Failed to create kernel: " + errorStr);
|
||||||
volDims.val,
|
|
||||||
neighbourCoords.val,
|
|
||||||
ocl::KernelArg::PtrReadOnly(volPoseGpu),
|
|
||||||
voxelSize,
|
|
||||||
voxelSizeInv,
|
|
||||||
((int)needNormals),
|
|
||||||
ocl::KernelArg::Local(lsz),
|
|
||||||
ocl::KernelArg::PtrReadWrite(atomicCtr),
|
|
||||||
ocl::KernelArg::ReadOnlyNoSize(groupedSum),
|
|
||||||
ocl::KernelArg::WriteOnlyNoSize(pts),
|
|
||||||
ocl::KernelArg::WriteOnlyNoSize(nrm)
|
|
||||||
);
|
|
||||||
|
|
||||||
if(!kfill.run(3, globalSize, localSize, true))
|
UMat atomicCtr(1, 1, CV_32S, Scalar(0));
|
||||||
throw std::runtime_error("Failed to run kernel");
|
|
||||||
|
// mem size to keep pts (and normals optionally) for all work-items in a group
|
||||||
|
size_t lszfill = localSize[0]*localSize[1]*localSize[2]*elemSize;
|
||||||
|
|
||||||
|
kfill.args(ocl::KernelArg::PtrReadOnly(volume),
|
||||||
|
volResGpu.val,
|
||||||
|
volDims.val,
|
||||||
|
neighbourCoords.val,
|
||||||
|
ocl::KernelArg::PtrReadOnly(volPoseGpu),
|
||||||
|
voxelSize,
|
||||||
|
voxelSizeInv,
|
||||||
|
((int)needNormals),
|
||||||
|
ocl::KernelArg::Local(lszfill),
|
||||||
|
ocl::KernelArg::PtrReadWrite(atomicCtr),
|
||||||
|
ocl::KernelArg::ReadOnlyNoSize(groupedSum),
|
||||||
|
ocl::KernelArg::WriteOnlyNoSize(pts),
|
||||||
|
ocl::KernelArg::WriteOnlyNoSize(nrm)
|
||||||
|
);
|
||||||
|
|
||||||
|
if(!kfill.run(3, globalSize, localSize, true))
|
||||||
|
throw std::runtime_error("Failed to run kernel");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user