2012-07-03 53 views
1

我在Mac上使用OpenCV下面的代碼。以下函數從另一個函數接收圖像文件的路徑,並且工作正常。然而,cvExtractSURF拋出一個異常,指出:cvExtractSURF拋出異常,錯誤的輸入數組大小()在cvCreateSeq

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

會有人知道這是怎麼回事?任何幫助,將不勝感激!

+0

能否以64位模式運行應用程序會成爲問題?另外,我將不得不重新編譯OpenCV。 – Tiago

+1

這是2.4.0和2.4.1中的一個錯誤。應該在剛剛發佈的OpenCV 2.4.2中修復。 –

+0

幹得好,你們確實在2.4.2中修復了它!感謝您的領導! – Tiago

回答

0

由於安德烈Kamaev指出,這是在2.4.0 & 2.4.1的錯誤。升級確實解決了它。

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

我能提取衝浪關鍵點沒有任何錯誤。我希望這個錯誤能夠得到解決。

+0

感謝您的快速回復!我只是試了一下,不幸的是它拋出了相同的錯誤... 我有一種感覺,它有一些與我在64位模式下運行它,請參閱行89:http://code.opencv.org /projects/opencv/repository/revisions/8811/entry/trunk/opencv/modules/legacy/src/features2d.cpp – Tiago

0

調整SURF的hessianThreshold;他們說OpenCV的 ;

hessianThreshold only features with hessian larger than that are extracted. good default value is ~300-500 (can depend on the average local contrast and sharpness of the image). user can further filter out some features based on their hessian values and other characteristics.