質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1617閲覧

GPU版OpenCVでの顔認識でtypeerror: expected ptr<cv::umat> for argument 'image'が解決できない

west1220

総合スコア3

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/12/19 02:49

前提・実現したいこと

OpenCVによるカスケード分類器を用いた顔認識(detectmultiscale)をGPUを用いて
高速化させたいです。(CUDAを使用、OpenCVはGPUが使用できるもの(4.5.0)を導入済)
※ソースコードでは全身などの検出も記述していますが、まずは顔認識を成功させたいです。

発生している問題・エラーメッセージ

後述のソースコードにあるfaces = face_cascade.detectMultiScale(frame_gray, 1.11, 3)
の行で以下のtypeerrorが出現します。
(原因はcuda_GpuMat型のframe_grayがdetectmultiscaleの引数としてNG?なのかと
推察していますが、具体的な改善方法がわからず…といった形で悩んでいます。)

typeerror: expected ptr<cv::umat> for argument 'image'

該当のソースコード

python3.6

1import cv2 2import threading 3import numpy as np 4 5#全身のみHOG特徴で検出 6global hog 7hog = cv2.HOGDescriptor() 8hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) 9 10face_cascade = cv2.cuda_CascadeClassifier.create('haarcascade_frontalface_alt2.xml') 11upperbody_cascade = cv2.cuda_CascadeClassifier.create('haarcascade_upperbody.xml') 12lowerbody_cascade = cv2.cuda_CascadeClassifier.create('haarcascade_lowerbody.xml') 13 14#顔検出用スレッド 15def face_rectangle(img, img_gray, faces): 16 for x, y, w, h in faces: 17 cv2.cuda.rectangle(img, (x,y), (x+w, y+h), (0, 0, 255), 2) 18 face = img[y:y+h, x:x+w] 19 face_gray = img_gray[y:y+h, x:x+w] 20 21#全身検出用スレッド 22def fullbody_rectangle(img, fullbodys): 23 for x, y, w, h in fullbodys: 24 cv2.cuda.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2) 25 26#上半身検出用スレッド 27def upperbody_rectangle(img, img_gray, upperbodys): 28 for x, y, w, h in upperbodys: 29 cv2.cuda.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2) 30 upperbody = img[y:y+h, x:x+w] 31 upperbody_gray = img_gray[y:y+h, x:x+w] 32 33#下半身検出用スレッド 34def lowerbody_rectangle(img, img_gray, lowerbodys): 35 for x, y, w, h in lowerbodys: 36 cv2.cuda.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2) 37 lowerbody = img[y:y+h, x:x+w] 38 lowerbody_gray = img_gray[y:y+h, x:x+w] 39 40#カメラキャプチャON 41cap = cv2.VideoCapture(0) 42 43if __name__ == '__main__': 44 while(cap.isOpened()): 45 #画像の設定 46 ret, frame = cap.read() 47 gpu_frame = cv2.cuda_GpuMat(frame) 48 frame_gray = cv2.cuda_GpuMat() 49 gpu_frame.upload(frame) 50 frame_gray = cv2.cuda.cvtColor(gpu_frame, cv2.COLOR_BGR2GRAY) 51 52 #検出パラメータ設定 53 faces = face_cascade.detectMultiScale(frame_gray, 1.11, 3) 54 fullbodys, features = hog.detectMultiScale(gpu_frame, winStride = (8, 8), padding = (32, 32), scale = 1.05) 55 upperbodys = upperbody_cascade.detectMultiScale(frame_gray, 1.05, 2) 56 lowerbodys = lowerbody_cascade.detectMultiScale(frame_gray, 1.05, 2) 57 58 #検出&矩形描画スレッド起動(マルチスレッド) 59 t1 = threading.Thread(target = face_rectangle, args = (gpu_frame, frame_gray, faces)) 60 t2 = threading.Thread(target = fullbody_rectangle, args = (gpu_frame, fullbodys)) 61 t3 = threading.Thread(target = upperbody_rectangle, args = (gpu_frame, frame_gray, upperbodys)) 62 t4 = threading.Thread(target = lowerbody_rectangle, args = (gpu_frame, frame_gray, lowerbodys)) 63 t1.start() 64 t2.start() 65 t3.start() 66 t4.start() 67 68 #画像の表示 69 cv2.imshow('detect', gpu_frame) 70 71 key = cv2.waitKey(1) 72 if key > 0 or cv2.getWindowProperty('detect', cv2.WND_PROP_VISIBLE) < 1: 73 break 74 75cap.release() 76cv2.destroyAllWindows() 77

試したこと

frame_gray = cv2.cuda.cvtColor(gpu_frame, cv2.COLOR_BGR2GRAY)
の箇所について、他のサイトであったように、
①gpu_frameをnp.float32(gpu_frame)にする。
➁gpu_frameをcv2.UMat(gpu_frame)にする。
などを試しました。

しかし、
①TypeError: float() argument must be a string or a number, not 'image'
➁UMat() missing required argument 'ranges' (pos 2)
という、別のエラーが出て解決に至りませんでした。

補足情報(FW/ツールのバージョンなど)

ハード:JetsonNano 4GBモデル
言語:Python3.6.9
画像処理ライブラリ:OpenCV4.5×CUDA
カメラ:logicoolC270n

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問