这个问题最好由实际从事此工作的人 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 在 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
查看是否是权限错误,阻止了车道检测程序实际读取文件。