我在OpenCV 3.0中有一个使用带有自定义XML文件的级联分类器的工作程序。
我想加快速度,所以我改为GPU方法。 这是工作程序(CPU方法):
// image_src (cv::Mat) is the source image, captured from webcam
cv::CascadeClassifier cascade;
cv::Mat image_src_gray;
vector<cv::Rect> foundObjects;
vector<int> numDetect;
cv::cvtColor( image_src, image_src_gray, CV_BGR2GRAY );
cascade.detectMultiScale(
image_src_gray,
foundObjects, // return: objects vector
numDetect, // return: confidence vector
1.1,
4, // neighbors
0|cv::CASCADE_SCALE_IMAGE, // flags
cv::Size(40,40), // minSize
image_src.size() // maxSize
);
通过这种方式,我能够通过numDetect向量知道每个检测到的对象的置信度,并过滤掉不良结果。我使用detectMultiScale的三种形式中的一种。
使用GPU程序,函数detectMultiScale似乎无法返回置信度结果。 这是GPU程序:
// image_src (cv::Mat) is the source image, captured from webcam
cv::Ptr<cv::cuda::CascadeClassifier> cascade_gpu;
cv::cuda::GpuMat image_src_gpu, image_src_gray_gpu;
vector<cv::Rect> foundObjects;
vector<int> numDetect;
image_src_gpu.upload(image_src);
cv::cuda::cvtColor( image_src_gpu, image_src_gray_gpu, CV_BGR2GRAY );
cascade_gpu->setFindLargestObject(true);
cascade_gpu->setScaleFactor(1.1);
cascade_gpu->setMinNeighbors(4);
cascade_gpu->setMinObjectSize(cv::Size(40,40));
cascade_gpu->setMaxObjectSize(image_src.size());
cv::cuda::GpuMat foundObjects_gpu;
cascade_gpu->detectMultiScale(
image_src_gray_gpu,
foundObjects_gpu
);
cascade_gpu->convert( foundObjects_gpu, foundObjects );
这样可以正常工作,但不能根据置信度过滤结果。 Cuda detectMultiScale只有一种形式,没有置信水平。
我如何知道每个检测到的物体的置信度?
我的设置:Ubuntu 14.04.1,内核3.19.0-25,openCV 3.0,cuda 7.5。 硬件:i7-2600K - PNY / nVidia Quadro 4000。