如果在

时间:2016-12-01 03:43:49

标签: c++ windows opencv vlfeat

我有一个时间要求严格的函数,执行需要30ms(平均),如果我之前调用了OpenCV的detectMultiScale()。如果我不调用detectMultiScale(),则需要40-45ms。这个问题似乎很奇怪,因为这两个函数彼此无关。时间关键函数内部消除此行为的部分是VLFeat的HOG特征描述符vl_feat_put_image()。

我需要调用该函数两次,一次是detectMultiScale(),一次是没有,但是我需要执行两次完成30ms。

void myfunc(cv::Mat& img, std:vector<cv::Rect>& faces)
{

    // other stuff

    vl_hog_put_image(...);

    // other stuff

}

void main()
{    
    cv::CascadeClassifier face_cascade;
    std::string face_cascade_name = "models/haarcascade_frontalface_alt2.xml";
    face_cascade.load(face_cascade_name);
    std:vector<cv::Rect> faces;

    cv::Mat img = cv::imread("img.jpg");


    // TYPE 1 (30ms)
    face_cascade.detectMultiScale(frame, faces, 1.2, 2, 0 | CV_HAAR_SCALE_IMAGE, cv::Size(30,30));
    myfunc(img, faces); // takes about 30ms

    //Type 2 (40ms)
    myfunc(img, faces); // takes about 40ms
}

替代方法我试图将变量faces作为一个因素消除。

void main()
{    
    cv::CascadeClassifier face_cascade;
    std::string face_cascade_name = "models/haarcascade_frontalface_alt2.xml";
    face_cascade.load(face_cascade_name);
    std:vector<cv::Rect> faces;

    std::ifstream myfile("facesfile.csv");
    // code to read the text file into 'faces'

    cv::Mat img = cv::imread("img.jpg");

    cv::Mat dummyImage = cv::imread("dummy.jpg");
    std::vector<cv::Rect> dummyVector;


    // TYPE 1 (30ms)
    face_cascade.detectMultiScale(dummyImage, dummyVector, 1.2, 2, 0 | CV_HAAR_SCALE_IMAGE, cv::Size(30,30));
    myfunc(img, faces); // takes about 30ms

    //Type 2 (40ms)
    myfunc(img, faces); // takes about 40ms
}

经过大量的分析,使用Visual Studio的分析器和使用std :: chrono的计时计算,我发现问题在于vl_hog_put_image()函数,但我无法弄清楚原因。< / p>

VLFeat文档:http://www.vlfeat.org/api/hog_8c.html#a86e1faec74ae8163db8dd1e0d292c305

我可以提供vl_hog_put_image()函数的源代码,如果它有帮助,因为它是开源的。

非常感谢任何帮助。即使调试此类问题的方法也很有用。

到目前为止,我唯一可以理解的是,OpenCV的detectMultiScale()在内部进行了并行化,这在某种程度上影响了系统的内存,使vl_hog_put_image()能够更快地执行。

0 个答案:

没有答案