2

我已经运行了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

我可以看到图片。请帮助我。谢谢你。

4

2 回答 2

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 有两个输入,图像和它被写入的垫子。垫子应该没问题,所以我们需要检查图像。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

查看是否是权限错误,阻止了车道检测程序实际读取文件。

于 2013-09-04T17:32:50.583 回答
0

以防万一,我遇到了同样的错误,因为我正在处理(试图显示)非常大的图像。

所以我不得不分割图像并逐块处理。

(我在 Python 中使用 OpenCV 3.0,我知道这是针对 C++ 的,但它基本上是在下面运行的)。

于 2016-03-31T17:02:03.310 回答