0

カメラ パラメータ ファイルの読み込み中に fscanf 関数で問題が発生しました。QT 4.7 を使用して、QT ウィジェット アプリケーションを作成しています。最初の fscanf ステートメントを実行すると、セグメンテーション違反が発生します。しかし、コンソール アプリケーション プロジェクトでコードを実行すると、問題なく動作します。

ここに私のコードの一部があります:

struct parametry_kamery
           {
            float cc[2],fc[2],alpha_c,kc[5];
            int D,al;
           };
    parametry_kamery kam_par;

void Widget::readParameters(parametry_kamery* kam_par)
{

 FILE *fi;
 char buf[255];
 float cc1=0,cc2=0;

 fi=fopen("Camera parameters.cfg", "r");

 if(!fi)
 {
  QMessageBox::information(this,tr("Can't read file"),tr("Error"));
  return;
 }

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %f %f",buf,buf,buf,&cc1,&cc2);

kam_par->fc[0] = cc1;
kam_par->fc[1] = cc2;

 fclose(fi);
}

関数 readParameters(&kam_par); を呼び出しています。

そして、ここにファイルの内容があります:

Parametry_wewnętrzne_kamery
Focal_Length:                    fc =  1079.33793   1181.44679  ± [ 2.44878   2.52105]
Principal_point:                 cc =  378.95649   245.99109  ± [ 3.48032   2.99878 ]
Skew:                       alpha_c =  0.00000  ±  0.00000     => angle of pixel axes = 90.00000 ± 0.00000 degrees
Distortion:                      kc =  -0.13666   -0.01830   -0.00070   0.00134  0.00000 
4

2 に答える 2

0

関数を変更しました。値ごとに構造体を取り、構造体を返します。より多くのメモリが必要になることはわかっていますが、今のところうまく機能しています。ポインタでバージョンを修正してみます。Rokuを助けてくれてありがとう。

Widget::parametry_kamery Widget::readParameters(parametry_kamery kam_par)
{

 FILE *fi;
 char buf[255];

 fi=fopen("Camera parameters.cfg", "r");

 if(!fi)
 {
  QMessageBox::information(this,tr("Błąd odczytu pliku konfiguracyjnego"),tr("Error"));
  return parametry_kamery::parametry_kamery();
 }

 while('\n'!=fgetc(fi));

 fscanf(fi,"%s %s %s %f %f",buf,buf,buf,&kam_par.fc[0],&kam_par.fc[1]);

QMessageBox::information(this,buf,buf2);
 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %f %f",buf,buf,buf,&kam_par.cc[0],&kam_par.cc[1]);

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %f",buf,buf,buf,&kam_par.alpha_c);

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %f %f %f %f %f",buf,buf,buf,&kam_par.kc[0],
       &kam_par.kc[1],&kam_par.kc[2],&kam_par.kc[3],&kam_par.kc[4]);

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %i",buf,buf,buf,&kam_par.D);

 while('\n'!=fgetc(fi));
 fscanf(fi,"%s %s %s %i",buf,buf,buf,&kam_par.al);

 fclose(fi);
 return kam_par;
}
于 2013-02-19T20:27:32.897 に答える
0

最初の fscanf は 3 つの文字列を読み取り、次に 2 つの float を読み取ります。しかし、ファイルは 2 つのフロートの前に 4 つの文字列で始まるようです。最初の 4 つの文字列は次のとおりです。

Parametry_wewnętrzne_kamery
Focal_Length:
fc
=

ところで、Qt を使用している場合は、Qt のファイル関数 (QFile と QTextStream) と QString とその変換関数を使用する方がはるかに簡単です (エラーが発生しにくくなります)。

于 2013-02-18T19:48:23.590 に答える