Этот вопрос может быть лучше ответил Мохамедом Али, парнем, который на самом деле работал над этим. Его контакт находится прямо на странице, с которой вы связаны.
Тем не менее, давайте посмотрим. (Есть TLDR, если вы хотите пропустить это) Ошибка вызвана cvGetMat в файле cxarray.cpp. Первые пару линий, которые являются:
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;
}
Это не до позже, что мы на самом деле проверить, если вы изображение имеет данные в нем или нет.
Итак, теперь можно найти, где г-н Али использовал 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 вызывается в ProcessImage (*) в файле main.cc - но это также получает имя файла, переданное в него. ProcessImage вызывается в Process(), где имя файла ставится в качестве одной и той же строке, что печатается, когда он говорит
Processing image: /home/me/caltech-lanes/cordova1/f00000.png
Конечно, это просто строка - он не проверял, если он мог читать в файл заранее, поэтому, когда он говорит «Обрабатывать изображение», он действительно означает «Это путь, которым я был обращен к изображению», но на самом деле я не знаю, могу ли я его еще прочесть ».
TLDR: (И я не могу винить Я.) Так что, похоже, как главный вопрос заключается в том, что он не может прочитать файл, несмотря на EOG будучи в состоянии отобразить его. As-единственное, что я могу предложить, это попытаться переместить папку 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
, чтобы увидеть, если это ошибка разрешения позволяют программе полосы обнаружения от фактического чтения в файле.