入门工作者 2023-08-02 16:30 采纳率: 0%
浏览 51
已结题

opencv cvtcolor 内存泄露

c++的opencv4.7版本,做成dll供MFC调用,dll中使用多线程处理多张图片,在加入如下几行代码后,程序每运行一遍,所占内存增加0.05MB,实际图片是1.6MB的。

Mat dst;
        fout << "dst 的地址" << &(dst.data) << endl;
        cvtColor(src, dst, COLOR_GRAY2BGR);
        fout << "dst 的地址" << &(dst.data) << endl;
        
        dst.release();
        delete dst.data;
        dst.data = nullptr;

有谁遇到这个难题啦?
我的多线程处理函数如下,m_work_img是我的一个公用mat,每次从这里面取图片。

void XDXCustomQueueProcess::Deal_Image(int index)
{
    try {
        //Sleep(5000);   //不可以在m_work_img克隆之前睡眠,会导致m_work_img一直没更新
        fout << "进入图像处理线程,线程号:" << std::this_thread::get_id() << "图片序号为: " << index << endl;
        unique_lock<mutex> lg0(m_lock);
        Mat src = m_work_img.clone();
        fout << "m_work_img 的地址"<<&(m_work_img.data) << endl;
        fout << "src 的地址" << &(src.data) << endl;
        lg0.unlock();
        Mat dst;
        fout << "dst 的地址" << &(dst.data) << endl;
        cvtColor(src, dst, COLOR_GRAY2BGR);
        fout << "dst 的地址" << &(dst.data) << endl;
        
        dst.release();
        dst = Mat();    //根据别人建议修改,也没改善

  • 写回答

11条回答 默认 最新

  • 入门工作者 2023-08-03 16:41
    关注

    我自己回答一下,经过查资料和验证,我在cvtcolor前面加入cv::setNumThreads(1);或者cv::setNumThreads(0);
    关闭opencv的并行运算,可解决。大概是我自己的多线程跟opencv函数内部的多线程搞混,导致有内存没释放。
    https://www.likecs.com/ask-1210062.html

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月8日
  • 修改了问题 8月2日
  • 创建了问题 8月2日