2016-06-02 15 views
0

Ich schreibe etwas OpenCV-Code, um cv::Mat (s) in einer Warteschlange in eine Datei zu schreiben. Leider scheinen die Aufrufe an cv::imread einen Speicherverlust zu verursachen. Wenn diese Zeilen auskommentiert sind, tritt kein Speicherverlust auf.OpenCV cv :: imwrite verursacht Speicherverlust

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(); 
    } 
} 

Ich habe die Freigabe bis zum Ende ruft nur um sicher zu stellen, dass die cv::Mat (n) richtig befreit. Ich bin mir auch sicher, dass die Warteschlange nicht voll ist. Ich benutze OpenCV 3.1.

Antwort

0

Concurrency Probleme - verschieben Sie einfach die Entsperrung nach dem cv :: imwrite Anrufe.

Verwandte Themen