-
Notifications
You must be signed in to change notification settings - Fork 2
/
bss1518.py
190 lines (149 loc) · 9.92 KB
/
bss1518.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# -*- coding: utf-8 -*-
import easygui
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc # 한글지원
'''
import pygame
'''
def report():
title='사고 영상 접수'
msg='프로그램을 실행해주셔서 감사합니다.\n이 프로그램은 블랙박스 영상 분석을 통한 빠른 과실비율 판단을 위해 만들어졌으며, 손해보험협회의 자동차 과실비율 산정기준을 판단 근거로 삼고 있습니다. \n\n단, 이 프로그램이 제공하는 결과는 법적인 효력이 없으므로 참고용으로 사용하시기 바랍니다.'
easygui.msgbox(msg,title)
information=[]
msg='사고 영상이 저장된 경로를 입력하세요\n(뒷 차량에서 촬영된 영상이어야 합니다)'
fieldname='G:/example/video/important.mp4'
information.append(easygui.enterbox(msg,title,fieldname)) #사고 영상 경로 입력받음
if information[0]=='' or information[0]==None:
easygui.msgbox("경로명을 입력하지 않으셨습니다. 프로그램이 종료됩니다. 다시 실행해주세요.")
return
msg='처리 시 필요한 파일들을 저장할 경로를 입력해주세요.'
fieldname='G:/example/images/important'
information[0]=[information[0],easygui.enterbox(msg,title,fieldname)]
if information[0][1]=='' or information[0][1]==None:
easygui.msgbox("경로명을 입력하지 않으셨습니다. 프로그램이 종료됩니다. 다시 실행해주세요.")
return
msg='당신의 차는 사고 당시 앞 차량이었나요? 아니면 뒷 차량이었나요?'
if easygui.boolbox(msg,title,["앞차", "뒷차"]): you='앞차' #사고 당시 위치 관계 입력받음
else: you='뒷차'
information.append(you)
checklist=['해당 사항 없음','음주 운전','무면허 운전', '졸음 운전', '과속 운전','(차선 변경 시) 방향지시등 미점등','운전 중 휴대폰 및 DMB 사용','초보운전 스티커 부착','합류되어 사라지는 도로 주행중','이유없는 급정거']
frontplus=0
rearplus=0
msg="앞 차량에 해당하는 사항이 있을 경우 선택해주세요."
checked=easygui.multchoicebox(msg,title,checklist) #앞 차량의 과실 사항 체크받음
if checked==None: return
if '이유없는 급정거' in checked: #이 경우 앞차의 과실비율 30% 추가
frontplus+=30
rearplus-=30
if '음주 운전' in checked or '무면허 운전' in checked or '졸음 운전' in checked: #이 경우 앞차 과실비율 20% 추가
frontplus+=20
rearplus-=20
if '과속 운전' in checked or '(차선 변경 시) 방향지시등 미점등' in checked or '운전 중 휴대폰 및 DMB 사용' in checked: #앞차 과실비율 10% 추가
frontplus+=10
rearplus-=10
if '초보운전 스티커 부착' in checked: #이 경우 상대방의 과실비율 10% 추가
frontplus-=10
rearplus+=10
information.append(checked)
msg="뒷 차량에 해당하는 사항이 있을 경우 선택해주세요."
checked=easygui.multchoicebox(msg,title,checklist[:-3]+['갓길 주행']) #뒷 차량의 과실 사항 체크받음
if checked==None: return
if '음주 운전' in checked or '무면허 운전' in checked or '졸음 운전' in checked:
rearplus+=20
frontplus-=20
if '과속 운전' in checked or '운전 중 휴대폰 및 DMB 사용' in checked:
rearplus+=10
frontplus-=10
if '초보운전 스티커 부착' in checked:
rearplus-=10
frontplus+=10
information.append(checked)
information+=[frontplus,rearplus]
return information #information=[영상_경로, 앞차인지_뒷차인지, 앞차_특징, 뒷차_특징, 앞차_추가_과중, 뒷차_추가_과중]
def judge(information,cs,direc): #cs(내 차량),direc(상대방 차량)=left or right or no
if '합류도로를 통해 합류 중' in information[2]:
return information+[501,70,30]
if '합류되어 사라지는 도로 주행중' in information[2]:
return information+[502,60,40]
if direc=='no' and '갓길 주행' in information[3]: #뒷차와 앞차의 차선이 같았고 갓길을 주행한 경우
return information+[506,0,100]
elif direc=='no':
return information+[507,0,100]
if cs=='no' and direc=='right':
return information+[503,80,20]
if cs=='no' and direc=='left':
return information+[504,70,30]
def show(information): #information=[영상_경로, 앞차인지_뒷차인지, 앞차_특징, 뒷차_특징, 앞차_추가_과중, 뒷차_추가_과중, 사건유형번호, 앞차_과실비율, 뒷차_과실비율]
front_fault=information[4]+information[7] #입력받은 앞, 뒷차의 특징을 바탕으로 최종 과실 비율 계산
rear_fault=information[5]+information[8]
if front_fault>=100:
front_fault=100
rear_fault=0
elif rear_fault>=100:
rear_fault=100
front_fault=0
description={501:['합류도로를 통해 진입중',
'주행로 주행',
'앞 차량은 본선도로의 주행을 방해해서는 안 될 의무가 있고, 뒷 차량은 진입하려는 자동차를 잘 살펴야 할 의무가 있습니다.'],
502:['합류되어 사라지는 차로 주행',
'합류가 예상되는 차로에서 후행',
'두 차량 모두 차로 감소를 예상하여 안전운전을 해야 할 의무가 있으나, 합류차인 앞 차량의 주의의무가 더 큽니다.'],
503:['주행로에서 추월로로 진로변경',
'추월로에서 직진',
'앞 차량이 추월선으로 진로를 변경할 때 뒷 차량의 움직임을 잘 살피지 못한 과실이 큽니다.'],
504:['추월로(또는 주행로)에서 주행로로 진로변경',
'주행로에서 직진',
'앞 차량의 경우 진로를 변경할 때 뒤에 따라오는 차량의 움직임을 잘 살피지 못한 과실이 큽니다.'],
505:['주행로에 정차',
'후행',
'일반도로와 달리 고속도로에서는 자동차의 주정차를 예상하기 어려우므로 과실 비율이 다음과 같습니다.'],
506:['갓길에 정차',
'갓길에서 후행',
'운전자는 자동차의 고장 등 부득이한 사유가 있는 경우를 제외하고는 정해진 차로에 따라 통행해야하며 갓길로 통행하여서는 안됩니다.'],
507:['주행',
'앞차보다 빠르게 주행',
'뒷 차량은 전방을 잘 살피지 못하였고 안전거리를 확보하지 않았기 때문에 일방적인 과실이 있습니다.']
} #사고 상황 별 설명을 담은 딕셔너리
checklist_percent={'음주 운전':'(+20%)',
'무면허 운전':'(+20%)',
'졸음 운전': '(+20%)',
'과속 운전':'(+10%)',
'운전 중 휴대폰 및 DMB 사용':'(+10%)',
'(차선 변경 시) 방향지시등 미점등':'(+10%)',
'초보운전 스티커 부착':'(-10%)',
'이유없는 급정거':'(+30%)'} #각 사항 별 추가 과실 비율을 담은 딕셔너리
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name) #원그래프에 한글 폰트 적용
x=['앞 차량', '뒷 차량'] #정의역
if information[1]=='앞차': x[0]+='(당신의 차량)'
else: x[1]+='(당신의 차량)'
y=[front_fault, rear_fault] #치역
plt.title('<즉석 과실비율 분석 결과>',size=15) #그래프 제목
wedges, texts, autotexts = plt.pie(y,labels=x,
autopct='%1d%%', pctdistance=0.85,
shadow=True, startangle=90)
for w in wedges: # 조각 설정
w.set_linewidth(1)
w.set_edgecolor('w')
for t in texts: # label 설정
t.set_color('k')
t.set_fontsize(12)
for a in autotexts: # 퍼센티지 설정
a.set_color('w')
a.set_fontsize(12)
plt.savefig("piegraph.png",dpi=300) #원그래프를 이미지로 저장
plt.show() #원그래프 보여줌
front_result_text, rear_result_text, explain = description[information[6]]
front_result_text=x[0]+': '+front_result_text+'('+str(information[7])+'%)'
rear_result_text=x[1]+': '+rear_result_text+'('+str(information[8])+'%)'
explain='총 과실 => '+str(front_fault)+':'+str(rear_fault)+' (사고 분류 유형 : '+str(information[6])+'번)'+'\n\n해설 : '+explain+'\n\n\n ** 반영비율이 같은 사항들은 하나만 과실비율에 반영됩니다.'
if front_fault>=50: front_result_text+='* 보험료 할증 대상!'
if rear_fault>=50: rear_result_text+='*보험료 할증 대상!'
for i in information[2]:
if i!='해당 사항 없음' and i!='합류되어 사라지는 도로 주행중':
front_result_text=front_result_text+'\n - '+i+checklist_percent[i] #앞 차량 설명에 과실 추가요소들을 추가함
for j in information[3]:
if j!='해당 사항 없음':
rear_result_text=rear_result_text+'\n - '+j+checklist_percent[j] #뒷 차량 설명에도 과실 추가요소들을 추가함
easygui.msgbox(front_result_text+'\n\n'+rear_result_text+'\n\n'+explain) #창 띄움
#################################################################################