Python : List(np.array) をcsvファイルへ
プログラムの作成途中なので、作ったリストデータをcsvに入れ込む方法です。
基本はリストデータをあまり外で使うことはないのですが、
プログラムを作っているときに、どうしようか検討する際に、
csvにすると、excelとかでも見れるので、便利な時があります。
とりあえず、適当なデータが見当たらなかったので、
先日作ったhoughcircleの結果(circle)の結果(x,y,radius)をcsvにします。
houghについての説明はこちら
プログラムの説明です。
csvモジュールのwriterというのを使います
まず、書き込むcsvファイルを作成します(wで作成、追加の場合はa)
with open('data.csv', 'w',newline='') as file:
作ったcsvファイルをwriterという変数にいれます。(入れ方は下記)
writer = csv.writer(file)
書き込みます。
writer.writerows(circles[0,:])
この際、今回のhoughcircleのデータは3次元のデータです。
なので、今回のほしい値は[0,:]となるので、これを取り出します。
結果は下記のように検出されます。
Aがx座標(width方向)
Bがy座標(hight方向)
cがradius(半径)
プログラムは下記です。
#opencvをインポートします。 import cv2 import numpy as np import csv #フォントの指定 fontType = cv2.FONT_HERSHEY_COMPLEX #検出する画像の読み込み frame = cv2.imread('circle1.jpg') #1チャンネル(白黒画像に変換) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #Cannyにてエッジ検出処理(やらなくてもよい) canny_gray = cv2.Canny(gray,100,200) #houghで使う画像の指定、後で変えたりする際に変数してしておくと楽。 cimg = canny_gray j = 1 #hough関数 circles = cv2.HoughCircles(cimg,cv2.HOUGH_GRADIENT,1,20,param1=120,param2=15,minRadius=10,maxRadius=30) # param1 ; canny()エッジ検出機に渡される2つの閾値のうち、大きいほうの閾値0 # param2 ; 円の中心を検出する際の投票数の閾値、小さくなるほど、より誤検出が起こる可能性がある。 # minRadius ; 検出する円の最小値 # maxRadius ; 検出する円の最大値 ########################################################## print(type(circles)) with open('data.csv', 'w',newline='') as file: writer = csv.writer(file) writer.writerows(circles[0,:]) ########################################################## #np.savetxt('data.csv',circles[0,:],delimiter=',') #検出された際に動くようにする。 if circles is not None and len(circles) > 0: #型をfloat32からunit16に変更:整数のタイプになるので、後々トラブルが減る。 circles = np.uint16(np.around(circles)) for i in circles[0,:]: # 外側の円を描く cv2.circle(frame,(i[0],i[1]),i[2],(0,255,0),2) # 中心の円を描く cv2.circle(frame,(i[0],i[1]),2,(0,0,255),2) # 円の数を数える j = j + 1 #円の合計数を表示 cv2.putText(frame,'Total :'+str(j), (30,30), fontType, 1, (0, 0, 0), 1, cv2.LINE_AA) #結果画像の表示 cv2.imshow('',frame) #結果の書き込み cv2.imwrite('hough_circle.jpg',frame) #キー入力を待つ cv2.waitKey(0) #全ての開いたウインドウ閉じる cv2.destroyAllWindows()