コード例 #1
0
int performWTP(unsigned char *inputFilename, unsigned char *outputFilename, int image_width, int image_height, int to_extend_image, int extend_by_pixels, int use_FFT, int wavelet_type, int ridge_alg, double starting_scale, double scale_step, double ending_scale, double Morlet_sigma)
{
    printf("\nEntering C program...\n");
	if (to_extend_image == NO)  extend_by_pixels = 0;

	int image_width_FFT = 0, order = 0;
	if (use_FFT == YES && to_extend_image == YES)
	{
		//determine log2(image_width)
		while (image_width_FFT <= image_width) 
		{
			image_width_FFT = pow(2.0,(double) order);
			++order;
		}
		extend_by_pixels = (image_width_FFT - image_width)/2;
	}

	//read the fringes image which is BYTE format 
    printf("Reading %s \n", inputFilename);
	unsigned char *fringes = (unsigned char *)calloc(image_width * image_height, sizeof(unsigned char));
	FILE *input_file = fopen(inputFilename, "rb");
    if(!input_file)
	{
		printf("\ncan't open file %s\n", inputFilename);
		return 1;
    }
	fread(fringes, sizeof(unsigned char), image_width * image_height, input_file);
	fclose(input_file);
	
	//convert fringes to float data type
	int i;
	float *fringes_float = (float *)malloc(image_width * image_height * sizeof(float));
	for (i=0; i<image_width*image_height; ++i)
	{
		fringes_float[i] = fringes[i];
	//	printf("\n debug %f\n", fringes_float[i]);
	}

	//subtract the image from its mathematical mean
	remove_DC(fringes_float, image_width, image_height);

	if (to_extend_image == YES)
	{
		printf("Extending the image borders using linear prediction,...\n");
		fringes_float = extend_image_linear_prediction(fringes_float, &image_width, &image_height, extend_by_pixels);
	
	}

	float *wrapped_phase = (float *)malloc(image_width * image_height * sizeof(float));

	//use either the WFA or the WTA function.
	if (use_FFT == YES)
	{
		printf("Performing wavelet transform in Frequency domain, please wait...\n");
		WFA(fringes_float, wrapped_phase, image_width, image_height, starting_scale, scale_step, ending_scale, ridge_alg, Morlet_sigma, extend_by_pixels, wavelet_type);
	}
	else
	{
		printf("Performing wavelet transform in time domain, please wait...\n");
		WTA(fringes_float, wrapped_phase, image_width, image_height, starting_scale, scale_step, ending_scale, ridge_alg, Morlet_sigma, extend_by_pixels, wavelet_type);
	}

	//crop the image to return it to the original image dimensions
	if (to_extend_image == YES)
		wrapped_phase = crop_wrapped_phase(wrapped_phase, &image_width, &image_height, extend_by_pixels);

	//writing the results to the file
    printf("Writing %s \n", outputFilename);
	FILE *output_file = fopen(outputFilename, "wb");
  	fwrite(wrapped_phase, sizeof(float), image_width * image_height, output_file);
	fclose(output_file);

	//free used memory
	free(fringes);
	free(fringes_float);
	free(wrapped_phase);
    printf("Leaving C program...\n \n");
	return 0;
}
コード例 #2
0
ファイル: binary.cpp プロジェクト: ccppjava/random-codes
int main(int argc, char **argv)
{
    try {
        // parse command line
        if (argc != 3)
            throw CError(usage, argv[0]);
        int argn = 1;
        char *dataFileName = argv[argn++];
	char *outstem = argv[argn++];

	int writeParams = 1;
	int writeTimings = 1;

	FILE *debugfile = createDebugFile(writeParams, outstem, verbose, argc, argv);

	// Load datafile 
	int width, height, nLabels;
	std::vector<int> gt, data, lrPairwise, udPairwise;
	MRF::CostVal *dataCostArray, *hCue, *vCue;

	if (verbose)
	    fprintf(stderr, "Loading datafile...\n");
	
	LoadDataFile(dataFileName, width, height, nLabels, dataCostArray, hCue, vCue);

	DataCost *dcost = new DataCost(dataCostArray);
	SmoothnessCost *scost = new SmoothnessCost(1, 1, 1, hCue, vCue);
	EnergyFunction *energy = new EnergyFunction(dcost, scost);

	if (verbose)
	    fprintf(stderr, "Running optimization...\n");
	fflush(stderr);

	int MRFalg = aRunAll;

	int outerIter, innerIter;
	MRF *mrf = NULL;
	for (int numAlg = aICM; numAlg <= aBPM; numAlg++) {
	    outerIter = MAXITER;
	    innerIter = 1;
	    if (MRFalg < aRunAll && numAlg != MRFalg) continue;

	    startAlgInitTimer();

	    switch (numAlg) {
	    case aICM:       mrf = new ICM(width, height, nLabels, energy); innerIter = 5; break;
	    case aExpansion: mrf = new Expansion(width, height, nLabels, energy); break;
	    case aSwap:      mrf = new Swap(width, height, nLabels, energy); break;
	    case aTRWS:      mrf = new TRWS(width, height, nLabels, energy); break;
	    case aBPS:       mrf = new BPS(width, height, nLabels, energy);  
		//innerIter = 5; 
		break;
	    case aBPM:       mrf = new MaxProdBP(width, height, nLabels, energy);
		//innerIter = 2; 
		break;
	    default: throw new CError("unknown algorithm number");
	    }
	    if (debugfile)
		fprintf(debugfile, "******* Running %s for up to %d x %d iterations\n",
			algs[numAlg], outerIter, innerIter);

	    mrf->initialize();
	    mrf->clearAnswer();

	    bool initializeToWTA = false;
	    if (initializeToWTA) {
		if (debugfile)
		    fprintf(debugfile, "performing WTA\n");
		CByteImage disp;
		WTA(dataCostArray, width, height, nLabels, disp);
		writeDisparities(disp, 255, "WTA.png", debugfile);
		setDisparities(disp, mrf);
	    } else {
		mrf->clearAnswer();
	    }

	    float initTime = getAlgInitTime();
	    
	    FILE *timefile = createTimeFile(writeTimings, outstem, algs[numAlg], debugfile);

	    runAlg(mrf, numAlg, debugfile, timefile, outerIter, innerIter, initTime);

	    // save resulting labels as image
	    CShape sh(width, height, 1);
	    CByteImage outimg(sh);
	    int n = 0;
	    for (int y = 0; y < height; y++) {
		for (int x = 0; x < width; x++) {
		    outimg.Pixel(x, y, 0) = 255* mrf->getLabel(n);
		    n++;
		}
	    }

	    char fname[500];
	    sprintf(fname, "%s-%s.png", outstem, algs[numAlg]);
	    WriteImageVerb(outimg, fname, 1);
	    delete mrf;
	}

	if (writeParams)
	    fclose(debugfile);

	delete energy;
	delete scost;
	delete dcost;
	delete [] dataCostArray;
	delete [] hCue;
	delete [] vCue;
    }
    catch (CError &err) {
        fprintf(stderr, err.message);
        fprintf(stderr, "\n");
        return -1;
    }
    catch (bad_alloc) {
	fprintf(stderr, "*** Error: not enough memory\n");
	exit(1);
    }

    return 0;
}
コード例 #3
0
ファイル: cvCore.cpp プロジェクト: lhnows/DepthCompute
int _tmain(int argc, _TCHAR* argv[])
{
	//paragrams
	const int rectLeftTopX = 200 ,rectLeftTopY = 200, rectWidth = 1648,rectHeight = 768;
	const int toplimit = 1000;
	const int hwin = 10,disparity_begin=-15,disparity_range=37;

	//variable
	int winPixTotal = (hwin+1)*(hwin+1); 

	int *refer_img = new int[WH];		//存储参考图像
	int *target_img = new int[WH];		//存储目标图像
	int *refer_I = new int[disparity_range*WH];		//参考图像移位后的每个像素点对应矩形框内像素和
	int *refer_MSI = new int[disparity_range*WH];	//参考图像移位后的每个像素点对应矩形框内像素和
	int *refer_MSII = new int[disparity_range*WH];	//参考图像移位后的每个像素点对应矩形框内像素平方和
	int *target_SI = new int[WH];					//目标图像的每个像素点对应矩形框内像素和
	int *target_SII = new int[WH];					//目标图像的的每个像素点对应矩形框内像素平方和
	int *DJ = new int[WH];							//参考图像的一阶积分图
	int *DJJ = new int[WH];							//参考图像的二阶积分图
	int *DIJ = new int[WH*disparity_range];							
	int *DT = new int[WH];							//目标图像的一阶积分图
	int *DTT = new int[WH];							//
	int *DM = new int[WH];							//目标图像的一阶积分图
	int *DMM = new int[WH];							//目标图像的二阶积分图

	int *SIJ = new int[disparity_range*WH];			//参考图像与目标图像的点乘的积分图

	
	float *DI = new float[WH];						  //视差深度
	// Variables for GPU
	float *costmatrix = new float[WH*disparity_range];//匹配代价
	float *finalCost = new float[WH*disparity_range]; //匹配代价


	String referImgName;							 //参考图像
	String targetImgName;				
	String SaveImgName;


	//指定原始数据的存储位置
	referImgName	= "TestData\\Reference\\reference.bmp";
	targetImgName	= "TestData\\Reference\\target\\";
	SaveImgName		= "TestData\\Reference\\result\\";	


	
	//参考图像数据读取
	LoadImgFromFilePath(referImgName.c_str(),refer_img, rectLeftTopX,rectLeftTopY,rectWidth,rectHeight);

	//像素值阈值截断
	PreProcess_Truncation(refer_img,toplimit);

	CalculateReferInteg(refer_img,DJ,DJJ,refer_I,refer_MSI,refer_MSII, hwin, disparity_begin, disparity_range);

	AdaptiveFilter_refer(refer_img, refer_MSI,winPixTotal);

	CalculateReferInteg(refer_img,DJ,DJJ,refer_I,refer_MSI,refer_MSII, hwin, disparity_begin, disparity_range);

	IplImage* depthShow=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);  
	cvNamedWindow("depth",1);  

	//遍历dir文件夹下所有jpg图像,作为目标图像进行三维重建
	_finddata_t fileDir;
	char* dir="TestData\\Reference\\数据标定\\*.*";
	long lfDir;
	if((lfDir = _findfirst(dir,&fileDir))==-1l)
		printf("No file is found\n");
	else{
		printf("file list:\n");
		do{
			printf("%s\n",fileDir.name);
			String fn = dir;
			fn.erase(fn.length()-3,fn.length());
			fn = fn + fileDir.name;
			if (fn.find(".bmp") != -1)
			{
				//从目标图像中取出数据
				LoadImgFromFilePath(fn.c_str(),target_img,rectLeftTopX,rectLeftTopY,rectWidth,rectHeight);

				clock_t start0, start; //声明两个时间点
				//double time,time1,time2,time3,time4,time5,time6,timen; //定义运行时间

				start0 = clock(); //获取开始时间
				start = clock();
				PreProcess_Truncation(target_img,toplimit);
				CalculateTargetInteg(target_img,DT,DTT,target_SI,target_SII, hwin);
				AdaptiveFilter_target(target_img, target_SI ,winPixTotal);
				CalculateTargetInteg(target_img,DM,DMM,target_SI,target_SII, hwin);
				printf( "TargetInteg待匹配图像积分图计算时间(CPU)为%.4f 秒\n",(double)(clock() - start) / CLOCKS_PER_SEC);//显示

			
				start = clock(); //获取开始时间
				CalculateReferTargetInteg(refer_I,target_img,DIJ,SIJ,hwin,disparity_range);
				printf( "Refer*TargetInteg参考图像与目标图像乘积积分图计算时间(CPU)为%.4f 秒\n",(double)(clock() - start) / CLOCKS_PER_SEC);//显示

				start = clock(); 
				CalculateAllCostMatrix(refer_MSI,refer_MSII,target_SI,target_SII,SIJ,costmatrix,disparity_range,winPixTotal);
				printf( "CalculateAllCostMatrixZNCC算子计算时间(CPU)为%.4f 秒\n",(double)(clock() - start) / CLOCKS_PER_SEC);//显示

				start = clock();
				blockWTA(costmatrix,finalCost,disparity_range);
				printf("blockWTA ZNCC滤波计算时间(CPU)为%.4f 秒\n",(double)(clock() - start) / CLOCKS_PER_SEC);//显示

				start = clock();
				WTA(finalCost,DI, hwin, disparity_begin, disparity_range);
				printf( "WTA 搜索最优ZNCC计算时间(CPU)为%.4f 秒\n",(double)(clock() - start) / CLOCKS_PER_SEC);//显示

				start =clock();
				TransDepthMap(DI,finalCost, disparity_begin, disparity_range);
				printf( "TransDepthMap 三角变换+插值计算时间(CPU)为%.4f 秒\n",(double)(clock() - start) / CLOCKS_PER_SEC); //CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,进行计算,完成的时间减去开始的时间获得算法运行时间
				printf( "Total CPU运行时间为%.4f 秒\n",(double)(clock() - start0) / CLOCKS_PER_SEC);//显示

				//对深度图像Resize,从1004x748变成1024x768
				ResizeDepthImage(DI);
				//利用opencv存储和展示图片
				for (int i=0;i<height;i++)
				{
					uchar *ptr = (uchar *) (depthShow->imageData + i * depthShow->widthStep);
					float *ptr1 = (float *) (DI + i*width);
					for (int j=0;j<width;j++)
					{
						ptr[j] = ptr1[width-1-j];
					}
				}

				//解析存储文件名
				fn.erase(fn.length()-4,fn.length());
				SaveImgName =  fn + "_result.jpg";
				double blockDepthValue = 0;

				for(int i = width/2-hwin;i<width/2+hwin;i++)
				{
					for(int j = height/2-hwin; j< height/2+hwin;j++)
					{
						blockDepthValue += DI[i*height + j];
					}
				}
				blockDepthValue /= winPixTotal;
				char blockDepthString[10];
				sprintf(blockDepthString,"%f",blockDepthValue);
				CvFont font;    
				double hScale=1;   
				double vScale=1;    
				int linewidth=2;// 相当于写字的线条    
				// 初始化字体   
				cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,linewidth);//初始化字体,准备写到图片上的   
				cvSaveImage(SaveImgName.c_str(),depthShow);
				cvShowImage("depth",depthShow);
				//cvWaitKey(-1);
				//把更高精度的深度图存储到txt里面去
				String SaveTxtName = fn + ".txt";
				SaveDepthMapInTxt(DI,SaveTxtName.c_str());
			}

		}while( _findnext( lfDir, &fileDir ) == 0 );
	}
	_findclose(lfDir);

	delete refer_img;
	delete target_img;
	delete refer_I;
	delete refer_MSI ;
	delete refer_MSII;
	delete target_SI ;
	delete target_SII ;
	delete DJ ;
	delete DJJ;
	delete DIJ;
	delete SIJ;
	delete DT;
	delete DTT;
	delete DM;
	delete DMM;
	delete costmatrix ; //按层存储
	delete finalCost;
	delete DI ;
	// Comment the following two lines to disable waiting on exit.
	cerr << endl << "Press Enter to exit." << endl;
	while( cin.get() != '\n');
	return 0;
}