質問編集履歴

6

labeling関数だけでなくmainメソッドも追記しました。

2019/07/30 17:13

投稿

sabo-rino33
sabo-rino33

スコア7

test CHANGED
File without changes
test CHANGED
@@ -178,7 +178,7 @@
178
178
 
179
179
  //numの値を振り分けていく
180
180
 
181
- //ここ以下のif文でエラー
181
+ //(1)ここ以下のif文でエラー?
182
182
 
183
183
  if(output[(j-1)*NX+i-1]==0 && output[(j-1)*NX+i]==0 &&
184
184
 

5

labeling関数だけでなくmainメソッドも追記しました。

2019/07/30 17:13

投稿

sabo-rino33
sabo-rino33

スコア7

test CHANGED
File without changes
test CHANGED
@@ -146,16 +146,6 @@
146
146
 
147
147
  //jは縦、iは横
148
148
 
149
- //手順
150
-
151
- //1.左,左上,上,右上に既に割り振られた番号があったらその番号にする
152
-
153
- //2.何もない場合numの値をoutput[j*NX + i]に代入
154
-
155
- //
156
-
157
-
158
-
159
149
  //output:読み込んだ画像,
160
150
 
161
151
  //bright:二値化された場所が0か1を判定するための引数

4

labeling関数だけでなくmainメソッドも追記しました。

2019/07/30 17:12

投稿

sabo-rino33
sabo-rino33

スコア7

test CHANGED
File without changes
test CHANGED
@@ -4,17 +4,17 @@
4
4
 
5
5
  C言語で画像処理の際に使用するラベリング関数を作っています。
6
6
 
7
-
7
+ int labeling(char* output,int bright);の関数部分でラベリング処理を行おうとしています。
8
+
9
+
10
+
8
-
11
+ 同じフォルダーに星の画像を入れ星が何個あるかを数えるプログラムを作っています。
12
+
9
-
13
+ (field1.bmp)が星の画像です。
10
-
11
-
12
-
13
-
14
14
 
15
15
  ### 発生している問題・エラーメッセージ
16
16
 
17
-
17
+ mainメソッドなどは問題ないのですがlabeling関数の部分で実行エラーが出てしまいます。
18
18
 
19
19
  0,1に二値化された場所にラベリング処理をしている際に、コンパイルは成功するのですが実行エラーが起き動作が停止してしまいます。(1)以降のif文をコメントすると一応実行はできるようになるので、
20
20
 
@@ -28,7 +28,135 @@
28
28
 
29
29
  ```C
30
30
 
31
+ #define _CRT_SECURE_NO_WARNINGS
32
+
33
+
34
+
35
+ #include <stdio.h>
36
+
37
+ #include <stdlib.h>
38
+
39
+
40
+
41
+ #define NX 2048 //Image size X
42
+
43
+ #define NY 2048 //Image size Y
44
+
45
+ #define HEADER_SIZE 300 //maximum header size
46
+
47
+
48
+
49
+ void readImageFile(char*, char*, char*, int, int, int*);
50
+
51
+ void writeImageFile(char*, char*, char*, int, int, int);
52
+
53
+ int labeling(char* ,int);
54
+
55
+
56
+
57
+ void main(int argc, char *argv[])
58
+
59
+ {
60
+
61
+ char *input, *output, *header;
62
+
63
+ int hSize;
64
+
65
+ int j,i; //ループ変数
66
+
67
+ int cnt = 0; //星の数を数える変数
68
+
69
+ int sepbright = 10; //星を分ける大きさ(ここに二値化の最善の値を入れる)
70
+
71
+ int bright = 1; //星の返す色
72
+
73
+
74
+
75
+ input = (char*)malloc(NX*NY * 1);
76
+
77
+ output = (char*)malloc(NX*NY * 1);
78
+
79
+ header = (char*)malloc(HEADER_SIZE);
80
+
81
+
82
+
83
+ // read image file
84
+
85
+ readImageFile("field1.bmp", input, header, NX, NY, &hSize);
86
+
87
+
88
+
89
+ // getchar(); //なくてもいい(実行時returnですすむ)
90
+
91
+
92
+
93
+ //Image processing ここ変える
94
+
95
+ for (j = 0; j < NY; j++) {
96
+
97
+ for (i = 0; i < NX; i++) {
98
+
99
+ output[j*NX + i] = input[j*NX + i];
100
+
101
+
102
+
103
+ //適当な二値化
104
+
105
+ if(output[j*NX + i] >=sepbright){
106
+
107
+ output[j*NX + i] = bright;//bright は1設定
108
+
109
+ }else if(output[j*NX + i] <sepbright){
110
+
111
+ output[j*NX + i] = 0;
112
+
113
+ }
114
+
115
+
116
+
117
+ }//printf("%d ",j);
118
+
119
+ }
120
+
121
+
122
+
123
+ cnt = labeling(output,bright);
124
+
125
+ printf("星の数:%d",cnt);
126
+
127
+ // write image file
128
+
129
+ writeImageFile("output1.bmp", output, header, NX, NY, hSize);
130
+
131
+
132
+
133
+ free(header);
134
+
135
+ free(output);
136
+
137
+ free(input);
138
+
139
+
140
+
141
+ }
142
+
143
+
144
+
145
+
146
+
147
+ //jは縦、iは横
148
+
149
+ //手順
150
+
151
+ //1.左,左上,上,右上に既に割り振られた番号があったらその番号にする
152
+
153
+ //2.何もない場合numの値をoutput[j*NX + i]に代入
154
+
155
+ //
156
+
157
+
158
+
31
- //output:読み込んだ画像
159
+ //output:読み込んだ画像,
32
160
 
33
161
  //bright:二値化された場所が0か1を判定するための引数
34
162
 
@@ -54,13 +182,13 @@
54
182
 
55
183
  //二値化されたものがbrightであれば
56
184
 
57
- if(output[j*NX + i] = bright){
185
+ if(output[j*NX + i] == bright){
58
186
 
59
187
  //左上、上、右上、左の画素番号がすべて0なら
60
188
 
61
189
  //numの値を振り分けていく
62
190
 
63
- //(1)
191
+ //ここ以下のif文でエラー
64
192
 
65
193
  if(output[(j-1)*NX+i-1]==0 && output[(j-1)*NX+i]==0 &&
66
194
 
@@ -70,120 +198,100 @@
70
198
 
71
199
  output[j*NX + i]=num; //numは2から
72
200
 
73
- look[num]=num;
201
+ look[num]=num;
74
-
202
+
75
- num++;
203
+ num++;
76
204
 
77
205
  }
78
206
 
79
207
  //左上、上、右上、左の画素番号のうち0以外が複数あるなら
80
208
 
81
- else{
209
+ else{
82
-
83
-
84
-
210
+
85
- if(output[(j-1)*NX+i-1] != 0 && output[(j-1)*NX+i-1]<min)
211
+ if(output[(j-1)*NX+i-1] != 0 && output[(j-1)*NX+i-1]<min){
86
-
87
- {
212
+
88
-
89
- min = output[(j-1)*NX+i-1];
213
+ min = output[(j-1)*NX+i-1];
214
+
215
+ //look[num]の値と左上の値が違うならlookを書き換える
216
+
217
+ if(look[num] != output[(j-1)*NX+i-1]){
218
+
219
+ look[num] = output[(j-1)*NX+i-1];
220
+
221
+ lookcnt++;
222
+
223
+ }
224
+
225
+ }
90
226
 
91
227
 
92
228
 
229
+ else if(output[(j-1)*NX+i] != 0 && output[(j-1)*NX+i]<min){
230
+
231
+ min = output[(j-1)*NX+i];
232
+
233
+
234
+
93
- //look[num]の値と上の値が違うならlookを書き換える
235
+ //look[num]の値と上の値が違うならlookを書き換える
94
-
236
+
95
- if(look[num] != output[(j-1)*NX+i-1]){
237
+ if(look[num] != output[(j-1)*NX+i]){
96
-
238
+
97
- look[num] = output[(j-1)*NX+i-1];
239
+ look[num] = output[(j-1)*NX+i];
98
-
240
+
99
- lookcnt++;
241
+ lookcnt++;
242
+
243
+ }
244
+
245
+
100
246
 
101
247
  }
102
248
 
103
249
 
104
250
 
251
+ else if(output[(j-1)*NX+i+1] != 0 && output[(j-1)*NX+i+1]<min){
252
+
253
+ min = output[(j-1)*NX+i+1];
254
+
255
+
256
+
257
+ //look[num]の値と右上の値が違うならlookを書き換える
258
+
259
+ if(look[num] != output[(j-1)*NX+i+1]){
260
+
261
+ look[num] = output[(j-1)*NX+i+1];
262
+
263
+ lookcnt++;
264
+
265
+ }
266
+
267
+
268
+
269
+ }
270
+
271
+ else if(output[j*NX+i-1] != 0 && output[j*NX+i-1]<min){
272
+
273
+ min = output[j*NX+i-1];
274
+
275
+
276
+
277
+ //look[num]の値と左の値が違うならlookを書き換える
278
+
279
+ if(look[num] != output[j*NX+i-1]){
280
+
281
+ look[num] = output[j*NX+i-1];
282
+
283
+ lookcnt++;
284
+
285
+ }
286
+
287
+ }
288
+
289
+ output[j*NX+i]=min;
290
+
105
291
  }
106
292
 
107
- else if(output[(j-1)*NX+i] != 0 && output[(j-1)*NX+i]<min)
108
-
109
- {
110
-
111
- min = output[(j-1)*NX+i];
112
-
113
-
114
-
115
- //look[num]の値と上の値が違うならlookを書き換える
116
-
117
- if(look[num] != output[(j-1)*NX+i]){
118
-
119
- look[num] = output[(j-1)*NX+i];
120
-
121
- lookcnt++;
122
-
123
- }
124
-
125
-
126
-
127
- }
128
-
129
- else if(output[(j-1)*NX+i+1] != 0 && output[(j-1)*NX+i+1]<min)
130
-
131
- {
132
-
133
- min = output[(j-1)*NX+i+1];
134
-
135
-
136
-
137
- //look[num]の値と右上の値が違うならlookを書き換える
138
-
139
- if(look[num] != output[(j-1)*NX+i+1]){
140
-
141
- look[num] = output[(j-1)*NX+i+1];
142
-
143
- lookcnt++;
144
-
145
- }
146
-
147
-
148
-
149
- }
150
-
151
- else if(output[j*NX+i-1] != 0 && output[j*NX+i-1]<min)
152
-
153
- {
154
-
155
- min = output[j*NX+i-1];
156
-
157
-
158
-
159
- //look[num]の値と左の値が違うならlookを書き換える
160
-
161
- if(look[num] != output[j*NX+i-1]){
162
-
163
- look[num] = output[j*NX+i-1];
164
-
165
- lookcnt++;
166
-
167
- }
168
-
169
- }
170
-
171
-
172
-
173
- output[j*NX+i]=min;
174
-
175
-
176
-
177
293
  }
178
294
 
179
-
180
-
181
-
182
-
183
-
184
-
185
- }
186
-
187
295
  }
188
296
 
189
297
  }
@@ -194,6 +302,108 @@
194
302
 
195
303
  }
196
304
 
305
+
306
+
307
+
308
+
309
+ void readImageFile(char* fileName, char* input, char* header, int xsize, int ysize, int *headerSize)
310
+
311
+ {
312
+
313
+ FILE *fp;
314
+
315
+ int imageSize = xsize*ysize * 3;
316
+
317
+ int j;
318
+
319
+
320
+
321
+ fp = fopen(fileName, "rb");
322
+
323
+ if (fp == NULL) {
324
+
325
+ fprintf(stderr, "File open error: %s", fileName);
326
+
327
+ exit;
328
+
329
+ }
330
+
331
+
332
+
333
+ fseek(fp, 0, SEEK_END);
334
+
335
+ int fileSize = ftell(fp);
336
+
337
+ *headerSize = fileSize - imageSize;
338
+
339
+ printf("%d %d %d\n", imageSize, fileSize, *headerSize);
340
+
341
+
342
+
343
+ fseek(fp, 0, SEEK_SET);
344
+
345
+
346
+
347
+ fread(header, *headerSize, 1, fp); //read header
348
+
349
+
350
+
351
+ for (j = 0; j < xsize*ysize; j++) {
352
+
353
+ input[j] = fgetc(fp);
354
+
355
+ fgetc(fp);
356
+
357
+ fgetc(fp);
358
+
359
+ }
360
+
361
+ }
362
+
363
+
364
+
365
+ void writeImageFile(char* fileName, char* input, char* header, int xsize, int ysize, int headerSize)
366
+
367
+ {
368
+
369
+ FILE *fp;
370
+
371
+ int imageSize = xsize*ysize * 3;
372
+
373
+ int j;
374
+
375
+
376
+
377
+ fp = fopen(fileName, "wb");
378
+
379
+ if (fp == NULL) {
380
+
381
+ fprintf(stderr, "File open error: %s", fileName);
382
+
383
+ exit;
384
+
385
+ }
386
+
387
+
388
+
389
+ fwrite(header, headerSize, 1, fp); //read header
390
+
391
+
392
+
393
+ for (j = 0; j < xsize*ysize; j++) {
394
+
395
+ fputc(input[j], fp);
396
+
397
+ fputc(input[j], fp);
398
+
399
+ fputc(input[j], fp);
400
+
401
+ }
402
+
403
+ }
404
+
405
+
406
+
197
407
  ```
198
408
 
199
409
  ###修正した箇所
@@ -201,11 +411,3 @@
201
411
  (1)以下の処理をコメントしたときは実行が通ったので、
202
412
 
203
413
  それ以降が間違っていそうなのですが修正する方法がわかりません。
204
-
205
-
206
-
207
- ### 補足情報(FW/ツールのバージョンなど)
208
-
209
-
210
-
211
- ここにより詳細な情報を記載してください。

3

コードタグで囲めていなかったので再編集いたしました

2019/07/30 17:10

投稿

sabo-rino33
sabo-rino33

スコア7

test CHANGED
File without changes
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  ### 該当のソースコード
28
28
 
29
- ```C言語
29
+ ```C
30
30
 
31
31
  //output:読み込んだ画像
32
32
 
@@ -194,7 +194,7 @@
194
194
 
195
195
  }
