ПРИМЕЧАНИЕ: вопрос длинный, но я попытался убедиться, что его легко прочитать
Я работаю с OpenCV на платформе arm, где я выполняю простую программу чтения изображения, затемнайти лица в нем, используя cv::CascadeClassifier(//LBP here)
и записав изображение обратно. У меня есть небольшое ограничение пространства около 50 МБ для работы.
Я могу сделать это с чтением цветного изображения 720p . Я также могу сделать это с чтением изображения в градациях серого 1080 и без записи обратно. Когда я пытаюсь читать цветное изображение 1080p , я сталкиваюсь с ошибка недостаточной памяти .
При отладке:
Программа не работает наfaceTemplate.detectMultiScale(frame_gray, out_bounding_box, 1.3, 3);
здесь, очевидно, требуется больше места (около 26 МБ).
Поэтому я ставлю паузы до и после этого утверждения std::cin.get()
. Я снова запустил программу с разрешением 720p (сценарий PASS) и проверил состояния памяти в этих двух точках, как показано ниже:
******************** Before the Program starts***************************
total used free shared buffers cached
Mem: 91620 36420 55200 0 0 6020
-/+ buffers/cache: 30400 61220
******************** Before detectMultiScale ****************************
total used free shared buffers cached
Mem: 91620 44736 46884 0 0 12568
-/+ buffers/cache: 32168 59452
********************* After detectMultiScale ****************************
total used free shared buffers cached
Mem: 91620 58036 33584 0 0 13528
-/+ buffers/cache: 44508 47112
Теперь я хочу выяснить, откуда (heap / stck) возникает ошибка недостаточного объема памяти послеdetectMultiScale
называется. Я не могу отследить функцию внутри библиотеки opencv. (Есть несколько реализаций detectMultiScale()
)
Моя цель:
В этом упражнении я думаю, что смогу затем выделить требуемую кучу / стекпредварительное выполнение памяти.
Моя программа:
int GetFaceBoundingBoxes(const std::string image_path) {
//Create the Image holders
cv::Mat frameBGR, frame_gray;
frameBGR = cv::imread(image_path, cv::IMREAD_COLOR);
//Convert the color scheme to grayscale
cv::cvtColor(frameBGR, frame_gray, cv::COLOR_BGR2GRAY);
std::vector<cv::Rect> out_bounding_box;
std::cin.get();
faceTemplate.detectMultiScale(frame_gray, out_bounding_box, 1.3, 3);
std::cin.get();
for (std::vector<cv::Rect>::iterator face_itr = out_bounding_box.begin();
face_itr != out_bounding_box.end(); face_itr++) {
cv::rectangle(frameBGR, cv::Point(face_itr->x, face_itr->y),
cv::Point(face_itr->x + face_itr->width,
face_itr->y + face_itr->height),
cv::Scalar(255, 0, 255), 3);
}
cv::imwrite("imageTest_new.jpg", frameBGR);
return 0;
}
Вопрос:
Как правильно отследить функцию deteMultiScale? Есть ли в Opencv иерархическая карта, подобная этой?