kiyopon2200
@kiyopon2200

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

USBカメラopencv systemd 自動起動で失敗します

解決したいこと

USBカメラを用いて特定の画像を認識すると、ネオピクセルLEDに指定した図形が表示するプログラム(face_led0910.py)を作りました。認識のためカスケード分類器でxmlファイルを作り、特定の画像を認識することができました。LXターミナル上では意図した動きになりましたが、systemdの自動起動で失敗でします。プログラムはネオピクセルが仮想環境のもとしか動かないため、仮想環境のものでで動かしています。ラズベリーパイは初心者です。ご教示いただけると大変助かります。どうぞよろしくおねがいします。

自動起動のためにsystemd unitファイルを作りました


systemd unitファイルを作り、sudo systemctl enableでサービスを有効化
↓
sudo systemctl startでサービスをスタート
↓
sudo systemctl statusで動作確認を行うと以下のエラーが表示されます。

発生している問題・エラー

× face_0910.service - face_led0910
     Loaded: loaded (/lib/systemd/system/face_0910.service; enabled; preset: enabled)
     Active: failed (Result: signal) since Sun 2024-10-06 19:14:41 JST; 7s ago
   Duration: 1.847s
    Process: 5931 ExecStart=/home/kiyohara/env/bin/python3 /home/kiyohara/env/bin/face_led0910.py (code=killed, signal=ABRT)
   Main PID: 5931 (code=killed, signal=ABRT)
        CPU: 941ms

10月 06 19:14:40 raspberrypi systemd[1]: Started face_0910.service - face_led0910.
10月 06 19:14:41 raspberrypi python3[5931]: qt.qpa.xcb: could not connect to display
10月 06 19:14:41 raspberrypi python3[5931]: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/kiyohara/env/lib/python3.11/site-packages/cv2/qt/>
10月 06 19:14:41 raspberrypi python3[5931]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may >
10月 06 19:14:41 raspberrypi python3[5931]: Available platform plugins are: xcb.
10月 06 19:14:41 raspberrypi systemd[1]: face_0910.service: Main process exited, code=killed, status=6/ABRT
10月 06 19:14:41 raspberrypi systemd[1]: face_0910.service: Failed with result 'signal'.

python3のプログラム


import time
import board
import neopixel
import cv2
import numpy as np
import RPi.GPIO as GPIO
import os

print('basename:    ', os.path.basename(__file__))
print('dirname:     ', os.path.dirname(__file__))


GPIO.setmode(GPIO.BCM)
GPIO.setup(12,GPIO.OUT)
GPIO.setup(18,GPIO.OUT)
GPIO.setup(23,GPIO.OUT)
GPIO.setup(24,GPIO.OUT)
GPIO.output(12,GPIO.LOW)
GPIO.output(18,GPIO.HIGH)
GPIO.output(23,GPIO.LOW)
GPIO.output(24,GPIO.LOW)


pixel_pin = board.D18
num_pixels = 64
ORDER = neopixel.GRB

pixels = neopixel.NeoPixel(pixel_pin,num_pixels,brightness=0.01, auto_write=False, pixel_order=ORDER)
pixels.fill((0, 0, 0))
pixels.show()

capture = cv2.VideoCapture(0)

face_cascade = cv2.CascadeClassifier('/home/kiyohara/env/bin/data/haarcascade_ok.xml')

while True:
        ret,img = capture.read()
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

        faces = face_cascade.detectMultiScale(gray,1.1,5)
        for (x,y,w,h) in faces:

            cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

            xkao = int(x+w/2)
                      
            if xkao > 200 and xkao > 400:
                       GPIO.output(18,GPIO.HIGH)
                       GPIO.output(23,GPIO.HIGH)
                       GPIO.output(24,GPIO.LOW)
                       time.sleep(1)
                       pixels[0] = (0,0,0)  
                       pixels[1] = (0,0,0)
                       pixels[2] = (0,0,0)
                       pixels[3] = (0,255,0)
                       pixels[4] = (0,255,0)
                       pixels[5] = (0,0,0)
                       pixels[6] = (0,0,0)
                       pixels[7] = (0,0,0)
                       以下省略

pip3 list

pip3 list
Package Version

Adafruit-Blinka 8.47.0
adafruit-circuitpython-busdevice 5.2.9
adafruit-circuitpython-connectionmanager 3.1.1
adafruit-circuitpython-neopixel 6.3.11
adafruit-circuitpython-pixelbuf 2.0.5
adafruit-circuitpython-requests 4.1.6
adafruit-circuitpython-typing 1.11.0
Adafruit-PlatformDetect 3.74.0
Adafruit-PureIO 1.1.11
binho-host-adapter 0.1.6
numpy 2.1.2
opencv-python 4.10.0.84
pip 23.0.1
pyftdi 0.55.4
pyserial 3.5
pyusb 1.2.1
RPi.GPIO 0.7.1
rpi_ws281x 5.0.0
setuptools 66.1.1
sysv_ipc 1.1.0
typing_extensions 4.12.2

自分で試したこと

opencvの再アンインストール
カスケード分類器の保存場所の確認

0

3Answer

原因は以下に表示されているのでは?

10月 06 19:14:41 raspberrypi python3[5931]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application .may >
10月 06 19:14:41 raspberrypi python3[5931]: Available platform plugins are: xcb.

0Like

Comments

  1. @kiyopon2200

    Questioner

    jinnbei230525さん
    メッセージありがとうございます
    そうなんです。プラグインの入れ方、具体的なコマンドがわかれば解決できると思うのですが、私の知識不足でどうすればいいかわからずに解決できません。

  2. エラー文を検索してみましたか? してないなら、まずはそうしてみましょう。

  3. @kiyopon2200

    Questioner

    jinnbei230525さん
    ありがとうございます。やってみます!!

Raspberryをよくわかってないながら書いています。
QTは画面などだと思うので環境ごとにバイナリやコードが違うのではないかと思います。
下の記事を参考にQTをセットアップするか、opencvのプラグインをセットアップしてみてはいかがでしょうか
https://qiita.com/AlohaYos/items/0149b6fd5c06cc6cf732
あとはこのあたりとか。
https://github.com/manfredipist/RPi3BPlusQtOpenCV

0Like

Comments

  1. @kiyopon2200

    Questioner

    calcMCalcmさん
    解説ありがとうございます。
    リンク先まで付けていただき感謝です。
    本日、トライしてみます!

jinnbei230525さん、calcMCalcmさん

おかげさまで、エラーメッセージの「Qt platform plugin could be initialized」からopencvのプラグインを再セットアップを行うことで
当初のエラーが解決しました。

しかしながら、以下の新しくCV2のエラーが発生しました。
どのように解決すればよいかアドバイスをお願いいたします

File "/home/kiyohara/env/bin/face_led0910.py", line 41, in
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

cv2.error: OpenCV(4.10.0) /io/opencv/modules/imgproc/src/color.cpp:196: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

0Like

Comments

  1. @kiyopon2200

    Questioner

    calcMCalcmさん

    いつもアドバイスありがとうございます。
    初歩的な質問で申し訳ございません。

    パスを指定してみます!本当にありがとうございます。

Your answer might help someone💌