画像処理のチェーンコードが上手くいかない問題

このQ&Aのポイント
  • C#で実装された画像処理のチェーンコードが正しく動作しない問題が発生しています。
  • 指定した条件に基づいて、チェーンコードの方向を判断しているにもかかわらず、意図した結果が得られていません。
  • 解決策として、他の言語でチェーンコードのサンプルコードを探し、参考にすることが考えられます。
回答を見る
  • ベストアンサー

画像処理のチェーンコード

画像処理のチェーンコードが上手くいきません。 言語はC#です。下のようにやってますが、どこかで上手くいっていないみたいです。間違いの指摘をおねがいします。 あるいは、画像処理のチェーンコードのサンプルコードのあるサイトを教えてもらえると助かります。言語はメジャーなものならなんでもかまいません。 for (; ; ) { if (x == xs && y == ys && l != 0) { break; } switch (vec) { case 3: if (data[x, y + 1] == 0 && data[x - 1, y + 1] == 255) { x = x - 1; y = y + 1; list.Add(1); l++; } vec = 0; break; case 4: if (data[x - 1, y + 1] == 0 && data[x - 1, y] == 255) { x = x - 1; y = y + 0; list.Add(2); l++; } vec = 1; break; case 5: if (data[x - 1, y] == 0 && data[x - 1, y - 1] == 255) { x = x - 1; y = y - 1; list.Add(3); l++; } vec = 2; break; case 6: if (data[x - 1, y - 1] == 0 && data[x, y - 1] == 255) { x = x + 0; y = y - 1; list.Add(4); l++; } vec = 3; break; case 7: if (data[x, y - 1] == 0 && data[x + 1, y - 1] == 255) { x = x + 1; y = y - 1; list.Add(5); l++; } vec = 4; break; case 0: if (data[x + 1, y - 1] == 0 && data[x + 1, y] == 255) { x = x + 1; y = y + 0; list.Add(6); l++; } vec = 5; break; case 1: if (data[x + 1, y] == 0 && data[x + 1, y + 1] == 255) { x = x + 1; y = y + 1; list.Add(7); l++; } vec = 6; break; case 2: if (data[x + 1, y + 1] == 0 && data[x, y + 1] == 255) { x = x + 0; y = y + 1; list.Add(0); l++; } vec = 7; break; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

http://homepage2.nifty.com/tsugu/sotuken/binedge/ やりたいことは、↑のようなことでしょうか? サンプルプログラムの注意点として、switch~caseのFall Through(わざとbreakを置かずに、あるcaseを実行後そのまま次のcaseを実行するようにする)を利用しているので、そのままC#で使えません)コンパイルエラーになります)。 case A: の前の行に goto case A; を入れてください(Aは0,1,...です)

参考URL:
http://homepage2.nifty.com/tsugu/sotuken/binedge/
blade3322
質問者

お礼

無事解決しました

