gpt4 book ai didi

c++ - OpenCV 错误 : Null pointer (NULL array pointer is passed) in cvGetMat

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:36 24 4
gpt4 key购买 nike

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

我能看到图片,请帮帮我。谢谢。

最佳答案

这个问题最好由实际从事此工作的人 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() 中调用,其中文件名作为与打印出的字符串相同的字符串放置

Processing image: /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

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

关于c++ - OpenCV 错误 : Null pointer (NULL array pointer is passed) in cvGetMat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com