掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29518

BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/21 02:56:43)


2枚の同サイズのBMP画像を照合して、相関を取る(パターン認識)プログラムを作っています。
原画像を固定して、100枚用意した画像(入力画像)と順番に連続して相関を取るには どうすればいいのか教えていただけないでしょうか!
2枚目の画像dataというところでつまずいています。
fprintfを使うことは分かったのですがうまくいきません。
以下が作りかけのプログラムです。
よろしくおねがいします!

#include <stdio.h>
#include <math.h>


int main(void)
{
FILE *fp;
int wide,hite,wd,ht,cm;
int v[256][256],v2[256][256];
int h[54],palette[1024];
int i,j,a,b,x;
int n,m,p,t;
double sum3=0,sum4=0,sum5=0;
double z;
char infilepath[256];




/*1枚目の画像data*/

fp=fopen("p.bmp","rb"); // mono画像ファイルを開く
if(fp==NULL){
printf("エラー\n");
return 1; }
for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wide=h[18]+h[19]*256; // 画像の幅の計算
hite=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);

//mono画像データ読み込み
for(a=0; a<hite; a++)for(b=0; b<wide; b++){
v[a][b]=fgetc(fp);


}




/*2枚目の画像data*/
for (x=0; x<100; x++) {

sprintf(infilepath,"gazou%d.bmp",x);
fp=fopen("infilepath","rb"); // mono画像ファイルを開く

if(fp==NULL){
printf("エラー2\n");
return 1; }

for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wd=h[18]+h[19]*256; // 画像の幅の計算
ht=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);

//mono画像データ読み込み
for(a=0; a<ht; a++)for(b=0; b<wd; b++){
v2[a][b]=fgetc(fp);

}


}

/*相関の式に代入*/


//左下の計算//

for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
n=(v[a][b])*(v[a][b]);
sum3+=n;

}
printf("sum3=%f\n",sum3);


//右下の計算//


for(a=0;a<ht;a++) for(b=0;b<wd;b++)
{
m=(v2[a][b])*(v2[a][b]);
sum4+=m;

}
printf("sum4=%f\n",sum4);


//分子の計算//

for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
p=(v[a][b])*(v2[a][b]);
sum5+=p;

}
printf("sum5=%f\n",sum5);

//sum5÷sum3*sum4のルート
z=sum5/sqrt(sum3*sum4);

printf("類似度=%f",z);


return 0;
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:BMPを順番に取り込む方法を教えてください 29519 若旦那 2007/01/21 02:58:42
<子記事> Re:BMPを順番に取り込む方法を教えてください 29520 επιστημη 2007/01/21 12:29:48
<子記事> Re:BMPを順番に取り込む方法を教えてください 29529 ルナレルナ 2007/01/21 20:12:38
<子記事> Re:BMPを順番に取り込む方法を教えてください 29559 bmp 2007/01/23 14:37:33


No.29519

Re:BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/21 02:58:42)


追加です。
とりあえず用意している画像はgazou0.bmp〜gazou10.bmpです。


この投稿にコメントする

削除パスワード

No.29520

Re:BMPを順番に取り込む方法を教えてください
投稿者---επιστημη(2007/01/21 12:29:48)
http://blogs.wankuma.com/episteme/


× fp=fopen("infilepath","rb");
○ fp=fopen(infilepath,"rb");



この投稿にコメントする

削除パスワード

No.29521

Re:BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/21 13:07:09)


episteme様ありがとうございます。
変えてみましたがうまくいきません。。
もうすこしアドバイスおねがいします!

/*2枚目の画像data*/
for (x=0; x<50; x++) {

sprintf(infilepath,"gazou%d.bmp",x);
fp=fopen(infilepath,"rb");// mono画像ファイルを開く

if(fp==NULL){
printf("エラー2\n");
return 1; }
}

for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wd=h[18]+h[19]*256; // 画像の幅の計算
ht=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);

//mono画像データ読み込み
for(a=0; a<ht; a++)for(b=0; b<wd; b++){
v2[a][b]=fgetc(fp);

fclose(fp);


}




この投稿にコメントする

削除パスワード

No.29522

Re:BMPを順番に取り込む方法を教えてください
投稿者---επιστημη(2007/01/21 13:11:01)
http://blogs.wankuma.com/episteme/


"うまくいきません"だけじゃ小学生以下。
どこの/なにが/どのように"うまくいきません"のですか?

# "具合が悪い"の一言で薬をくれる医者はいません(いたらヤブ医者)。



この投稿にコメントする

削除パスワード

No.29523

Re:BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/21 14:09:29)


失礼しました。。

sprintf(infilepath,"gazou%d.bmp",x);
 
"gazou%d.bmp"の%dは、%cまたは%sに変える必要はありますでしょうか?


この投稿にコメントする

削除パスワード

No.29524

Re:BMPを順番に取り込む方法を教えてください
投稿者---επιστημη(2007/01/21 14:34:06)
http://blogs.wankuma.com/episteme/


> sprintf(infilepath,"gazou%d.bmp",x);
>"gazou%d.bmp"の%dは、%cまたは%sに変える必要はありますでしょうか?

