1

OK、私はこの質問が新しいものではないかもしれないことを知っています.同じ問題をカバーするいくつかの記事をすでに読んでいますが、実際には役に立ちませんでした. 私は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を再コンパイルしても、コードのデバッグを試みました。しかし、私は同じ問題を何度も繰り返しています。私は助けが必要です !!!

私の問題を適切に説明したことを願っています。前もって感謝します !!!

PS: テキスト ファイルには、実際にはすべてのイメージ パスの前に数字が含まれています。imshow/imread 関数へのパスをフィードする前に、番号を削除する必要があります。これが、テキスト ファイルを読み取って文字配列に格納しようとしている理由です (最初の 2 文字を最初に取り除くことができるようにするため)。

4

3 に答える 3

2

エラー メッセージは、画像が 0 行または 0 列であることを示しています。これは通常、イメージへのパスが間違っているか、OpenCV のインストールで処理されないイメージ タイプが原因です。

デバッグするには、引数を出力しimread()て、システム上のファイルの実際の場所と比較する必要があります。

于 2013-10-31T08:44:18.487 に答える
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;

そのため、パスが壊れているため、空の画像が表示されます。

于 2013-10-31T09:12:37.537 に答える