下記の画像から青色の矢印の座標を特定し、最小の円を描画するソフトを作りました。
その円の中心座標と半径をcsvに保存したいのですが、以下のようなエラーが出ます。
改善点を教えていただきたいです。
Python
1 # -*- coding:utf-8 -*- 2import cv2 3import numpy as np 4import sys 5 6 7 8# 青色の検出 9def detect_blue_color(img): 10 # HSV色空間に変換 11 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 12 13 # 青色のHSVの値域1 14 hsv_min = np.array([40,140,120]) 15 hsv_max = np.array([150,255,255]) 16 17 # 青色領域のマスク(255:赤色、0:赤色以外) 18 mask = cv2.inRange(hsv, hsv_min, hsv_max) 19 20 # マスキング処理 21 masked_img = cv2.bitwise_and(img, img, mask=mask) 22 23 return mask, masked_img 24 25for i in range(2, 35): 26 img = cv2.imread('CoD1/filename_{0:05d}.png'.format(i)) 27 28 # 色検出(赤、緑、青) 29 mask, masked_img = detect_blue_color(img) 30 31 # 輪郭を抽出する。 32 contours, hierarchy = cv2.findContours( 33 mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 34 ) 35 36 # 小さい輪郭は誤検出として削除する 37 contours = list(filter(lambda x: cv2.contourArea(x) > 10, contours)) 38 39 40 def get_center(contour): 41 """輪郭の中心を取得する。 42 """ 43 # 輪郭のモーメントを計算する。 44 M = cv2.moments(contour) 45 # モーメントから重心を計算する。 46 cx = M["m10"] / M["m00"] 47 cy = M["m01"] / M["m00"] 48 49 return cx, cy 50 51 # 輪郭の中心を取り出す。 52 centers = [get_center(x) for x in contours] 53 54 # 確認用に各中心を描画 55 centers = np.array(centers, dtype=int) 56 for c in centers: 57 img = cv2.circle( img, tuple(c), 3, (0,0,255), 1) 58 59 # 最小外接円を求める 60 cs = centers.reshape(len(centers), 1, 2).astype(int) # カタチを整える 61 (x,y),radius = cv2.minEnclosingCircle(cs) 62 print(x,y,radius) # 中心座標と半径 63 64 65 # 結果を CSV で保存する。 66 with open('centers2.csv','a') as f_handle: 67 np.savetxt(f_handle, (x,y), radius , delimiter=",", fmt="%.0f")
エラーコード
96.0 93.0 9.999999747378752e-05
Traceback (most recent call last):
File "Blue.py", line 67, in <module>
np.savetxt(f_handle, (x,y), radius , delimiter=",", fmt="%.0f")
File "<array_function internals>", line 4, in savetxt
TypeError: _savetxt_dispatcher() got multiple values for argument 'fmt'