2013-08-24 2 views
2

Я запустил код Caltech-Lanes-Detection. Существует моя команда:Ошибка OpenCV: указатель Null (указатель массива NULL передан) в cvGetMat

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

Этот вопрос может быть лучше ответил Мохамедом Али, парнем, который на самом деле работал над этим. Его контакт находится прямо на странице, с которой вы связаны.

Тем не менее, давайте посмотрим. (Есть 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 

, чтобы увидеть, если это ошибка разрешения позволяют программе полосы обнаружения от фактического чтения в файле.

0

На всякий случай это помогает, у меня была такая же ошибка, потому что я имел дело с попытками показать очень большие изображения.

Поэтому мне пришлось сегментировать изображения и обрабатывать их куском.

(Я использовал OpenCV 3.0 для Python, я знаю, что это было для C++, но это в основном то, что работает под ним).

Смежные вопросы