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; }
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; }
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; }