Cuda CascadeClassifier detectMultiScale 输出不可读

Posted

技术标签:

【中文标题】Cuda CascadeClassifier detectMultiScale 输出不可读【英文标题】:Cuda CascadeClassifier detectMultiScale output is unreadable 【发布时间】:2020-09-01 13:51:32 【问题描述】:

我正在尝试使用带有 openCV4.4 的 CUDA 进行级联分类,但是当我运行 detectMultiScale 函数时,它给了我一个分段错误。我做错了什么?

openCV for CUDA 在 python 中的文档有限,因此很难找到使用 CUDA 进行级联分类的正确程序。

我的系统:

Quadro P620 Debian 6.3.0-18 Python 3.5.3 使用 CUDA=ON、CUDNN=ON 构建 OpenCV 4.5.0

我想出的代码:

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

classifier_cuda 和 cuda_frame 分别被识别为<cuda_GpuMat 0x7fffa9446d10> <cuda_CascadeClassifier 0x7fffa9446cf0>

已通过将代码更改为:

classifier_cuda = cv2.cuda.CascadeClassifier_create('model.xml')
while True:
    success, frame = vidcap.read()
    cuFrame = cv2.cuda_GpuMat(frame)
    output2 = cv2.cuda_GpuMat()
    output = classifier_cuda.detectMultiScale(cuFrame, output2)
    
    # And then its unclear what to use to get the detections
    # I Tried:
    final = classifier_cuda.convert(output)
    # And:
    final = classifier_cuda.convert(output2)
    # And:
    final = output.download()
    # And:
    final = output2.download()

现在的问题是结果都是空的。那么,我应该如何从我的检测多尺度中提取数据?我需要一个边界框列表 [x,y,w,h]。

【问题讨论】:

尝试提供CascadeClassifier 的完整路径,例如C:\User\..\..\opencv\data\haarcascades\cascade_file.xml 尝试为视频和级联文件提供绝对路径。 感谢@Ahmet 和 Micka,但不幸的是我已经尝试过了,但没有成功 您是否从互联网上获得了cascade_file.xml?当我使用来自互联网的çxml 时,我遇到了同样的问题。似乎.xml 仅来自/opencv/data/haarcascades 目录与detectMultiScale 一起使用。 @Ahmet 不,这是一个自定义级联,尝试了新旧布局 【参考方案1】:

output.download() 实际上对我有用,但如果没有检测到任何东西,它将是 None

我认为您的问题是您需要将帧转换为COLOR_BGR2GRAY

这应该可行:

source = cv2.VideoCapture('video_file.mp4')
classifier = cv2.cuda.CascadeClassifier_create('model.xml')

while True:
    success, frame = source.read()

    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gpu_frame = cv2.cuda_GpuMat(gray_frame)
    gpu_result = classifier.detectMultiScale(gpu_frame) # cuda_GpuMat
    result = gpu_result.download() # UMat

    if result is not None:
        for item in result[0]:
            (x, y, w, h) = item
            print(x, y, w, h)

(OpenCV 4.4)

【讨论】:

我还将 item[0] 更改为 item 并将 result 更改为 result[0] 以解决只有一个结果的问题。谢谢 :) 正是我所做的,将更新我的答案。 Tnx!

以上是关于Cuda CascadeClassifier detectMultiScale 输出不可读的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 OpenCV 中为 CascadeClassifier GPU 使用 gpu::Stream 吗?如何使用?

CascadeClassifier::detectMultiScale 不适用于 C++

如何修复“cv2”没有属性“CascadeClassifier”?

错误:(-215:断言失败)!函数'cv :: CascadeClassifier :: detectMultiScale'中的empty()

多线程中的 OpenCV CascadeClassifier C++ 接口

cv::CascadeClassifier::detectMultiScale 中的断言失败 (!empty())