前提・実現したいこと
logicool C500 USBカメラを使用し、QRの検知、OR情報を使用し、ラジコンを自動制御する
発生している問題・エラーメッセージ
エラーがでてしまい、動作しません。
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.7/tkinter/init.py", line 1705, in call
return self.func(*args)
File "/home/pi/sample/ET/line trace2.py", line 142, in btn_click1
linetra()
File "/home/pi/sample/ET/line trace2.py", line 120, in linetra
x=kamera()
File "/home/pi/sample/ET/line trace2.py", line 39, in kamera
qrdata = detector.detectAndDecode(frame)
cv2.error: OpenCV(4.0.1) /home/pi/opencv-4.0.1/modules/objdetect/src/qrcode.cpp:1098:
error: (-215:Assertion failed) !inarr.empty() in function 'detectAndDecode'
該当のソースコード
pythonです。
import sys
import tkinter
import tkinter as tk
import tkinter.ttk as ttk
import time
import RPi.GPIO as GPIO # PythonのGPIO制御用のパッケージ
import cv2
GPIO.setmode(GPIO.BOARD) #ピン番号で指定する
GPIO.setup(31, GPIO.OUT) #TRF CW
GPIO.setup(33, GPIO.OUT) #TRF CCW
GPIO.setup(35, GPIO.OUT) #TLF CW
GPIO.setup(37, GPIO.OUT) #TLF CCW
GPIO.setup(32, GPIO.OUT) #TRB CW
GPIO.setup(36, GPIO.OUT) #TRB CCW
GPIO.setup(38, GPIO.OUT) #TLB CW
GPIO.setup(40, GPIO.OUT) #TLB CCW
GPIO.setup(12, GPIO.IN,pull_up_down=GPIO.PUD_DOWN) #ライントレースR
GPIO.setup(16, GPIO.IN,pull_up_down=GPIO.PUD_DOWN) #ライントレースM
GPIO.setup(18, GPIO.IN,pull_up_down=GPIO.PUD_DOWN) #ライントレースL
cap = cv2.VideoCapture(0)
QRCodeDetectorを生成
detector = cv2.QRCodeDetector()
root = tkinter.Tk()
root.title("ラジコン")
root.geometry("300x300")
root.configure(bg='sky blue')
def kamera():
#カメラから1フレーム読み取り
ret, frame = cap.read()
time.sleep(0.1)
# QRコードを認識
qrdata = detector.detectAndDecode(frame) #if qrdata[0] != "": # print(qrdata[0]) time.sleep(0.1) # ウィンドウ表示 cv2.imshow('frame', frame) return qrdata[0]
def zenshin():
GPIO.output(31, 1)
GPIO.output(33, 0)
GPIO.output(35, 1)
GPIO.output(37, 0)
GPIO.output(32, 1)
GPIO.output(36, 0)
GPIO.output(38, 1)
GPIO.output(40, 0)
time.sleep(0.1)
GPIO.output(31, 1) GPIO.output(33, 1) GPIO.output(35, 1) GPIO.output(37, 1) GPIO.output(32, 1) GPIO.output(36, 1) GPIO.output(38, 1) GPIO.output(40, 1) time.sleep(0.3)
def migi():
GPIO.output(31, 0)
GPIO.output(33, 1)
GPIO.output(35, 1)
GPIO.output(37, 0)
GPIO.output(32, 0)
GPIO.output(36, 1)
GPIO.output(38, 1)
GPIO.output(40, 0)
time.sleep(0.1)
GPIO.output(31, 1) GPIO.output(33, 1) GPIO.output(35, 1) GPIO.output(37, 1) GPIO.output(32, 1) GPIO.output(36, 1) GPIO.output(38, 1) GPIO.output(40, 1) time.sleep(0.3)
def hidari():
GPIO.output(31, 1)
GPIO.output(33, 0)
GPIO.output(35, 0)
GPIO.output(37, 1)
GPIO.output(32, 1)
GPIO.output(36, 0)
GPIO.output(38, 0)
GPIO.output(40, 1)
time.sleep(0.1)
GPIO.output(31, 1) GPIO.output(33, 1) GPIO.output(35, 1) GPIO.output(37, 1) GPIO.output(32, 1) GPIO.output(36, 1) GPIO.output(38, 1) GPIO.output(40, 1) time.sleep(0.3)
def linetra():
while True:
if GPIO.input(12)==1 and GPIO.input(18)==1:
zenshin()
elif GPIO.input(12)==0:
hidari()
elif GPIO.input(18)==0:
migi()
x=kamera()
print(x)
if(x=='1'):
break
def turnL():
while True:
if GPIO.input(12)==1 and GPIO.input(18)==1:
zenshin()
elif GPIO.input(12)==0:
hidari()
elif GPIO.input(18)==0:
migi()
if GPIO.input(12)==0 and GPIO.input(18)==0:
break
while GPIO.input(12)==1 and GPIO.input(18)==1:
hidari()
def btn_click1(): #動作スタートボタン
#qrm='1'
linetra()
turnL()
#qrm='1'
linetra()
btn1 = tkinter.Button(root,text='start',command=btn_click1,bg='snow')
btn1.place(x=130, y=1)
root.mainloop()
試したこと
カメラの関数を単体で動かした場合、動くことは確認しております。
補足情報(FW/ツールのバージョンなど)
あなたの回答
tips
プレビュー