我运行了Caltech-Lanes-Detection的代码。有我的命令:
$ ./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
我可以看到图片。请帮帮我。谢谢。
答案 0 :(得分:1)
穆罕默德·阿利(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有两个输入,图像和它写入的mat。垫子应该没问题,所以我们需要检查图像。 cvLoadImage可以处理任何文件名 - 无论文件是否存在 - 都不会出错;所以我们需要检查文件名是否完好无损。 mcvLoadImage在main.cc文件中的ProcessImage(*)中调用 - 但这也会将文件名传递给它。在Process()中调用ProcessImage,其中文件名作为相同的字符串放入,当它显示
时打印出来处理图片:/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
查看是否存在权限错误,阻止了车道检测程序实际读取文件。
答案 1 :(得分:0)
万一它有所帮助,我有同样的错误,因为我正在处理(试图显示)非常大的图像。
所以我不得不分割图像并按块处理它。
(我使用的是OpenCV 3.0 for Python,我知道这是针对C ++的,但它基本上就是在底层运行的)。