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

質問編集履歴

1

質問の更新

2020/10/10 06:01

投稿

noooooooob
noooooooob

スコア16

title CHANGED
@@ -1,1 +1,1 @@
1
- OpenCV,numpyを用いた画像処理ついて知識お貸くださ
1
+ ターミナル上コメント
body CHANGED
@@ -1,264 +1,1 @@
1
- ###環境
2
- python 3.7
3
- raspberry pi 3
4
- OpenCV 4.x
5
- numpy OS(buster)にもともと入っていたもの
6
-
7
- ###現状・問題点
8
- 専門学校て画像処理を用い自律走行ついて研究を行っていま
1
+ ターミナル上数値、まはコメントを残すはどようにるのでしょうか
9
- その研究は何年か引き継がれている研究ですが、引き継ぎ状態が悪く、私に引き継いだ方も今までのプログラム(コード?)を理解していませんでした。また、私の知識の浅さも相まって、研究が進まない状況にあります。
10
-
11
- そこで、プログラミングの先輩方にご教授していただきたく、質問をさせていただきました。
12
-
13
- ###画像処理で行いたいこと
14
- 文で説明を行うと長くなってしまうので図を書きました。
15
- ![図1](1b9833ee4eae5dcf6f845b43e97edbb5.jpeg)
16
- ![図2](c5a25c0b678dc9fb956373f132ea2ee4.jpeg)
17
-
18
- ###作成されたコード
19
- 一応、研究内容ですので私の分からないところに関係ない場所は割愛させていただいております。
20
- また、この以下のコードは3つのコード分あります。それぞれの分け目にコード名が記載されています。(Autonomous.py , processing.py , p_value.py です。)
21
-
22
- ```python
23
- "Autonomous.py"
24
- import sys
25
- from PyQt5.QtWidgets import *
26
- from PyQt5.QtGui import *
27
- from PyQt5.QtCore import *
28
- import subprocess
29
- import time
30
- import numpy as np
31
- import cv2
32
- import RPi.GPIO as GPIO
33
- #ここから下4つは自作モジュール
34
- import processing
35
- import HSV_GUI
36
- import motor_GUI as motor
37
- import motor_PWM
38
-
39
- class Tab1Widget(QWidget):
40
-
41
- def __init__(self):
42
- super().__init__()
43
- self.title = "自律走行"
44
- self.left = 50
45
- self.top = 50
46
- self.width = 1300
47
- self.height = 1200
48
- self.initUI()
49
- self.counter = 0
50
-
51
- def initUI(self):
52
-
53
- super(Tab1Widget, self).__init__()
54
- self.cap = cv2.VideoCapture(0)
55
-
56
- self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
57
- self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,200)
58
- self.cap.set(cv2.CAP_PROP_FPS,10)
59
-
60
- self.camera_run = 0
61
- self.auto_run = 0
62
- self.countM = 0
63
- self.M = 1
64
- self.Duty_R = self.Duty_L = 0
65
-
66
- self.H1 = 30
67
- self.H2 = 90
68
- self.countHSV2 = 0
69
-
70
- self.view1 = QGraphicsView()
71
- self.scene1 = QGraphicsScene()
72
-
73
- #PyQtでGUI作成(略)
74
-
75
- def camera_ON(self):
76
- self.camera_run = 1
77
- self.camera_set()
78
- timer = QTimer(self.view1)
79
- timer.timeout.connect(self.camera_set)
80
- timer.start(300)
81
-
82
-
83
- def camera_OFF(self):
84
- self.camera_run = 0
85
-
86
- def camera_set(self):
87
-
88
- ret, cv_img = self.cap.read()
89
-
90
- if ret == False:
91
- return
92
-
93
- self.img_src = cv_img
94
- cv_img_RGB = cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)
95
- cv_img_RGB = cv2.resize(cv_img_RGB,(250,250))
96
- cv_img_RGB = cv2.rectangle(cv_img_RGB, (60, 100), (190, 190), (255, 0, 0), 2, 3)
97
- height, width, dim = cv_img_RGB.shape
98
- bytesPerLine = dim * width
99
- self.image = QImage(cv_img_RGB.data, width, height, bytesPerLine, QImage.Format_RGB888)
100
- self.item = QGraphicsPixmapItem(QPixmap.fromImage(self.image))
101
- self.scene.addItem(self.item)
102
- self.view1.setScene(self.scene)
103
-
104
- #分からない範囲が画像処理のため自律移動のコードは割愛します。
105
-
106
- if __name__ == "__main__":
107
- app = QApplication(sys.argv)
108
- ex = Tab1Widget()
109
- sys.exit(app.exec_())
110
-
111
- """
112
- """
113
- "processing.py"
114
- import numpy as np
115
- import math
116
- import cv2
117
- import time
118
- import RPi.GPIO as GPIO
119
- #以下3つは自作モジュール
120
- import P_value as p_v
121
- import HSV
122
- import motor
123
-
124
- def camera(auto_run,img_src,countM,H1,H2): #Autonomous.pyから()内の数値を取得
125
- t1 = time.time()
126
- if auto_run == 0:
127
- return
128
- count_hsv = 0
129
- count_p = F = F2 = F3 = P = countHSV2 = 0
130
- row_mean_p = row_mean_p2 = h3 = 0
131
- row_mean_p3 = 320
132
-
133
- S1 = 50
134
- S2 = 255
135
- imageX = 160
136
- imageY = 60
137
- M = 1
138
-
139
- #Autonomous.pyから得たカメラ画像 img_src の画像処理
140
- img_src=cv2.resize(img_src,(imageX,imageY))
141
- hsv = cv2.cvtColor(img_src, cv2.COLOR_BGR2HSV)
142
- img_src0 = cv2.cvtColor(img_src, cv2.COLOR_BGR2RGB)
143
- lower_green = np.array([H1, S1, 30])
144
- upper_green = np.array([H2, S2,255])
145
- img_mask = cv2.inRange(hsv, lower_green, upper_green)
146
- # 8近傍の定義
147
- neiborhood8 = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]],np.uint8)
148
- img_erosion = cv2.erode(img_mask,neiborhood8,iterations=2)
149
- img_erosion = cv2.erode(img_erosion,neiborhood8,iterations=2)
150
- img_dilation = cv2.dilate(img_erosion,neiborhood8,iterations=2)
151
- img_dilation = cv2.dilate(img_dilation,neiborhood8,iterations=2)
152
- img_dst = cv2.bitwise_and(img_src, img_src, mask=img_dilation)
153
- img_dst2 = cv2.bitwise_and(img_src, img_src, mask=img_mask)
154
-
155
- start = time.time()
156
- row_mean_L , row_mean_R ,p_vaiue3 = p_v.Get_MotorParameter(img_mask,1 ,F3)
157
-
158
- F3 = int(-p_vaiue3)
159
-
160
- count_hsv += 1
161
- if count_hsv == 20 or count_hsv == 25 or count_hsv == 30 :
162
- img_dst, H1, H2 ,S1 , S2 , countHSV2 = HSV.HSV_value (img_dst, H1, H2,countHSV2)
163
- countM += 1
164
-
165
- t2 = time.time()
166
- elapsed_time = t2 - t1
167
-
168
- return p_vaiue3 ,img_src0 ,elapsed_time,countM
169
-
170
- """
171
- """
172
- "P_value.py"
173
- import numpy as np
174
- import math
175
-
176
- import time
177
- countM = 0
178
- def Get_MotorParameter(img1, y_number=1, F3=0 ): #緑判定後の二値画像取得
179
- #変数定義(メモリ領域確保)
180
- img_mean = 0
181
- y_img1 = img1.shape[0]
182
- x_img1 = img1.shape[1]
183
- xhalf_img1 = x_img1 // 2
184
- count = np.uint(0)
185
- img_maskL = np.zeros( ( y_number, xhalf_img1 ), np.uint8)
186
- img_maskR = np.zeros( ( y_number, xhalf_img1 ), np.uint8)
187
- Left_crd = np.zeros( ( 2 , ), np.uint16)
188
- Right_crd = np.zeros( ( 2 , ), np.uint16)
189
- row_mean_L = np.zeros( ( y_img1 ), np.uint16)
190
- row_mean_R = np.zeros( ( y_img1 ), np.uint16)
191
- p_vaiue = p_vaiue2 = p_vaiue3 = Left_crd_max = Right_crd_min = 0
192
- G_vaiue3 = G_vaiue2 = G_vaiue1 = 0
193
- X = 0
194
- X2 = 0
195
- Y = 0
196
- X_gap = 15
197
- F4 = F5 = F3 = 0
198
- if F3 < -X :
199
- F4 = -F3 - X
200
- if F3 > X :
201
- F5 = F3 - X
202
-
203
-
204
- if y_number == 1:
205
- for y in range(Y,img1.shape[0]-Y, 1):
206
- #'''一行ずつ処理
207
- img_maskL = img1[ y , X + F3 + F4 : xhalf_img1 + F3 - X2]
208
- img_maskR = img1[ y, xhalf_img1 + F3 + X2 : x_img1 - X + F3 -F5]
209
- Left_crd = np.array( np.where( img_maskL > 0 ) ) [0,:]
210
- Right_crd = np.array( np.where( img_maskR > 0 ) ) [0,:]
211
- Left_Mean =np.mean( Left_crd )
212
- Right_Mean = np.mean( Right_crd )
213
- if (Left_Mean > 0) and ( Right_Mean > 0 ) :
214
- Left_crd_max = np.max( Left_crd )
215
- Right_crd_min = np.min( Right_crd )
216
- count += 1
217
- row_mean_L[y+(y_number//2)] = int(Left_crd_max + X + F3 + F4 )
218
- row_mean_R[y+(y_number//2)] = int(Right_crd_min + xhalf_img1 + F3 + X2)
219
- p_vaiue1 = ( xhalf_img1 - Left_crd_max - Right_crd_min - X - (2*F3) + X_gap)
220
- p_vaiue2 = p_vaiue2 + p_vaiue1
221
- p_vaiue3 = p_vaiue2 / ((count))
222
-
223
-
224
- else:
225
- for y in range(Y,img1.shape[0]-Y, y_number): #複数列処理
226
-
227
- #'''複数列処理
228
- img_maskL = img1[ y : y+y_number,X + F3 + F4: xhalf_img1 + F3 - X2]
229
- img_maskR = img1[ y : y+y_number, xhalf_img1 + F3 + X2 : x_img1 - X + F3 -F5]
230
- Left_crd=np.array(np.where(img_maskL >0))[1,:]
231
- Right_crd=np.array(np.where(img_maskR >0))[1,:]
232
- Left_Mean = np.mean( Left_crd[~np.isnan(Left_crd) ] )
233
- Right_Mean = np.mean( Right_crd[~np.isnan(Right_crd) ] )
234
- if (Left_Mean > 0) and ( Right_Mean > 0 ) :
235
- Left_crd_max = np.max( Left_crd )
236
- Right_crd_min = np.min( Right_crd )
237
- count += 1
238
- row_mean_L[y+(y_number//2)] = int(Left_crd_max + X + F3 + F4 ) #各画素列の平均
239
- row_mean_R[y+(y_number//2)] = int(Right_crd_min + xhalf_img1 + F3 + X2)
240
- p_vaiue1 = ( xhalf_img1- Left_crd_max - Right_crd_min - X - (2*F3) + X_gap)
241
- p_vaiue2 += p_vaiue1
242
- p_vaiue3 = p_vaiue2 / (count)
243
-
244
- return row_mean_L , row_mean_R ,p_vaiue3
245
- ```
246
- ###理解しているつもりのこと(間違っていたらご指摘ください)
247
- ・Autonomous.pyについては理解できています。
248
- ・processing.pyについて
249
- > img_src=cv2.resize(img_src,(imageX,imageY))
250
-
251
- で、Autonomous.pyから取得したカメラ画像を160×60にしており、その後は画像加工を行っている。
252
- 加工内容も一応理解はしています。
253
-
254
- ###分からないこと
255
- p_value.pyに関して(numpyに関して)が理解できていません。
256
- numpyについて学習してみたものの、いざコードを読もうとしてもさっぱりでした。
257
- > y_img1 = img1.shape[0]
258
- x_img1 = img1.shape[1]
259
- xhalf_img1 = x_img1 // 2
260
-
261
- は、processing.pyから取得した加工済みの画像の高さ・幅・幅の1/2の情報を取得しているのだと思いますが、その後は全く分かりません。
262
-
263
- この辺はこんなことをしている、程度のざっくりでいいのでご教授いただけますと幸いです。
264
- 自分でも驚くほどの無知なため、大雑把な質問になってしまいましたが先輩のお力をお貸しください。よろしくお願いいたします。