196
196
 
197
-
197
+ ```
198
198
 
199
199
  ###修正した箇所
200
200
 

2

コードタグで囲めていなかったので再編集いたしました

2019/07/30 16:22

投稿

sabo-rino33
sabo-rino33

スコア7

test CHANGED
File without changes
test CHANGED
@@ -24,9 +24,11 @@
24
24
 
25
25
  エラーメッセージですが、「動作が終了しました」と出てしまい、プログラムが停止してしまいます
26
26
 
27
- ### 該当のソースコード```C言語
27
+ ### 該当のソースコード
28
+
28
-
29
+ ```C言語
30
+
29
- //output:読み込んだ画像,
31
+ //output:読み込んだ画像
30
32
 
31
33
  //bright:二値化された場所が0か1を判定するための引数
32
34
 
@@ -192,15 +194,9 @@
192
194
 
193
195
  }
194
196
 
195
- ```
197
+
196
-
198
+
197
- ###したこと```ここに言語を入力
199
+ ###修正した箇所
198
-
199
- コード
200
-
201
- ```
202
-
203
-
204
200
 
205
201
  (1)以下の処理をコメントしたときは実行が通ったので、
206
202
 

1

codeタグで括り、できるだけ明確にタイトル変更いたしました

2019/07/30 16:19

投稿

sabo-rino33
sabo-rino33

スコア7

test CHANGED
@@ -1 +1 @@
1
- 実行時にエラーが原因とその改善
1
+ C言語で画像処理におけるラベリング処理をしようとすると実行エラーが
test CHANGED
@@ -8,15 +8,23 @@
8
8
 
9
9
 
10
10
 
11
+
12
+
13
+
14
+
11
15
  ### 発生している問題・エラーメッセージ
12
16
 
13
17
 
14
18
 
15
- 0,1に二値化された場所にラベリング処理をしている際に、コンパイルは成功するのですが実行エラーが起き動作が停止してしまいます。
19
+ 0,1に二値化された場所にラベリング処理をしている際に、コンパイルは成功するのですが実行エラーが起き動作が停止してしまいます。(1)以降のif文をコメントすると一応実行はできるようになるので、
20
+
16
-
21
+ その近辺でバグが起きているのだと思いますがデバッグの方法が分かりません。
22
+
23
+
24
+
17
-
25
+ エラーメッセージですが、「動作が終了しました」と出てしまい、プログラムが停止してしまいます
18
-
26
+
19
- ### 該当のソースコード
27
+ ### 該当のソースコード```C言語
20
28
 
21
29
  //output:読み込んだ画像,
22
30
 
@@ -184,9 +192,13 @@
184
192
 
185
193
  }
186
194
 
187
-
195
+ ```
188
-
196
+
189
- ### 試したこと
197
+ ### 試したこと```ここに言語を入力
198
+
199
+ コード
200
+
201
+ ```
190
202
 
191
203
 
192
204