teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

2019/11/17 10:34

投稿

0126tami
0126tami

スコア60

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,4 @@
1
- プログラムを全てはっていますが、メイン分のzyusin関数以外は全て完成しているので
2
- zyusin関数部分と構造体の部分のアドバイスをお願いす。
1
+ zyusin関数が全く機能ていないみたいです。
3
- 先生から元々あるプログラムを真似しながら重心を求める関数を作ってみなさいと言われたのですがコンパイルは通るもののzyusin関数が全く機能していないみたいです。
4
2
  どうか助けてください。
5
3
 
6
4
 

4

いろいろ

2019/11/17 10:33

投稿

0126tami
0126tami

スコア60

title CHANGED
File without changes
body CHANGED
@@ -38,105 +38,8 @@
38
38
 
39
39
  ```
40
40
  メイン部分
41
- int main(int argc, char *argv[]) {
42
- Img func_h_i(Img, Param); // Eq.(4)
43
- Img func_h(Img); // Eqs.(2) and (3)
44
- Img func_av(Img, Param); // Eq.(5)
45
- Img func_bin(Img, Param); // Eq.(6)
46
- Img lbl(Img);
47
41
 
48
- ****構造体を増やしました****
49
- Zahyou zyusin(Img);
50
42
 
51
- FILE *fp;
52
- int i;
53
- Img img, himg, hhimg, aimg, bimg;
54
- Param param;
55
- Zahyou z;
56
- Img limg,zimg;
57
-
58
- if(argc != 3) {
59
- fprintf(stderr, "Usage: %s file_param file_img.\n", argv[0]);
60
- return 1;
61
- }
62
- if(NULL == (fp = fopen(argv[1], "r"))) {
63
- fprintf(stderr, "Cannot open %s.\n", argv[1]);
64
- return 2;
65
- }
66
- param = fgetparam(fp);
67
- fclose(fp);
68
- if(NULL == (fp = fopen(argv[2], "r"))) {
69
- fprintf(stderr, "Cannot open %s.\n", argv[1]);
70
- return 3;
71
- }
72
- img = fgetimg(fp);
73
- fclose(fp);
74
-
75
- printf("Input image. (RGB)\n");
76
- fputimg(stdout, img);
77
-
78
- printf("Filtering with (l_i, u_i). (Eq.(4))\n");
79
- himg = func_h_i(img, param);
80
- fputimg(stdout, himg);
81
-
82
- printf("Merging and binarizing. (Eqs. (3) and (2))\n");
83
- hhimg = func_h(himg);
84
- fputimg(stdout, hhimg);
85
-
86
-
87
- printf("Averaging. (Eq.(5))\n");
88
- aimg = func_av(hhimg, param);
89
- fputimg_uni(stdout, aimg, 0);
90
-
91
- printf("Binarizing. (Eq.(6))\n");
92
- bimg = func_bin(aimg, param);
93
- fputimg_uni(stdout, bimg, 0);
94
-
95
- printf("Labeling.\n");
96
- limg = lbl(bimg);
97
- fputimg_uni(stdout, limg, 0);
98
- ********新たにfputzを追加しました!!!!****
99
- printf("zyusin.\n");
100
- z=zyusin(limg);
101
- fputz(stdout,z);
102
-
103
- return 0;
104
- }
105
-
106
- Img func_bin(Img img, Param p) {
107
-      省略
108
-
109
- return bimg;
110
- }
111
-
112
- Img func_av(Img img, Param p) {
113
-      省略
114
- return aimg;
115
- }
116
-
117
- Img func_h_i(Img img, Param p) {
118
- 省略
119
- return himg;
120
- }
121
-
122
- Img func_h(Img img) {
123
- 省略
124
- return himg ;
125
- }
126
-
127
- Param fgetparam(FILE *fp) {
128
- Param param;
129
- 省略
130
- return param;
131
- }
132
-
133
- Img fgetimg(FILE *fp) {
134
-
135
- 省略
136
- return img;
137
- }
138
-
139
-
140
43
  *****新たに変えました**
141
44
  ラベル数に応じて返す値を増やしたりしたいのですがそこができません
142
45
 
@@ -204,32 +107,8 @@
204
107
 
205
108
 
206
109
 
207
- void fputimg(FILE *fp, Img img) {
208
- int sx, sy;
209
- int c, x, y;
210
110
 
211
- sx = img.sx; sy = img.sy;
212
- fprintf(fp, "%d %d\n", sx, sy);
213
- for(c = 0; c < MC; c++) {
214
- fputimg_uni(fp, img, c);
215
- }
216
- }
217
111
 
218
- void fputimg_uni(FILE *fp, Img img, int c) {
219
- int sx, sy;
220
- int x, y;
221
-
222
- sx = img.sx; sy = img.sy;
223
- for(y = 0; y < sy; y++) {
224
- for(x = 0; x < sx; x++) {
225
- fprintf(fp, "%3d ", img.d[c][y][x]);
226
- }
227
- fprintf(fp, "\n");
228
- }
229
- fprintf(fp, "\n");
230
- }
231
-
232
-
233
112
  ******新たに追加しました*****
234
113
  void fputz(FILE *fp, Zahyou zahyou){
235
114
 
@@ -249,85 +128,9 @@
249
128
 
250
129
 
251
130
 
252
- ```
253
- ラベリング部分 ここは質問とは関係ないですが参考にして考えろと言われたところです
254
- #include <stdio.h>
255
- #include "img.h"
256
- #define NBR 4
257
- #define TBLSIZ 63
258
131
 
