gpt4 book ai didi

c++ - opencv 库的双链表损坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:09 25 4
gpt4 key购买 nike

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

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

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 库,表明您已损坏堆。

具体来说,你不应该在 Cv::mat 上调用 release(),除非你在 addref() >你自己的代码Cv::mat 的行为类似于 Qt 中常见的隐式共享值(例如 QImage),您不必担心手动管理其引用计数。

显而易见的建议是删除“一些计算”部分。您显示的代码按原样 应该可以工作(没有release())而无需计算,适用于更 multimap 像。

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

也许计算分配了内存?

下面是一个有效的、独立的示例,它演示了所示代码不仅可以,而且即使您一次在内存中存储一​​百张图像也一切正常。每张图片大小为 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;
}

关于c++ - opencv 库的双链表损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22842151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com