• 締切済み

インデックスが配列の境界外です。と出てしまいます。

C#で、HLS色空間による2値化などを利用した顔領域検出のプログラムを作っています。 文献を参考にプログラミングし、エラーも出なかったのですが… デバックすると、 f[i, j] = 0;のところで「インデックスが配列の境界外です。」と言われてしまいます。 何故なのか、どなたか教えてください。 よろしくお願いします。 --------------------プログラムの一部-------------------- public double minHue, maxHue;//肌色領域(色相) public double minSat, minLight;//肌色領域(彩度、明度) public void BinaryHue(Bitmap bmp0, int[,] f, bool flagBinaryDisp ) { int i, j, nx, ny, gray; double rr, gg, bb, c1, c2; double light, hue, saturation; Color col; nx = bmp0.Width; ny = bmp0.Height; for (j = 0; j < ny; j++) { for (i = 0; i < nx; i++) { col = bmp0.GetPixel(i, j); //原画像 rr = col.R; gg = col.G; bb = col.B; light = 0.299 * rr + 0.587 * gg + 0.114 * bb; c1 = (rr - light); c2 = (bb - light); hue = calcHue(c1, c2);//C2を基準 if (hue < 0) hue += 360.0; saturation = Math.Sqrt(c1 * c1 + c2 * c2);// / 255.0;//最大値を1 if ((hue >= minHue && hue <= maxHue && saturation > minSat)) { f[i, j] = 1; gray = 255; } else { f[i, j] = 0; gray = 0; } if (flagBinaryDisp) bmp0.SetPixel(i, j, Color.FromArgb(gray, gray, gray)); } } }

みんなの回答

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

普通に考えれば引数で渡しているfの配列が小さすぎるのではと思いますが、その前のコードがないのではっきりしたことはわかりません。

daekred-maria
質問者

お礼

ありがとうございます! なんとか画像も表示されるようになりました^^