infilepathをprintfして、望みのファイル名ができてるか確認すればえーやないのん。



この投稿にコメントする

削除パスワード

No.29525

Re:BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/21 15:38:15)


正しく出力されました。
しかし類似度の結果が正しい答えにならなくなりました。
他の変数も配列にする必要はありますでしょうか?

#include <stdio.h>
#include <math.h>


int main(void)
{
FILE *fp;
int wide,hite,wd,ht,cm;
int v[256][256],v2[256][256];
int h[54],palette[1024];
int i,j,a,b,x;
int n,m,p,t;
double sum3=0,sum4=0,sum5=0;
double z;
char infilepath[256];




/*1枚目の画像data*/

fp=fopen("gazou3.bmp","rb"); // mono画像ファイルを開く
if(fp==NULL){
printf("エラー\n");
return 1; }
for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wide=h[18]+h[19]*256; // 画像の幅の計算
hite=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);

//mono画像データ読み込み
for(a=0; a<hite; a++)for(b=0; b<wide; b++){
v[a][b]=fgetc(fp);


}




/*2枚目の画像data*/
for (x=0; x<4; x++) {

sprintf(infilepath,"gazou%d.bmp",x);
fp=fopen(infilepath,"rb"); // mono画像ファイルを開く


if(fp==NULL){
printf("エラー2\n");
return 1; }


for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wd=h[18]+h[19]*256; // 画像の幅の計算
ht=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);

//mono画像データ読み込み
for(a=0; a<ht; a++)for(b=0; b<wd; b++){
v2[a][b]=fgetc(fp);


}


/*相関の式に代入*/


//左下の計算//

for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
n=(v[a][b])*(v[a][b]);
sum3+=n;

}
printf("sum3=%f\n",sum3);


//右下の計算//


for(a=0;a<ht;a++) for(b=0;b<wd;b++)
{
m=(v2[a][b])*(v2[a][b]);
sum4+=m;

}
printf("sum4=%f\n",sum4);


//分子の計算//

for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
p=(v[a][b])*(v2[a][b]);
sum5+=p;

}
printf("sum5=%f\n",sum5);

//sum5÷sum3*sum4のルート
z=sum5/sqrt(sum3*sum4);

printf("類似度=%f\n",z);

}
return 0;
}


この投稿にコメントする

削除パスワード

No.29526

Re:BMPを順番に取り込む方法を教えてください
投稿者---επιστημη(2007/01/21 18:04:50)
http://blogs.wankuma.com/episteme/


>しかし類似度の結果が正しい答えにならなくなりました。
>他の変数も配列にする必要はありますでしょうか?

そう考える根拠はありますか?
あてずっぽでいじくってまぐれを期待しても無駄。

そもそも僕にはあなたがこのコードでなにをやってるのかさっぱりわかりません。
インデントかかってないし変数名はテキトーだし。



この投稿にコメントする

削除パスワード

No.29528

Re:BMPを順番に取り込む方法を教えてください
投稿者---yoh2(2007/01/21 19:33:16)


> ソースの添付は「HTML変換ツール」で字下げします。

これ守って下さいね。

さて、ぱっと見た感じ、ファイルが存在しているなら、fopen()部分には問題なさそう。
問題になりそうなのは以下のあたりでしょうか。特に2と3。
読もうとしているファイルのフォーマットを確認してみてはいかが?

1) 8ビットBMP専用になっている。
2) 類似度の計算らしきところで、ピクセルの実際のRGB値ではなく、カラーマップのインデックスを利用している。
3) 2を解消しようにも、1枚目のカラーマップの内容を2枚目以降の内容で上書きしている。
4) 画像の1ラインの終わりに付くパディングが考慮されていない。

もしこれららが問題のようなら、ちと問題が変わってきますので、スレッドを改めた方がいいかもしれません。


この投稿にコメントする

削除パスワード

No.29530

Re:BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/21 20:52:30)


yoh2さんアドバイスありがとうございます!
なにぶん画像処理に関してもC言語に関しても初心者でして。。
ルールは守らないといけませんね。すみません。

カラーマップのインデックスを利用しているというのは、ピクセル値を利用しているということですよね?濃淡画像の輝度を読み込みたい場合はどうすればいいのでしょうか?

1枚目のカラーマップの内容を2枚目以降の内容で上書きしている。という可能性が高そうですが。。


この投稿にコメントする

削除パスワード

No.29529

