我在Mac上使用以下代码与OpenCV。以下函数从另一个函数接收图像文件的路径,并且工作正常。但是,cvExtractSURF会抛出一个异常,说明:
OpenCV错误:cvCreateSeq中输入数组()的大小不正确,文件> /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarb> alls_ports_graphics_opencv / opencv / work / OpenCV-2.4.1 / modules / core / src / datastructs.cpp,第372行 终止调用抛出异常
代码如下:
- (int)extractFromImagePath:(NSString*)pathToFile{
[self.statusText setStringValue:@"image received"];
NSLog(@"Path: %@",pathToFile);
// Path: /Users/loco/Desktop/testimage.png
const char * path = [pathToFile UTF8String];
IplImage* image = cvLoadImage(path, CV_LOAD_IMAGE_GRAYSCALE );
cv::Mat im = cv::imread(path,0);
if(im.data == NULL)
{
std::cout<<"Unable to read "<<path<<std::endl;
return 0;
}
/* extract the SURF keypoints/descriptors of an image */
// presumes a previously declared IplImage *image
CvSeq *keypoints = NULL;
CvSeq *descriptors = NULL;
CvMemStorage *storage = cvCreateMemStorage(0);
cvExtractSURF(image, NULL, &keypoints, &descriptors, storage, cvSURFParams(0, 600));
// OpenCV Error: Incorrect size of input array () in cvCreateSeq, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.1/modules/core/src/datastructs.cpp, line 372
// terminate called throwing an exception
[self.statusText setStringValue:@"writing to files"];
/* build a path to save a file in the documents directoy */
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docs = [paths objectAtIndex:0];
NSString *xmlpath_kp = [docs stringByAppendingPathComponent:@"keypoints.xml"];
NSString *xmlpath_desc = [docs stringByAppendingPathComponent:@"descriptors.xml"];
/* serialize to xml and save to disc */
cvSave([xmlpath_kp UTF8String], keypoints);
cvSave([xmlpath_desc UTF8String], descriptors);
[self.statusText setStringValue:@"done"];
/* don't forget your cleanup ;) */
cvReleaseImage(&image);
cvClearMemStorage(storage);
return 1;
}
有人知道发生了什么吗?任何帮助将不胜感激!
答案 0 :(得分:1)
我测试了部分代码抛出错误。以下代码没有给出任何错误,只需检查一下。
IplImage* image = cvLoadImage("C:\\Koala.jpg",CV_LOAD_IMAGE_GRAYSCALE);
CvSeq* kp_pns;
CvSeq* desct;
CvSURFParams pams;
pams.hessianThreshold=10;
pams.nOctaveLayers=4;
pams.nOctaves=3;
pams.upright = true;
CvMemStorage *storage = cvCreateMemStorage(0);
cvExtractSURF(image,NULL,&kp_pns,&desct,storage,pams,0);
我能够毫无错误地提取冲浪关键点。我希望错误将得到解决。
答案 1 :(得分:0)
调整SURF的hessianThreshold; 来自OpenCV他们说;
hessianThreshold 只有粗体大于此值的特征 提取。良好的默认值是~300-500(可能取决于平均值 局部对比度和图像的清晰度)。用户可以进一步过滤 根据他们的粗麻布值和其他特征输出一些特征 特性
答案 2 :(得分:0)
安德烈卡马耶夫指出,这是2.4.0中的一个错误。 2.4.1。升级确实解决了这个问题。