259
- int nbrlbl(Img img, Img limg, int x, int y, int l[]) {
260
- int ml, i;
261
- int sx, sy;
262
-
263
- sx = img.sx; sy = img.sy;
264
- l[3] = x > 0 ? limg.d[0][y][x-1] : 0;
265
- if(y > 0) {
266
- l[1] = limg.d[0][y-1][x];
267
- l[0] = x > 0 ? limg.d[0][y-1][x-1] : 0;
268
- l[2] = x < sx - 1 ? limg.d[0][y-1][x+1] : 0;
269
- } else {
270
- l[0] = l[1] = l[2] = 0;
271
- }
272
- ml = TBLSIZ;
273
- //printf("%d %d: %d ", x, y, ml);
274
- for(i = 0; i < NBR; i++) {
275
- if(l[i] > 0 && l[i] < ml) ml = l[i];
276
- //printf(" %d ", l[i]);
277
- }
278
- if(ml == TBLSIZ) ml = 0;
279
- //printf(" min: %d\n", ml);
280
132
 
281
- return ml;
282
- }
283
133
 
284
- Img lbl(Img img) {
285
- Img limg;
286
- int nbrlbl(Img, Img, int, int, int []);
287
- int sx, sy;
288
- int x, y, i;
289
- int tbl[TBLSIZ], l[NBR], ml, ll;
290
-
291
- sx = img.sx; sy = img.sy;
292
- limg.sx = sx; limg.sy = sy;
293
- tbl[0] = 0;
294
- ll = 0;
295
- for(y = 0; y < sy; y++) {
296
- for(x = 0; x < sx; x++) {
297
- if(img.d[0][y][x] > 0) {
298
- ml = nbrlbl(img, limg, x, y, l);
299
- //printf("\t>>%d %d: %d\n", x, y, ml);
300
- if(ml == 0) {
301
- limg.d[0][y][x] = ++ll;
302
- tbl[ll] = ll;
303
- } else {
304
- limg.d[0][y][x] = ml;
305
- for(i = 0; i < NBR; i++) {
306
- if(l[i] > ml) {
307
- tbl[l[i]] = ml;
308
- }
309
- }
310
- }
311
- } else {
312
- limg.d[0][y][x] = 0;
313
- }
314
- }
315
- }
316
- /* For debug.
317
- for(i = 1; i <= ll; i++) {
318
- printf("(%3d %3d)\n", i, tbl[i]);
319
- }
320
- */
321
- for(y = 0; y < sy; y++) {
322
- for(x = 0; x < sx; x++) {
323
- limg.d[0][y][x] = tbl[limg.d[0][y][x]];
324
- }
325
- }
326
- return limg;
327
- }
328
- ```
329
-
330
-
331
134
  ```ここに言語を入力
332
135
   格納される部分
333
136
  #define MAX 255

3

誤字

2019/11/17 10:19

投稿

0126tami
0126tami

スコア60

title CHANGED
File without changes
body CHANGED
@@ -1,12 +1,14 @@
1
1
  プログラムを全てはっていますが、メイン分のzyusin関数以外は全て完成しているので
