与imshow的断言错误

时间:2013-10-31 08:38:41

标签: opencv imshow

好的,我知道这个问题可能并不新鲜,而且我已经完成了一些涉及同一问题的帖子,但它并没有真正帮助。我是opencv的新手,我正在尝试使用imread加载图像(在与可执行文件存储的文件夹不同的文件夹中)并使用imshow显示它。它是一个更大的代码的一部分,但我已经在这里展示了作为单独代码覆盖问题的部分:

#include <stdio.h>
#include "cv.h"
#include "cvaux.h"
#include "highgui.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include <iostream>
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv/highgui.h"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/legacy/legacy.hpp"

#include <fstream>
#include <sstream>

#include <cctype>
#include <iterator>
#include <cstring>

#include <highgui.h>
#include <string.h>

int disp(char * filename);

using namespace std;
using namespace cv;
int main()
{
    disp("file.txt");
} 
int disp(char * filename)
{
    FILE * fp;
    char shr[50];
    char ch;
    if( !(fp = fopen(filename, "rt")) )
{
    fprintf(stderr, "Can\'t open file %s\n", filename);
    return 0;
}
    for(i=0;ch != '\n';i++)
{

    ch = fgetc(imgListFile);
    shr[i] = ch;    

}

    string str(shr);
Mat image=imread(str.c_str(),1);    
namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
    imshow( "Display Image",image);
cvWaitKey(0);
}

“file.txt”是一个文本文件,包含我要加载和显示的图像的完整路径。我正在将它读入一个字符数组,将其转换为字符串并将其传递给imshow / imread函数。编译时我没有收到任何错误,但是,当我运行代码时出现错误:

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/ubuntu/Desktop/OpenCV/opencv-2.4.6.1/modules/highgui/src/window.cpp, line 261
terminate called after throwing an instance of 'cv::Exception'
what():  /home/ubuntu/Desktop/OpenCV/opencv-2.4.6.1/modules/highgui/src/window.cpp:261: error: (-215) size.width>0 && size.height>0 in function imshow

Aborted (core dumped)

我试过调试代码,甚至重新编译opencv;但我再次得到同样的问题&amp;再次。我需要帮助!!!

希望我已正确解释了我的问题。在此先感谢!!!

P.S:文本文件实际上包含每个图像路径之前的数字;我需要删除数字才能将路径提供给imshow / imread函数;这就是我试图读取文本文件并存储在字符数组中的原因(这样我可以先删除前2个字符)。

3 个答案:

答案 0 :(得分:1)

错误消息告诉您图像为0行和/或0列。这通常是由于图像路径不正确,或者是由安装OpenCV未处理的图像类型引起的。

要调试它,您需要打印imread()的参数,并将其与系统上文件的catual位置进行比较。

答案 1 :(得分:1)

你的for循环在这里被破坏了:

for(i=0;ch != '\n';i++)
{
    ch = fgetc(imgListFile);
    // you have to check the value of ch *after* reading
    if ( ch == '\n' )
        break; // else, you still append the '\n' to your filename
    shr[i] = ch;    
}
// z terminate
shr[i] = 0;

所以, - 由于路径破碎,你会得到空白的图像。

答案 2 :(得分:-1)

您的代码中存在一些拼写错误。此外,似乎您还没有完全掌握使用c ++的文件处理和字符串分配的概念;我建议你阅读那些......我已经重新编写了你的​​代码,如下所示,

int main()
{
    disp("file.txt");
    return EXIT_SUCCESS;
} 

void disp(char* filename)
{
    ifstream myReadFile;
    char shr[500];
    myReadFile.open(filename);

    if(myReadFile.is_open())
            while(!myReadFile.eof())
                    myReadFile >> shr;

    string str(shr);
    Mat image=imread(str.c_str(),1);    
    namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
    imshow( "Display Image",image);
    cvWaitKey(0);
}

希望这有帮助。