【问题标题】:OpenCV Error: Null pointer (NULL array pointer is passed) in cvGetMatOpenCV 错误:cvGetMat 中的空指针(传递空数组指针)
【发布时间】:2016-04-01 01:02:03
【问题描述】:

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

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

【问题讨论】:

    标签: c++ opencv


    【解决方案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()。我们很幸运!只有一个地方他用过而没有注释掉:File is 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
    

    查看是否是权限错误导致车道检测程序无法实际读取文件。

    【讨论】:

      【解决方案2】:

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

      所以我不得不对图像进行分段并逐块处理。

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

      【讨论】:

        猜你喜欢
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 2013-03-22
        • 2012-12-24
        • 2014-05-09
        • 1970-01-01
        相关资源
        最近更新 更多