Exemplo n.º 1
0
// Arithmetic routines
double *camAllocateVector(int nl, int nh)
{
    double *v;
    v=(double *)malloc((unsigned)(nh - nl + 1) * sizeof(double));
    if (!v) {
	camError("camAllocateVector", "Memory allocation failure");
	return NULL;
    }
    return v-nl;
}
Exemplo n.º 2
0
// Binary images processing
// camMonadicArithm1U : source is n bits, dest is one bit
int camMonadicArithm1U(CamImage *source, CamImage *dest, CamArithmParams *params)
{
    int x,y;
    int width,height;
    CAM_PIXEL *srcptr,*cpsrcptr;
    CAM_BIT_BLOCK *dstptr,*cpdstptr;
    CAM_BIT_BLOCK bit_block,eol_block;
    int sol_offset,bit_offset;

    int c1=params->c1;
    int c2=params->c2;
    int c3=params->c3;

    CamInternalROIPolicyStruct iROI;

    CAM_CHECK_ARGS(camMonadicArithm,(source->depth&CAM_DEPTH_MASK)<=(sizeof(CAM_PIXEL)*8));
    CAM_CHECK_ARGS(camMonadicArithm,(source->depth&CAM_DEPTH_MASK)>=8);

    // ROI (Region Of Interest) management
    CAM_CHECK(camMonadicArithm,camInternalROIPolicy(source, dest, &iROI, 0));
    srcptr=(CAM_PIXEL*)iROI.srcptr;
    width=iROI.srcroi.width;
    height=iROI.srcroi.height;

    if (dest->roi) {
	sol_offset=dest->roi->xOffset%CAM_BIT_BLOCK_SIZE;
	dstptr=(CAM_BIT_BLOCK*)(dest->imageData+dest->roi->yOffset*dest->widthStep)+(dest->roi->xOffset/CAM_BIT_BLOCK_SIZE);
    } else {
	sol_offset=0;
	dstptr=(CAM_BIT_BLOCK*)dest->imageData;
    }

    switch(params->operation) {
    case CAM_ARITHM_ABS:
	camError("camMonadicArithm","CAM_ARITHM_ABS operation is not possible on binary images");
	break;
    case CAM_ARITHM_SELECT:
	if (c2) {
	    FOREACH_PIXEL {
		STORE_BIT((int)(*srcptr==c1));	    
	    } END_FOREACH_PIXEL
	} else {
	    FOREACH_PIXEL {
		STORE_BIT((int)(*srcptr!=c1));	    
	    } END_FOREACH_PIXEL
	}
	break;
    case CAM_ARITHM_THRESHOLD:
	if (c2) {
	    FOREACH_PIXEL {
		STORE_BIT((int)(*srcptr<c1));
	    } END_FOREACH_PIXEL
	} else {
Exemplo n.º 3
0
int camSVD(double **a, int m, int n, double w[], double **v)
{
    int flag, i, its, j, jj, k, l, nm;
    double anorm, c, f, g, h, s, scale, x, y, z, *rv1;
    int camMinTmp1, camMinTmp2;
    double camMaxTmp1, camMaxTmp2;

    rv1=camAllocateVector(1,n);
    g=scale=anorm=0.0;
    for (i=1;i<=n;i++) {
	l=i+1;
	rv1[i]=scale*g;
	g=s=scale=0.0;
	if (i <= m) {
	    for (k=i;k<=m;k++) scale += fabs(a[k][i]);
	    if (scale) {
		for (k=i;k<=m;k++) {
		    a[k][i] /= scale;
		    s += a[k][i]*a[k][i];
		}
		f=a[i][i];
		g = -CAM_SIGN(sqrt(s),f);
		h=f*g-s;
		a[i][i]=f-g;
		for (j=l;j<=n;j++) {
		    for (s=0.0,k=i;k<=m;k++) s += a[k][i]*a[k][j];
		    f=s/h;
		    for (k=i;k<=m;k++) a[k][j] += f*a[k][i];
		}
		for (k=i;k<=m;k++) a[k][i] *= scale;
	    }
	}
	w[i]=scale*g;
	g=s=scale=0.0;
	if (i <= m && i != n) {
	    for (k=l;k<=n;k++) scale += fabs(a[i][k]);
	    if (scale) {
		for (k=l;k<=n;k++) {
		    a[i][k] /= scale;
		    s += a[i][k]*a[i][k];
		}
		f=a[i][l];
		g = -CAM_SIGN(sqrt(s),f);
		h=f*g-s;
		a[i][l]=f-g;
		for (k=l;k<=n;k++) rv1[k]=a[i][k]/h;
		for (j=l;j<=m;j++) {
		    for (s=0.0,k=l;k<=n;k++) s += a[j][k]*a[i][k];
		    for (k=l;k<=n;k++) a[j][k] += s*rv1[k];
		}
		for (k=l;k<=n;k++) a[i][k] *= scale;
	    }
	}
	anorm=CAM_DMAX(anorm,(fabs(w[i])+fabs(rv1[i])));
    }
    for (i=n;i>=1;i--) {
	if (i < n) {
	    if (g) {
		for (j=l;j<=n;j++) v[j][i]=(a[i][j]/a[i][l])/g;
		for (j=l;j<=n;j++) {
		    for (s=0.0,k=l;k<=n;k++) s += a[i][k]*v[k][j];
		    for (k=l;k<=n;k++) v[k][j] += s*v[k][i];
		}
	    }
	    for (j=l;j<=n;j++) v[i][j]=v[j][i]=0.0;
	}
	v[i][i]=1.0;
	g=rv1[i];
	l=i;
    }
    for (i=CAM_IMIN(m,n);i>=1;i--) {
	l=i+1;
	g=w[i];
	for (j=l;j<=n;j++) a[i][j]=0.0;
	if (g) {
	    g=1.0/g;
	    for (j=l;j<=n;j++) {
		for (s=0.0,k=l;k<=m;k++) s += a[k][i]*a[k][j];
		f=(s/a[i][i])*g;
		for (k=i;k<=m;k++) a[k][j] += f*a[k][i];
	    }
	    for (j=i;j<=m;j++) a[j][i] *= g;
	} else for (j=i;j<=m;j++) a[j][i]=0.0;
	++a[i][i];
    }
    for (k=n;k>=1;k--) {
	for (its=1;its<=30;its++) {
	    flag=1;
	    for (l=k;l>=1;l--) {
		nm=l-1;
		if ((double)(fabs(rv1[l])+anorm) == anorm) {
		    flag=0;
		    break;
		}
		if ((double)(fabs(w[nm])+anorm) == anorm) break;
	    }
	    if (flag) {
		c=0.0;
		s=1.0;
		for (i=l;i<=k;i++) {
		    f=s*rv1[i];
		    rv1[i]=c*rv1[i];
		    if ((double)(fabs(f)+anorm) == anorm) break;
		    g=w[i];
		    h=camPythag(f,g);
		    w[i]=h;
		    h=1.0/h;
		    c=g*h;
		    s = -f*h;
		    for (j=1;j<=m;j++) {
			y=a[j][nm];
			z=a[j][i];
			a[j][nm]=y*c+z*s;
			a[j][i]=z*c-y*s;
		    }
		}
	    }
	    z=w[k];
	    if (l == k) {
		if (z < 0.0) {
		    w[k] = -z;
		    for (j=1;j<=n;j++) v[j][k] = -v[j][k];
		}
		break;
	    }
	    if (its == 100) {
		camError("camSVD", "No convergence after 100 iterations");
		return 0;
	    }
	    x=w[l];
	    nm=k-1;
	    y=w[nm];
	    g=rv1[nm];
	    h=rv1[k];
	    f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
	    g=camPythag(f,1.0);
	    f=((x-z)*(x+z)+h*((y/(f+CAM_SIGN(g,f)))-h))/x;
	    c=s=1.0;
	    for (j=l;j<=nm;j++) {
		i=j+1;
		g=rv1[i];
		y=w[i];
		h=s*g;
		g=c*g;
		z=camPythag(f,h);
		rv1[j]=z;
		c=f/z;
		s=h/z;
		f=x*c+g*s;
		g = g*c-x*s;
		h=y*s;
		y *= c;
		for (jj=1;jj<=n;jj++) {
		    x=v[jj][j];
		    z=v[jj][i];
		    v[jj][j]=x*c+z*s;
		    v[jj][i]=z*c-x*s;
		}
		z=camPythag(f,h);
		w[j]=z;
		if (z) {
		    z=1.0/z;
		    c=f*z;
		    s=h*z;
		}
		f=c*g+s*y;
		x=c*y-s*g;
		for (jj=1;jj<=m;jj++) {
		    y=a[jj][j];
		    z=a[jj][i];
		    a[jj][j]=y*c+z*s;
		    a[jj][i]=z*c-y*s;
		}
	    }
	    rv1[l]=0.0;
	    rv1[k]=f;
	    w[k]=x;
	}
    }
    camFreeVector(rv1,1,n);
    return 1;
}
Exemplo n.º 4
0
int camLoadBitmapFont(CamBitmapFont *font, char *filename)
{
    CamImage bitmap;
    CamROI roi;
    int delimiter_color,x,i,px;
    unsigned char *ptr;
    CamTable clusters,LUT;
    CamRLEImage temp;
    char s[256];

    if (!camLoadBMP(&bitmap,filename)) {
        sprintf(s,"Couldn't load bitmap file %s.",filename);
        camError("camBitmapFontLoad",s);
        return 0;
    }
    font->height=bitmap.height-1;

    // Try to figure out how many letters are there in this font image
    font->nb_chars=0;
    font->first_char=33;
#define GET_COLOR_PIXEL(ptr) (((int)*(ptr))+(((int)*((ptr)+1))<<8)+(((int)*((ptr)+2))<<16))   
    ptr=bitmap.imageData;
    delimiter_color=GET_COLOR_PIXEL(ptr);
    for (x=0;x<bitmap.width;x++,ptr+=3) {
        if (GET_COLOR_PIXEL(ptr)==delimiter_color) font->nb_chars++;
    }

    // OK, now we can allocate memory for these
    font->masks=(CamRLEImage*)malloc(sizeof(CamRLEImage)*font->nb_chars);
    font->letters=(CamImage*)malloc(sizeof(CamImage)*font->nb_chars);
    
    // Let's prepare the data for font loading
    ptr=bitmap.imageData;
    px=0;
    roi.coi=0;
    bitmap.roi=&roi;
    clusters.size=12;
    for (i=0;i<6;i++) clusters.t[i*2]=clusters.t[i*2+1]=*(ptr+i);
    i=0;
    LUT.size=3;
    LUT.t[0]=1; LUT.t[1]=0; LUT.t[2]=0;
    camRLEAllocate(&temp,10000);

    // Ready. Let's go for all the characters
    for (x=1,ptr+=3;x<bitmap.width;x++,ptr+=3) {
        if (GET_COLOR_PIXEL(ptr)==delimiter_color) {
            // We've found the next character
            camRLEAllocate(&font->masks[i],(x-px)*font->height+2);
            camAllocateRGBImage(&font->letters[i],x-px,font->height);
            roi.xOffset=px; roi.yOffset=1;
            roi.width=x-px;
            roi.height=font->height;
            camCopy(&bitmap,&font->letters[i]);
            camRLEEncodeColor(&bitmap,&temp,&clusters);
            camRLEApplyLUT(&temp,&font->masks[i],&LUT);
            px=x;
            i++;
        }
    }
    // We've found the last character
    camRLEAllocate(&font->masks[i],(x-px)*font->height+2);
    camAllocateRGBImage(&font->letters[i],x-px,font->height);
    roi.xOffset=px; roi.yOffset=1;
    roi.width=x-px;
    roi.height=font->height;
    camCopy(&bitmap,&font->letters[i]);
    camRLEEncodeColor(&bitmap,&temp,&clusters);
    camRLEApplyLUT(&temp,&font->masks[i],&LUT);

    // Set the masks to all letters
    for (i=0;i<font->nb_chars;i++) {
        font->letters[i].mask=&font->masks[i];
    }
    camDeallocateImage(&bitmap);
    camRLEDeallocate(&temp);
    return 1;
}