前提・実現したいこと
顔認識して、モザイク処理をするアプリケーションを作っています。
現状CPUをつかって処理したいですが、GPUを使うことで高速化できないか検討しています。
発生している問題・エラーメッセージ
以下の通り、何かしらの設定が必要な状況です。
face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
TypeError: Expected Ptrcv::UMat for argument 'image'
該当のソースコード
face_cascade_path = '/home/ubuntu/opencv/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml' fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') writer = cv2.VideoWriter(after, fmt, frame_rate, size) ### Run with GPU img_gpu_src2 = cv2.cuda_GpuMat() img_gpu_dst2 = cv2.cuda_GpuMat() for i in range(frame_count): ret, frame = video.read() img_gpu_src2.upload(frame) gray = cv2.cuda.cvtColor(img_gpu_src2, cv2.COLOR_BGR2GRAY) face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30)) for (x, y, w, h) in face: ###モザイク処理 frame[y:y+h, x:x+w] = mosaic(frame[y:y+h, x:x+w], 0.01) img_gpu_dst2 = frame frame = img_gpu_dst2.download() writer.write(frame) # モザイク処理 def mosaic(img, alpha): w = img.shape[1] h = img.shape[0] ### Run with GPU img_gpu_src = cv2.cuda_GpuMat() img_gpu_dst = cv2.cuda_GpuMat() # 最近傍法で縮小→拡大することでモザイク加工、GPU処理 img_gpu_src.upload(img) img_gpu_dst = cv2.cuda.resize(img_gpu_src, (int(w*alpha), int(h*alpha))) img_gpu_dst = cv2.cuda.resize(img_gpu_dst, (w, h), interpolation=cv2.INTER_NEAREST) img = img_gpu_dst.download() return img
このあたり参考になるかも
https://stackoverflow.com/questions/61225139/cv2-cuda-cascadeclassifier-in-python
https://ja.stackoverflow.com/questions/43193/opencv%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%89%E7%89%A9%E4%BD%93%E8%AA%8D%E8%AD%98%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8Ccpu-opencl-cuda%E3%81%A7%E9%81%95%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86
参考情報ありがとうございます。
上記のパスに則りコード修正しました。
face_cascade_path = '/home/ubuntu/opencv/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml'
cascade = cv2.cuda_CascadeClassifier.create(face_cascade_path)
# 保存用
fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
writer = cv2.VideoWriter(after, fmt, frame_rate, size)
img_gpu_src2 = cv2.cuda_GpuMat()
img_gpu_dst2 = cv2.cuda_GpuMat()
for i in range(frame_count):
ret, frame = video.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cuda_GpuMat(gray)
face = cascade.detectMultiScale(gray2)
for (x, y, w, h) in face:
frame[y:y+h, x:x+w] = mosaic(frame[y:y+h, x:x+w], 0.01)
img_gpu_dst2 = face.download
writer.write(img_gpu_dst2)
以下のエラーになります。設定が足りていないでしょうか?
cascade = cv2.cuda_CascadeClassifier.create(face_cascade_path)
cv2.error: OpenCV(4.2.0) /home/ubuntu/opencv/modules/core/include/opencv2/core/private.cuda.hpp:115: error: (-213:The function/feature is not implemented) The called functionality is disabled for current build or platform in function 'throw_no_cuda'
> cv2.error: OpenCV(4.2.0)
私が紹介した一つ目のWebページに、「This is most likely due to the use of a version of openCV between 4.0.0 and 4.3.0, In those versions cuda_CascadeClassifier was disabled.」と書かれてます
ありがとうございます。構築をし直して再検証します。
回答1件
あなたの回答
tips
プレビュー