opencv 库的双链表损坏

2024-02-11

嗨,我写了这个简单的程序

Main.cpp

std::vector<cv::Mat> PD_Classifier_VEC;
#define Folder_Address ""
int Main()
{
        int overall_counter=0;

        for(int j = 0 ; j < 600 ; j++)
          {
               QString address = Folder_Address + QString::number(overall_counter++) +".jpg";
               cv::Mat image = cv::imread(address.toUtf8().constData(),0);
               PD_Classifier_VEC.push_back(image);
               PD();
          }
}

局电功能

void PD()
{
            static int Total_Frame_Number=0;
            Total_Frame_Number++;
            cv::Mat Point_MAT = cv::Mat(PD_Classifier_VEC[0].size(),CV_8UC1,cv::Scalar::all(0)); 

   ....//Some Calculation //

       PD_Classifier_VEC[0].release();
       PD_Classifier_VEC.erase(PD_Classifier_VEC.begin());

}

这段代码工作正常,直到 j=56,之后 Qt 显示此错误并退出!

*** Error in `/home/parsa/QtProjects/QtVLPR/QtVLPR': corrupted double-linked list: 0x0000000000dcf880 ***

我在调试器模式下运行代码并将此 if 语句代码添加到 PD() 函数:

void PD()
{
            static int Total_Frame_Number=0;
            Total_Frame_Number++;
            cv::Mat Point_MAT = cv::Mat(PD_Classifier_VEC[0].size(),CV_8UC1,cv::Scalar::all(0)); 

   ....//Some Calculation //

        if(Total_Frame_Number==56)
        {
        std::cout<<Point_MAT<<"\n";            //it displays the elements perfectly
        int Nonz = cv::countNonZero(Point_MAT);  //it runs too
        cv::imshow("Point_MAT",Point_MAT);          //here the error appears !!!
        cv::waitKey();
        }
       PD_Classifier_VEC[0].release();
       PD_Classifier_VEC.erase(PD_Classifier_VEC.begin());

}

正如您所看到的,前两行上方提供的注释工作正常,但是当我尝试使用 imshow 显示图像时,程序崩溃并显示损坏的双链表错误!这里出了什么问题?

为什么我无法显示此图像,如果 POINT_MAT 图像已损坏,前两行如何正常工作?

附言 如果我从 j=57 启动程序,它会正常工作直到完成并且不会出现错误,因此

//some calculation 

代码工作正常,我确信这一点。

我已经测试了许多其他函数,例如阈值、减法和...,它们适用于图像的数据部分,并且工作正常,但是当我添加适用于元数据+数据部分的函数时,损坏的双链表再次出现! !

cv::subtract(Point_MAT,Point_MAT,temp); //works fine because it only works on data part
Point_MAT.copyTo(Temp_MAT); //gives error cause it works on header part too ...

该错误来自标准 C 库,表明您已损坏堆。

具体来说,你不应该打电话release() on a Cv::mat除非你有匹配的addref() in 你自己的代码. Cv::mat行为类似于 Qt 中常见的隐式共享值(比如QImage),您不必担心手动管理其引用计数。

明显的建议是删除“一些计算”部分。您显示的代码as is应该可以工作(没有release())无需计算即可获得更多图像。

将您显示的代码转换为单独的单个文件项目,并确保它运行 - 因为它应该运行。那么错误就仅限于您的计算 - 事实上,它仅在您进行计算时才会显现出来,这是计算问题的症状。

也许计算会分配内存?

下面是一个有效的、独立的示例,它演示了所显示的代码不仅没问题,而且即使您一次在内存中存储一​​百个图像,一切也能正常工作。每张图像的大小为 2MB。

#include <QImage>
#include <QTemporaryFile>
#include <QDebug>
#include <vector>
#include <opencv2/opencv.hpp>

std::vector<cv::Mat> PD_Classifier_VEC;

void PD()
{
  cv::Mat Point_MAT = cv::Mat(PD_Classifier_VEC[0].size(),CV_8UC1,cv::Scalar::all(0));

  //Some Calculation //

  std::stringstream stream;
  stream<<Point_MAT<<"\n";
  int Nonz = cv::countNonZero(Point_MAT);
  cv::imshow("Point_MAT",Point_MAT);

  PD_Classifier_VEC.erase(PD_Classifier_VEC.begin());
}

int main()
{
  QTemporaryFile file;
  file.setFileTemplate(file.fileTemplate() + ".jpg");

  const int N = 100;
  for(int j = 0 ; j < N ; j++)
  {
    file.open();
    QImage img(800, 600, QImage::Format_RGB32);
    img.save(&file);
    file.close();
    QString address = file.fileName();
    cv::Mat image = cv::imread(address.toStdString(),0);
    PD_Classifier_VEC.push_back(image);
  }
  while (!PD_Classifier_VEC.empty()) PD();
  cv::waitKey();
  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 库的双链表损坏 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 未找到“属性”段的资源

    当使用 ADO Net Data Services 客户端通过调用刷新实体时LoadProperty ctx BeginLoadProperty this Owner IAsyncResult ar gt 如果该属性是 它会在服务器上引发错
  • 工作流程中的 Dynamics CRM 当前日期占位符

    我已将工作流程附加到具有到期日期和时间的实体 那么指示当前时间的适当占位符是什么 CURRENT TIME Sultan 您的问题有点模糊 但如果您通过编辑器谈论 Dynamics CRM 工作流程 则工作流程运行的时间就是执行时间 为此
  • 无法将字符串转换为 pandas 中的浮点数(ValueError)

    我有一个从 JSON 输出创建的数据框 如下所示 Total Revenue Average Revenue Purchase count Rate Date Monday 1 304 40 CA 20 07 CA 2 345 1 54 存
  • 如何在 Python 中从给定 CDF 的分布中采样

    我想从概率分布中抽取样本CDF https en wikipedia org wiki Cumulative distribution function 1 e x 2 python scipy 等中有没有方法 使您能够从仅给定 CDF 的
  • Django 到底什么时候运行查询?

    虽然我了解 Django 的 QuerySet 和延迟执行的高级思想 但我没有在 Django 3 1 2 源代码中看到查询执行是如何触发的 即 数据库被命中 例如 根据Django 文档 https docs djangoproject
  • nasm 汇编linux定时器或睡眠

    我正在尝试找到一种方法让我的代码在继续之前等待两秒钟 我在保护模式下使用Linux的nasm 所以我只能使用int 80h 我找到了一个syscall称为 alarm 27 另一个叫 pause 29 但是 当我尝试使用这些时 程序会等待并
  • Android Fabric - 以自定义间隔发送捕获的异常

    根据 Fabric 文档面料文档 https docs fabric io android crashlytics caught exceptions html为了减少用户流量 仅在应用程序启动时发送捕获的异常 Crashlytics 在专
  • 如何使用 JTidy 从解析的 HTML 中获取错误/警告消息?

    我能够解析 HTML 但我想从解析的 HTML 中提取警告消息并将其显示给用户 这是我的代码 Tidy tidy new Tidy StringBuffer StringBuffer1 new StringBuffer b Hello u
  • java中的抽象和接口[重复]

    这个问题在这里已经有答案了 可能的重复 接口与抽象类 一般面向对象 https stackoverflow com questions 761194 interface vs abstract class general oo 什么时候使用
  • ALT-TAB 应用程序图标像素化

    When a child window of my application is opened and I view the ALT TAB menu the application icon looks pixellated I assu
  • 在 JodaTime 中生成日期范围

    我需要检查数组列表中是否存在日期 字符串 我有两个日期 首先我需要生成这两个日期之间的日期范围并将它们存储在数组中 这就是我正在做的事情 DateTimeFormatter dateFromatter DateTimeFormat forP
  • cabal 无法使用 http 代理

    我的Linux redhat6 服务器必须使用http代理来连接到外界 虽然它适用于 wget 等其他东西 但它不适用于 cabal cabal update v3 显示这样的错误 407 需要代理身份验证阴谋 下载失败http hacka
  • phpMyAdmin 错误 1932 - 引擎中不存在表

    Windows 7 xampp 我有一个有 14 个表的数据库 这几天我和他们所有人一起工作 直到今天早上都没有出现任何问题 除了桌子外 所有桌子都可以posts 当我单击它的名称 phpMyAdmin 中的左侧菜单 时 我收到一条消息 1
  • Dagger:定义可注入类的正确方法,该类在其构造函数中采用上下文

    我想使用 dagger Square 的 dagger v1 创建一个单例类 其构造函数需要上下文作为参数 然后我想将这个单例类注入到我的 MainActivity 中 定义这一点的正确步骤是什么 我尝试这样做 单例类 Module inj
  • 如何检查 Android 上是否启用 USB 连接模式?

    我在 Android 市场上有一个应用程序 用户经常将他们的设备连接到计算机以将音乐添加到应用程序文件夹中 我在说明中特别指出 当启用 USB 连接模式时 Android 应用程序无法与 SD 卡通信 显然这还不够愚蠢的证据 有没有办法在j
  • 站点包位于 Conda 环境中的什么位置?

    在 Conda 环境中安装软件包后 我想对该软件包中的代码进行一些更改 我在哪里可以找到site packages包含已安装软件包的目录 我有一个 Anaconda Python 2 7base分发 但我没有找到目录 Users usern
  • 如何在 VueJS Webpack 项目中使用 Modernizr

    有人有在 VueJs Webpack 项目中捆绑和使用 Modernizr 的简单教程吗 我使用带有单文件组件的 VueJS 默认 Webpack 项目 我想要全部捆绑起来 为了精确起见 我想在大多数表单中使用 inputtypes dat
  • mongodb数据库与Java play 2.0

    有教程如何在 Java play 2 0 中使用 mongodb 数据库吗 在官方网站 playframework org 上似乎只有NoSql示例 在 github 上查看这个演示 https github com czihong pla
  • 绘制抗锯齿圆的算法?

    绘制抗锯齿圆的好算法是什么 已填充和未填充 Bresenham 因直线算法而闻名 也有一个圆形算法 吴晓林对直线算法进行了抗锯齿处理 对圆算法也进行了同样的处理 http en wikipedia org wiki Xiaoolin Wu
  • opencv 库的双链表损坏

    嗨 我写了这个简单的程序 Main cpp std vector