2

Caltech-Lanes-Detectionのコードを実行しました。私のコマンドがあります:

$ ./LaneDetector32 --show --list-file=/home/me/caltech-lanes/cordova1/list.txt --list-path=/home/me/caltech-lanes/cordova1/ --output-suffix=_result

そして、次のような問題があります。

main.cc:187 msg   Loaded camera file
main.cc:194 msg   Loaded lanes config file
main.cc:249 msg   Processing image: /home/me/caltech-lanes/cordova1/f00000.png
OpenCV Error: Null pointer (NULL array pointer is passed) in cvGetMat, file /home/me/OpenCV-2.0.0/src/cxcore/cxarray.cpp, line 2370
terminate called after throwing an instance of 'cv::Exception'

そして、このコマンドを実行すると:

eog /home/me/caltech-lanes/cordova1/f00000.png

写真が見えます。助けてください。ありがとうございました。

4

2 に答える 2

1

この質問は、実際にこれに取り組んだ Mohamed Aly が答えたほうがよいかもしれません。彼の連絡先はあなたがリンクしたページにあります。

とは言え、見てみましょう。(これをスキップしたい場合は TLDR があります) cxarray.cppファイルの cvGetMat が原因でエラーが発生します。最初の数行は次のとおりです。

2362    cvGetMat( const CvArr* array, CvMat* mat,
2363              int* pCOI, int allowND )
2364    {
2365        CvMat* result = 0;
2366        CvMat* src = (CvMat*)array;
2367        int coi = 0;
2368    
2369        if( !mat || !src )
2370            CV_Error( CV_StsNullPtr, "NULL array pointer is passed" );
        ...
            return result;
        }

画像にデータが含まれているかどうかを実際に確認するのは、後になってからです。

それでは、Aly 氏が cvGetMat() を使用した場所を見つけてみましょう。運がいい!彼がコメントアウトせずに使用した場所は 1 つだけです。ファイルは mcv.cc です。

void mcvLoadImage(const char *filename, CvMat **clrImage, CvMat** channelImage)
{
  // load the image
  IplImage* im;
  im = cvLoadImage(filename, CV_LOAD_IMAGE_COLOR);
  // convert to mat and get first channel
  CvMat temp;
  cvGetMat(im, &temp);
  *clrImage = cvCloneMat(&temp);
  // convert to single channel
  CvMat *schannel_mat;
  CvMat* tchannelImage = cvCreateMat(im->height, im->width, INT_MAT_TYPE);
  cvSplit(*clrImage, tchannelImage, NULL, NULL, NULL);
  // convert to float
  *channelImage = cvCreateMat(im->height, im->width, FLOAT_MAT_TYPE);
  cvConvertScale(tchannelImage, *channelImage, 1./255);
  // destroy
  cvReleaseMat(&tchannelImage);
  cvReleaseImage(&im);
}

これは明らかに、指定したファイル名の最終的な場所です。ここには何も問題はありません。画像が実際にコードにロードされていることを再確認してくれればよいのですが、厳密には必要ではありません。cvGetMat には、画像とそれが書き込まれるマットの 2 つの入力があります。マットは問題ないはずなので、画像を確認する必要があります。cvLoadImage は、ファイルが存在するかどうかに関係なく、エラーを発生させることなく、任意のファイル名で機能します。そのため、ファイル名が無傷であることを確認する必要があります。mcvLoadImage は main.cc ファイルの ProcessImage(*) で呼び出されますが、これによりファイル名も渡されます。ProcessImage は Process() で呼び出され、ファイル名は、それが言うときに出力されるのと同じ文字列として配置されます

加工画像:/home/me/caltech-lanes/cordova1/f00000.png

もちろん、それはただの文字列です - 彼は事前にファイルを読み込むことができるかどうかをチェックしていませんでした.実際、まだ読めるかどうかはわかりません。」

TLDR:(そして、私はあなたを責めることはできません)したがって、主な問題は、eogがファイルを表示できるにもかかわらず、ファイルを読み取れないことのようです。私が提案できる唯一のことは、フォルダー cordova1 を C:/Test/cordova1/ のような場所に移動しようとすること、または (コンピューターにそれが機能しない設定がある場合) C:/Users/[You]/ cordova1/ そこにあるファイルを使用して、

$ ./LaneDetector32 --show --list-file=/home/me/caltech-lanes/cordova1/list.txt --list-path=/home/me/caltech-lanes/cordova1/ --output-suffix=_result

車線検出プログラムが実際にファイルを読み取ることを妨げているパーミッション エラーであるかどうかを確認します。

于 2013-09-04T17:32:50.583 に答える