2
- zyusin関数部分だけのアドバイスをお願いします。
2
+ zyusin関数部分と構造体部分のアドバイスをお願いします。
3
3
  先生から元々あるプログラムを真似しながら重心を求める関数を作ってみなさいと言われたのですがコンパイルは通るもののzyusin関数が全く機能していないみたいです。
4
4
  どうか助けてください。
5
5
 
6
- それから先生に言われたことですが、void関数にしているのは他の関数を真似していることになっていないと言われたのですが、zyusin関数で最後に返したいのはラベリングしたものの重心の座標なのでvoid関数でいいのではないかと思ったのですが、、、
7
- 私が何を間違っているのかがさっぱりわかりません
8
6
 
7
+ ちなみにzyusin関数は全て自分で作っています泣
9
8
 
9
+
10
+
11
+
10
12
  8 10 //8かける10のテキストファイル
11
13
  0 0 0 0 0 1 1 1
12
14
  0 0 0 0 1 1 1 0

2

構造体の追加

2019/11/15 04:24

投稿

0126tami
0126tami

スコア60

title CHANGED
File without changes
body CHANGED
@@ -36,22 +36,21 @@
36
36
 
37
37
  ```
38
38
  メイン部分
39
- #include <stdio.h>
40
- #include "img.h"
41
-
42
39
  int main(int argc, char *argv[]) {
43
40
  Img func_h_i(Img, Param); // Eq.(4)
44
41
  Img func_h(Img); // Eqs.(2) and (3)
45
42
  Img func_av(Img, Param); // Eq.(5)
46
43
  Img func_bin(Img, Param); // Eq.(6)
47
44
  Img lbl(Img);
48
- Img zyusin(Img);
49
45
 
46
+ ****構造体を増やしました****
47
+ Zahyou zyusin(Img);
48
+
50
49
  FILE *fp;
51
50
  int i;
52
51
  Img img, himg, hhimg, aimg, bimg;
53
52
  Param param;
54
-
53
+ Zahyou z;
55
54
  Img limg,zimg;
56
55
 
57
56
  if(argc != 3) {
@@ -94,176 +93,109 @@
94
93
  printf("Labeling.\n");
95
94
  limg = lbl(bimg);
96
95
  fputimg_uni(stdout, limg, 0);
97
- ここの部分見てください!!!!
96
+ *******新たにfputz追加しました!!!!****
98
97
  printf("zyusin.\n");
99
- zyusin(limg);
98
+ z=zyusin(limg);
100
- //fputimg_uni(stdout,zimg,0);
99
+ fputz(stdout,z);
101
100
 
102
101
  return 0;
103
102
  }
104
103
 
105
104
  Img func_bin(Img img, Param p) {
106
- Img bimg;
107
- int sx, sy;
108
- int c, x, y;
109
- int t;
105
+      省略
110
106
 
111
- sx = img.sx; sy = img.sy;
112
- bimg.sx = sx; bimg.sy = sy;
113
- c = 0;
114
- t = p.t;
115
-
116
- *計算は省略
117
-
118
107
  return bimg;
119
108
  }
120
109
 
121
110
  Img func_av(Img img, Param p) {
122
- Img aimg;
123
- int sx, sy;
124
- int c, x, y;
125
- int n, nn, d;
126
- int m, xs, xe, ys, ye, mx, my, cc, s;
127
-
128
- *計算は省略
111
+      省略
129
-
130
112
  return aimg;
131
113
  }
132
114
 
133
115
  Img func_h_i(Img img, Param p) {
134
- Img himg;
135
- int sx, sy;
136
- int c, x, y;
137
- int d, h;
138
- int l, u;
139
-
140
- sx = img.sx; sy = img.sy;
141
- himg.sx = sx; himg.sy = sy;
142
- for(c = 0; c < MC; c++) {
143
- l = p.low[c];
144
- u = p.up[c];
145
- for(y = 0; y < sy; y++) {
146
- for(x = 0; x < sx; x++) {
147
- d = img.d[c][y][x];
148
- h = (d >= l && d <= u) ? 1 : 0;
149
- himg.d[c][y][x] = h;
150
- }
116
+ 省略
151
- }
152
- }
153
-
154
117
  return himg;
155
118
  }
156
119
 
157
120
  Img func_h(Img img) {
158
- Img himg;
159
- int sx, sy;
160
- int c, x, y;
161
- int d;
162
-
163
- sx = img.sx; sy = img.sy;
164
- himg.sx = sx; himg.sy = sy;
165
- for(y = 0; y < sy; y++) {
166
- for(x = 0; x < sx; x++) {
167
- d = MAX;
168
- for(c = 0; c < MC; c++) {
169
- d *= img.d[c][y][x];
170
- }
121
+ 省略
171
- for(c = 0; c < MC; c++) {
172
- himg.d[c][y][x] = d;
173
- }
174
- }
175
- }
176
-
177
122
  return himg ;
178
123
  }
179
124
 
180
125
  Param fgetparam(FILE *fp) {
181
126
  Param param;
182
- int c;
183
- for(c = 0; c < MC; c++) {
184
- fscanf(fp, "%d", &(param.low[c]));
185
- }
127
+ 省略
186
- for(c = 0; c < MC; c++) {
187
- fscanf(fp, "%d", &(param.up[c]));
188
- }
189
- fscanf(fp, "%d", &(param.n));
190
- fscanf(fp, "%d", &(param.t));
191
-
192
128
  return param;
193
129
  }
194
130
 
195
131
  Img fgetimg(FILE *fp) {
196
- Img img;
197
- int sx, sy;
198
- int c, x, y;
199
- int tmp;
200
-
201
- fscanf(fp, "%d %d", &sx, &sy);
202
- img.sx = sx; img.sy = sy;
203
- for(c = 0; c < MC; c++) {
204
- for(y = 0; y < sy; y++) {
205
- for(x = 0; x < sx; x++) {
206
- fscanf(fp, "%d", &tmp);
207
- img.d[c][y][x] = tmp;
208
- }
209
- }
210
- }
211
132
 
133
+ 省略
212
134
  return img;
213
135
  }
214
136
 
215
137
 
138
+ *****新たに変えました**
139
+ ラベル数に応じて返す値を増やしたりしたいのですがそこができません
216
140
 
217
- *****ここから見てください*****
218
- Img zyusin(Img img){
219
141
 
142
+ Zahyou zyusin(Img img){
220
143
 
144
+ Zahyou zahyou;
221
- int sx=0,sy=0;
145
+ int sx,sy;
146
+ int x,y,label1x=0,label1y=0,label2x=0,label2y=0,label3x=0,label3y=0,label4x=0,label4y=0;
222
- int x,y,label1x=0,label1y=0,label2x=0,label2y=0;
147
+ int label1=0,label2=0,label3=0,label4=0;
223
- int label1=0,label2=0;
224
- sx=img.sx; sy=img.sy;
225
148
 
149
+ img.sx=sx; img.sy=sy;
226
150
 
227
151
 
228
152
 
229
- for(y=0;y<sy;y++){
230
- for(x=0;x<sx;x++){
231
- if(img.d[0][y][x]==1){
232
- label1++;
233
- }else if(img.d[0][y][x]==2){
234
- label2++;
235
- }
236
- }
237
- }
238
-
239
-
240
153
  for(y=0;y<sy;y++){
241
154
  for(x=0;x<sx;x++){
242
155
  if(img.d[0][y][x]==1){
156
+ label1++;
243
- label1x=label1x+x;
157
+ label1x=label1x+x;
244
- label1y=label1y+y;
158
+ label1y=label1y+y;
245
-
246
- }if(img.d[0][y][x]==2){
159
+ }else if(img.d[0][y][x]==2){
247
-
160
+ label2++;
248
161
  label2x=label2x+x;
249
162
  label2y=label2y+y;
163
+ }else if(img.d[0][y][x]==3){
164
+ label3++;
165
+ label3x=label3x+x;
166
+ label3y=label3y+y;
167
+ }else if(img.d[0][y][x]==4){
168
+ label4++;
169
+ label4x=label4x+x;
170
+ label4y=label4y+y;
250
171
  }
172
+ }
173
+ }
251
174
 
252
- }
253
175
 
254
- }
255
176
 
256
177
 
257
178
  label1x=label1x/label1;
258
179
  label1y=label1y/label1;
259
180
 
181
+
260
182
  label2x=label2x/label2;
261
183
  label2y=label2y/label2;
262
184
 
263
185
 
264
- return label1x;
186
+ label3x=label3x/label3;
187
+ label3y=label3y/label3;
265
188
 
266
189
 
190
+ label4x=label4x/label4;
191
+ label4y=label4y/label4;
192
+
193
+
194
+ Zahyou.px=label1x;
195
+ Zahyou.py=label1y;
196
+
197
+
198
+ return zahyou;
267
199
 
268
200
 
269
201
  }
@@ -294,6 +226,23 @@
294
226
  }
295
227
  fprintf(fp, "\n");
296
228
  }
229
+
230
+
231
+ ******新たに追加しました*****
232
+ void fputz(FILE *fp, Zahyou zahyou){
233
+
234
+ int i;
235
+
236
+ for(i=0;i<4;i++){ //4はラベルの数だけ分にしたい今回の例だと2
237
+ fprintf(fp,"%d %d",zahyou.px,zahyou.py);
238
+ }
239
+
240
+
241
+ fprintf(fp,"\n");
242
+
243
+ }
244
+
245
+
297
246
  ```
