2枚の同サイズのBMP画像を照合して、相関を取る(パターン認識)プログラムを作っています。
原画像を固定して、100枚用意した画像(入力画像)と順番に連続して相関を取るには
どうすればいいのか教えていただけないでしょうか!
今は原画像も入力画像も指定して開いています。
以下が作りかけのプログラムです。
#include <stdio.h>
#include <math.h>
int main(void)
{
FILE *fp;
int wide,hite,wd,ht,cm;
int v,v2;
int h[54],palette[1024],x,y,e,g;
int i,j;
double z,p,n,m;
double sum=0,sum2=0,sum3=0,sum4=0,sum5=0;
double ave=0,ave2=0;
/*原画像データ*/
fp=fopen("m.bmp","rb"); // mono画像ファイルを開く
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(y=0; y<hite; y++)for(x=0; x<wide; x++){
v=fgetc(fp); //v=濃度値
sum+=v;
}
ave=sum/(hite*wide);
/*入力画像データ*/
fp=fopen("p.bmp","rb"); // mono画像ファイルを開く
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(e=0; e<ht; e++)for(g=0; g<wd; g++){
v2=fgetc(fp);
sum2+=v2;
}
ave2=sum2/(ht*wd);
/*相関をとる*/
for(j=0;j<=hite;j++) for(i=0;i<=wide;i++)
{
n=(v-ave)*(v-ave);
sum3+=n;
}
for(j=0;j<=ht;j++) for(i=0;i<=wd;i++)
{
m=(v2-ave2)*(v2-ave2);
sum4+=m;
}
for(j=0;j<=hite;j++) for(i=0;i<=wide;i++)
{
p=(v-ave)*(v2-ave2);
sum5+=p;
}
printf("sum5=%f\n",sum5);
//sum5÷sum3*sum4のルート
z=sum5/sqrt(sum3*sum4);
printf("類似度=%f",z);
return 0;
}
無題
Re:無題
入力画像がgazou0.bmp~gazou99.bmpの連番という決まりがあるのでしたら、
パスを記述したファイルとは、プログラム内でパスを生成するのではなく
gazou0.bmp
gazou1.bmp
:
:
gazou98.bmp
gazou99.bmp
という具合にファイルパスを記述したファイルを用意して、
そのファイルを利用して入力画像を取得する方法です。
入力画像のファイルパスに規則性が無い場合に有効です。
char infilepath[256]; int x; /*入力画像データ*/ for(x=0;x<num;x++){ sprintf(infilepath, "gazou%d.bmp", x); fp=fopen(infilepath,"rb"); : : }で、できます。
パスを記述したファイルとは、プログラム内でパスを生成するのではなく
gazou0.bmp
gazou1.bmp
:
:
gazou98.bmp
gazou99.bmp
という具合にファイルパスを記述したファイルを用意して、
そのファイルを利用して入力画像を取得する方法です。
入力画像のファイルパスに規則性が無い場合に有効です。
Re:無題
Yukiさんありがとうございます!
教えていただいたとおりにしたつもりなのですがコンパイルはできても
2枚目の画像をひらくことができません。
用意している画像はgazou0.bmp~gazou10.bmpです。
プログラムがあるフォルダにいれていればいいんですよね?
もう一度手直ししていただけますでしょうか。
早急に完成させないといけないのでよろしくおねがいします。
#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]=fgetc(fp);
}
/*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]=fgetc(fp);
}
/*相関の式に代入*/
//左下の計算//
for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
n=(v[a])*(v[a]);
sum3+=n;
}
printf("sum3=%f\n",sum3);
//右下の計算//
for(a=0;a<ht;a++) for(b=0;b<wd;b++)
{
m=(v2[a])*(v2[a]);
sum4+=m;
}
printf("sum4=%f\n",sum4);
//分子の計算//
for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
p=(v[a])*(v2[a]);
sum5+=p;
}
printf("sum5=%f\n",sum5);
//sum5÷sum3*sum4のルート
z=sum5/sqrt(sum3*sum4);
printf("類似度=%f",z);
return 0;
}
教えていただいたとおりにしたつもりなのですがコンパイルはできても
2枚目の画像をひらくことができません。
用意している画像はgazou0.bmp~gazou10.bmpです。
プログラムがあるフォルダにいれていればいいんですよね?
もう一度手直ししていただけますでしょうか。
早急に完成させないといけないのでよろしくおねがいします。
#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]=fgetc(fp);
}
/*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]=fgetc(fp);
}
/*相関の式に代入*/
//左下の計算//
for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
n=(v[a])*(v[a]);
sum3+=n;
}
printf("sum3=%f\n",sum3);
//右下の計算//
for(a=0;a<ht;a++) for(b=0;b<wd;b++)
{
m=(v2[a])*(v2[a]);
sum4+=m;
}
printf("sum4=%f\n",sum4);
//分子の計算//
for(a=0;a<hite;a++) for(b=0;b<wide;b++)
{
p=(v[a])*(v2[a]);
sum5+=p;
}
printf("sum5=%f\n",sum5);
//sum5÷sum3*sum4のルート
z=sum5/sqrt(sum3*sum4);
printf("類似度=%f",z);
return 0;
}