Ejemplo n.º 1
0
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];
}
Ejemplo n.º 2
0
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]);
        }
    }
}
Ejemplo n.º 3
0
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;
}