貴殿が提示したコードが何かを参考にされたものであれば、参考とされたページもご提示されるとよろしいかと。
ちなみに、キー入力待ちとGUIは相性がよろしくないです。まずはカメラ制御を考えず、tkinterでOpenCVを利用したカメラ映像を表示することをお考えになるとよろしいかと。
前提・実現したいこと
カメラをキャプチャしながら、カメラの制御コマンドをGUI上に入力し、
送受信するソフトを作成しようと考えております。
プログラム初心者が見よう見まねで作成してみましたが、
案の定上手くいきませんでした。
GUIの表示とカメラ画像の同時表示及び制御はどのように行えば良いでしょうか。
参考になるか疑問ですが、ソースコードも記載しておきます。
該当のソースコード
python
1import cv2 2import serial 3import serial.tools.list_ports 4import tkinter 5 6class Serial_Control(tkinter.Frame): 7 def __init__(self, master=None): 8 super().__init__(master) 9 self.pack() 10 self.create_widgets() 11 12 def create_widgets(self): 13 self.static1 = tkinter.Label(text=u'送信コマンド') 14 self.static1.place(x=10, y=10) 15 self.EditBox1 = tkinter.Entry(width=50) 16 self.EditBox1.place(x=10, y=30) 17 self.static2 = tkinter.Label(text=u'受信コマンド') 18 self.static2.place(x=10, y=50) 19 self.EditBox2 = tkinter.Entry(width=50) 20 self.EditBox2.place(x=10, y=70) 21 #↓ここで受信コマンドを表示したい。 22 self.EditBox2.insert(tkinter.END, self.rcv_cmd) 23 self.button = tkinter.Button(text="送信",command=self.send) 24 self.button.place(x=10,y=100) 25 26 def send(self): 27 self.snd_cmd = self.EditBox1.get() 28 self.rcv_cmd =self.uart_write_read(self.snd_cmd, 20) 29 30 '''有効なCOMポートを自動的に探して返す''' 31 def search_com_port(self): 32 coms = serial.tools.list_ports.comports() 33 comlist = [] 34 for com in coms: 35 comlist.append(com.device) 36 self.use_port = comlist[0] 37 print('Use COM port: ' + self.use_port) 38 return self.use_port 39 40 '''シリアル通信でデータの送受信を行う''' 41 def uart_write_read(self,w_data, r_size): 42 # Write 43 ser.write(w_data) 44 # Read 45 self.r_data = ser.read_until(size=r_size) #size分Read 46 return self.r_data 47 48#GUI表示 49root = tkinter.Tk() 50root.title("Camera Control") 51root.geometry("400x200") 52app = Serial_Control(master=root) 53 54#接続 55use_port = app.search_com_port() 56ser = serial.Serial(use_port,9600,timeout=10) 57cap = cv2.VideoCapture(0) 58 59while True: 60 ret, frame = cap.read() 61 frame = cv2.resize(frame, (int(frame.shape[1] / 2), int(frame.shape[0] / 2))) 62 cv2.imshow('xxx', frame) 63 app.MainLoop() 64 print(str(frame.text)) 65 66 # キー入力を1ms待って、k が27(ESC)だったらBreakする 67 k = cv2.waitKey(1) 68 if k == 27: 69 break 70 71cap.release() 72cv2.destroyAllWindows() 73ser.close()
あなたの回答
tips
プレビュー