forked from ZYM-PKU/6Don-pen-track
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BasicDemo.py
260 lines (225 loc) · 10.3 KB
/
BasicDemo.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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# -- coding: utf-8 --
import sys
from tkinter import *
from tkinter.messagebox import *
import _tkinter
import tkinter.messagebox
import tkinter as tk
import sys, os
from tkinter import ttk
#指定工作目录
PATH = os.path.dirname(__file__)
os.chdir(PATH)
sys.path.append("MvImport")
from MvCameraControl_class import *
from CamOperation_class import *
from PIL import Image,ImageTk
#获取选取设备信息的索引,通过[]之间的字符去解析
def TxtWrapBy(start_str, end, all):
start = all.find(start_str)
if start >= 0:
start += len(start_str)
end = all.find(end, start)
if end >= 0:
return all[start:end].strip()
#将返回的错误码转换为十六进制显示
def ToHexStr(num):
chaDic = {10: 'a', 11: 'b', 12: 'c', 13: 'd', 14: 'e', 15: 'f'}
hexStr = ""
if num < 0:
num = num + 2**32
while num >= 16:
digit = num % 16
hexStr = chaDic.get(digit, str(digit)) + hexStr
num //= 16
hexStr = chaDic.get(num, str(num)) + hexStr
return hexStr
if __name__ == "__main__":
global deviceList
deviceList = MV_CC_DEVICE_INFO_LIST()
global tlayerType
tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
global cam
cam = MvCamera()
global nSelCamIndex
nSelCamIndex = 0
global obj_cam_operation
obj_cam_operation = 0
global b_is_run
b_is_run = False
#界面设计代码
window = tk.Tk()
window.title('BasicDemo')
window.geometry('1150x650')
model_val = tk.StringVar()
global triggercheck_val
triggercheck_val = tk.IntVar()
page = Frame(window,height=400,width=60,relief=GROOVE,bd=5,borderwidth=4)
page.pack(expand=True, fill=BOTH)
panel = Label(page)
panel.place(x=190, y=10,height=600,width=1000)
#绑定下拉列表至设备信息索引
def xFunc(event):
global nSelCamIndex
nSelCamIndex = TxtWrapBy("[","]",device_list.get())
#ch:枚举相机 | en:enum devices
def enum_devices():
global deviceList
global obj_cam_operation
deviceList = MV_CC_DEVICE_INFO_LIST()
tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
if ret != 0:
tkinter.messagebox.showerror('show error','enum devices fail! ret = '+ ToHexStr(ret))
if deviceList.nDeviceNum == 0:
tkinter.messagebox.showinfo('show info','find no device!')
print ("Find %d devices!" % deviceList.nDeviceNum)
devList = []
for i in range(0, deviceList.nDeviceNum):
mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
if mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE:
print ("\ngige device: [%d]" % i)
chUserDefinedName = ""
for per in mvcc_dev_info.SpecialInfo.stGigEInfo.chUserDefinedName:
if 0 == per:
break
chUserDefinedName = chUserDefinedName + chr(per)
print ("device model name: %s" % chUserDefinedName)
nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)
nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
print ("current ip: %d.%d.%d.%d\n" % (nip1, nip2, nip3, nip4))
devList.append("["+str(i)+"]GigE: "+ chUserDefinedName +"("+ str(nip1)+"."+str(nip2)+"."+str(nip3)+"."+str(nip4) +")")
elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:
print ("\nu3v device: [%d]" % i)
chUserDefinedName = ""
for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chUserDefinedName:
if per == 0:
break
chUserDefinedName = chUserDefinedName + chr(per)
print ("device model name: %s" % chUserDefinedName)
strSerialNumber = ""
for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber:
if per == 0:
break
strSerialNumber = strSerialNumber + chr(per)
print ("user serial number: %s" % strSerialNumber)
devList.append("["+str(i)+"]USB: "+ chUserDefinedName +"(" + str(strSerialNumber) + ")")
device_list["value"] = devList
device_list.current(0)
#ch:打开相机 | en:open device
def open_device():
global deviceList
global nSelCamIndex
global obj_cam_operation
global b_is_run
if True == b_is_run:
tkinter.messagebox.showinfo('show info','Camera is Running!')
return
obj_cam_operation = CameraOperation(cam,deviceList,nSelCamIndex)
ret = obj_cam_operation.Open_device()
if 0!= ret:
b_is_run = False
else:
model_val.set('continuous')
b_is_run = True
# ch:开始取流 | en:Start grab image
def start_grabbing():
global obj_cam_operation
obj_cam_operation.Start_grabbing(window,panel)
# ch:停止取流 | en:Stop grab image
def stop_grabbing():
global obj_cam_operation
obj_cam_operation.Stop_grabbing()
# ch:关闭设备 | Close device
def close_device():
global b_is_run
global obj_cam_operation
obj_cam_operation.Close_device()
b_is_run = False
#清除文本框的数值
text_frame_rate.delete(1.0, tk.END)
text_exposure_time.delete(1.0, tk.END)
text_gain.delete(1.0, tk.END)
#ch:设置触发模式 | en:set trigger mode
def set_triggermode():
global obj_cam_operation
strMode = model_val.get()
obj_cam_operation.Set_trigger_mode(strMode)
#ch:设置触发命令 | en:set trigger software
def trigger_once():
global triggercheck_val
global obj_cam_operation
nCommand = triggercheck_val.get()
obj_cam_operation.Trigger_once(nCommand)
#ch:保存bmp图片 | en:save bmp image
def bmp_save():
global obj_cam_operation
obj_cam_operation.b_save_bmp = True
#ch:保存jpg图片 | en:save jpg image
def jpg_save():
global obj_cam_operation
obj_cam_operation.b_save_jpg = True
def get_parameter():
global obj_cam_operation
obj_cam_operation.Get_parameter()
text_frame_rate.delete(1.0, tk.END)
text_frame_rate.insert(1.0,obj_cam_operation.frame_rate)
text_exposure_time.delete(1.0, tk.END)
text_exposure_time.insert(1.0,obj_cam_operation.exposure_time)
text_gain.delete(1.0, tk.END)
text_gain.insert(1.0, obj_cam_operation.gain)
def set_parameter():
global obj_cam_operation
obj_cam_operation.exposure_time = text_exposure_time.get(1.0,tk.END)
obj_cam_operation.exposure_time = obj_cam_operation.exposure_time.rstrip("\n")
obj_cam_operation.gain = text_gain.get(1.0,tk.END)
obj_cam_operation.gain = obj_cam_operation.gain.rstrip("\n")
obj_cam_operation.frame_rate = text_frame_rate.get(1.0,tk.END)
obj_cam_operation.frame_rate = obj_cam_operation.frame_rate.rstrip("\n")
obj_cam_operation.Set_parameter(obj_cam_operation.frame_rate,obj_cam_operation.exposure_time,obj_cam_operation.gain)
xVariable = tkinter.StringVar()
device_list = ttk.Combobox(window, textvariable=xVariable,width=30)
device_list.place(x=20, y=20)
device_list.bind("<<ComboboxSelected>>", xFunc)
label_exposure_time = tk.Label(window, text='Exposure Time',width=15, height=1)
label_exposure_time.place(x=20, y=350)
text_exposure_time = tk.Text(window,width=15, height=1)
text_exposure_time.place(x=160, y=350)
label_gain = tk.Label(window, text='Gain', width=15, height=1)
label_gain.place(x=20, y=400)
text_gain = tk.Text(window,width=15, height=1)
text_gain.place(x=160, y=400)
label_frame_rate = tk.Label(window, text='Frame Rate', width=15, height=1)
label_frame_rate.place(x=20, y=450)
text_frame_rate = tk.Text(window,width=15, height=1)
text_frame_rate.place(x=160, y=450)
btn_enum_devices = tk.Button(window, text='Enum Devices', width=35, height=1, command = enum_devices )
btn_enum_devices.place(x=20, y=50)
btn_open_device = tk.Button(window, text='Open Device', width=15, height=1, command = open_device)
btn_open_device.place(x=20, y=100)
btn_close_device = tk.Button(window, text='Close Device', width=15, height=1, command = close_device)
btn_close_device.place(x=160, y=100)
radio_continuous = tk.Radiobutton(window, text='Continuous',variable=model_val, value='continuous',width=15, height=1,command=set_triggermode)
radio_continuous.place(x=20,y=150)
radio_trigger = tk.Radiobutton(window, text='Trigger Mode',variable=model_val, value='triggermode',width=15, height=1,command=set_triggermode)
radio_trigger.place(x=160,y=150)
model_val.set(1)
btn_start_grabbing = tk.Button(window, text='Start Grabbing', width=15, height=1, command = start_grabbing )
btn_start_grabbing.place(x=20, y=200)
btn_stop_grabbing = tk.Button(window, text='Stop Grabbing', width=15, height=1, command = stop_grabbing)
btn_stop_grabbing.place(x=160, y=200)
checkbtn_trigger_software = tk.Checkbutton(window, text='Tigger by Software', variable=triggercheck_val, onvalue=1, offvalue=0)
checkbtn_trigger_software.place(x=20,y=250)
btn_trigger_once = tk.Button(window, text='Trigger Once', width=15, height=1, command = trigger_once)
btn_trigger_once.place(x=160, y=250)
btn_save_bmp = tk.Button(window, text='Save as BMP', width=15, height=1, command = bmp_save )
btn_save_bmp.place(x=20, y=300)
btn_save_jpg = tk.Button(window, text='Save as JPG', width=15, height=1, command = jpg_save)
btn_save_jpg.place(x=160, y=300)
btn_get_parameter = tk.Button(window, text='Get Parameter', width=15, height=1, command = get_parameter)
btn_get_parameter.place(x=20, y=500)
btn_set_parameter = tk.Button(window, text='Set Parameter', width=15, height=1, command = set_parameter)
btn_set_parameter.place(x=160, y=500)
window.mainloop()