2013-08-24 42 views
2

我運行的代碼爲Caltech-Lanes-Detection。還有就是我的命令:OpenCV錯誤:cvGetMat中的空指針(NULL數組指針被傳遞)

$ ./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 

我可以看到picture.Please幫我。謝謝。

回答

1

這個問題最好由Mohamed Aly回答,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()。我們很幸運!只有一個地方,他用它不註釋掉它:文件是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有兩個輸入,圖像和它被寫入的墊子。墊子應該沒問題,所以我們需要檢查圖像。 cvLoadImage可以處理任何文件名 - 無論文件是否存在 - 不會給出錯誤;所以我們需要檢查文件名是否完好無損。 mcvLoadImage在main.cc文件中的ProcessImage(*)中被調用 - 但是這也會傳入文件名。 processImage來被稱爲在文件名放在作爲打印輸出相同的字符串處理()時,它說

Processing image: /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 

,看它是否是一個權限錯誤防止車道檢測程序從文件中實際讀取。

0

爲了以防萬一,我也有同樣的錯誤,因爲我正在處理(試圖顯示)非常大的圖像。

所以我不得不分段的圖像和大塊處理它塊。

(我正在使用OpenCV 3。0代表Python,我知道這是用於C++,但它基本上是在底下運行的)。