ラベリング処理プログラム
画像のラベリング処理プログラムを作っているんですが
どうもうまく実行できません。よければ教えていただけないでしょうか。
#include<stdio.h>
#include<stdlib.h>
int column, row;
unsigned char val[4] = {0,0,0,0};
unsigned char tmp[255];
int pos_y[4] = {-1, 0, 1, 0};
int pos_x[4] = {0, 1, 0, -1};
int i, j, x, y, label, level, label1;
int label_count = 1;
unsigned char *in, *out;
void labeling_main();
void labeling_search();
void labeling_main()
{
for(i = 0; i < y; i++){
for(j = 0; j < x; j++){
printf("aaa\n");
if(out[i * x + j] == 255){
printf("bbb\n");
fflush(stdout);
out[i * x + j] = label_count;
labeling_search(label_count, i, j);
label_count++;
}
}
}
}
void labeling_search(int label_count, int x, int y)
{
for(i = 0; i < 4; i++){
if(out[(pos_y[i] + y) * x + (pos_x[i] + x)] == 255){
out[(pos_y[i] + y) * x + (pos_x[i] + x)] = label_count;
labeling_search(label_count,(pos_y[i]+y),(pos_x[i]+x));
}
}
printf("ccc\n");
}
int main(int argc, char *argv[])
{
int result;
int head, Magic;
unsigned char *image, *in, *out, *res, *ros;
FILE *fin, *fout;
if(argc!=3){
printf("Usage : %s input output\n",argv[0]);
exit(1);
}
fin = fopen(argv[1],"rb");
/* -------------------- ヘッダ取得ここから -------------------- */
fgets(tmp,255,fin);
if(tmp[0]!='P') return 0;
sscanf(tmp,"P%d",&Magic);
if(Magic < 1 || Magic > 6) return 0;
do fgets(tmp,255,fin); while(tmp[0]=='#');
sscanf(tmp,"%d %d",&x,&y);
if(x < 1 || y < 1) return 0;
fgets(tmp,255,fin);
sscanf(tmp,"%d",&level);
/* ヘッダの確認 */
printf("P%d\n",Magic);
printf("%d %d\n",x,y);
printf("%d\n",level);
/* 画素の読み込み */
in = (unsigned char *)malloc(sizeof(unsigned char) *x*y);
fread(in,sizeof(unsigned char),x*y,fin);
fout = fopen(argv[2],"wb");
fprintf(fout,"P%d\n",Magic);
fprintf(fout,"# My new PGM\n");
fprintf(fout,"%d %d\n",x, y);
fprintf(fout,"%d\n",level);
fwrite(out, sizeof(unsigned char),x*y, fout);
out = (unsigned char *)malloc(sizeof(unsigned char) *x*y);
//2値画像
for (i = 0; i < y; i++) {
for (j = 0; j < x; j++){
if(in[i * x + j] > 120){
out[i * x + j] = 0;
}else if(in[i * x + j] <= 120){
out[i * x + j] = 255;
}
}
}
labeling_main();
printf("Max label number:%d\n",label_count);
free(in);
free(out);
fclose(fin);
fclose(fout);
}
コンパイルは通るのですが実行するとlabeling_mainの
if文でセグメンテーションが出てしまいます。
補足
Saitarさん、早速ありがとうございます。 直前の足の高値安値を0.3pipsずらすのは、プログラミングの本を読み始めた時に、もしかしてと思ってHigh[1]+0.003とやってみたら偶然出来たのですが、書いていただいたsabunというのを使うと簡単に数字も変更できていいですね。 私の読んだ本にはこういう内容は全くありませんでした。 ありがとうございました。 ちなみに、今は以下のような感じにして、チャートに直接入れて表示して使わせてもらっています。私はユーロ円しか今はやっていないのですが、6桁の価格の内、先頭の2桁は全く見ていないので、できたら表示したくないのですが、そのような事は出来るのでしょうか。 現在の文字の大きさだと、先頭の2桁が最新のローソク足と重なってしまい、少々見難い事もあるので、非表示に出来るとありがたいです。 #property copyright "Copyright Saitar" #property indicator_chart_window int x_pos = 20; // x position int y_pos = 10; // y position int mag = 10; //font size// int init() { ObjectCreate("values1", OBJ_LABEL, 0, 0, 0); ObjectSet("values1", OBJPROP_CORNER, 1); ObjectSet("values1", OBJPROP_XDISTANCE, x_pos-19); ObjectSet("values1", OBJPROP_YDISTANCE, y_pos-10);//High+0.003 ObjectCreate("values2", OBJ_LABEL, 0, 0, 0); ObjectSet("values2", OBJPROP_CORNER, 1); ObjectSet("values2", OBJPROP_XDISTANCE, x_pos-19); ObjectSet("values2", OBJPROP_YDISTANCE, y_pos+5);//High[1] ObjectCreate("values3", OBJ_LABEL, 0, 0, 0); ObjectSet("values3", OBJPROP_CORNER, 1); ObjectSet("values3", OBJPROP_XDISTANCE, x_pos-19); ObjectSet("values3", OBJPROP_YDISTANCE, y_pos+22);//High[0] ObjectCreate("values4", OBJ_LABEL, 0, 0, 0); ObjectSet("values4", OBJPROP_CORNER, 1); ObjectSet("values4", OBJPROP_XDISTANCE, x_pos-19); ObjectSet("values4", OBJPROP_YDISTANCE, y_pos+242);//Low[0] ObjectCreate("values5", OBJ_LABEL, 0, 0, 0); ObjectSet("values5", OBJPROP_CORNER, 1); ObjectSet("values5", OBJPROP_XDISTANCE, x_pos-19); ObjectSet("values5", OBJPROP_YDISTANCE, y_pos+258);//Low[1] ObjectCreate("values6", OBJ_LABEL, 0, 0, 0); ObjectSet("values6", OBJPROP_CORNER, 1); ObjectSet("values6", OBJPROP_XDISTANCE, x_pos-19); ObjectSet("values6", OBJPROP_YDISTANCE, y_pos+275);//Low[1]-0.003 return(0); } int deinit() { ObjectDelete("values1"); ObjectDelete("values2"); ObjectDelete("values3"); ObjectDelete("values4"); ObjectDelete("values5"); ObjectDelete("values6"); return(0); } int start() { ObjectSetText("values1", DoubleToStr(High[1]+0.003,Digits), mag, "Eras Bold ITC", Lime); ObjectSetText("values2", DoubleToStr(High[1],Digits), mag, "Eras Bold ITC", Pink); ObjectSetText("values3", DoubleToStr(Close[0],Digits), mag, "Eras Bold ITC", Yellow); ObjectSetText("values4", DoubleToStr(Close[0],Digits), mag, "Eras Bold ITC", Yellow); ObjectSetText("values5", DoubleToStr(Low[1],Digits), mag, "Eras Bold ITC", Pink); ObjectSetText("values6", DoubleToStr(Low[1]-0.003,Digits), mag, "Eras Bold ITC", Lime); return(0); }