Skip to content

Commit c8b405e

Browse files
savuoralalek
authored andcommitted
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
1 parent 9c3e86b commit c8b405e

File tree

1 file changed

+34
-30
lines changed

1 file changed

+34
-30
lines changed

modules/rgbd/src/tsdf.cpp

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,7 +1393,7 @@ void TSDFVolumeGPU::fetchPointsNormals(OutputArray points, OutputArray normals)
13931393
(int)divUp(globalSize[2], (unsigned int)localSize[2]));
13941394

13951395
const size_t counterSize = sizeof(int);
1396-
size_t lsz = localSize[0]*localSize[1]*localSize[2]*counterSize;
1396+
size_t lszscan = localSize[0]*localSize[1]*localSize[2]*counterSize;
13971397

13981398
const int gsz[3] = {ngroups[2], ngroups[1], ngroups[0]};
13991399
UMat groupedSum(3, gsz, CV_32S, Scalar(0));
@@ -1409,7 +1409,7 @@ void TSDFVolumeGPU::fetchPointsNormals(OutputArray points, OutputArray normals)
14091409
ocl::KernelArg::PtrReadOnly(volPoseGpu),
14101410
voxelSize,
14111411
voxelSizeInv,
1412-
ocl::KernelArg::Local(lsz),
1412+
ocl::KernelArg::Local(lszscan),
14131413
ocl::KernelArg::WriteOnlyNoSize(groupedSum));
14141414

14151415
if(!kscan.run(3, globalSize, localSize, true))
@@ -1422,12 +1422,6 @@ void TSDFVolumeGPU::fetchPointsNormals(OutputArray points, OutputArray normals)
14221422

14231423
// 2. fill output arrays according to per-group points count
14241424

1425-
ocl::Kernel kfill;
1426-
kfill.create("fillPtsNrm", source, options, &errorStr);
1427-
1428-
if(kfill.empty())
1429-
throw std::runtime_error("Failed to create kernel: " + errorStr);
1430-
14311425
points.create(gpuSum, 1, POINT_TYPE);
14321426
UMat pts = points.getUMat();
14331427
UMat nrm;
@@ -1438,31 +1432,41 @@ void TSDFVolumeGPU::fetchPointsNormals(OutputArray points, OutputArray normals)
14381432
}
14391433
else
14401434
{
1441-
// it won't access but empty args are forbidden
1435+
// it won't be accessed but empty args are forbidden
14421436
nrm = UMat(1, 1, POINT_TYPE);
14431437
}
1444-
UMat atomicCtr(1, 1, CV_32S, Scalar(0));
1445-
1446-
// mem size to keep pts (and normals optionally) for all work-items in a group
1447-
lsz = localSize[0]*localSize[1]*localSize[2]*elemSize;
14481438

1449-
kfill.args(ocl::KernelArg::PtrReadOnly(volume),
1450-
volResGpu.val,
1451-
volDims.val,
1452-
neighbourCoords.val,
1453-
ocl::KernelArg::PtrReadOnly(volPoseGpu),
1454-
voxelSize,
1455-
voxelSizeInv,
1456-
((int)needNormals),
1457-
ocl::KernelArg::Local(lsz),
1458-
ocl::KernelArg::PtrReadWrite(atomicCtr),
1459-
ocl::KernelArg::ReadOnlyNoSize(groupedSum),
1460-
ocl::KernelArg::WriteOnlyNoSize(pts),
1461-
ocl::KernelArg::WriteOnlyNoSize(nrm)
1462-
);
1463-
1464-
if(!kfill.run(3, globalSize, localSize, true))
1465-
throw std::runtime_error("Failed to run kernel");
1439+
if (gpuSum)
1440+
{
1441+
ocl::Kernel kfill;
1442+
kfill.create("fillPtsNrm", source, options, &errorStr);
1443+
1444+
if(kfill.empty())
1445+
throw std::runtime_error("Failed to create kernel: " + errorStr);
1446+
1447+
UMat atomicCtr(1, 1, CV_32S, Scalar(0));
1448+
1449+
// mem size to keep pts (and normals optionally) for all work-items in a group
1450+
size_t lszfill = localSize[0]*localSize[1]*localSize[2]*elemSize;
1451+
1452+
kfill.args(ocl::KernelArg::PtrReadOnly(volume),
1453+
volResGpu.val,
1454+
volDims.val,
1455+
neighbourCoords.val,
1456+
ocl::KernelArg::PtrReadOnly(volPoseGpu),
1457+
voxelSize,
1458+
voxelSizeInv,
1459+
((int)needNormals),
1460+
ocl::KernelArg::Local(lszfill),
1461+
ocl::KernelArg::PtrReadWrite(atomicCtr),
1462+
ocl::KernelArg::ReadOnlyNoSize(groupedSum),
1463+
ocl::KernelArg::WriteOnlyNoSize(pts),
1464+
ocl::KernelArg::WriteOnlyNoSize(nrm)
1465+
);
1466+
1467+
if(!kfill.run(3, globalSize, localSize, true))
1468+
throw std::runtime_error("Failed to run kernel");
1469+
}
14661470
}
14671471
}
14681472

0 commit comments

Comments
 (0)