回答編集履歴
1
誤植の修正
test
CHANGED
@@ -4,15 +4,15 @@
|
|
4
4
|
|
5
5
|
処理の要点だけ書きます。
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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")
|