Ejemplo n.º 1
0
int
main (int argc, char **argv)
{
    CvCapture *capture = 0;
    IplImage *frame = 0;
    double w = 320, h = 240;
    int c;

    // (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
    if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
	capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0);

    /* この設定は,利用するカメラに依存する */
    // (2)キャプチャサイズを設定する.
    //cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
    //cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);

    cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

    // (3)カメラから画像をキャプチャする
    {
	IplImage *src_img_gray, *tmp_img_gray, *dst_img_gray;
	
	// (a) 画像処用の画像データを確保
	frame = cvQueryFrame (capture);
	frame = cvQueryFrame (capture);
	frame = cvQueryFrame (capture);
	tmp_img_gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_16S, 1);
	src_img_gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
	dst_img_gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);

	while (1) {
	    frame = cvQueryFrame (capture);

	    // (b)グレイ画像を作成
	    cvCvtColor(frame, src_img_gray, CV_BGR2GRAY);
	    
	    // (c)Edge処理
	    if ( 0 ) {
		cvCanny (src_img_gray, dst_img_gray, 50.0, 200.0, 3);
	    }else{
		cvLaplace (src_img_gray, tmp_img_gray, 5);
		cvConvertScaleAbs(tmp_img_gray, dst_img_gray, 1, 0);
	    }

	    // (d)結果を表示する
	    cvShowImage ("Capture", dst_img_gray);

	    c = cvWaitKey (10);
	    if (c == '\x1b')
		break;
	}
    }
	
    cvReleaseCapture (&capture);
    cvDestroyWindow ("Capture");

    return 0;
}
Ejemplo n.º 2
0
// À­ÆÕÀ­Ë¹±ä»»
int main( int argc, char** argv )
{
    IplImage* laplace = 0;
    IplImage* colorlaplace = 0;
    IplImage* planes[3] = { 0, 0, 0 };
    CvCapture* capture = 0;
    
    if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
        capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );
    else if( argc == 2 )
        capture = cvCaptureFromAVI( argv[1] ); 

    if( !capture )
    {
        fprintf(stderr,"Could not initialize capturing...\n");
        return -1;
    }
        
    cvNamedWindow( "Laplacian", 0 );

    for(;;)
    {
        IplImage* frame = 0;
        int i;

        frame = cvQueryFrame( capture );
        if( !frame )
            break;

        if( !laplace )
        {
            for( i = 0; i < 3; i++ )
                planes[i] = cvCreateImage( cvSize(frame->width,frame->height), 8, 1 );
            laplace = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_16S, 1 );
            colorlaplace = cvCreateImage( cvSize(frame->width,frame->height), 8, 3 );
        }

        cvCvtPixToPlane( frame, planes[0], planes[1], planes[2], 0 );
        for( i = 0; i < 3; i++ )
        {
            cvLaplace( planes[i], laplace, 3 );
            cvConvertScaleAbs( laplace, planes[i], 1, 0 );
        }
        cvCvtPlaneToPix( planes[0], planes[1], planes[2], 0, colorlaplace );
        colorlaplace->origin = frame->origin;

        cvShowImage("Laplacian", colorlaplace );

        if( cvWaitKey(10) >= 0 )
            break;
    }

    cvReleaseCapture( &capture );
    cvDestroyWindow("Laplacian");

    return 0;
}
Ejemplo n.º 3
0
void COpenCVMFCView::OnLaplace()
{
	// TODO: Add your command handler code here

	IplImage* pImage;
	IplImage* pImgLaplace = NULL;
	IplImage* pImgPlanes[3] = {0,0,0};
	int i;

	pImage = workImg;

	pImgLaplace = cvCreateImage(cvGetSize(pImage),
		IPL_DEPTH_16S,1);

	if (workImg->nChannels == 1) {
		cvLaplace(pImage,pImgLaplace,3);
		cvConvertScaleAbs(pImgLaplace,pImage, 1, 0 );
	}
	else {
		for (i = 0; i < 3; i++) {
			pImgPlanes[i] = cvCreateImage(cvGetSize(pImage),
				IPL_DEPTH_8U,1);
		}

		cvCvtPixToPlane(pImage,pImgPlanes[0],
			pImgPlanes[1],pImgPlanes[2],0);

		for (i = 0; i < 3; i++) {
			cvLaplace(pImgPlanes[i],pImgLaplace,3);
			cvConvertScaleAbs(pImgLaplace,pImgPlanes[i], 1, 0 );
		}

		cvCvtPlaneToPix(pImgPlanes[0],pImgPlanes[1],
			pImgPlanes[2],0,pImage);

		for (i = 0; i < 3; i++) {
			cvReleaseImage(&pImgPlanes[i]);
		}
	}

	cvReleaseImage(&pImgLaplace);

	Invalidate();
}
Ejemplo n.º 4
0
typename image<T, D>::create_new laplace(const image<T, D>& a,
	int aperture_size)
{
	IplImage* src = a.ipl();
	IplImage* dst = cvCreateImage(cvGetSize(src),
		image_details::ipl_depth<T>(), int(a.channels()));
	cvLaplace(src, dst, aperture_size);
	typename image<T, D>::create_new r(dst);
	cvReleaseImage(&src);
	cvReleaseImage(&dst);
	return r;
}
Ejemplo n.º 5
0
static GstFlowReturn
gst_cv_laplace_transform (GstOpencvVideoFilter * base, GstBuffer * buf,
                          IplImage * img, GstBuffer * outbuf, IplImage * outimg)
{
    GstCvLaplace *filter = GST_CV_LAPLACE (base);

    g_assert (filter->intermediary_img);

    cvLaplace (img, filter->intermediary_img, filter->aperture_size);
    cvConvertScale (filter->intermediary_img, outimg, 1, 0);

    return GST_FLOW_OK;
}
Ejemplo n.º 6
0
int main(int argc, char *argv[])
{
	IplImage* img = 0; 
	IplImage* img2 = 0;
	int height,width,step,channels;
	uchar *data;
	int i,j,k;
	
	if(argc<2){
		printf("Usage: main <image-file-name>\n\7");
		exit(0);}
	
	// load an image  
	img=cvLoadImage(argv[1]);
	if(!img){
	printf("Could not load image file: %s\n",argv[1]);
	exit(0);
	}
	
	// get the image data
	height    = img->height;
	width     = img->width;
	step      = img->widthStep;
	channels  = img->nChannels;
	data      = (uchar *)img->imageData;
	printf("Processing a %dx%d image with %d channels and widthStep=%d\n",height,width,channels,step); 
	
	cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); // create a window
	cvMoveWindow("mainWin", 100, 100);//offset from the upper-left corner of the screen
	
	// invert the image
	for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++)
	data[i*step+j*channels+k]=255-data[i*step+j*channels+k];	
	cvShowImage("mainWin1", img );	// show the image
	cvWaitKey(0); // wait for a key

	cvCircle(img, cvPoint(100,100), 20, cvScalar(0,255,0), 1);//draw a circle at (100,100) with a r=20. green lines of width 1
	cvShowImage("mainWin2", img );	// show the image
	cvWaitKey(0); // wait for a key

	img2=cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_32F,3);//allocates memory for image 2
	cvLaplace( img, img2, 3); //computes Laplacian of img and puts the result on img2. 
	cvShowImage("mainWin3", img2 );// show the image
	cvWaitKey(0); // wait for a key
	
	// release the images
	cvReleaseImage(&img );
	cvReleaseImage(&img2 );
	return 0;
}
Ejemplo n.º 7
0
void ImageProcessorCV::Laplacian5x5(CByteImage *pInputImage, CByteImage *pOutputImage)
{
	if (pInputImage->width != pOutputImage->width || pInputImage->height != pOutputImage->height ||
		pInputImage->type != pOutputImage->type || pInputImage->type != CByteImage::eGrayScale)
		return;

	IplImage *pIplInputImage = IplImageAdaptor::Adapt(pInputImage);
	IplImage *pIplOutputImage = IplImageAdaptor::Adapt(pOutputImage);
	IplImage *pIplTempImage = cvCreateImage(cvSize(pInputImage->width, pInputImage->height), IPL_DEPTH_16S, 1);
	
	cvLaplace(pIplInputImage, pIplTempImage, 5);
	cvConvertScaleAbs(pIplTempImage, pIplOutputImage);
	
	cvReleaseImage(&pIplTempImage);
	cvReleaseImageHeader(&pIplInputImage);
	cvReleaseImageHeader(&pIplOutputImage);
}
Ejemplo n.º 8
0
static CvMat* extractEdges( IplImage* img, image_type_t source )
{
  CvMat* temp_16sc;
  CvMat* temp_8uc;
  CvMat* edges;
  edges     = cvCreateMat( img->height, img->width, CV_8UC1 );
  temp_16sc = cvCreateMat( img->height, img->width, CV_16SC1 );
  temp_8uc  = cvCreateMat( img->height, img->width, CV_8UC1 );

  cvZero(edges);


  void accumulateEdgesFromChannel( int channel )
  {
    if( channel > 0 )
      cvSetImageCOI( img, channel );

    cvCopy(img, temp_8uc, NULL); // needed only becaues cvLaplace() doesn't support COI

    if( source == PHOTO )
      cvSmooth(temp_8uc, temp_8uc, CV_GAUSSIAN, PHOTO_PRESMOOTH, PHOTO_PRESMOOTH, 0.0, 0.0);

    cvLaplace(temp_8uc, temp_16sc, 3);
    cvAbs( temp_16sc, temp_16sc );
    cvAdd( edges, temp_16sc, edges, NULL);
  }


  if( img->nChannels == 1 )
    accumulateEdgesFromChannel( -1 );
  else if( source != PHOTO )
    accumulateEdgesFromChannel( 1 );
  else
    for(int i = 0; i < 3; i++)
      accumulateEdgesFromChannel( i+1 );


  cvReleaseMat(&temp_16sc);
  cvReleaseMat(&temp_8uc);
  return edges;
}
Ejemplo n.º 9
0
static void node_composit_exec_cvLaplace(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{

	IplImage *image, *laplace_img, *img_grey;
	int aperture;
	CV_FUNCNAME( "cvLaplace" ); 
	if(out[0]->hasoutput==0) return;
	cvSetErrMode(1); //Parent mode error
	__CV_BEGIN__;
	if(in[0]->data){
		switch(node->custom1){
		case 0:
		  CV_CALL(aperture=3);
		  break;
		case 1:
		  CV_CALL(aperture=1);
		  break;
		case 2:
		  CV_CALL(aperture=5);
		  break;
		case 3:
		  CV_CALL(aperture=7);
		  break;
		case 4:
		  CV_CALL(aperture=9);
		  break;
		}	  
	CV_CALL(image = in[0]->data);
	laplace_img= cvCreateImage(cvSize(image->width,image->height),32,1);
	img_grey= cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
	CV_CALL(cvCvtColor(image,img_grey, CV_BGR2GRAY));
	CV_CALL(cvLaplace(img_grey,laplace_img,aperture));
	CV_CALL(out[0]->data= laplace_img);
	}
	__CV_END__;
}
Ejemplo n.º 10
0
CV_IMPL void cvDistReg(const CvArr* srcarr,
                       CvArr* dstarr)
{
    CV_FUNCNAME("cvDistReg");
    
    __BEGIN__;
    CvMat sstub, *src;
    CvMat dstub, *dst;
    CvMat* src_dx=0, *src_dy=0, *s=0, *ps=0;
    CvMat* dps_x=0, *dps_y=0, *del=0, *ones=0;
    CvSize size;
    int i, j, iStep_s, iStep_ps;
    float* fPtr_s, *fPtr_ps;
    float temp_s=0.0f, temp_ps=0.0f;
    float flag_s1=0.0f, flag_s2=0.0f, flag_ps1=0.0f, flag_ps2=0.0f;
    
    CV_CALL( src = cvGetMat(srcarr, &sstub ));
    CV_CALL( dst = cvGetMat(dstarr, &dstub ));
    
    if( CV_MAT_TYPE(src->type) != CV_32FC1)
        CV_ERROR( CV_StsUnsupportedFormat, "Only-32bit, 1-channel input images are supported" );
    
    if( CV_MAT_TYPE(dst->type) != CV_32FC1)
        CV_ERROR( CV_StsUnsupportedFormat, "Only-32bit, 1-channel input images are supported" );
    
    if( !CV_ARE_SIZES_EQ( src, dst ))
        CV_ERROR( CV_StsUnmatchedSizes, "The input images must have the same size" );
    size = cvGetMatSize( src );
    
    src_dx  = cvCreateMat(size.height, size.width, CV_32FC1 );
    src_dy  = cvCreateMat(size.height, size.width, CV_32FC1 );
    s  = cvCreateMat(size.height, size.width, CV_32FC1 );
    ps  = cvCreateMat(size.height, size.width, CV_32FC1 );
    dps_x  = cvCreateMat(size.height, size.width, CV_32FC1 );
    dps_y  = cvCreateMat(size.height, size.width, CV_32FC1 );
    del  = cvCreateMat(size.height, size.width, CV_32FC1 );
    ones = cvCreateMat(size.height, size.width, CV_32FC1 );
    cvSetZero(src_dx);
    cvSetZero(src_dy);
    cvSetZero(s);
    cvSetZero(ps);
    cvSetZero(dps_x);
    cvSetZero(dps_y);
    cvSetZero(del);
    cvSet(ones, cvScalar(1.0f));
    
    iStep_s = s->step / sizeof(fPtr_s[0]);
    fPtr_s  = s->data.fl;
    iStep_ps= ps->step/ sizeof(fPtr_ps[0]);
    fPtr_ps = ps->data.fl;
    
    cvSobel(src, src_dx, 1, 0, 1);
    cvSobel(src, src_dy, 0, 1, 1);
    cvMul(src_dx, ones, src_dx, 0.25f);
    cvMul(src_dy, ones, src_dy, 0.25f);
    cvCalS(src,s);
    
    for (j=0; j<size.height; j++){
        for (i=0; i<size.width; i++){
            temp_s = fPtr_s[i+iStep_s*j];
            if (int(temp_s*10000)>=0 && int(temp_s*10000)<=10000) {
                flag_s1 = 1.0f;
            } else {
                flag_s1 = 0.0f;
            }
            if (int(temp_s*10000) > 10000) {
                flag_s2 = 1.0f;
            } else {
                flag_s2 = 0.0f;
            }
            temp_ps = flag_s1*sin(2*PI*temp_s)/2/PI+flag_s2*(temp_s-1.0f);
            if (int(temp_ps*10000) == 0) {
                flag_ps1 = 0.0f;
            } else {
                flag_ps1 = 1.0f;
            }
            if (int(temp_s*10000) == 0) {
                flag_ps2 = 0.0f;
            } else {
                flag_ps2 = 1.0f;
            }
            fPtr_ps[i+iStep_ps*j] = (flag_ps1*temp_ps+1.0f-flag_ps1)/(flag_ps2*temp_s+1.0f-flag_ps2);
            if ((flag_ps2*temp_s+1.0f-flag_ps2)==0){
                printf("Something wrong in last: temp_s = %f, flag_ps2 = %f\n", temp_s, flag_ps2);
                exit(0);
            }
        }
    }
    cvMul(ps, src_dx, dps_x);
    cvMul(ps, src_dy, dps_y);
    cvSub(dps_x, src_dx, dps_x);
    cvSub(dps_y, src_dy, dps_y);
    cvCurvature(dps_x, dps_y, dst);
    cvLaplace(src,del,1);
    cvMul(del, ones, del, 0.2f);
    cvAdd(dst, del, dst);
    
    cvReleaseMat(&src_dx);
    cvReleaseMat(&src_dy);
    cvReleaseMat(&s);
    cvReleaseMat(&ps);
    cvReleaseMat(&dps_x);
    cvReleaseMat(&dps_y);
    cvReleaseMat(&del);
    cvReleaseMat(&ones);
    
    __END__;
}
Ejemplo n.º 11
0
CvScalar GetSharpness(IplImage* in, IplImage* drawHist=0)
{
	const  short history_size           = 5;
    static short history_index          = 0;
    static short history[5];

    static IplImage* data = 0;
    static IplImage* out = 0;
    static IplImage* out_8bit = 0;

	if( ! out ) {
        out=cvCreateImage(cvSize(in->roi->width,in->roi->height),IPL_DEPTH_16S,1);
		out_8bit=cvCreateImage(cvSize(in->roi->width,in->roi->height),IPL_DEPTH_8U,1);
    }

    // aperture size of 1 corresponds to the correct matrix
    cvLaplace(in, out, 1);

    short maxLap = -32767;
    short* imgData = (short*)out->imageData;
    int i=0;
	double avg=0.0;
    for(i=0;i<(out->imageSize/2);i++)
    {
        if(abs(imgData[i]) > maxLap) maxLap = abs(imgData[i]);
		avg += abs(imgData[i]);
    }
	avg /= out->imageSize;

	history[history_index++] = maxLap;
    history_index = (history_index + 1) % history_size;
    float mean = 0.0;
    for(i=0;i<history_size;i++) {
		mean+=history[i];
	}
    mean /= history_size;

	if(drawHist) {
        cvConvertScale(out,out_8bit);

	    CvHistogram* hist;
	    int hist_size[] = { 256 };
	    float ranges_1[] = { 0, 256 };
	    float* ranges[] = { ranges_1 };
	    hist = cvCreateHist( 1, hist_size, CV_HIST_ARRAY, ranges, 1 );

	    cvCalcHist( &out_8bit, hist, 0, 0 ); // Compute histogram
	    cvNormalizeHist( hist, 20*255 ); // Normalize it

        // populate the visualization
	    float max_value = 0;
	    cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );

	    for( int s = 0; s < 256; s++ ){
	    	float bin_val = cvQueryHistValue_1D( hist, s );
			if(bin_val>0.0) {
				cvRectangle( drawHist, cvPoint( s, 100 ),
						cvPoint( s, 100- (bin_val/max_value*100)),
						CV_RGB( 0, 255, 0 ),
						CV_FILLED );
			}
	    }

	    cvReleaseHist(&hist);
    }

	CvScalar r;
	r.val[0] = mean;
    r.val[1] = avg;
	return r;
}
Ejemplo n.º 12
0
void Evolution(IplImage *u, IplImage *g, double lambda, double mu, double alf, double epsilon, double delt, int numIter)
{
    if (!u||!g)
        return;
    CvSize size = cvGetSize(u);
    IplImage* vx = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* vy = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* ux = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* uy = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* Nx = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* Ny = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* diracU = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* K = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* laplace = cvCreateImage(size,IPL_DEPTH_32F,1);

    Sobel(g, vx, vy);

    int i,j;
    CvScalar cur1,cur2,cur11,cur22,cur;
    CvScalar Cdirac, Cvx, CNx, Cvy, CNy, Cg, CK, Claplace, Cu;
    for (int k=0;k<numIter;k++)
    {
        cout<<k<<"……"<<endl;
        NeumannBoundCond(u);
        Sobel(u, ux, uy);

        for (i=0; i<size.height; i++)
        {
            for(j=0; j<size.width; j++)
            {
                cur1 = cvGet2D(ux,i,j);
                cur2 = cvGet2D(uy,i,j);
                cur11.val[0] = cur1.val[0]/sqrt(cur1.val[0]*cur1.val[0] + cur2.val[0]*cur2.val[0] + 1e-10);
                cur22.val[0] = cur2.val[0]/sqrt(cur1.val[0]*cur1.val[0] + cur2.val[0]*cur2.val[0] + 1e-10);
                cvSet2D(Nx,i,j,cur11);
                cvSet2D(Ny,i,j,cur22);
            }
        }

        Dirac(u,diracU,epsilon);
        CurvatureCentral2(Nx,Ny,K);
        cvLaplace(u, laplace, 1);

        for (i=0; i<size.height; i++)
        {
            for(j=0; j<size.width; j++)
            {
                Cdirac = cvGet2D(diracU,i,j);
                Cvx = cvGet2D(vx,i,j);
                CNx = cvGet2D(Nx,i,j);
                Cvy = cvGet2D(vy,i,j);
                CNy = cvGet2D(Ny,i,j);
                Cg = cvGet2D(g,i,j);
                CK = cvGet2D(K,i,j);
                Claplace = cvGet2D(laplace,i,j);
                Cu = cvGet2D(u,i,j);

                cur.val[0] = lambda*Cdirac.val[0]*(Cvx.val[0]*CNx.val[0] + Cvy.val[0]*CNy.val[0] + Cg.val[0]*CK.val[0])
                    + mu*(Claplace.val[0]-CK.val[0]) + alf*Cdirac.val[0]*Cg.val[0];
                Cu.val[0] += delt*cur.val[0];
                cvSet2D(u,i,j,Cu);
            }
        }
    }
    cvReleaseImage(&vx);
    cvReleaseImage(&vy);
    cvReleaseImage(&ux);
    cvReleaseImage(&uy);
    cvReleaseImage(&Nx);
    cvReleaseImage(&Ny);
    cvReleaseImage(&diracU);
    cvReleaseImage(&K);
    cvReleaseImage(&laplace);
}
Ejemplo n.º 13
0
void Evolution2(IplImage * u, IplImage *g, double lambda, double mu, double alf, double epsilon, double delt, int numIter)
{
    if (!u||!g)
        return;
    CvSize size = cvGetSize(u);
    IplImage* vx = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* vy = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* ux = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* uy = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* Nx = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* Ny = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* diracU = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* K = cvCreateImage(size,IPL_DEPTH_32F,1);
    IplImage* Laplace = cvCreateImage(size,IPL_DEPTH_32F,1);

    Sobel(g,vx,vy);
    CvScalar s1,s2,s11,s22;
    CvScalar Cdirac, Cvx, Cvy, CNx, CNy, Cg, CK, CLaplace, Cu;
    int i,j;
    for(int k=0;k<numIter;k++)
    {
        cout<<k<<"……"<<endl;
        NeumannBoundCond(u);
        Sobel(u,ux,uy);

        for(i=0;i<size.height;i++)
        {
            for(j=0;j<size.width;j++)
            {
                s1=cvGet2D(ux,i,j);
                s2=cvGet2D(uy,i,j);
                double normDu=sqrt(pow(s1.val[0],2)+pow(s2.val[0],2)+1e-10);
                s11.val[0]=s1.val[0]/normDu;
                s22.val[0]=s2.val[0]/normDu;
                cvSet2D(Nx,i,j,s11);
                cvSet2D(Ny,i,j,s22);
            }
        }

        Dirac(u,diracU,epsilon);
        CurvatureCentral2(Nx,Ny,K);
        cvLaplace(u, Laplace, 1);
        for(i=0;i<size.height;i++)
        {
            for(j=0;j<size.width;j++)
            {
                Cdirac=cvGet2D(diracU,i,j);
                Cvx=cvGet2D(vx,i,j);
                Cvy=cvGet2D(vy,i,j);
                CNx=cvGet2D(Nx,i,j);
                CNy=cvGet2D(Ny,i,j);
                Cg=cvGet2D(g,i,j);
                CK=cvGet2D(K,i,j);
                CLaplace=cvGet2D(Laplace,i,j);
                Cu=cvGet2D(u,i,j);

                double weightedLengthTerm=lambda*Cdirac.val[0]*(Cvx.val[0]*CNx.val[0]+Cvy.val[0]*CNy.val[0]+Cg.val[0]*CK.val[0]);
                double weightedAreaTerm=alf*Cdirac.val[0]*Cg.val[0];
                double penalizingTerm=mu*(CLaplace.val[0]-CK.val[0]);
                double total=weightedLengthTerm+weightedAreaTerm+penalizingTerm;
                Cu.val[0]+=delt*total;
                cvSet2D(u,i,j,Cu);
            }
        }
    }
    cvReleaseImage(&vx);
    cvReleaseImage(&vy);
    cvReleaseImage(&ux);
    cvReleaseImage(&uy);
    cvReleaseImage(&Nx);
    cvReleaseImage(&Ny);
    cvReleaseImage(&diracU);
    cvReleaseImage(&K);
    cvReleaseImage(&Laplace);
}