for回圈執行第一次的程序中,getEyeCornerLbp256or59()函式執行完之后,file->num就變成一個很大的負值。在這個函式執行之前的程式中file->num的值很正常,指的是檔案夾里圖片的數量。求助,一天都沒找到問題所在,小妹字在此感激涕零。。。
void savePartFeature256or59(char *img_folder_path, char *point_folder_path, char *lbp_folder_path, int radius, int orientation, int thread_value, int pattern)
{
ApDirInfo* file;
char suffix[5] = { "JPG" }; //圖片檔案的后綴名
int num_feature;
int fnum;
FILE *lbpf;
FILE *fp1;//11.18
int k, t; //張立添加
int j;
IplImage *img;
//char *file_name_total,*file_name,*point_name,*point_name_total;
char *file_name_total, *point_name_total;
char *point_name;
struct CvPoint2D32f *image_point;
double *faceratio;//人臉比例特征
double *fhdata;//前額部分特征
double *fcdata;//臉頰部分特征
double *ecdata;//眼角部分特征
faceratio = (double*)calloc(6, sizeof(double));
if (pattern == 1){ num_feature = 59; }
else if (pattern == 2){ num_feature = 16; }//cslbp模式
else{ num_feature = 256; }
fhdata = (double*)calloc(num_feature, sizeof(double));
fcdata = (double*)calloc(num_feature, sizeof(double));
ecdata = (double*)calloc(num_feature, sizeof(double));
file_name_total = (char*)calloc(FILE_NAME_LENGTH, sizeof(char));
point_name_total = (char*)calloc(FILE_NAME_LENGTH, sizeof(char));
image_point = (struct CvPoint2D32f *)calloc(POINT_NO, sizeof(struct CvPoint2D32f));
file = (ApDirInfo*)calloc(1, sizeof(ApDirInfo));//分配空間,注意分配足夠的記憶體
file = apDirFiles(img_folder_path, suffix);//讀取檔案夾資訊,包含檔案名和檔案個數
lbpf = fopen(lbp_folder_path, "w");
if (lbpf == NULL)
{
printf("fopen檔案未打開!\n");
exit(1);
};
fprintf(lbpf, "pictureNum=%d\n", file->num);//
for (fnum = 1; fnum<file->num; fnum++)
{
printf("正在提取第%d張圖片\n", fnum);
//file_name=file->name[fnum];
sprintf(file_name_total, "%s%s", img_folder_path, file->name[fnum]);
//這里要把點檔案的全路徑計算出來
point_name = (char*)calloc(strlen(file->name[fnum]), sizeof(char));
//apChangeSuffix(file->name[fnum],point_name,".pts");//根據影像檔案名,通過改變后綴名得到特征點檔案名
//point_name[3]='a';//圖片名中第四位為大寫,特征點檔案名中為小寫,這里處理一下
//sprintf(point_name_total,"%s%s",point_folder_path,point_name);//最終得到特征點檔案的全路徑名point_name
//2013.11.18上午張立改
apChangeSuffix(file->name[fnum], point_name, ".txt");//根據影像檔案名,通過改變后綴名得到特征點檔案名
point_name[3] = 'a';//圖片名中第四位為大寫,特征點檔案名中為小寫,這里處理一下
sprintf(point_name_total, "%s%s", point_folder_path, point_name);//最終得到特征點檔案的全路徑名point_name
fp1 = fopen(point_name_total, "r");
fscanf(fp1, "points:%d\n", &t);
for (k = 0; k<68; k++)
{
fscanf(fp1, "%f", &image_point[k].x);
fscanf(fp1, "%f", &image_point[k].y);
}
fclose(fp1);
img = cvLoadImage(file_name_total, 0);
//ImgePoint68(point_name_total,image_point);//讀68個點
//計算特征
getFaceRatio(image_point, faceratio);
getForheadLbp256or59(fhdata, img, image_point, radius, orientation, thread_value, pattern);
//getEyeCornerLbp256or59(ecdata, img, image_point, radius, orientation, thread_value, pattern);
getFaceCheekLbp256or59(fcdata, img, image_point, radius, orientation, thread_value, pattern);
getEyeCornerLbp256or59(ecdata, img, image_point, radius, orientation, thread_value, pattern);
for (j = 0; j<6; j++){ fprintf(lbpf, "%6.4f\t", faceratio[j]); } fprintf(lbpf, "\n");
for (j = 0; j<num_feature; j++){ fprintf(lbpf, "%6.4f\t", fhdata[j]); }fprintf(lbpf, "\n");
for (j = 0; j<num_feature; j++){ fprintf(lbpf, "%6.4f\t", fcdata[j]); }fprintf(lbpf, "\n");
for (j = 0; j<num_feature; j++){ fprintf(lbpf, "%6.4f\t", ecdata[j]); }fprintf(lbpf, "\n\n");
//free(point_name);
}
printf("over....");
fclose(lbpf);
// free(point_name);
free(faceratio);
free(fhdata);
free(fcdata);
free(ecdata);
free(image_point);
free(file_name_total);
free(point_name_total);
//free(point_name);
cvReleaseImage(&img); //釋放影像資料
apReleaseMatrix2Dc(file->name, file->num);
free(file); file = NULL;
}
uj5u.com熱心網友回復:
getEyeCornerLbp256or59 這個函式處理是否有問題,或者你引數傳遞等不正確,導致它修改或者越界寫入了垃圾資料uj5u.com熱心網友回復:
變數初始化試試uj5u.com熱心網友回復:
把代碼再精簡一些,注釋掉一部分代碼 ,看看問題是出現在什么地方,先定位出出題出在哪句代碼或者哪幾句上,才好解決問題uj5u.com熱心網友回復:
point_name[3] = 'a'; "a" ????轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/113993.html
標籤:基礎類
