1

Mac の OpenCV で次のコードを使用しています。次の関数は、別の関数から画像ファイルへのパスを受け取り、正常に動作します。ただし、cvExtractSURF は次のような例外をスローします。

OpenCV エラー: cvCreateSeq 内の入力配列 () のサイズが正しくありません。 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;
}

誰が何が起こっているのか知っていますか?どんな助けでも大歓迎です!

4

3 に答える 3

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

エラーなしでサーフ キーポイントを抽出できます。エラーが解決されることを願っています。

于 2012-07-03T20:13:19.303 に答える
0

SURF の hessianThreshold を調整します。OpenCVから彼らは言います。

hessianThresholdは、それより大きいヘッシアンを持つフィーチャのみが抽出されます。適切なデフォルト値は 300 ~ 500 です (画像の平均的なローカル コントラストとシャープネスに依存する場合があります)。ユーザーは、ヘシアン値やその他の特性に基づいて、一部の機能をさらに除外できます。

于 2012-07-30T07:24:47.193 に答える
0

Andrey Kamaev が指摘したように、これは 2.4.0 と 2.4.1 のバグでした。アップグレードはそれを修正しました。

于 2012-07-30T12:11:02.390 に答える