⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 完整的3D 模型检索程序
💻 C
📖 第 1 页 / 共 4 页
字号:
			// refine Translate and scale between model 1 and 2
			TranslateScale(vertex2, NumVer2, destfn, &Translate2, &Scale2);
			TranslateScale(vertex1, NumVer1, srcfn, &Translate1, &Scale1);

			// refine rotate of model 2 to fit the model 1
			Err = Refine(src_ArtCoeff[UseCam], vertex2, triangle2, NumVer2, NumTri2, UseCam,
						 CamVertex[UseCam], CamTriangle[UseCam], CamNumVer[UseCam], CamNumTri[UseCam]);

			// refine Translate and scale of model 2 again
			TranslateScale(vertex2, NumVer2, destfn, &Translate2, &Scale2);

			// scale and translate back to the original state of model 1
			Scale1 = 1.0 / Scale1;
			Scale(vertex2, NumVer2, Scale1);

			Translate1.coor[0] = -Translate1.coor[0];
			Translate1.coor[1] = -Translate1.coor[1];
			Translate1.coor[2] = -Translate1.coor[2];
			Translate(vertex2, NumVer2, Translate1);

			// record execute time --- end
			finish = clock();
			fpt = fopen("time.txt", "a");
			fprintf(fpt, " Refine %.1f sec.\n", (double)(finish - start) / CLOCKS_PER_SEC );
			fclose(fpt);

			sprintf(filename, "%s_to_%s_refine.obj", destfn, srcfn);
			SaveObj(filename, vertex2, triangle2, NumVer2, NumTri2);

			// save two model
			// model 1 should translate and scale back to original
			Scale(vertex1, NumVer1, Scale1);
			Translate(vertex1, NumVer1, Translate1);
			sprintf(filename, "%s_to_%s_merge_refine.obj", destfn, srcfn);
			SaveMergeObj(filename, vertex1, triangle1, NumVer1, NumTri1, vertex2, triangle2, NumVer2, NumTri2);

			// write Err to file
			fpt2 = fopen("Refine_Err.txt", "a");
			fprintf(fpt2, "Err of %s to %s : %f\n", destfn, srcfn, Err);
			fclose(fpt2);

			// free memory of 3D model
			free(vertex1);
			free(triangle1);
			free(vertex2);
			free(triangle2);
		}

		fclose(fpt1);
		for(destCam=0; destCam<ANGLE; destCam++)
		{
			free(CamVertex[destCam]);
			free(CamTriangle[destCam]);
		}
		NumTri = 0;
		break;
*/
// *************************************************************************************************
	// calculate feature and save to file
	case 'n':
		// initialize ART
		GenerateBasisLUT();
		// initialize: read camera set
		for(destCam=0; destCam<ANGLE; destCam++)
		{
			sprintf(filename, "12_%d", destCam);
			ReadObj(filename, CamVertex+destCam, CamTriangle+destCam, CamNumVer+destCam, CamNumTri+destCam);
		}

		for(i=0; i<CAMNUM; i++)
		{
			srcBuff[i] = (unsigned char *) malloc (winw * winh * sizeof(unsigned char));
			ColorBuff[i] = (unsigned char *) malloc (3 * winw * winh * sizeof(unsigned char));
		}
		YuvBuff = (unsigned char *) malloc (3 * winw * winh * sizeof(unsigned char));
		// add edge to test retrieval
		EdgeBuff = (unsigned char *) malloc (winw * winh * sizeof(unsigned char));

		// for Fourier Descriptor
		total = winw * winh;
		Contour = (sPOINT *) malloc( total * sizeof(sPOINT));
		ContourMask = (unsigned char *) malloc( total * sizeof(unsigned char));

		fpt1 = fopen("list.txt", "r");
		fpt_art_q4 = fopen("all_q4_v1.8.art", "wb");
		fpt_art_q8 = fopen("all_q8_v1.8.art", "wb");
//		fpt_ccd = fopen("all_v1.7.ccd", "wb");
		fpt_cir_q8 = fopen("all_q8_v1.8.cir", "wb");
