這個問題最好由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
,看它是否是一個權限錯誤防止車道檢測程序從文件中實際讀取。