@WADADA

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!

Jetson Nanoでlinux環境のもとOpenCVを使ってPythonで顔認識をする方法について教えてください。

解決したいこと

現在、Jetson Nanoにwebカメラを接続してリアルタイムで顔認識をすることを目標としています。OSはLinuxです。顔認識にはOpenCVを利用してPythonでコードを記述し、プログラムをターミナル上で実行して顔認識を行いたいのですがうまくいかなかったため、ご教授いただけたらと思います。以下が実行したコードとなります。

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

line6 command =
              ^
SyntaxError: invalid syntax

該当するソースコード

# coding: utf-8
import subprocess
import cv2

# GStreamerコマンド
command = (
    "gst-launch-1.0 nvarguscamerasrc ! "
    "video/x-raw(memory:NVMM),width=1280,height=720,framerate=60/90,format=NV12 ! "
    "nvvidconv ! video/x-raw,width=640,height=480 ! "
    "nvvidconv ! nvegltransform ! nveglglessink -e"
)

# カメラ起動
camera_process = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE)

# OpenCVを使用してカメラからの映像をキャプチャ
cap = cv2.VideoCapture("nvcamerasrc ! video/x-raw(memory:NVMM),width=640,height=480,format=NV12,framerate=30/1 ! nvvidconv flip-method=0 ! video/x-raw,width=640,height=480,format=BGRx ! videoconvert ! video/x-raw,format=BGR ! appsink", cv2.CAP_GSTREAMER)

# 顔認識のためのHaarcascades分類器をロード
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

while True:
    ret, frame = cap.read()  # フレームをキャプチャ

    if not ret:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # グレースケールに変換
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))  # 顔を検出

    # 検出された顔に矩形を描画
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

    # 画面に表示
    cv2.imshow('Face Detection', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):  # 'q'キーでループを抜ける
        break

# 終了処理
cap.release()
cv2.destroyAllWindows()
camera_process.kill()  # GStreamerプロセスを終了

プログラムについて

構想としては、webカメラを起動するコマンド(6行目辺りからのcommandの中身)をsubprocessを利用して実行後、OpenCVを使用してカメラからの映像をキャプチャして顔認識を行う流れを予定していたのですが、ターミナルで実行後、6行目のcommand = の部分に構文エラーがあるとエラーメッセージが出てしまいました。

そこで教えていただきたいのは、

  1. 6行目の構文エラーの解決方法と、GStreamerの使い方はこれで合っているのか
  2. このプログラムでリアルタイムの顔認識は実現できるか
  3. 1,2に問題がないにもかかわらず実行できない場合、どのような問題が考えられるか、またその対処法
  4. 上記のコード以外でリアルタイムの顔認識を行う手順

について教えてください。

python初心者ですので、できるだけかみ砕いた説明をよろしくお願いいたします。
つたない文章申し訳ありません。どうぞよろしくお願いいたします。

0 likes

2Answer

subprocess.Popenの第一引数は、コマンドラインを示す文字列の配列のようですから、

command = (
    " ・・・ "
    " ・・・ "
)

command = [
    " ・・・ ",
    " ・・・ ",
]

にするのかと思います。

なお、!が何度か出てきますが、コマンドラインとして正しいのでしょうか?
事前に(ターミナルに打ち込むなどして)確認された方がよいと思います。

0Like

Your answer might help someone💌