#前提・実現したいこと
画像から読み取った値をリストに格納し、そのリストをcsvとして出力したい。csvには画像取り込み時刻、ファイル名、読み取った値の3つをヘッダーの下に出力したい。
#ソースコード
import os import cv2 import numpy as np import math import glob import csv import time result=[] files=glob.glob("boyler0508/*") for fname in files: img=cv2.imread(fname, 1) #img=cv2.imread('c:/temp/0305.jpg', 1) height = img.shape[0] width = img.shape[1] gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) t,b=cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) b=cv2.bitwise_not(b) edges=cv2.Canny(b,50, 100) circles=cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, dp=1.0, minDist=40, param1=60, param2=80, minRadius=200) circles=cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, dp=1.0, minDist=40, param1=30, param2=20, minRadius=80)#param2=20 circles=np.uint16(np.around(circles)) if circles is not None: circles=circles.squeeze(axis=0) for cx, cy, r in circles: cv2.circle(img, (cx, cy), r, (0,255,0),2) cv2.circle(img, (cx,cy), 2, (0,255,0),2) lines=cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=110, minLineLength=90, maxLineGap=10) lineList=[] lines=cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=35, minLineLength=50, maxLineGap=10) lines=np.uint16(np.around(lines)) for line in lines: x1,y1,x2,y2=line[0] lineList.append((x1,y1,x2,y2)) green_line_img=cv2.line(img, (x1,y1),(x2,y2),(0,255,0),1) x0=lineList[0][0] y0=lineList[0][1] x1=lineList[0][2] y1=lineList[0][3] x2=lineList[1][0] y2=lineList[1][1] x3=lineList[1][2] y3=lineList[1][3] dx0=x1-x0 dy0=y1-y0 dx1=x3-x2 dy1=y3-y2 s_bunsi=(y0-y2)*dx1-(x0-x2)*dx1 s_bunbo=dx0*dy1-dy0*dx1 s=s_bunsi/s_bunbo X0=x0+s*(x1-x0) Y0=y0+s*(y1-y0) X=int(X0) Y=int(Y0) cv2.line(img, (cx,cy), (X,Y), (255,0,0),2) a=cx b=cy-r cv2.line(img, (cx,cy),(a,b), (255,0,0),2) A=np.array([cx-cx,cy-cy]) B=np.array([a-cx, cy-b]) C=np.array([X-cx, cy-Y]) veca=B-A vecb=C-A norm_a=np.linalg.norm(veca) norm_b=np.linalg.norm(vecb) dot_ab=np.dot(veca,vecb) cos_theta=dot_ab/(norm_a*norm_b) radians=math.acos(cos_theta) degrees=math.degrees(radians) if X-cx<0: Deg=int(360-degrees) atai=int(Deg/7.2*2) print(str(atai)+"kg") else: Deg=degrees atai=int(Deg/7.2*2) print(str(atai)+"kg") result.append(atai) date_format='%Y/%m/%d%H:%M' file_list=[] time_crt=time.strftime(date_format,time.localtime(os.path.getctime(fname))) file_list.append([fname,time_crt,atai]) with open('boyler_atai','a',newline="")as f: fieldnames=['ファイル名','日付','値'] writer=csv.DictWriter(f,fieldnames=fieldnames) writer.writeheader() for r in file_list: writer.writerows(file_list) cv2.waitKey(0) cv2.destroyAllWindows()
#エラーコード
File "C:\Users\erifu\Anaconda3\lib\csv.py", line 148, in _dict_to_list
wrong_fields = rowdict.keys() - self.fieldnames
AttributeError: 'list' object has no attribute 'keys'
回答1件
あなたの回答
tips
プレビュー