C++ 如果函数之前未调用OpenCV detectMultiScale(),则执行该函数需要更长的时间

C++ 如果函数之前未调用OpenCV detectMultiScale(),则执行该函数需要更长的时间,c++,windows,opencv,vlfeat,C++,Windows,Opencv,Vlfeat,我有一个时间关键型函数,如果我在前面调用OpenCV的detectMultiScale(),它的执行时间平均为30毫秒。如果不调用detectMultiScale(),需要40-45毫秒。这个问题看起来很奇怪,因为这两个函数彼此无关。时间关键函数中显示此行为的部分是VLFeat的HOG特征描述符vl_feat_put_image() 我需要调用函数两次,一次是detectMultiScale(),一次是不调用,但两次都需要在30毫秒内完成 void myfunc(cv::Mat& img

我有一个时间关键型函数,如果我在前面调用OpenCV的detectMultiScale(),它的执行时间平均为30毫秒。如果不调用detectMultiScale(),需要40-45毫秒。这个问题看起来很奇怪,因为这两个函数彼此无关。时间关键函数中显示此行为的部分是VLFeat的HOG特征描述符vl_feat_put_image()

我需要调用函数两次,一次是detectMultiScale(),一次是不调用,但两次都需要在30毫秒内完成

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
}
在使用Visual Studio的profiler和使用std::chrono的计时计算进行了大量分析之后,我发现问题出在vl_hog_put_image()函数上,但我不知道为什么

VLFeat文件:

我可以提供vl_hog_put_image()函数的源代码,因为它是开源的

任何帮助都将不胜感激。即使是调试这类问题的方法也会很有用


到目前为止,我唯一能弄明白的是OpenCV的detectMultiScale()在内部是并行的,这在某种程度上影响了系统的内存,从而使vl_hog_put_image()执行得更快。

CPU缓存可能已经有了数据,所以它不必再次获取数据。但是
detectMultiScale()为什么/如何
影响到这一点吗?我在它的位置上尝试了其他函数,甚至是
std::this\u thread::sleep\u for()
。Faces是detectmultiscale中的一个参数,然后在禁用哪个CPU会缓存该内存时立即再次使用它。我明白你的意思了。我将稍微编辑我的帖子,以展示我尝试过的另一种方法,它消除了“脸”作为一个因素。我将“faces”的值保存到一个文本文件中并使用它。仍然是相同的问题。请先尝试myfunc,然后detectmultiscale+myfuncCPU缓存可能已经有了数据,因此它不必再次获取数据。但是
detectmultiscale()
为什么/如何影响这一点?我在它的位置上尝试了其他函数,甚至是
std::this\u thread::sleep\u for()
。Faces是detectmultiscale中的一个参数,然后在禁用哪个CPU会缓存该内存时立即再次使用它。我明白你的意思了。我将稍微编辑我的帖子,以展示我尝试过的另一种方法,它消除了“脸”作为一个因素。我将“faces”的值保存到一个文本文件中并使用它。还是相同的问题。请先尝试myfunc,然后检测MultiScale+myfunc
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
}