2015-05-13 3 views
0

Я использую opencv под окнами с MSVC-2013. Я получаю утечки памяти. Теперь я пытаюсь выяснить, где они находятся.OpenCV: Является ли cv :: mat как shared_ptr?

Я достал все вещи, принадлежащие opencv, и они исчезли. Я хватаю их, создавая камеру, подталкиваю их к очереди, работаю над ними, подталкиваю их к видеозаписывающему устройству и тому же объекту в cui, где он отображается для пользователя.

Я использую как в большинстве случаев локальные объекты и думал, что cv::Mat похож на std::shared_ptr<T>. Я часто использую costructs как

void CChildView::OnPaint() 
{ 
    CPaintDC dc(this); // Gerätekontext zum Zeichnen 

    // get the current image to convert it 
    cv::Mat curr_img; 
    { 
     lock lk(m_monitor_gui); 
     curr_img = m_gui_image.clone(); 
    } 
    .... 
} 

Моей очередь выглядит следующим образом:

cv::Mat  m_gui_image; 
struct img_data 
{ 
    time_point_t time; 
    int nr; 
    cv::Mat img; 
}; 
std::deque<img_data>  m_grab_2_write; 

    ............. grabber thread 
// copy it to the writer queue 
{ 
    lock lk(m_monitor_grab_write); 

    // clone the raw frame 
    cv::Mat to_other_thread; 
    to_other_thread = raw_frame.clone(); 

    img_data tmp; 
    tmp.nr = cnt++; 
    tmp.img = to_other_thread; 
    tmp.time = now; 
    m_grab_2_write.push_back(tmp); 
} 

    ............. worker thread 
// get all images from the queue 
std::deque<img_data> all_images; 
{ 
    lock lk(m_monitor_grab_write); 
    all_images = m_grab_2_write; 
    m_grab_2_write.clear(); 
} 
    ...... 
// copy the current image to the display 
{ 
    lock lk(m_monitor_gui); 
    m_gui_image = current_frame.img; 
} 

Сейчас я работаю с местным all_images очереди, чтобы блокировать Грабер нити только за минимальное количество времени.

В рабочем я вытаскиваю их из локальной очереди.

Это дизайн, который я часто использовал в Halcon и других библиотеках и не имел утечек .... Где может быть проблема?

Утечка появляется, когда только один cv :: mat выделяется в стеке в обработчике OnPaint(). Я ничего не делаю с ней, просто локальная переменная. Я попытался воспроизвести его в простом консольном приложении, но он не появился.

Я использую opencv 2.4.9.

Я вытащил все, что касается opencv, и я проверяю, что нет ничего, что загружалось в opencv reagring.

Тогда я добавить следующее "PaintHandler" для моего приложения:

void CChildView::OnPaint() 
{ 
    lock lk(m_monitor_gui); 
    CPaintDC dc(this); 
    // get the current image to convert it 
    cv::Mat m; 
} 

Тогда просачивается. Когда я удаляю локальную переменную cv::Mat m, она не течет.


Detected memory leaks! 
Dumping objects -> 
{157} normal block at 0x005EDA48, 29 bytes long. 
Data: < X^_^ > 00 00 00 00 58 DA 5E 00 5F DA 5E 00 00 00 00 00 
{156} normal block at 0x005ED9B8, 77 bytes long. 
Data: < ^ ( > CD CD CD CD B8 D9 5E 00 00 00 00 00 28 00 00 00 
{155} normal block at 0x005ED930, 74 bytes long. 
Data: <   0^> CD CD CD CD CD CD CD CD CD CD CD CD 30 D9 5E 00 
{154} normal block at 0x005ED8A8, 73 bytes long. 
Data: < ^ ( > CD CD CD CD A8 D8 5E 00 00 00 00 00 28 00 00 00 
{153} normal block at 0x005ED818, 81 bytes long. 
Data: < ^ ( > CD CD CD CD 18 D8 5E 00 00 00 00 00 28 00 00 00 
{152} normal block at 0x005ED790, 73 bytes long. 
Data: <   ^> CD CD CD CD CD CD CD CD CD CD CD CD 90 D7 5E 00 
{151} normal block at 0x005ED700, 81 bytes long. 
Data: <   ^> CD CD CD CD CD CD CD CD CD CD CD CD 00 D7 5E 00 
{150} normal block at 0x005ED208, 76 bytes long. 
Data: < ^ ( > CD CD CD CD 08 D2 5E 00 00 00 00 00 28 00 00 00 
Object dump complete. 

течи результат с одним неиспользованного cv::Mat

ответ

2

cv::Mat, действительно, как shared_ptr<> и не должны течь должным образом, выделенные данные.
Для отладки попробуйте упростить код для однопоточной.

Ваша ошибка может быть связана с проблемами многопоточности или, может быть, несоответствия CRT. Вы связываетесь с общими библиотеками?

Статическая связь часто решает эти проблемы.

+0

Да, я использую общие библиотеки. Я всегда использую блокировки/мьютексы, чтобы предотвратить модификацию 'cv: Mat'. 'std :: shared_ptr <>' - это сохранить поток для копирования. Я думаю, 'cv: Mat' не является нитью для копирования. Консольное приложение не выдавало никакой памяти. Я пытаюсь определить его более вниз и использовать depend.exe, чтобы посмотреть, есть ли несоответствия CRT. –

+0

Попробуйте запустить код поочередно в одном потоке, чтобы узнать, связаны ли утечки MT. –

+0

Это мой обработчик OnPaint. Это утечка. –

0

статический ссылка действительно исправление это. Теперь нет утечки памяти.

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