cv2.cuda_CascadeClassifier 在 python

cv2.cuda_CascadeClassifier in python

我正在尝试使用来自 opencv cuda 的 Haar 分类器,为此我找到了对象 cv.cuda_CascadeClassifier。但是,将 cv.cuda_CascadeClassifier() 分配给变量会出现以下错误:

this object has no ''load'' attribute. I could successfully verify it by printing their dir() print(dir(cv.cuda_CascadeClassifier)).

是否有任何其他方法可以调用此对象,或者是否有人使用 opencv cuda 有效地利用了级联分类器?

感谢

这很可能是由于使用了 4.0.0 和 4.3.0 之间的 openCV 版本,在这些版本中 cuda_CascadeClassifier 被禁用。在 4.4.0 中,此功能被恢复。 (https://github.com/opencv/opencv_contrib/pull/2554/files)

尽管这在 C++ 中似乎工作正常,但使用 python 包装器使用以下代码给我一个分段错误:

classifier_cuda = cv2.cuda_CascadeClassifier('cascades_file.xml')
while True:
    success, frame = vidcap.read()
    cuFrame = cv2.cuda_GpuMat(frame)
    result = classifier_cuda.detectMultiScale(cuFrame)
    print (result) 

有什么解决办法吗?

缺少 python API 的文档真的很痛苦。说到OpenCV 4.5版本,你必须在读取xml级联文件时调用create方法,否则在尝试检测时会产生分段错误。根据我的经验,您还需要转换为灰度,否则会产生 (-215:Assertion failed) src.type() == CV_8UC1.

这是我在 OpenCV 4.5.1 上的工作代码:

import cv2

img = cv2.imread('./img_sample.jpg')
cascade = cv2.cuda_CascadeClassifier.create('./cascade_file.xml')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cuFrame = cv2.cuda_GpuMat(gray_img)
result = cascade.detectMultiScale(cuFrame).download() # download() gets the result as UMat

if result is not None:
    print(result[0])

我希望这能回答您关于 cuda 版本使用的问题。

正如 Breno Alef 所写,Python 的 OpenCV 问题是缺乏文档和一些代码示例,这使得难以理解如何正确编写 Python使用 OpenCV 的代码。

查看 cuda_CascadeClassifier 的文档或使用 Python 内置函数 help() 可以看到 cuda_CascadeClassifier 是一个 subclass of cv.Algorithm,其中包含 load() 方法,但问题是 cuda_CascadeClassifier 的工作方式与 opencv2/objdetect.hpp 中声明的 Cascade class 有点不同。