我有一个时间要求严格的函数,执行需要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()能够更快地执行。