ページ 1 / 1
バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 14:30
by あすぱら
あすぱらと申します。
初めての質問で至らぬ点があると思いますが、ご容赦ください。
以下に質問の内容を記載します。
[1] 質問文
[1.1] 自分が今行いたい事は何か
unsigned char* imagebufferの先頭アドレスには画像の輝度値が入っています。
それをfwrite関数とfor文を使用してバイナリファイルに書き出そうとしています。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
プログラムが長いので以下に問題の部分だけ記載します。
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
同じ内容のデータを964320回書き込んでいる。(恐らく先頭アドレスの内容をずっと書き込 んでいる)
[1.4] 今何がわからないのか、知りたいのか
for文で回して、先頭アドレスから次のアドレス(n+1)の内容を書き込みたい。
[2] 環境
[2.1] OS : Windows, Linux等々
Ubuntu12.04
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
GCC
[3] その他
・どの程度C言語を理解しているか
大学で初歩の初歩を教わった程度
コード:
unsigned char* imagebuffer = NULL;
res = pImage -> get(&imagebuffer);
if(res != BGAPI_RESULT_OK)
{
printf("BGAPI::Image::getエラー: %d\n" ,res);
return 0;
}
FILE* fp;
fp = fopen("R", "wb");
for(i=0;i<=964320;i++){
fwrite(&imagebuffer,sizeof(unsigned char),1,fp);
imagebuffer++;
}
fclose(fp);
printf("write\n");
何かまずい点、こうしたらいい点がありましたらお教えください。
Re: バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 14:54
by みけCAT
fwriteに渡すべきなのは&imagebufferではなくてimagebufferなのではないでしょうか?
Re: バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 16:06
by あすぱら
レスありがとうございます。
みけCATさんの言われた通り、「imagebuffer」を渡したところ、プログラムが途中で停止してしまいました。(コンソールにwriteが表示されませんでした。)
一応、バイナリファイルが出来ていたので見たところ容量が1.3MBありました。計算上ですと964.32KBのファイルとなるはずですので、まだ何かおかしいでしょうか?
Re: バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 16:12
by usao
964320回書き込むなら 11行目は <= ではなく < とすべきではないでしょうか?
オフトピック
「1byte書き込むことを964320回やる」ことに何か特別な理由があるのでなければ
「964320byte書き込むことを1回やる」でいいような.
[追記]
iの型はintか何かでしょうか?
とりあえずfor文の中が何回回っているかを確認されてみては?
Re: バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 16:24
by あすぱら
>>usao
レスありがとうございます。
書き込みを1度にやってはどうかとアドバイスを受けて、コードは以下のように修正しました。
fwriteの項目数を963420にしました。
コード:
unsigned char* imagebuffer = NULL;
res = pImage -> get(&imagebuffer);
if(res != BGAPI_RESULT_OK)
{
printf("BGAPI::Image::getエラー: %d\n" ,res);
return 0;
}
FILE* fp;
fp = fopen("R", "wb");
fwrite(&imagebuffer,sizeof(unsigned char),963420,fp);
fclose(fp);
printf("write\n");
実行したところ、323.6KBのバイナリファイルとなってしまいました。上記のコードで間違いがありますか?
Re: バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 16:51
by usao
おっと,また fwrite()の第一引数が &imagebuffer になっていますよ.
ファイルサイズがおかしくなる理由はわかりませんが
とりあえず,
・2行目の後で,imagebufferの値がNULLでないことを確認
・fopen()直後に,fpの値がまともかどうかを確認
・fwrite()の戻り値チェック(エラーじゃないかどうか)
くらいは入れておきたいですね.
オフトピック
コードから推測するにbaumerのやつを使っているのかな?
同じコードでも日によって(?)動いたり動かなかったりで,カメラから絵を取るときにえらく苦労したような記憶が.
Re: バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 17:41
by あすぱら
>>usao
アドバイスありがとうございます。以下に記載された事を調べるためにコードを修正しました。
コード:
unsigned char* imagebuffer = NULL;
res = pImage -> get(&imagebuffer);
printf("imagebuffer:%d\n",imagebuffer);
if(res != BGAPI_RESULT_OK)
{
printf("BGAPI::Image::getエラー: %d\n" ,res);
return 0;
}
printf("imagebuffer:%d\n",res);
FILE* fp;
fp = fopen("R", "wb");
printf("fp:%d\n",fp);
for(i=0;i<964320;i++){
res=fwrite(imagebuffer,sizeof(unsigned char),1,fp);
printf("%d\n",res);
printf("%d\n",i);
imagebuffer++;
}
fclose(fp);
printf("write\n");
上のコードを元に以下を解答致します。
・2行目の後で,imagebufferの値がNULLでないことを確認
値は「-1297069832」
・fopen()直後に,fpの値がまともかどうかを確認
値は「174192632」(すいません。この値がまともかどうかの判断はどのようにするのでしょうか)
・fwrite()の戻り値チェック(エラーじゃないかどうか)
常に「1」が返っているのでエラーではないと思います。
「i」についてはint型で間違いないです。
for文は325383回回った所で止まってしまいます。
恐らくfor文が途中で止まってしまうので、ファイルサイズがおかしいと思うのですが、止まってしまう理由がさっぱりわかりません。
お察しの通りbaumerのカメラから絵を取るためにしくはくしている所です。やはり意外と難しいのですね。
Re: バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 21:51
by みけCAT
964320バイトという値は、本当に取得しようとしている絵のサイズと合っていますか?
Re: バイナリファイルの書き出しについて
Posted: 2014年10月15日(水) 23:12
by へにっくす
考えられるのは、pImage->getで得たバッファサイズが964320バイトもないってことですね。
みけCATさんとかぶりますが、
そもそも964320バイトってのはどこからきた?
pImageの型が不明なのであてずっぽうなのですが、必要なサイズはいくらか得る関数とかあったりしないですかね。
#baumerのカメラですか
#それは実際に使っている人から聞かないとだめですねえ・・・
Re: バイナリファイルの書き出しについて
Posted: 2014年10月16日(木) 08:50
by あすぱら
>>みけCAT
964320ばいとは以下の式から求めました。
解像度×RGB24ビット=656×490×3=964320
>>へにっくす
レスありがとうございます。
必要なバイト数は上記で求めたのですが、もしかしたらRGB24ビットで画像を取得してない可能性も思いつきました。このカメラにはモノラル8ビットで画像を取得する事も出きるのです。もしその場合は必要なバイト数は321440バイトとなり、現在取得出来ているバイナリファイルのサイズ324493に近いサイズになります。
もう一度初期設定を見直してみます。
Re: バイナリファイルの書き出しについて
Posted: 2014年10月16日(木) 09:38
by usao
解像度やBPP等といった情報はカメラのクラスあたりから取得できたと思いますので,
実際にそれ用のメソッドで問い合わせてサイズを取得すべきですね.
実際にそこらへんのサイズが違ってるのが原因なのかわかりませんが
>325383回
ってのが奇数なのがなんとなく不自然な雰囲気ですね…
なんか変なサイズでの部分切り出しみたいな設定になってるとか?
#あと,関係ないと思いますが,カメラにイメージをセットしても
一回画像キャプチャされるとそのセットが解除されるから毎回セットし直す必要がある,
みたいな感じだったような記憶がありますが,そういう別のところで何かおかしなことになっているとか…?
オフトピック
fwrite()って,
void *p = 何か適当な値;
fwrite( p, sizeof(unsigned char), 1, fp );
とか書いたら
pの指す場所がどこであろうが,とりあえずそこの値を吐き出しそうな気がするけど
場合によってはフリーズし得るのか…?
Re: バイナリファイルの書き出しについて
Posted: 2014年10月16日(木) 13:17
by みけCAT
usao さんが書きました:実際にそこらへんのサイズが違ってるのが原因なのかわかりませんが
>325383回
ってのが奇数なのがなんとなく不自然な雰囲気ですね…
なんか変なサイズでの部分切り出しみたいな設定になってるとか?
確保された領域の外にアクセスしても、すぐにアクセス違反になるとは限りません。
「未定義」です。
usao さんが書きました:オフトピック
fwrite()って,
void *p = 何か適当な値;
fwrite( p, sizeof(unsigned char), 1, fp );
とか書いたら
pの指す場所がどこであろうが,とりあえずそこの値を吐き出しそうな気がするけど
場合によってはフリーズし得るのか…?
とりあえずそこの値を吐き出そうとして、そこへの読み取りアクセスが(OSなどによって)禁止されていればアクセス違反になると思います。
フリーズするケースがあるかは知りません。
Re: バイナリファイルの書き出しについて
Posted: 2014年10月17日(金) 11:35
by あすぱら
初期設定を見直したところ、やはりRGB8ビットで動作していませんでした。設定を変更しfor文で回したところ、無事にバイナリファイルとして書き出す事が出来ました。
アドバイス頂いた皆さんありがとうございました。