# Simple Camera test -2024.1.18- import sys import tkinter as tk import cv2 import Adafruit_PCA9685 from tkinter import messagebox from PIL import Image, ImageTk # camera read wait time DELAY = 100 # PCA9685 initialize pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(60) # servo adjastment adjX = -10 adjY = 30 # system end def kill(): root.destroy() sys.exit() # system end select def sys_end(): ret = messagebox.askyesno('確認', '処理を中断してシステムを終了しますか?') if ret: kill() # x-turn servo def sbarX(sclX): angleX = int(sclX) labelX.config(text='角度 = %d' % angleX) pulseX = 0 - int(angleX * 125 / 45) + 400 - adjX # print('X=' + str(pulseX)) pwm.set_pwm(0, 0, pulseX) # y-turn servo def sbarY(sclY): angleY = int(sclY) labelY.config(text='角度 = %d' % angleY) pulseY = 0 - int(angleY * 83 / 30) + 400 - adjY # print('Y=' + str(pulseY)) pwm.set_pwm(1, 0, pulseY) # camera preview def camera_job(): global videoOut check, frame = camera.read() frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img_rotate_180 = cv2.rotate(frame, cv2.ROTATE_180) pil_image = Image.fromarray(img_rotate_180) # pil_image = Image.fromarray(frame) videoOut = ImageTk.PhotoImage(image=pil_image) canvas.create_image(0, 20, image=videoOut, anchor='nw', tag='vc') root.after(DELAY, camera_job) # create control panel def control_panel(): close_btn = tk.Button(root, text='システム終了') close_btn.place(x=550, y=530) close_btn.configure(command=sys_end) camera_job() # servo position reset def servo_reset(): valX.set(0) sbarX(0) valY.set(0) sbarY(0) camera = cv2.VideoCapture(0) root = tk.Tk() root.geometry('680x600+100+50') root.title('CAMERA') canvas = tk.Canvas(root, width=640, height=700) canvas.pack() control_panel() valX = tk.IntVar() angleX = 0 valX.set(angleX) valY = tk.IntVar() angleY = 0 valY.set(angleY) labelX = tk.Label(root, text='角度 = %d' % valX.get()) labelX.place(x=75, y=560) labelY = tk.Label(root, text='角度 = %d' % valY.get()) labelY.place(x=200, y=560) resetBtn = tk.Button(root, text='RESET') resetBtn.place(x=300, y=533) resetBtn.configure(command=servo_reset) # servo position initialize (center=400) count:150-650 sbarX(angleX) sbarY(angleY) sldX = tk.Scale(root, label=' 水平方向回転', orient='h', from_=-45, to=45, showvalue=False, variable=valX, command=sbarX) sldX.place(x=50, y=520) sldY = tk.Scale(root, label=' 垂直方向回転', orient='h', from_=-30, to=30, showvalue=False, variable=valY, command=sbarY) sldY.place(x=175, y=520) root.mainloop()