回答編集履歴

1

誤植の修正

2021/01/17 03:27

投稿

退会済みユーザー
test CHANGED
@@ -4,15 +4,15 @@
4
4
 
5
5
  処理の要点だけ書きます。
6
6
 
7
- 0. 何とかして曲線部分だけ切り出しましょう。背景にいろいろな色があって分離困難な場合、HSV空間にもっていって、オレンジ色だけ切り出すと良いかもしれません。たくさん曲線があるようであれば、OpenCVのcontour毎に分離させる手法を取ってください。
8
-
9
- 1. 式で近似させるためになんとかして線ののっかる座標を拾いましょう。座標の割り出しにはskeletonが便利です。「オレは近似式なんぞ使わず、画素の並び具合から傾きを計算する!」というマッチョであれば以下無視してください。
10
-
11
- 2. 何らかの形でx,yから傾きを得るために、近似式を出す方法としてsplineを使いました。**式が定義できるのであればscipyで最小二乗法を**したらいいと思います(私にはムリでした)。**遺伝的アルゴリズムをコメントに書きましたが、計算が遅いのでお勧めできません**。splineが現実的かと思います。
12
-
13
- 3. 上記2において、**splineの場合あるxに対して1つのyしか存在が許されません**。あるx上に複数の解yが存在するのであれば、何らかの方法で曲線を分離してxに対して1つのyしか存在しないようにしてください。私の場合は重複チェックx,yの値を固有の値にしましました。これだと初めに出てきた対を機械的に生かすだけですので数pxくらいズレてしまいます。そんなザコい処理は許されないというのであれば、skeletonのskeletonを探したり、gaussianでぼかして濃いところだけ探す、cv2.erodeなりでもっとあたりを探ったら良いと思います。splineで曲線が相当最適化されると思いますので、上記の中心を割り出す処理をした上で、x,yの対の90%くらいを切り捨ててしまってから式を割り出すsplineをしてもいいかもしれません。
14
-
15
- 4. 傾きから直交する線を描くのはもっとスマートな方法があると思います。例えば[tiitoiさんの回答](https://teratail.com/questions/234974)みたいなもののほうがカッコいいですよね?
7
+ 1. 何とかして曲線部分だけ切り出しましょう。背景にいろいろな色があって分離困難な場合、HSV空間にもっていって、オレンジ色だけ切り出すと良いかもしれません。たくさん曲線があるようであれば、OpenCVのcontour毎に分離させる手法を取ってください。
8
+
9
+ 2. 式で近似させるためになんとかして線ののっかる座標を拾いましょう。座標の割り出しにはskeletonが便利です。「オレは近似式なんぞ使わず、画素の並び具合から傾きを計算する!」というマッチョであれば以下無視してください。
10
+
11
+ 3. 何らかの形でx,yから傾きを得るために、近似式を出す方法としてsplineを使いました。**式が定義できるのであればscipyで最小二乗法を**したらいいと思います(私にはムリでした)。**遺伝的アルゴリズムをコメントに書きましたが、計算が遅いのでお勧めできません**。splineが現実的かと思います。
12
+
13
+ 4. 上記3において、**splineの場合あるxに対して1つのyしか存在が許されません**。あるx上に複数の解yが存在するのであれば、何らかの方法で曲線を分離してxに対して1つのyしか存在しないようにしてください。私の場合は重複チェックをかませてx,yの値を固有の値にしましました。これだと初めに出てきた対を機械的に生かすだけですので少なくとも数pxくらいズレてしまいます。そんなザコい処理は許されないというのであれば、skeletonのskeletonを探したり、gaussianでぼかして濃いところだけ探す、cv2.erodeなりでもっとあたりを探ったら良いと思います。splineで曲線が相当最適化されると思いますので、上記の中心を割り出す処理をした上で、x,yの対の90%くらいを切り捨ててしまってから式を割り出すsplineをしてもいいかもしれません。
14
+
15
+ 5. 傾きから直交する線を描くのはもっとスマートな方法があると思います。例えば[tiitoiさんの回答](https://teratail.com/questions/234974)みたいなもののほうがカッコいいですよね?
16
16
 
17
17
 
18
18
 
@@ -142,8 +142,6 @@
142
142
 
143
143
 
144
144
 
145
-
146
-
147
145
  # Left
148
146
 
149
147
  img = cv2.line(img,center,(int(target_x - shift_value_horizontal), int(target_y - (target_slope * shift_value_horizontal))),(128,255,192),3)
@@ -156,8 +154,6 @@
156
154
 
157
155
 
158
156
 
159
-
160
-
161
157
  #######################################
162
158
 
163
159
  # Calc orthogonal params
@@ -178,8 +174,6 @@
178
174
 
179
175
 
180
176
 
181
-
182
-
183
177
  #######################################
184
178
 
185
179
  # Center
@@ -218,8 +212,6 @@
218
212
 
219
213
 
220
214
 
221
-
222
-
223
215
  # Calc spline
224
216
 
225
217
  spline_func = interpolate.interp1d(pos_x, pos_y,kind="cubic")