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 有点不同。
我正在尝试使用来自 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 有点不同。