예제 #1
0
IplConvKernel* IPLConvKernel(CFloatImage kernel, bool vertical = false)
{
    // Convert from a floating point image to an integer kernel
    const int nShiftR = 8;      // scale result by shifting to the right
    const float scale = (1 << nShiftR);
    CShape sh = kernel.Shape();
    std::vector<int> values;         // temporary storage for values
    values.resize(sh.width * sh.height);
    for (int y = 0, k = 0; y < sh.height; y++)
        for (int x = 0; x < sh.width; x++, k++)
            values[k] = int(kernel.Pixel(x, y, 0) * 256.0f + 0.5f);
    int nCols   = (vertical) ? sh.height : sh.width;
    int nRows   = (vertical) ? sh.width  : sh.height;
    int anchorX = -kernel.origin[(vertical) ? 1 : 0];
    int anchorY = -kernel.origin[(vertical) ? 0 : 1];
    return iplCreateConvKernel(nCols, nRows, anchorX, anchorY,
                               &values[0], nShiftR);
}
예제 #2
0
파일: ascharr.cpp 프로젝트: otoauler/sdkpub
static int fcaScharr( void )
{
    int KerX[15];
    int KerY[15];
    CvSize KerLens;
    int dx,dy;
    AtsRandState state;
    AtsRandState sizegen;
    double Error = 0;

    IplImage* src8u;
    IplImage* src8s;
    IplImage* src32f;
    IplImage* src16;
    IplImage* dst16;
    IplImage* test16;
    IplImage* dst32f;
    IplImage* test32f;
    IplImage* buf;
    IplConvKernel* KernelX;
    IplConvKernel* KernelY;
    IplConvKernelFP* KX;
    IplConvKernelFP* KY;

    /* Initialization global parameters */
    if( !read_param )
    {
        read_param = 1;
        /* Determining which test are needed to run */
        trsCaseRead( &data_types,"/u/s/f/a", "a",
                     "u - unsigned char, s - signed char, f - float, a - all" );
        /* Reading test-parameters */
        trsiRead( &lMinImageSize, "16", "Image height" );
        trsiRead( &lMaxImageSize, "256", "Image width" );
        trsiRead( &lTestNum, "20", "Test count" );
    }
    if( data_types != 3 && data_types != 0 ) return TRS_UNDEF;
    atsRandInit(&sizegen,lMinImageSize,lMaxImageSize,0);
    /* Creating images for testing */
    for(int i = 0; i < lTestNum; i++)
    {
        lImageWidth = atsRand32s(&sizegen);
        lImageHeight = atsRand32s(&sizegen);
        src8u= cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_8U, 1);
        src8s= cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_8S, 1);
        src32f = cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_32F, 1);
        src16 = cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_16S, 1);
        dst16 = cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_16S, 1);
        test16 = cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_16S, 1);
        buf = cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_32F, 1);
        dst32f = cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_32F, 1);
        test32f = cvCreateImage(cvSize(lImageWidth, lImageHeight), IPL_DEPTH_32F, 1);
        atsRandInit(&state,0,64,32);
        atsFillRandomImageEx(src8u, &state );
        atsFillRandomImageEx(src8s, &state );
        atsFillRandomImageEx(src32f, &state );


        /* Calculating the kernels */
        for(dx = 0; dx<=1; dx++)
        {
            dy=1-dx;
            atsCalcKernel(cv8u,dx,dy,CV_SCHARR,(char*)KerX,(char*)KerY,&KerLens,CV_ORIGIN_TL);
            KernelX = iplCreateConvKernel(KerLens.width,1,KerLens.width/2,0,KerX,0);
            KernelY = iplCreateConvKernel(1,KerLens.height,0,KerLens.height/2,KerY,0);

            /* Calculating the convolution */
            atsConvert(src8u,src16);
            iplSetBorderMode(src16,
                             IPL_BORDER_REPLICATE,
                             IPL_SIDE_TOP|IPL_SIDE_BOTTOM|IPL_SIDE_RIGHT|IPL_SIDE_LEFT,
                             0);
            iplConvolveSep2D(src16,dst16,KernelX,KernelY);
            cvSobel(src8u,test16,dx,dy,CV_SCHARR);
            Error += iplNorm(dst16,test16,IPL_C);

            atsConvert(src8s,src16);
            iplSetBorderMode(src16,
                             IPL_BORDER_REPLICATE,
                             IPL_SIDE_TOP|IPL_SIDE_BOTTOM|IPL_SIDE_RIGHT|IPL_SIDE_LEFT,
                             0);
            iplSetBorderMode(src16,
                             IPL_BORDER_REPLICATE,
                             IPL_SIDE_TOP|IPL_SIDE_BOTTOM|IPL_SIDE_RIGHT|IPL_SIDE_LEFT,
                             0);
            iplConvolveSep2D(src16,dst16,KernelX,KernelY);
            cvSobel(src8s,test16,dx,dy,CV_SCHARR);
            Error += iplNorm(dst16,test16,IPL_C);

            atsCalcKernel(IPL_DEPTH_32F,dx,dy,CV_SCHARR,(char*)KerX,(char*)KerY,&KerLens,CV_ORIGIN_TL);
            KX = iplCreateConvKernelFP(KerLens.width,1,KerLens.width/2,0,(float*)KerX);
            KY = iplCreateConvKernelFP(1,KerLens.height,0,KerLens.height/2,(float*)KerY);
            iplSetBorderMode(src32f,
                             IPL_BORDER_REPLICATE,
                             IPL_SIDE_TOP|IPL_SIDE_BOTTOM|IPL_SIDE_RIGHT|IPL_SIDE_LEFT,
                             0);


            /* Calculating the convolution */
            iplConvolveSep2DFP(src32f,dst32f,KX,KY);
            cvSobel(src32f,test32f,dx,dy,CV_SCHARR);
            /*for(i = 0; i<lImageHeight; i++)
            	for(int j = 0; j<lImageWidth; j++)
            		{
            			float a = ((float*)(dst32f->imageData))[i*dst32f->widthStep/4+j];
            			float b = ((float*)(test32f->imageData))[i*test32f->widthStep/4+j];
            		}
            	*/
            Error += iplNorm(test32f,dst32f,IPL_C);
            iplDeleteConvKernel(KernelX);
            iplDeleteConvKernel(KernelY);
            iplDeleteConvKernelFP(KX);
            iplDeleteConvKernelFP(KY);
        }

        /* Free Memory */

        cvReleaseImage( &src8u );
        cvReleaseImage( &src8s );
        cvReleaseImage( &src32f );
        cvReleaseImage( &src16 );
        cvReleaseImage( &dst16 );
        cvReleaseImage( &test16 );
        cvReleaseImage( &dst32f );
        cvReleaseImage( &test32f );
        cvReleaseImage( &buf);
    }

    if(Error/lTestNum>=EPSILON)return TRS_FAIL;
    return TRS_OK;
} /* fcaSobel8uC1R */