質問編集履歴

1

質問の更新

2020/10/10 06:01

投稿

noooooooob
noooooooob

スコア16

test CHANGED
@@ -1 +1 @@
1
- OpenCV,numpyを用いた画像処理ついて知識お貸くださ
1
+ ターミナル上コメント
test CHANGED
@@ -1,527 +1 @@
1
- ###環境
2
-
3
- python 3.7
4
-
5
- raspberry pi 3
6
-
7
- OpenCV 4.x
8
-
9
- numpy OS(buster)にもともと入っていたもの
10
-
11
-
12
-
13
- ###現状・問題点
14
-
15
- 専門学校て画像処理用いた自律走行ついて研究を行っていま
1
+ ターミナル上数値、またはコメント残すはどようにるのでしょうか
16
-
17
- その研究は何年か引き継がれている研究ですが、引き継ぎ状態が悪く、私に引き継いだ方も今までのプログラム(コード?)を理解していませんでした。また、私の知識の浅さも相まって、研究が進まない状況にあります。
18
-
19
-
20
-
21
- そこで、プログラミングの先輩方にご教授していただきたく、質問をさせていただきました。
22
-
23
-
24
-
25
- ###画像処理で行いたいこと
26
-
27
- 文で説明を行うと長くなってしまうので図を書きました。
28
-
29
- ![図1](1b9833ee4eae5dcf6f845b43e97edbb5.jpeg)
30
-
31
- ![図2](c5a25c0b678dc9fb956373f132ea2ee4.jpeg)
32
-
33
-
34
-
35
- ###作成されたコード
36
-
37
- 一応、研究内容ですので私の分からないところに関係ない場所は割愛させていただいております。
38
-
39
- また、この以下のコードは3つのコード分あります。それぞれの分け目にコード名が記載されています。(Autonomous.py , processing.py , p_value.py です。)
40
-
41
-
42
-
43
- ```python
44
-
45
- "Autonomous.py"
46
-
47
- import sys
48
-
49
- from PyQt5.QtWidgets import *
50
-
51
- from PyQt5.QtGui import *
52
-
53
- from PyQt5.QtCore import *
54
-
55
- import subprocess
56
-
57
- import time
58
-
59
- import numpy as np
60
-
61
- import cv2
62
-
63
- import RPi.GPIO as GPIO
64
-
65
- #ここから下4つは自作モジュール
66
-
67
- import processing
68
-
69
- import HSV_GUI
70
-
71
- import motor_GUI as motor
72
-
73
- import motor_PWM
74
-
75
-
76
-
77
- class Tab1Widget(QWidget):
78
-
79
-
80
-
81
- def __init__(self):
82
-
83
- super().__init__()
84
-
85
- self.title = "自律走行"
86
-
87
- self.left = 50
88
-
89
- self.top = 50
90
-
91
- self.width = 1300
92
-
93
- self.height = 1200
94
-
95
- self.initUI()
96
-
97
- self.counter = 0
98
-
99
-
100
-
101
- def initUI(self):
102
-
103
-
104
-
105
- super(Tab1Widget, self).__init__()
106
-
107
- self.cap = cv2.VideoCapture(0)
108
-
109
-
110
-
111
- self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
112
-
113
- self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,200)
114
-
115
- self.cap.set(cv2.CAP_PROP_FPS,10)
116
-
117
-
118
-
119
- self.camera_run = 0
120
-
121
- self.auto_run = 0
122
-
123
- self.countM = 0
124
-
125
- self.M = 1
126
-
127
- self.Duty_R = self.Duty_L = 0
128
-
129
-
130
-
131
- self.H1 = 30
132
-
133
- self.H2 = 90
134
-
135
- self.countHSV2 = 0
136
-
137
-
138
-
139
- self.view1 = QGraphicsView()
140
-
141
- self.scene1 = QGraphicsScene()
142
-
143
-
144
-
145
- #PyQtでGUI作成(略)
146
-
147
-
148
-
149
- def camera_ON(self):
150
-
151
- self.camera_run = 1
152
-
153
- self.camera_set()
154
-
155
- timer = QTimer(self.view1)
156
-
157
- timer.timeout.connect(self.camera_set)
158
-
159
- timer.start(300)
160
-
161
-
162
-
163
-
164
-
165
- def camera_OFF(self):
166
-
167
- self.camera_run = 0
168
-
169
-
170
-
171
- def camera_set(self):
172
-
173
-
174
-
175
- ret, cv_img = self.cap.read()
176
-
177
-
178
-
179
- if ret == False:
180
-
181
- return
182
-
183
-
184
-
185
- self.img_src = cv_img
186
-
187
- cv_img_RGB = cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)
188
-
189
- cv_img_RGB = cv2.resize(cv_img_RGB,(250,250))
190
-
191
- cv_img_RGB = cv2.rectangle(cv_img_RGB, (60, 100), (190, 190), (255, 0, 0), 2, 3)
192
-
193
- height, width, dim = cv_img_RGB.shape
194
-
195
- bytesPerLine = dim * width
196
-
197
- self.image = QImage(cv_img_RGB.data, width, height, bytesPerLine, QImage.Format_RGB888)
198
-
199
- self.item = QGraphicsPixmapItem(QPixmap.fromImage(self.image))
200
-
201
- self.scene.addItem(self.item)
202
-
203
- self.view1.setScene(self.scene)
204
-
205
-
206
-
207
- #分からない範囲が画像処理のため自律移動のコードは割愛します。
208
-
209
-
210
-
211
- if __name__ == "__main__":
212
-
213
- app = QApplication(sys.argv)
214
-
215
- ex = Tab1Widget()
216
-
217
- sys.exit(app.exec_())
218
-
219
-
220
-
221
- """
222
-
223
- """
224
-
225
- "processing.py"
226
-
227
- import numpy as np
228
-
229
- import math
230
-
231
- import cv2
232
-
233
- import time
234
-
235
- import RPi.GPIO as GPIO
236
-
237
- #以下3つは自作モジュール
238
-
239
- import P_value as p_v
240
-
241
- import HSV
242
-
243
- import motor
244
-
245
-
246
-
247
- def camera(auto_run,img_src,countM,H1,H2): #Autonomous.pyから()内の数値を取得
248
-
249
- t1 = time.time()
250
-
251
- if auto_run == 0:
252
-
253
- return
254
-
255
- count_hsv = 0
256
-
257
- count_p = F = F2 = F3 = P = countHSV2 = 0
258
-
259
- row_mean_p = row_mean_p2 = h3 = 0
260
-
261
- row_mean_p3 = 320
262
-
263
-
264
-
265
- S1 = 50
266
-
267
- S2 = 255
268
-
269
- imageX = 160
270
-
271
- imageY = 60
272
-
273
- M = 1
274
-
275
-
276
-
277
- #Autonomous.pyから得たカメラ画像 img_src の画像処理
278
-
279
- img_src=cv2.resize(img_src,(imageX,imageY))
280
-
281
- hsv = cv2.cvtColor(img_src, cv2.COLOR_BGR2HSV)
282
-
283
- img_src0 = cv2.cvtColor(img_src, cv2.COLOR_BGR2RGB)
284
-
285
- lower_green = np.array([H1, S1, 30])
286
-
287
- upper_green = np.array([H2, S2,255])
288
-
289
- img_mask = cv2.inRange(hsv, lower_green, upper_green)
290
-
291
- # 8近傍の定義
292
-
293
- neiborhood8 = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]],np.uint8)
294
-
295
- img_erosion = cv2.erode(img_mask,neiborhood8,iterations=2)
296
-
297
- img_erosion = cv2.erode(img_erosion,neiborhood8,iterations=2)
298
-
299
- img_dilation = cv2.dilate(img_erosion,neiborhood8,iterations=2)
300
-
301
- img_dilation = cv2.dilate(img_dilation,neiborhood8,iterations=2)
302
-
303
- img_dst = cv2.bitwise_and(img_src, img_src, mask=img_dilation)
304
-
305
- img_dst2 = cv2.bitwise_and(img_src, img_src, mask=img_mask)
306
-
307
-
308
-
309
- start = time.time()
310
-
311
- row_mean_L , row_mean_R ,p_vaiue3 = p_v.Get_MotorParameter(img_mask,1 ,F3)
312
-
313
-
314
-
315
- F3 = int(-p_vaiue3)
316
-
317
-
318
-
319
- count_hsv += 1
320
-
321
- if count_hsv == 20 or count_hsv == 25 or count_hsv == 30 :
322
-
323
- img_dst, H1, H2 ,S1 , S2 , countHSV2 = HSV.HSV_value (img_dst, H1, H2,countHSV2)
324
-
325
- countM += 1
326
-
327
-
328
-
329
- t2 = time.time()
330
-
331
- elapsed_time = t2 - t1
332
-
333
-
334
-
335
- return p_vaiue3 ,img_src0 ,elapsed_time,countM
336
-
337
-
338
-
339
- """
340
-
341
- """
342
-
343
- "P_value.py"
344
-
345
- import numpy as np
346
-
347
- import math
348
-
349
-
350
-
351
- import time
352
-
353
- countM = 0
354
-
355
- def Get_MotorParameter(img1, y_number=1, F3=0 ): #緑判定後の二値画像取得
356
-
357
- #変数定義(メモリ領域確保)
358
-
359
- img_mean = 0
360
-
361
- y_img1 = img1.shape[0]
362
-
363
- x_img1 = img1.shape[1]
364
-
365
- xhalf_img1 = x_img1 // 2
366
-
367
- count = np.uint(0)
368
-
369
- img_maskL = np.zeros( ( y_number, xhalf_img1 ), np.uint8)
370
-
371
- img_maskR = np.zeros( ( y_number, xhalf_img1 ), np.uint8)
372
-
373
- Left_crd = np.zeros( ( 2 , ), np.uint16)
374
-
375
- Right_crd = np.zeros( ( 2 , ), np.uint16)
376
-
377
- row_mean_L = np.zeros( ( y_img1 ), np.uint16)
378
-
379
- row_mean_R = np.zeros( ( y_img1 ), np.uint16)
380
-
381
- p_vaiue = p_vaiue2 = p_vaiue3 = Left_crd_max = Right_crd_min = 0
382
-
383
- G_vaiue3 = G_vaiue2 = G_vaiue1 = 0
384
-
385
- X = 0
386
-
387
- X2 = 0
388
-
389
- Y = 0
390
-
391
- X_gap = 15
392
-
393
- F4 = F5 = F3 = 0
394
-
395
- if F3 < -X :
396
-
397
- F4 = -F3 - X
398
-
399
- if F3 > X :
400
-
401
- F5 = F3 - X
402
-
403
-
404
-
405
-
406
-
407
- if y_number == 1:
408
-
409
- for y in range(Y,img1.shape[0]-Y, 1):
410
-
411
- #'''一行ずつ処理
412
-
413
- img_maskL = img1[ y , X + F3 + F4 : xhalf_img1 + F3 - X2]
414
-
415
- img_maskR = img1[ y, xhalf_img1 + F3 + X2 : x_img1 - X + F3 -F5]
416
-
417
- Left_crd = np.array( np.where( img_maskL > 0 ) ) [0,:]
418
-
419
- Right_crd = np.array( np.where( img_maskR > 0 ) ) [0,:]
420
-
421
- Left_Mean =np.mean( Left_crd )
422
-
423
- Right_Mean = np.mean( Right_crd )
424
-
425
- if (Left_Mean > 0) and ( Right_Mean > 0 ) :
426
-
427
- Left_crd_max = np.max( Left_crd )
428
-
429
- Right_crd_min = np.min( Right_crd )
430
-
431
- count += 1
432
-
433
- row_mean_L[y+(y_number//2)] = int(Left_crd_max + X + F3 + F4 )
434
-
435
- row_mean_R[y+(y_number//2)] = int(Right_crd_min + xhalf_img1 + F3 + X2)
436
-
437
- p_vaiue1 = ( xhalf_img1 - Left_crd_max - Right_crd_min - X - (2*F3) + X_gap)
438
-
439
- p_vaiue2 = p_vaiue2 + p_vaiue1
440
-
441
- p_vaiue3 = p_vaiue2 / ((count))
442
-
443
-
444
-
445
-
446
-
447
- else:
448
-
449
- for y in range(Y,img1.shape[0]-Y, y_number): #複数列処理
450
-
451
-
452
-
453
- #'''複数列処理
454
-
455
- img_maskL = img1[ y : y+y_number,X + F3 + F4: xhalf_img1 + F3 - X2]
456
-
457
- img_maskR = img1[ y : y+y_number, xhalf_img1 + F3 + X2 : x_img1 - X + F3 -F5]
458
-
459
- Left_crd=np.array(np.where(img_maskL >0))[1,:]
460
-
461
- Right_crd=np.array(np.where(img_maskR >0))[1,:]
462
-
463
- Left_Mean = np.mean( Left_crd[~np.isnan(Left_crd) ] )
464
-
465
- Right_Mean = np.mean( Right_crd[~np.isnan(Right_crd) ] )
466
-
467
- if (Left_Mean > 0) and ( Right_Mean > 0 ) :
468
-
469
- Left_crd_max = np.max( Left_crd )
470
-
471
- Right_crd_min = np.min( Right_crd )
472
-
473
- count += 1
474
-
475
- row_mean_L[y+(y_number//2)] = int(Left_crd_max + X + F3 + F4 ) #各画素列の平均
476
-
477
- row_mean_R[y+(y_number//2)] = int(Right_crd_min + xhalf_img1 + F3 + X2)
478
-
479
- p_vaiue1 = ( xhalf_img1- Left_crd_max - Right_crd_min - X - (2*F3) + X_gap)
480
-
481
- p_vaiue2 += p_vaiue1
482
-
483
- p_vaiue3 = p_vaiue2 / (count)
484
-
485
-
486
-
487
- return row_mean_L , row_mean_R ,p_vaiue3
488
-
489
- ```
490
-
491
- ###理解しているつもりのこと(間違っていたらご指摘ください)
492
-
493
- ・Autonomous.pyについては理解できています。
494
-
495
- ・processing.pyについて
496
-
497
- > img_src=cv2.resize(img_src,(imageX,imageY))
498
-
499
-
500
-
501
- で、Autonomous.pyから取得したカメラ画像を160×60にしており、その後は画像加工を行っている。
502
-
503
- 加工内容も一応理解はしています。
504
-
505
-
506
-
507
- ###分からないこと
508
-
509
- p_value.pyに関して(numpyに関して)が理解できていません。
510
-
511
- numpyについて学習してみたものの、いざコードを読もうとしてもさっぱりでした。
512
-
513
- > y_img1 = img1.shape[0]
514
-
515
- x_img1 = img1.shape[1]
516
-
517
- xhalf_img1 = x_img1 // 2
518
-
519
-
520
-
521
- は、processing.pyから取得した加工済みの画像の高さ・幅・幅の1/2の情報を取得しているのだと思いますが、その後は全く分かりません。
522
-
523
-
524
-
525
- この辺はこんなことをしている、程度のざっくりでいいのでご教授いただけますと幸いです。
526
-
527
- 自分でも驚くほどの無知なため、大雑把な質問になってしまいましたが先輩のお力をお貸しください。よろしくお願いいたします。