関連するQ&A

  • C#でのswitch文

    初歩的な質問ですいません 下のようなswitch文(チェーンコードのプログラム)で、コンパイルすると、 コントロールはひとつのcaseラベル('case 0~7:')から別のラベルへ流れ落ちることはできません。 というコンパイルエラーがでます。 continueをbreakに変えてもだめでした。 よろしくお願いします。 switch (vec) { case 3: if (data[x,y + 1] == 0 && data[x - 1,y + 1] == 1) { x = x - 1; y = y + 1; list.Add(1); l++; vec = 0; continue; } case 4: if (data[x - 1,y + 1] == 0 && data[x - 1,y] == 1) { x = x - 1; y = y + 0; list.Add(2); l++; vec = 1; continue; } case 5: if (data[x - 1,y] == 0 && data[x - 1,y - 1] == 1) { x = x - 1; y = y - 1; list.Add(3); l++; vec = 2; continue; } case 6: if (data[x - 1,y - 1] == 0 && data[x,y - 1] == 1) { x = x + 0; y = y - 1; list.Add(4); l++; vec = 3; continue; } case 7: if (data[x,y - 1] == 0 && data[x + 1,y - 1] == 1) { x = x + 1; y = y - 1; list.Add(5); l++; vec = 4; continue; } case 0: if (data[x + 1,y - 1] == 0 && data[x + 1,y] == 1) { x = x + 1; y = y + 0; list.Add(6); l++; vec = 5; continue; } case 1: if (data[x + 1,y] == 0 && data[x + 1,y + 1] == 1) { x = x + 1; y = y + 1; list.Add(7); l++; vec = 6; continue; } case 2: if (data[x + 1,y + 1] == 0 && data[x,y + 1] == 1) { x = x + 0; y = y + 1; list.Add(8); l++; vec = 7; continue; } vec = 3; }

  • 画像処理のプログラムについて

    初めまして、こんにちは C言語で画像処理のプログラミングについてご解答をお願いします 現在二値化した白黒バーコードに対して、ビット数埋め込みというものを行っています この画像に埋め込んだビットを、検出するプログラムを作成したいのですがどうしたらいいでしょうか? ソースコードは以下です int x,y,i,j; double Th = 128.0; /*2値化の際のしきい値 */ int x_StartPos, y_StartPos,x_EndPos,y_EndPos; /*バーコードが描画されている領域の座標 */ int num; y=0; while (y<biHeight){ x=0; while(x<biWidth){ if (Y[y][x]<Th) break; x++; } if (x < biWidth){ x_StartPos = x; y_StartPos = y; break; } y++; } if ((x_StartPos==0) && (y_StartPos==0)) { printf("画像中に黒領域が見つかりませんでした"); exit(-1); } x_EndPos=0; while (x<biWidth){ /*画面右までスキャンして、一番右端の黒のx座標を求める*/ if (Y[y][x] < Th)/* 黒い点であったら */ x_EndPos=x; x++; } if (x_EndPos==0) { printf(" バーコード右端が検出できませんでした\n"); exit(-1); } /*バーコード一番上のラインにおける、黒の画素の数を数える*/ x=y_StartPos; y=y_StartPos; num=0; //これまでに検出した黒画素の数 while(x<=x_EndPos){ if (Y[y][x] < Th) // 黒い点であったら num++; //黒画素数を +1 する x++; } *start_x= x_StartPos; *start_y= y_StartPos; *end_x = x_EndPos; *num_of_blackpixels =num; } void Embed_watermark(double Y[Y_SIZE][X_SIZE],double Y_out[Y_SIZE][X_SIZE], int sukasi[], int Length, int x_StartPos, int y_StartPos, int x_EndPos) { int x,y; int bitnum; double Th = 128.0; /*2値化の際のしきい値 */ for(y=0;y<biHeight;y++) //出力データに元データをコピー for(x=0;x<biWidth;x++) Y_out[y][x]=Y[y][x]; bitnum=0; //現在何番目のbitが埋め込み対象になっているのか x=x_StartPos; y=y_StartPos; //埋め込み開始 while(x<=x_EndPos){ if (Y_out[y][x]<Th){ //もし注目点が黒画素なら透かし埋め込み処理を行う printf("found! x=%d bitnum=%d\n",x,bitnum); if (sukasi[bitnum]==0){ // 「0」を埋め込むなら、該当画素を白くする Y_out[y][x]=255; } bitnum++; //埋め込み対象を次のビットにする } if (bitnum==Length) // もし全てのビットの埋め込み処理が終了したら break; x++; } printf("埋め込みが完了しました.埋め込み終了x座標=%d\n",x); } void main(void) { int Length = 20; // 埋め込む透かしのビット長 int suuchi[]={1,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,1,0}; //埋め込む透かしビット char *input="bar.bmp"; char *output="out.bmp"; /* 画像中のバーコードが書かれている左上端の座標 */ int x_StartPos; int y_StartPos; int x_EndPos;//バーコードx座標の終端 int Num_of_Blacks; //バーコードの横方向の黒画素数(=埋め込めるビット数の上限)

  • 同じコードがある初期化について教えてください。

    シューティングゲームのサンプルを勉強しています。 下記のこの部分のコードが二つあります。 memset(buf,0,sizeof(buf)); 気になっています。 なぜ二つあるのかを意味を知りたいです。 よろしくお願いします。 コードは以下に記述します。 CONTROL::CONTROL() { player = new PLAYER; back = new BACK; FILE *fp; ENEMYDATA data[ENEMY_NUM]; char buf[100]; int c; int col=1; int row=0; memset(buf,0,sizeof(buf)); fp = fopen("enemydata1.csv","r"); while(fgetc(fp)!='\n'); while(1){ while(1){ c=fgetc(fp); if(c==EOF) goto out; if(c!=','&& c!='\n') strcat(buf,(const char*)&c); else break; } switch(col){ case 1: data[row].type=atoi(buf); break; case 2: data[row].stype=atoi(buf); break; case 3: data[row].m_pattern=atoi(buf); break; case 4: data[row].s_pattern=atoi(buf); break; case 5: data[row].in_time=atoi(buf); break; case 6: data[row].stop_time=atoi(buf); break; case 7: data[row].shot_time=atoi(buf); break; case 8: data[row].out_time=atoi(buf); break; case 9: data[row].x=atoi(buf); break; case 10: data[row].y=atoi(buf); break; case 11: data[row].speed=atoi(buf); break; case 12: data[row].hp=atoi(buf); break; } memset(buf,0,sizeof(buf)); ++col; if(c=='\n'){ col=1; ++row; } } out: for(int i=0;i<ENEMY_NUM;++i){ enemy[i]=new ENEMY( data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); } }

  • あるopencvのコード、なぜカラーでいいグレーが

    int main( int argc, char** argv ) { Mat image = imread("test.png",1 ); Mat new_image = Mat::zeros( image.size(), image.type() ); for( int y = 0; y < image.rows; y++ ) { for( int x = 0; x < image.cols; x++ ) { for( int ll = -1; ll <= 1; ll++ ) { for( int mm = -1; mm <= 1; mm++ ) { if (x+ll >= 0 && x+ll < image.cols && y+mm >= 0 && y+mm < image.rows) { Vec3b &ff1 = image.at<Vec3b>(y+mm, x+ll); new_image.at<Vec3b>(y,x)[0] += ff1[0] / 9; new_image.at<Vec3b>(y,x)[1] += ff1[1] / 9; new_image.at<Vec3b>(y,x)[2] += ff1[2] / 9; } } } } } namedWindow("Original Image", 1); namedWindow("New Image", 1); imshow("Original Image", image); imshow("New Image", new_image); waitKey(); return 0; } このコード、なぞカラーで読み込むのはokで、1を0にして、グレーではだめですか? もしグレーでやりたいのなら、このコードどう修正すればよろしいですか? どうぞご指導のほどよろしくお願いいたします!

    • ベストアンサー
    • CGI
  • 画像処理について・・・・・・・・・・・

    #include<stdio.h> #include<stdlib.h> #define X_SIZE 512 #define Y_SIZE 512 unsigned char DATA[Y_SIZE][X_SIZE]; unsigned char O_DATA[Y_SIZE][X_SIZE]; char input_file_name[256]=”Lenna.raw”; char output_file_name[256]=”Lenna_out.raw”; void heikin(){ int x,u; int temp; for(y=1;y<Y_SIZE-1;y++){ for(x=1;x<X_SIZE-1;x++){ temp=・・・・・・・・・・・・・・・・・・・・・・・・; O_DATA[x][y]=(unsigned char)temp; } } } Int main (){ FILE*fp; If((fp=fopen(input_file_name,”rb”))==NULL){ Printf(“ファイルオ-プンエラ-\n”); Return 1; } Fread(DATA,sizeof(DATA),1,fp); fclose(fp); heikin(); if((fp=fopen(output_file_name,”wb”))==NULL{ printf(“ファイルオ-プンエラ-\n”); return 1; } Fwrite(O_DATA,sizeof(O_DATA),1,fp); Fclose(fp); Return 0; } ソースコードをやっているのですが、後、・・・・・・・・・の所を入力して完成なんですが、苦戦してます。 処理の内容としましては、 1、入力画像Lenna.rawを読み込んで、 2、平均値フィルタをかけ、 3、Lenna_out.rawに書き出す(保存する)したいんですが、公式みたいなのを入れればいいのでしょうか? すみませんが、お願いします。

  • エラーメッセージコード

    古いC言語ソースを解析していたのですが、よく分からないので質問させていただきます。 下記のerror関数は、エラーメッセージを単純にファイル出力するものとして使っており、中身は単純だと思っていました。しかしva_argやcase"s"~"x"など意図が良く分からないものが出てきており、ソースを読むのに熟練してる方に中身が何をしているのか分かり易く解説して頂きたいです。 void error(char *mess,...) { FILE *f2 = stdout; va_list list; int i; int k = 0; char fmt[1000] va_start(list, mess); for(i=0;i < (int)strlen(mess); i++) { if (k >0) { fmt[k++] = mess[i]; fmt[k] = 0; switch (mess[i]) { case's': fprintf(f2,fmt,va_arg(list,char *)); k=0; break; case'c': fprintf(f2,fmt,(char)va_arg(list,int)); k=0; break; case'd': case'x' fprintf(f2,fmt,(char)va_arg(list,int)); k=0; break; } if ( k >= 1000 -2) { fprintf(f2, "too long format string\n"); break; } } else if (mess[i]== '%') { k = 0; fmt[k++] = mess[i]; fmt[k] = 0; } else fprintf(f2, "%c", mess[i]); } va_end(list); exit(1); }

  • C言語で電卓を作成する。

    C言語を用いて三項まで計算できる電卓を作りたいのですが、どうも上手くいきません。 四則演算(+、-、×、÷)の優先順位を用いたプログラミング方法が分かりません。 以下に自分で作成したソースを添付します。 このソースに修正や追加して3項までの四則演算できるプログラミングを教えていただけますか? 宜しくお願いします。 #include <stdio.h> int main(void) { int answer; /*答え*/ int x,y,z; /*x=第一項,y=第二項,第三項*/ char op1,op2; /*演算子1、演算子2*/ while(1){ printf("式を入力してください\n"); printf("式:"); scanf("%d %c %d %c %d" ,&x,&op1,&y,&op2,&z); if((op1=='+'|'-'|'*'|'/') && (op2=='+'|'-'|'*'|'/')){ switch(op2){ case '+': answer=y+z; break; case '-': answer=y-z; break; case '*': answer=y*z; break; case '/': if(z==0){ printf("ERROR\n"); return 0; } answer=y/z; break; default: printf("ERROR\n"); return 0; } switch(op1){ case '+': answer=x+answer; break; case '-': answer=x-answer; break; case '*': answer=x*answer; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/answer; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } else { switch(op1){ case '+': answer=x+y; break; case '-': answer=x-y; break; case '*': answer=x*y; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/y; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } } } 左辺に×、÷が来ても優先的に計算されません。

  • プログラムの画面表示のことで

    このような場面で、プレイヤーが倒されてしまったときに、 HPが0にならずに、残ってしまいます。 処理が上から下に向かって動いているためだと思いますが、 プレイヤーやモンスターが倒れた時に、画面の構成を変えずに、 HPを0にすることができるでしょうか? int main(void) { system("cls"); //クリアー dungeon( /* 略 */); //ダンジョン表示(ステータスの表示) player_turn( /* 略 */);//キー入力(プレイヤーのターン) monster_turn( /* 略 */); //モンスターのターン } return 0; } //ダンジョン表示 void dungeon(PC *pc, MC *mc) { for(y=0; y<10; ++y){ for(x=0; x<10; ++x){ if(pc->y==y && pc->x==x){ printf("%s", "@"); }else if((mc->y==y) && (mc->x==x) && (mc->hp>=0)){ printf("%s", "Sk"); }else if(field[y][x]==9){ printf("%s", "■"); }else if(field[y][x]==8){ printf("%s", "□"); }else if(field[y][x]==7){ printf("%s", "<"); }else{ printf("%s", " "); } } status(pc, mc, y); //ステータスのある場所 printf("\n"); } } //ステータス表示 void status(PC *pc, MC *mc, int y) { switch(y) { case 0:printf(" *****************************");break; case 1:printf(" %s Lv%3d HP%3d %3dG", pc->name, pc->lv, pc->hp, pc->gold);break; case 2:break; case 3:break; case 4:break; case 5:break; case 6:break; case 7:break; case 8:printf(" %s Lv%3d HP%3d %3dG", mc->name, mc->lv, mc->hp, mc->gold);break; case 9:printf(" *****************************");break; default:break; } }

  • 綺麗なコードとは

    C言語において綺麗なコードを書くには、 コメントや書式をどのように書いたら良いのか教えてください。 例えば if(条件){    処理; }else{    処理; } を if(条件){    処理; } else{    処理; } と書いてみるなど。 よろしくお願いします。

  • 画像のラベリング

    画像処理について勉強しています。 画像のラベリングを行うプログラムを書いていたのですが、意図した結果になりません。 以下の関数で実現しようとしましたが、上手くいきませんでした。何か、決定的に間違っている点などがありましたら、教えてください。 また、参考になるWebページなどがありましたら、教えていただけると幸いです。 image2[][]には、レナ画像の512x512を判別分析法を使用して2値化した画像データが格納されています。 また、label[]は全て-1で初期化しました。(initialize()) void labeling(){ int x,y; int up_label,left_label; int label_num=1; //初期ラベル int label_add=1; //ラベルの増分 int max; int i; initialize(); for(y=0; y<y_size1; y++){ for(x=0; x<x_size1; x++){ if(image2[y][x]==0 && label[y][x]==-1){ up_label=left_label=500; if(y-1>=0) up_label=label[y-1][x]; if(x-1>=0) left_label=label[y][x-1]; if(up_label==500 && left_label==500){//(0,0)の地点の処理 label[y][x]=label_num; }else if(up_label==left_label){//上と左が等しい場合の処理 //上と左のラベルが無い場合はラベルを作る if(up_label < 0) label_num += label_add; //ラベルを付与 label[y][x]=label_num; }else{//それ以外の処理 //上と左で小さいほうのラベルを付与する if(up_label<0) label[y][x]=left_label; else if(left_label<0) label[y][x]=up_label; else label[y][x]= (up_label < left_label)? up_label:left_label; } } } } }

専門家に質問してみよう