OPENCV:是CV :: MAT,就像共享_ptr一样

OpenCV: Is cv::mat like a shared_ptr?

本文关键字:共享 一样 ptr CV MAT OPENCV      更新时间:2023-10-16

我在Windows下使用MSVC-2013的OpenCV。我得到内存泄漏。现在我尝试弄清楚它们在哪里。

我掏出所有属于OpenCV的东西,它们消失了。我抓住它们构架相机,将它们推到队列,对其进行工作,将它们推到视频作者和相同的对象到CUI,并向用户展示它。

我像大多数时间一样使用本地对象,并认为cv::Mat就像std::shared_ptr<T>。我经常使用

这样的构造
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队列一起工作,仅在最小的时间内阻止抓地力。

在工人中,我将它们从当地队列中拉出来。

while (all_images.size())
{
    img_data current_frame = all_images.front();
    all_images.pop_front();
    .... do work with current_frame

这是我经常在Halcon和其他库下使用的设计,没有泄漏。...在哪里可能是问题?

当仅在OnPaint()处理程序的堆栈中分配一个CV :: MAT时,会出现泄漏。我绝对什么都不做,只是一个局部变量。我试图在普通的控制台应用程序中复制它,但没有显示。

我使用opencv 2.4.9。


我拔出了有关OpenCV的所有内容,并与我核实没有opencv重新格式加载。

然后,我将以下" Pachandler"添加到我的应用程序:

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

泄漏结果

cv::Mat确实像 shared_ptr<>,不应泄漏正确分配的数据。
要调试尝试简化您的代码为单线线程。

您的错误可能与多线程问题或CRT不匹配有关。您是否正在与共享libs联系?

静态链接通常可以解决这些问题。

静态链接确实解决了此问题。现在没有内存泄漏。