298
247
 
299
248
 
@@ -379,7 +328,6 @@
379
328
 
380
329
  ```ここに言語を入力
381
330
   格納される部分
382
-
383
331
  #define MAX 255
384
332
  #define MX 20
385
333
  #define MY 20
@@ -388,6 +336,14 @@
388
336
  #define B 2
389
337
  #define MC 3
390
338
 
339
+
340
+ typedef struct zahyou{
341
+
342
+ int px,py;
343
+
344
+
345
+ } Zahyou;
346
+
391
347
  typedef struct img {
392
348
  int sx, sy;
393
349
  int d[MC][MY][MX];
@@ -402,5 +358,6 @@
402
358
  Param fgetparam(FILE *);
403
359
  void fputimg(FILE *, Img);
404
360
  void fputimg_uni(FILE *, Img, int);
405
- void zyusin(Img);
361
+ void fputz(FILE *, Zahyou);
362
+
406
363
  ```

1

修正

2019/11/15 04:21

投稿

0126tami
0126tami

スコア60

title CHANGED
File without changes
body CHANGED
@@ -45,7 +45,7 @@
45
45
  Img func_av(Img, Param); // Eq.(5)
46
46
  Img func_bin(Img, Param); // Eq.(6)
47
47
  Img lbl(Img);
