2016-06-02 2 views
0

Я пишу код OpenCV для записи любых cv::Mat (ов) в очередь в файл. К сожалению, вызовы cv::imread, по-видимому, вызывают утечку памяти. Когда эти строки прокомментированы, утечка памяти не происходит.OpenCV cv :: imwrite вызывает утечку памяти

void ck::file_pipe_handler() { 
    std::vector<int> compression_params; 
    compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); 
    compression_params.push_back(0); 
    while (true) { 
     std::unique_lock<std::mutex> pop_lock(
      file_pipe_mutex, std::defer_lock); 
     if (file_pipe.empty()) { 
      usleep(10); 
      continue; 
     } 
     pop_lock.lock(); 
     frame_details frame_deets = file_pipe.front(); 
     file_pipe.pop(); 
     pop_lock.unlock(); 

     auto base_dir = output_file_name + "/" + frame_deets.serial_number; 
     auto rgb_reg_dir = base_dir + "/rgb_registered/"; 
     auto rgb_raw_dir = base_dir + "/rgb_raw/"; 
     auto depth_dir = base_dir + "/depth/"; 

     // If you comment out the imwrite calls here, 
     // the memory leak does not occur 
     if (register_rgb) 
      cv::imwrite(rgb_reg_dir + std::to_string(frame_deets.timestamp_rgb) 
         + ".png", frame_deets.frame_registered.first); 
     cv::imwrite(rgb_raw_dir + std::to_string(frame_deets.timestamp_rgb) 
        + ".png", frame_deets.raw_rgb); 
     cv::imwrite(depth_dir + std::to_string(frame_deets.timestamp_depth) 
        + ".png", frame_deets.frame_registered.second, compression_params); 

     frame_deets.raw_rgb.release(); 
     frame_deets.frame_registered.first.release(); 
     frame_deets.frame_registered.second.release(); 
    } 
} 

Я добавил выпуск вызовов до конца, просто чтобы убедиться, что cv::Mat (s) правильно освобождены. Также я уверен, что очередь не заполняется. Я использую OpenCV 3.1.

ответ

0

Проблемы с параллелизмом - просто переместите разблокировку после вызовов cv :: imwrite.

Смежные вопросы