関連するQ&A

  • 画像の抽出

    今、VB2008を用いて、原画像と原画像に落書きをした画像の2枚を用いて、 落書きのみを抽出するプログラムを作っているのですが、 RGBの演算がどうも上手く出来ません。 コードは Dim r1#, g1#, b1#, r2#, g2#, b2#, r3#, g3#, b3#      Dim i%, j%, nx%, ny%      Dim col1, col2 As Color '略     For j = 0 To ny - 1      For i = 0 To nx - 1       col1 = bmp1.GetPixel(i, j)'落書きした画像         r1 = col1.R         g2 = col1.G         b3 = col1.B      col2 = bmp2.GetPixel(i, j)'落書き前の原画像         r2 = col2.R         g2 = col2.G         b2 = col2.B      r3 = r1 - r2       g3 = g1 - g2     b3 = b1 - b2    bmp3.SetPixel(i, j, Color.FromArgb(Int(r3), Int(g3), Int(b3)))'落書きのみ抽出された画像の書き込み     Next    Next Form1.Picturebox1.Image = bmp3 としてみたのですが、gやbの値が - になってしまい、エラーが出て しまいます。If(g3<255) then g3 =255 などと記載してみたのですが上手くいきませんでした。 どこを修正、加筆すればうまく抽出が出来る様になるのでしょうか。

  • 配列のファイル出力について

    fortranでできるファイルへの配列の出力をC言語でどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny                ループj   write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo                  ループjの最後尾  close(10)                ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるC言語プログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 C言語にはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。

  • 配列のファイルへの出力について

    fortranでできるファイルへの配列の出力をJAVAでどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny                ループj   write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo                  ループjの最後尾  close(10)                ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるJAVAプログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 JAVAにはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。 この質問は、C言語について以前質問したものですQNo.3590702。 JAVAだったらどうなるだろうと思ってお尋ねしています。

    • ベストアンサー
    • Java
  • c言語による画像処理について

    いつもお世話になってます。 c言語を使った画像処理を学び始めました。 入力画像の白(RGB値255,255,255)以外の画像を黒(RGB値0,0,0) に変換するプログラムを作成したいと思っているのですが、 入力画像の大きさによっては正常に命令を実行してくれないことがあるので、 改善点をご教示いただきたいと考え投稿させていただきました。ソースプログラムは #include<stdio.h> #define nx 100 //画像の幅 #define ny 100 //画像の高さ int main(void) { FILE *fp,*fp2; int i,j; unsigned char header[54]; unsigned char screen[nx][ny][3]; /* ファイルから読む */ fp=fopen("input.bmp","rb"); //ビットマップ形式 ,24ビットカラー fread(header,1,54,fp); // ヘッダ(54バイト)を飛ばす */ fread(screen,1,nx*ny*3,fp); // 残りはデータ(最下行から順に入る) //(255,255,255)以外なら黒(0,0,0)に for(j=0;j<ny;j++) for(i=0;i<nx;i++) if(screen[j][i][0]!=255||screen[j][i][1]!=255||screen[j][i][2]!=255){ screen[j][i][0]=0; screen[j][i][1]=0; screen[j][i][2]=0; } fclose(fp); /* ファイルに書く */ fp=fopen("output.bmp","wb"); fwrite(header,1,54,fp); /* ヘッダ */ fwrite(screen,1,nx*ny*3,fp); /* データ */ fclose(fp); return 0; } となっています。ここで、画像の高さ、幅を100以下にすると正常に変換できなくなります。 どなたか原因がお分かりでしたらお知らせ願えないでしょうか?

  • Delphiで配列をファイルに出力する方法

    Delphi(Pascal)について質問します。 fortranでできるファイルへの配列の出力をDelphiでどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny                ループj   write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo                  ループjの最後尾  close(10)                ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるDelphiプログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 Delphiにはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。 この質問は、C言語について以前質問したものですQNo.3590702。 Delphiではどうなるかと思って質問いたしました。

  • 二次元配列とポインタについてよくわかりません2

    先ほどもしつもんして自分なりに改良をくわえたのですが 上手くいきません。 int main( void ) {  int i, j;  /*4 x 4 行列 A*/  double a[4][4];  double *pa;  /*4 x 4 行列 B*/  double b[4];  double (*pb)[4];  /*4 x 4 行列 C*/  double c[4];  double (*pc)[4];  pa = a;  pb = b;  pc = c;  printf("4 x 4 行列 Aの要素を入力してください>\n");  for(i = 0; i < 4; i++){   for(j = 0; j < 4; j++){    printf("A[%d,%d]=", i + 1, j + 1 );    scanf("%lf", (*(pa + i) + j)); }} printf("4 x 4 行列 Bの要素を入力してください>\n"); for(i = 0; i < 4; i++){  for(j = 0; j < 4; j++){   printf("B[%d,%d]=", i + 1, j + 1 );   scanf("%lf", &pb[i][j]); }} としたところ(途中までを表記してます)  pa = a;  pb = b;  pc = c; のところでコンパイル時に 警告で問題のあるポインタの変換とでます なぜおかしいのかまったくわからないので よければ教えてください

  • javaの配列とファイル読み込みについて。

    javaでゲームを作っておりマップの読み込みでつまってしまったので 質問させてもらいます。 try { BufferedReader br = new BufferedReader( new InputStreamReader(getClass().getResourceAsStream(filename))); // rowを読み込む String line = br.readLine(); row = Integer.parseInt(line); // colを読む line = br.readLine(); col = Integer.parseInt(line); // マップサイズを設定 width = col * CS; height = row * CS; // マップを作成 map = new int[row][col]; for (int i=0; i<row; i++) { line = br.readLine(); for (int j=0; j<col; j++) { map[i][j] = Integer.parseInt(line.charAt(j) + ""); } } } catch (Exception e) { e.printStackTrace(); } これなんですがreadLine()は1行読み込むと見たんですが、 多分ファイルに改行がないために最初から最後まで読み込めたんじゃないかとおもいます。でもそのあとの配列へ入れるやり方がよくわかりません。どうなっているんでしょうか? よろしくお願いします。 ちなみに参考にさせてもらっているページは http://javagame.skr.jp/index.php?%A5%DE%A5%C3%A5%D7%A4%CE%C6%C9%A4%DF%B9%FE%A4%DF です。

    • ベストアンサー
    • Java
  • C,C++によるファイルからの並びの入出力

    C,C++でファイルから並びの入出力をどのようにプログラミングするか教えて頂きたいのですが。100x100の2次元のデータ(エクセルのシートと同じような形式)のファイルがあるとします。Fortranではこのような風になります。 nx=100; ny=100  ! sはnx x ny2次元配列 open(10,file='xxx.dat') do j=ny,1,-1 read(10,*) (s(i,j),i=1,nx) enddo close(10) これと同じ動作をするc, c++のソースを教えて頂きたいのです。私の手元にあるC++の本はそのようなことを全く書いていません。私は仕事として大きな量のデータを扱うのでC++の解説本でクラスを使った簡易ゲームによる動作確認のようなものだとあまり参考にならないのですね。 c,c++は使用者の人口が多くて幅が広いので、自分の用途に対応した解説本がないのです。 よろしくお願いします。

  • C言語のプログラミングの解答例又は修正箇所をおしえていただきたいのですが

    #include <stdio.h> int main(int argc, char **argv){ int a,b,c,g,r,i,j,ll;  int blue,green,red;  FILE *fpi,*fpo; unsigned long size,head,width,height,offset;  unsigned long comp,isize,ucolor,icolor; unsigned short plane,bitsize;  unsigned long wreso,hreso; unsigned char *image;  char infile[1024] = "t.bmp";  char outfile[1024] = "g.bmp"; long ww,hh;  long w3,h3;  unsigned char *img;  unsigned char *img2; int bai1,bai2;  bai1=1,bai2=3; fpi=fopen(infile,”rb"); for(i=0;i<2;i++){c=getc(fpi);} for(i=0,size=0;i<4;i++){size += (getc(fpi))<<(8*i);} for(i=0;i<4;i++){c=getc(fpi);} for(i=0,offset=0;i<4;i++){offset += (getc(fpi))<<(8*i);} ↑と同じようhead,width,height,plane,bitsize,comp,isize,wreso,hreso,ucolor,icolorを書く(ただしplane,bitsizeはi<2) hh=height*bai1/bai2; ww=width *bai1/bai2; img2 = (unsigned char*)malloc(sizeof(char)*3*ww*hh); for(j=0;j<hh;j++){ for(i=0;i<ww;i++){ int i1,j1,i2,j2; double x,pa,pb,pc,pd,x11,x21,x12,x22; int bb,gg,rr; i1=(i*(width-1))/(ww-1); i2=i1+1; x=(i*(width-1)*1.0)/((double)(ww-1)); pa=x-i1; pb=i2-x; j1=(j*(height-1))/(hh-1); j2=j1+1; x=(j*(height-1)*1.0)/((double)(hh-1)); pc=x-j1; pd=j2-x; x11=(double)img[j1*width*3+i1*3+0;] x21=(double)img[j1*width*3+i2*3+0]; x12=(double)img[j2*width*3+i1*3+0]; x22=(double)img[j2*width*3+i2*3+0]; bb=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd); x11=(double)img[j1*width*3+i1*3+1]; x21=(double)img[j1*width*3+i2*3+1]; x12=(double)img[j2*width*3+i1*3+1]; x22=(double)img[j2*width*3+i2*3+1]; gg=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd); x11=(double)img[j1*width*3+i1*3+2]; x21=(double)img[j1*width*3+i2*3+2]; x12=(double)img[j2*width*3+i1*3+2]; x22=(double)img[j2*width*3+i2*3+2]; rr=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd);; img2[j*ww*3+i*3+0]=(unsigned char)(bb&0xff); img2[j*ww*3+i*3+1]=(unsigned char)(gg&0xff); img2[j*ww*3+i*3+2]=(unsigned char)(rr&0xff); } } w3=ww*3; h3=hh*3; if((w3*3)%4==0){size=offset+w3*h3*3;} else{size= offset+w3*h3*3-(4-(w3*3)%4);} isize = size-offset; fpo=fopen(outfile,"wb"); putc('B', fpo); putc('M', fpo); for(i=0;i<4;i++){putc(((size>>(8*i))&0xff),fpo);} for(i=0;i<4;i++){putc(0x0,fpo);} for(i=0;i<4;i++){putc((((offset)>>(8*i)&0xff),fpo);} ↑と同じようhead,width,height,plane,bitsize,comp,isize,wreso,hreso,ucolor,icolorを書く(ただしplane,bitsizeはi<2) fwrite(&w3 ,sizeof(long),1,fpo); ↑と同じように&h,&offset,&head,&width,&height,&plane,&bitsize,&comp,&isize,&wreso,&hreso,&ucolor,&icolorを書く for(jj=0;jj<3;jj++){ for(j=hh-1;j>=0;j--){ ll=0; for(ii=0;ii<3;ii++){ for(i=0;i<ww;i++){ putc(img2[j*ww*3+i*3+0],fpo); putc(img2[j*ww*3+i*3+1],fpo); putc(img2[j*ww*3+i*3+2],fpo); ll+=3; } } ll=ll%4; if(ll!=0){for(i=0;i<(4-ll);i++)putc(0x0,fpo);} } } printf("Done\n"); fclose(fpo); printf("%s -> %s\n",infile,outfile); }

  • エラーの原因が分かりません "undefined reference to"

    ライブラリのヘッダファイル matrix.h #ifndef MATRIX_H #define MATRIX_H #ifdef __cplusplus extern "C"{ #endif typedef struct{ int row,col; double *elements; } MATRIX; extern int matrix_error_code; extern void zero_matrix(MATRIX *a); extern void identity_matrix(MATRIX *a); extern void show_matrix(MATRIX *x); extern MATRIX multiply_matrix(MATRIX *a,MATRIX *b); extern MATRIX transposed_matrix(MATRIX *a); #ifdef __cplusplus } #endif #endif ライブラリのソースファイル matrix.c #include <stdio.h> #include <stdlib.h> #include <math.h> #include "matrix.h" int matrix_error_code = 0; void zero_matrix(MATRIX *a) { int i,size; double *p; size=a->row*a->col; if((p = malloc(sizeof(double)*size)) == NULL) { puts("メモリを確保できません."); exit(0); } a->elements=p; for(i=0;i<size;i++) *p++=0; } void identity_matrix(MATRIX *a) { int i; zero_matrix(a); for(i=0;i<a->row;i++) { *(a->elements+i*a->col+i)=1.0000; } } void show_matrix(MATRIX *x) { int i,j; for(i=0;i<x->row;i++) { for(j=0;j<x->col;j++) { printf("%3.4lf ",*(x->elements+i*x->col+j)); } printf("\n"); } printf("\n"); } MATRIX transposed_matrix(MATRIX *a) { MATRIX x; int i,j; double *p; if((p = malloc(sizeof(double)*(a->row*a->col))) == NULL) { puts("メモリを確保できません."); exit(0); } x.elements=p; x.row=a->col; x.col=a->row; for(i=0;i<x.row;i++) { for(j=0;j<x.col;j++) { *p++=*(a->elements+j*x.row+i); } } return x; } MATRIX multiply_matrix(MATRIX *a,MATRIX *b) { int i,j,k; double *p; MATRIX x; x.row=a->row; x.col=b->col; if((p = malloc(sizeof(double)*(x.row*x.col))) == NULL) { puts("メモリを確保できません."); exit(0); } x.elements=p; for(i=0;i<x.row;i++) { for(j=0;j<x.col;j++) { for(k=0;k<a->col;k++) { *p += *(a->elements+i*a->col+k) * *(b->elements+k*b->row+j); } } p++; } return x; } 動作確認のアプリケーションファイル test_matrix.c #include <stdio.h> #include "matrix.h" int main(void) { int i,j; MATRIX b,c,d,f; b.row=c.row=2; b.col=c.col=2; identity_matrix(&b); identity_matrix(&c); d=transposed_matrix(&b); show_matrix(&d); f=multiply_matrix(&b,&c); show_matrix(&f); return 0; } ライブラリのコンパイルまではエラーなしで出来るのですが、test_matrix.cをコンパイルすると、"undefined reference to '_transposed_matrix'"と、"undefined reference to '_multiply_matrix'"の2つが表示されてコンパイルができません。 どうかよろしくお願いします。

専門家に質問してみよう