48
-
48
+ Img zyusin(Img);
49
49
 
50
50
  FILE *fp;
51
51
  int i;
@@ -215,22 +215,22 @@
215
215
 
216
216
 
217
217
  *****ここから見てください*****
218
- void zyusin(Img img){
218
+ Img zyusin(Img img){
219
219
 
220
- Img limg;
220
+
221
221
  int sx=0,sy=0;
222
222
  int x,y,label1x=0,label1y=0,label2x=0,label2y=0;
223
223
  int label1=0,label2=0;
224
+ sx=img.sx; sy=img.sy;
224
225
 
225
- limg.sx=sx; limg.sy=sy;
226
226
 
227
227
 
228
228
 
229
229
  for(y=0;y<sy;y++){
230
230
  for(x=0;x<sx;x++){
231
- if(limg.d[0][y][x]==1){
231
+ if(img.d[0][y][x]==1){
232
232
  label1++;
233
- }else if(limg.d[0][y][x]==2){
233
+ }else if(img.d[0][y][x]==2){
234
234
  label2++;
235
235
  }
236
236
  }
@@ -239,11 +239,11 @@
239
239
 
240
240
  for(y=0;y<sy;y++){
241
241
  for(x=0;x<sx;x++){
242
- if(limg.d[0][y][x]==1){
242
+ if(img.d[0][y][x]==1){
243
243
  label1x=label1x+x;
244
244
  label1y=label1y+y;
245
245
 
246
- }if(limg.d[0][y][x]==2){
246
+ }if(img.d[0][y][x]==2){
247
247
 
248
248
  label2x=label2x+x;
249
249
  label2y=label2y+y;
@@ -261,7 +261,7 @@
261
261
  label2y=label2y/label2;
262
262
 
263
263
 
264
- printf("1 %d,%d\n2 %d,%d",label1x,label1y,label2x,label2y);
264
+ return label1x;
265
265
 
266
266
 
267
267