Не могу понять, откуда ошибка «Недостаточно памяти» для больших изображений - PullRequest
0 голосов
/ 01 ноября 2019

ПРИМЕЧАНИЕ: вопрос длинный, но я попытался убедиться, что его легко прочитать
Я работаю с 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 иерархическая карта, подобная этой?

...