//		fpt_fd = fopen("all.fd", "wb");
		fpt_fd_q8 = fopen("all_q8_v1.8.fd", "wb");
		fpt_ecc_q8 = fopen("all_q8_v1.8.ecc", "wb");
		Count = 0;
		while( fgets(fname, 400, fpt1) )
		{
			// record execute time --- start
			start = clock();

			fname[strlen(fname)-1] = 0x00;
			// get the translatation and scale of the two model
			if( ReadObj(fname, &vertex1, &triangle1, &NumVer1, &NumTri1) == 0 )
				continue;

			// ****************************************************************
			// Corase alignment
			// ****************************************************************

			// Translate and scale model 1
			TranslateScale(vertex1, NumVer1, triangle1, NumTri1, fname, &Translate1, &Scale1);

			// read RED only, so size is winw*winh
			for(srcCam=0; srcCam<ANGLE; srcCam++)
			{
				// capture CAMNUM silhouette of srcfn to memory
				for(i=0; i<CAMNUM; i++)
//					RenderToMem(srcBuff[i], ColorBuff[i], CamVertex[srcCam]+i, vertex1, triangle1, NumVer1, NumTri1);
					RenderToMem(srcBuff[i], NULL, CamVertex[srcCam]+i, vertex1, triangle1, NumVer1, NumTri1);

				// find center for each shape
				for(i=0; i<CAMNUM; i++)
					FindCenter(srcBuff[i], winw, winh, CenX+i, CenY+i);

				// from silhouette
//				for(i=0; i<CAMNUM; i++)
//				{
//					EdgeDetectSil(srcBuff[i], winw, winh);
//					sprintf(fn, "%s_%2d_%02d.bmp", fname, srcCam, i);
//					WriteBitmap8(srcBuff[i], winw, winh, fn);
//				}

				// get color descriptor
//				for(i=0; i<CAMNUM; i++)
//				{
//					RGB_To_YUV(YuvBuff, ColorBuff[i], winw, winh);
//					ExtractCCD(YuvBuff, CompactColor[srcCam]+i, srcBuff[i]);
					// print the results of compact color
//					for(j=0; j<NUM_BINS-1; j++)
//						if( CompactColor[i] & (0x8000000000000000 >> j) )
//							printf("1");
//						else
//							printf("0");
//					printf("\n");
//				}

				// get Zernike moment
				FindRadius(srcBuff, CenX, CenY);
				for(i=0; i<CAMNUM; i++)
				{
					// from depth
					// EdgeDetect(EdgeBuff, srcBuff[i], winw, winh);
//					WriteBitmap8(srcBuff[i], winw, winh, "test1.bmp");
//					WriteBitmap8(EdgeBuff, winw, winh, "test2.bmp");
					ExtractCoefficients(srcBuff[i], src_ArtCoeff[srcCam][i], EdgeBuff, CenX[i], CenY[i]);
				}

				// get Fourier descriptor
				for(i=0; i<CAMNUM; i++)
					FourierDescriptor(src_FdCoeff[srcCam][i], srcBuff[i], winw, winh, Contour, ContourMask, CenX[i], CenY[i]);

				// get eccentricity
				for(i=0; i<CAMNUM; i++)
					ecc_Coeff[srcCam][i] = Eccentricity(srcBuff[i], winw, winh, CenX[i], CenY[i]);

				// get circularity
				for(i=0; i<CAMNUM; i++)
				{
					EdgeDetectSil(EdgeBuff, srcBuff[i], winw, winh);
					cir_Coeff[srcCam][i] = Circularity(srcBuff[i], winw, winh, EdgeBuff);
				}

			}

			// free memory of 3D model
			free(vertex1);
			free(triangle1);

			// record execute time --- end
			finish = clock();
			fpt = fopen("feature_time.txt", "a");
			fprintf(fpt, "%s ( V: %d T: %d )\t: %f sec;\n", fname, NumVer1, NumTri1, (double)(finish - start) / CLOCKS_PER_SEC );
			fclose(fpt);

			// **********************************************************************
			// save ART feature to file
//			sprintf(filename, "%s_v1.7.art", fname);
//			fpt = fopen(filename, "wb");
//			fwrite(src_ArtCoeff, ANGLE * CAMNUM * ART_ANGULAR * ART_RADIAL, sizeof(double), fpt);
//			fclose(fpt);

			// linear Quantization to 8 bits for each coefficient
			for(i=0; i<ANGLE; i++)
				for(j=0; j<CAMNUM; j++)
				{
					// the order is the same with that defined in MPEG-7, total 35 coefficients
					k = 0;
					p = 0;
					for(r=1 ; r<ART_RADIAL ; r++, k++)
					{
						itmp = (int)(QUANT8 *  src_ArtCoeff[i][j][p][r]);
						if(itmp>255)
							q8_ArtCoeff[i][j][k] = 255;
						else
							q8_ArtCoeff[i][j][k] = itmp;
					}

					for(p=1; p<ART_ANGULAR ; p++)
						for(r=0 ; r<ART_RADIAL ; r++, k++)
						{
							itmp = (int)(QUANT8 *  src_ArtCoeff[i][j][p][r]);
							if(itmp>255)
								q8_ArtCoeff[i][j][k] = 255;
							else
								q8_ArtCoeff[i][j][k] = itmp;
						}
				}
			// save to disk
			fwrite(q8_ArtCoeff, sizeof(unsigned char), ANGLE * CAMNUM * ART_COEF, fpt_art_q8);
			sprintf(filename, "%s_q8_v1.8.art", fname);
			if( (fpt = fopen(filename, "wb")) == NULL )	{	printf("Write %s error!!\n", filename);	return;	}
			fwrite(q8_ArtCoeff, sizeof(unsigned char), ANGLE * CAMNUM * ART_COEF, fpt);
			fclose(fpt);

			// non-linear Quantization to 4 bits for each coefficient using MPEG-7 quantization table
			for(i=0; i<ANGLE; i++)
				for(j=0; j<CAMNUM; j++)
				{
					// the order is the same with that defined in MPEG-7, total 35 coefficients
					k = 0;
					p = 0;
					for(r=1 ; r<ART_RADIAL ; r++, k++)
					{
						high = 17;
						low = 0;
						while(high-low > 1)
						{
							middle = (high+low) / 2;

							if(QuantTable[middle] < src_ArtCoeff[i][j][p][r])
								low = middle;
							else
								high = middle;
						}
						q8_ArtCoeff[i][j][k] = low;
					}
					for(p=1; p<ART_ANGULAR ; p++)
						for(r=0 ; r<ART_RADIAL ; r++, k++)
						{
							high = 17;
							low = 0;
							while(high-low > 1)
							{
								middle = (high+low) / 2;

								if(QuantTable[middle] < src_ArtCoeff[i][j][p][r])
									low = middle;
								else
									high = middle;
							}
							q8_ArtCoeff[i][j][k] = low;
						}
				}

			for(i=0; i<ANGLE; i++)
				for(j=0; j<CAMNUM; j++)
					for(k=0, a=0; k<ART_COEF; k+=2, a++)
						if( k+1 < ART_COEF )
							q4_ArtCoeff[i][j][a] = ( (q8_ArtCoeff[i][j][k] << 4) & 0xf0 ) | 
												( q8_ArtCoeff[i][j][k+1] & 0x0f );
						else
							q4_ArtCoeff[i][j][a] = ( (q8_ArtCoeff[i][j][k] << 4) & 0xf0 );

			// save to disk
			fwrite(q4_ArtCoeff, sizeof(unsigned char), ANGLE * CAMNUM * ART_COEF_2, fpt_art_q4);
			sprintf(filename, "%s_q4_v1.8.art", fname);
			if( (fpt = fopen(filename, "wb")) == NULL )	{	printf("Write %s error!!\n", filename);	return;	}
			fwrite(q4_ArtCoeff, sizeof(unsigned char), ANGLE * CAMNUM * ART_COEF_2, fpt);
			fclose(fpt);

			// **********************************************************************
			// save color descriptor to disk
//			fwrite(CompactColor, sizeof(unsigned char), ANGLE * CAMNUM * sizeof(unsigned __int64), fpt_ccd);
//			sprintf(filename, "%s.ccd", fname);
//			if( (fpt = fopen(filename, "wb")) == NULL )	{	printf("Write %s error!!\n", filename);	return;	}
//			fwrite(CompactColor, sizeof(unsigned char), ANGLE * CAMNUM * sizeof(unsigned __int64), fpt);
//			fclose(fpt);

			// **********************************************************************
			// save circularity feature to file
//			sprintf(filename, "%s.cir", fname);
//			fpt = fopen(filename, "wb");
//			fwrite(cir_Coeff, ANGLE * CAMNUM, sizeof(double), fpt);
//			fclose(fpt);

			// linear Quantization to 8 bits for each coefficient
			for(i=0; i<ANGLE; i++)
				for(j=0; j<CAMNUM; j++)
				{
					itmp = (int)(QUANT8 *  cir_Coeff[i][j]);
					if(itmp>255)		q8_cirCoeff[i][j] = 255;
					else				q8_cirCoeff[i][j] = itmp;
				}
			// save to disk
			fwrite(q8_cirCoeff, sizeof(unsigned char), ANGLE * CAMNUM, fpt_cir_q8);
			sprintf(filename, "%s_q8_v1.8.cir", fname);
			if( (fpt = fopen(filename, "wb")) == NULL )	{	printf("Write %s error!!\n", filename);	return;	}
			fwrite(q8_cirCoeff, sizeof(unsigned char), ANGLE * CAMNUM, fpt);
			fclose(fpt);

			// **********************************************************************
			// save eccentricity feature to file
			// linear Quantization to 8 bits for each coefficient
			for(i=0; i<ANGLE; i++)
				for(j=0; j<CAMNUM; j++)
				{
					itmp = (int)(QUANT8 * ecc_Coeff[i][j]);
					if(itmp>255)		q8_eccCoeff[i][j] = 255;
					else				q8_eccCoeff[i][j] = itmp;
				}
			// save to disk
			fwrite(q8_eccCoeff, sizeof(unsigned char), ANGLE * CAMNUM, fpt_ecc_q8);
			sprintf(filename, "%s_q8_v1.8.ecc", fname);
			if( (fpt = fopen(filename, "wb")) == NULL )	{	printf("Write %s error!!\n", filename);	return;	}
			fwrite(q8_eccCoeff, sizeof(unsigned char), ANGLE * CAMNUM, fpt);
			fclose(fpt);

			// **********************************************************************
			// save Fourier descriptor feature to file
//			fwrite(src_FdCoeff, ANGLE * CAMNUM * FD_COEFF_NO, sizeof(double), fpt_fd);
//			sprintf(filename, "%s.fd", fname);
//			fpt = fopen(filename, "wb");
//			fwrite(src_FdCoeff, ANGLE * CAMNUM * FD_COEFF_NO, sizeof(double), fpt);
//			fclose(fpt);

			for(i=0; i<ANGLE; i++)
				for(j=0; j<CAMNUM; j++)
				{
					for(k=0; k<FD_COEFF_NO; k++)
					{
						itmp = (int)(QUANT8 * FD_SCALE * src_FdCoeff[i][j][k]);
						if(itmp>255)
							q8_FdCoeff[i][j][k] = 255;
						else
							q8_FdCoeff[i][j][k] = itmp;
					}
				}

			fwrite(q8_FdCoeff, ANGLE * CAMNUM * FD_COEFF_NO, sizeof(unsigned char), fpt_fd_q8);
			sprintf(filename, "%s_q8_v1.8.fd", fname);
			fpt = fopen(filename, "wb");
			fwrite(q8_FdCoeff, ANGLE * CAMNUM * FD_COEFF_NO, sizeof(unsigned char), fpt);
			fclose(fpt);

//			printf("%d.%s OK.\n", Count++, fname);
			printf("%d.", Count++);
		}

		for(i=0; i<CAMNUM; i++)
		{
			free(srcBuff[i]);
			free(ColorBuff[i]);
		}
		free(YuvBuff);
		free(EdgeBuff);
		free(Contour);
		free(ContourMask);
		fclose(fpt1);
		fclose(fpt_art_q8);
		fclose(fpt_art_q4);
//		fclose(fpt_ccd);
		fclose(fpt_cir_q8);
		fclose(fpt_ecc_q8);
//		fclose(fpt_fd);
		fclose(fpt_fd_q8);
		for(destCam=0; destCam<ANGLE; destCam++)
		{
			free(CamVertex[destCam]);
			free(CamTriangle[destCam]);
		}
		NumTri = 0;
		break;

// *************************************************************************************************
	// calculate color feature only
	case 'm':
		// initialize ART
//		GenerateBasisLUT();
		// initialize: read camera set

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -