c++ - cvExtractSURF 抛出异常,cvCreateSeq 中输入数组 ( ) 的大小不正确

标签 c++ objective-c macos opencv

我在 Mac 上将以下代码与 OpenCV 结合使用。以下函数从另一个函数接收图像文件的路径,并且工作正常。但是,cvExtractSURF 会抛出一个异常说明:

OpenCV Error: Incorrect size of input array () in cvCreateSeq, file >/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, line 372 terminate called throwing an exception

代码如下:

- (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;
}

有人知道这是怎么回事吗?任何帮助将不胜感激!

最佳答案

我测试了你抛出错误的部分代码。下面的代码没有给出任何错误,请检查一下。

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);

我能够毫无错误地提取冲浪关键点。我希望错误会得到解决。

关于c++ - cvExtractSURF 抛出异常,cvCreateSeq 中输入数组 ( ) 的大小不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11317921/

相关文章:

c++ - 在 Visual Studio (2005) 下使用 Makefile 代替解决方案/项目文件

objective-c - iOS : How to implement a bookmark for ePub reader?

在 OSX Yosemite 中加载时出现 Rcmdr 错误

macos - "Missing required icons"使用 Application Loader 提交应用程序时

iphone - 设置 UIImage 边框

macos - 如何使用 NSPageController 在 NSViewController 之间切换?

c++ - 在 C++ 的条件语句中使用字符

c++ - 64位架构优化

c++ - 清除输入流

objective-c - 无法实现俄罗斯方 block 移动方法