【发布时间】:2014-04-03 15:24:39
【问题描述】:
嗨,我写了这个简单的程序
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());
}
如您所见,前两行上方提供的 cmets 工作正常,但是当我尝试使用 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 ...
【问题讨论】:
-
显而易见的建议是删除“一些计算”部分。对于更多图像,它应该在没有计算的代码上工作(没有
release())。 -
-1 因为您没有提供任何实际失败的代码。到目前为止的一切(
release()尽管)工作正常。我知道,我试过了。 -
现在您知道不展示一个完整的、自包含的示例 是多么的低效。像你这样的问题一次又一次地出现在 SO 上,提问者总是一致地声称他们不需要需要提供任何其他代码。他们总是是错误的,他们这样做是在浪费他们的时间和回答者的时间。
-
是的,我尽量不再重复...我今天学到了一些关于如何在 SO 中提供代码的重要知识...