OpenCV错误:cvGetMat中的空指针(传递NULL数组指针)

时间:2013-08-24 15:19:28

标签: c++ opencv

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

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

2 个答案:

答案 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 ++的,但它基本上就是在底层运行的)。