cl_int2 PointSmoother::SearchLinearDirection(cl_float4* pointCloud, const cl_int2& pixel, cl_float4& normal) { // direc.x, y <= MG static const cl_int2 direc[] = {{2,0}, {2,2}, {0,2}, {-2,2}}; const int szdir = 4; const cl_float4& herept = pointCloud[PIXIDX(pixel)]; const float distUppLimit = clDot(normal, herept)*0.002f; float flatness, minDist = distUppLimit; int minIndex = -1; // search flattest direction for(int i=0; i<szdir; i++) { const cl_float4& leftpt = pointCloud[IMGIDX(pixel.y-direc[i].y, pixel.x-direc[i].x)]; const cl_float4& righpt = pointCloud[IMGIDX(pixel.y+direc[i].y, pixel.x+direc[i].x)]; if(clIsNull(leftpt) || clIsNull(righpt)) continue; flatness = fabs(clDot(normal, (leftpt - righpt))); if(flatness < minDist) { minDist = flatness; minIndex = i; } } if(minIndex < 0) return (cl_int2) { 0,0 }; else return direc[minIndex]; }
void DescriptorMakerCpu::ComputeDescriptors(const cl_float4* pointCloud, const cl_float4* normalCloud , const cl_int* neighborIndices, const cl_int* numNeighbors, int maxNeighbs , DescType* descriptors) { // int ptpos = 150*IMAGE_WIDTH + 150; // if(IsInvalidPoint(pointCloud[ptpos]) || clIsNull(normalCloud[ptpos])) // return; // if(numNeighbors[ptpos] < maxNeighbs/2) // return; // descriptors[ptpos] = ComputeEachDescriptor(pointCloud[ptpos], normalCloud[ptpos] // , pointCloud, neighborIndices, ptpos*maxNeighbs, numNeighbors[ptpos], true); // return; //#pragma omp parallel for for(int y=0; y<IMAGE_HEIGHT; y++) { for(int x=0; x<IMAGE_WIDTH; x++) { int ptpos = y*IMAGE_WIDTH + x; if(IsInvalidPoint(pointCloud[ptpos]) || clIsNull(normalCloud[ptpos])) continue; if(numNeighbors[ptpos] < maxNeighbs/2) continue; descriptors[ptpos] = ComputeEachDescriptor(pointCloud[ptpos], normalCloud[ptpos] , pointCloud, neighborIndices, ptpos*maxNeighbs, numNeighbors[ptpos]); } } }
cl_uchar* Experimenter::CreateNullityMap(SharedData* shdDat) { static ArrayData<cl_uchar> nullData(IMAGE_HEIGHT*IMAGE_WIDTH); cl_uchar* nullityMap = nullData.GetArrayPtr(); const cl_float4* pointCloud = shdDat->ConstPointCloud(); const cl_float4* normalCloud = shdDat->ConstNormalCloud(); for(int i=0; i<IMAGE_HEIGHT*IMAGE_WIDTH; i++) { nullityMap[i] = NullID::NoneNull; if(clIsNull(pointCloud[i])) nullityMap[i] = NullID::PointNull; else if(clIsNull(normalCloud[i])) nullityMap[i] = NullID::NormalNull; } return nullityMap; }