Re:BMPを順番に取り込む方法を教えてください
投稿者---ルナレルナ(2007/01/21 20:12:38)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	画像が無いのでテスト出来ない……
//

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
    char head[54], *map, *map2;
    int width, height;
    int i, j, map_n;
    const int file_n = 100;
    int sum[3];
    double z;
    char fname[256];
    FILE *in;
    
    in = fopen("p.bmp", "rb");
    
    fread(head, 1, sizeof head, in);
    if (head[28] == 8)
        fseek(in, 1024, SEEK_CUR);
    
    width = head[18] | head[19] << 8;
    height = head[22] | head[23] << 8;
    map = malloc(map_n = width * height);
    map2 = malloc(map_n);
    
    fread(map, 1, map_n, in);
    fclose(in);
    
    for (i = 0; i < map_n; i++)
        sum[0] += map[i] * map[i];
    
    for (i = 0; i < file_n; i++) {
        sprintf(fname, "gazou%d.bmp", i);
        in = fopen(fname, "rb");
        
        fread(head, 1, sizeof head, in);
        if (head[28] == 8)
            fseek(in, 1024, SEEK_CUR);
        fread(map2, 1, map_n, in);
        fclose(in);
        
        sum[1] = sum[2]=  0;
        for (j = 0; j < map_n; j++) {
            sum[1] += map2[j] * map2[j];
            sum[2] += map[j] * map2[j];
        }
        
        z = (double) sum[2] / sqrt((double) sum[0] * sum[1]);
        printf("z = %f\n", z);
    }
    
    free(map);
    free(map2);
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.29531

Re:BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/21 21:08:12)


ルナレルナさん
私のプログラムを書き直してくださったのでしょうか、プログラムまで作っていただきありがとうございます!
見たことのないものがいっぱいですが。。
早速が実行してみましたが、結果がただしくありませんでした。
同じ画像を入れた場合類似度は1と出るはずですがでませんでした。

私のプログラムで修正するべきところがあればアドバイスお願いします。




この投稿にコメントする

削除パスワード

No.29532

Re:BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/21 21:54:09)


結果の類似度にマイナスはありえないのですがマイナスになってしまいます。何が原因でしょうか?
またsum[0]は初期化しなくていいのですか?





この投稿にコメントする

削除パスワード

No.29534

Re:BMPを順番に取り込む方法を教えてください
投稿者---επιστημη(2007/01/22 01:04:06)
http://blogs.wankuma.com/episteme/


>またsum[0]は初期化しなくていいのですか?

いや、だから、そーゆーのはあなたが理解してないとどーしよーもないやないですか?
これ以降疑問が生じるたびに誰かにいちいちお伺いをたてな先に進めんのですか?

僕らはコードが正しいか否か以外になんもわからんと思うてください。




この投稿にコメントする

削除パスワード

No.29535

Re:BMPを順番に取り込む方法を教えてください
投稿者---asd(2007/01/22 10:12:37)


>結果の類似度にマイナスはありえないのですがマイナスになってしまいます。何が原因でしょうか?
>またsum[0]は初期化しなくていいのですか?
>
>

>課題の丸投げはしません。

επιστημηさんも仰っていますが、それは貴方が考えることです。
同じ画像を入れたときのそれぞれの変数の値をステップ実行などで確認していってはどうですか?

どの辺りがおかしいのか探してみる、「こうじゃないかな?」と思ったことは試してみる/試してみた結果を載せる、自分で出来ることはやってから再質問しましょうよ。

# プログラム書いてもらえたからって自助努力を放棄しちゃダメだと思うのです。


この投稿にコメントする

削除パスワード

No.29536

Re:BMPを順番に取り込む方法を教えてください
投稿者---ルナレルナ(2007/01/22 12:35:48)
http://park6.wakwak.com/~nougaki/mini_program/


若旦那の指摘通り、
sum[0]を初期化し、
適当にファイルを作って、
file_nを調整し、
実験したところ無事成功。

意図的に、
malloc()やfopen()なりで、
エラーチェックをしなかったところ、
実行中、連番ファイルのfopenのところで止まる
???

よ〜くみてみると、
プログラム側の問題ではなくて、
適当に用意したファイル名が、
0番からではなく、1番からはじまっていた。

只ファイル名がちょっと違うだけでひっかかる。
当たり前だけど、陥りがちなミス。
そこに気付けてよかったよかった。


この投稿にコメントする

削除パスワード

No.29537

なぜ、sum[0]を初期化しなかったのか?
投稿者---ルナレルナ(2007/01/22 12:45:28)
http://park6.wakwak.com/~nougaki/mini_program/


実は、はじめは初期化していた。
s[0], s[1], s[2]を同時に求めていた。
s[0]は1度だけ求めれば良かったので、s[1], s[2]と分離した。
s[1], s[2]は、ファイルが変わるごとに、0にしないと、延々と増えつづける。
s[1], s[2]とに0を代入する処理を加えた。
0を代入する処理により、初期化が必要ないと感じた。
sum[0]のことをすっかり忘れ、初期化処理を省いた。
sum[0]が初期化されていないことによる計算ミス。


この投稿にコメントする

削除パスワード

No.29548

Re:なぜ、sum[0]を初期化しなかったのか?
投稿者---若旦那(2007/01/23 01:25:03)


ルナレルナさんのおかげで先に進むことができました!
ありがとうございました☆
またつまずいたらおねがいします!


この投稿にコメントする

削除パスワード

No.29559

Re:BMPを順番に取り込む方法を教えてください
投稿者---bmp(2007/01/23 14:37:33)


向こうの掲示板のスレッドはクローズしておいてください。


この投稿にコメントする

削除パスワード

No.29563

Re:BMPを順番に取り込む方法を教えてください
投稿者---若旦那(2007/01/23 15:03:07)


マナー違反でした、すみません。
すぐに削除します。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