Problem z dodawaniem danych do sringstream
Ostatnio zmodyfikowano 2014-11-06 17:36
jawka7 Temat założony przez niniejszego użytkownika |
Problem z dodawaniem danych do sringstream » 2014-11-05 20:55:01 Witam, Odrazu mówię, że nie jestem zbyt dobry w c++ jednak pewna sytuacja zmusiła mnie do napisania kawałka kodu w tym języku. Po uruchomieniu programu w różnych etapach działania pętli wyskakuje mi komunikat "Unhandled exception at 0x012D2D28 in BoFSIFT.exe: 0xC0000005: Access violation reading location 0x04CB1000.", wyskakuje to czasami dopiero po setnej iteracji a czasami jeszcze później. Nie mam pojęcia w czym tkwi problem, poniżej zamieszczam fragment z kodem, w którym tkwi problem: Problem pojawia sie podczas zapisu danych do zmiennej descriptorsData, fragment ten został okomentowany. Mat dictionaryDesc = dictionary;
Ptr < DescriptorMatcher > matcher( new FlannBasedMatcher ); Ptr < FeatureDetector > detectorDesc( new SiftFeatureDetector() ); Ptr < DescriptorExtractor > extractor( new SiftDescriptorExtractor ); BOWImgDescriptorExtractor bowDE( extractor, matcher ); bowDE.setVocabulary( dictionaryDesc );
char * filenameDesc = new char[ 100 ]; DWORD genDescriptorsStartTime = GetTickCount();
for( int ii = 0; ii < vecImages.size(); ii++ ) { string name = vecImages[ ii ].Path; printf( "Descriptor: %s\n", name ); sprintf( filenameDesc, name.c_str() ); Mat img = imread( filenameDesc, CV_LOAD_IMAGE_GRAYSCALE ); vector < KeyPoint > keypoints; detectorDesc->detect( img, keypoints ); Mat bowDescriptor; bowDE.compute( img, keypoints, bowDescriptor ); stringstream descriptorsData; for( int i = 0; i < bowDescriptor.rows; i++ ) { for( int j = 0; j < bowDescriptor.cols; j++ ) { descriptorsData << bowDescriptor.at < double >( i, j ); if( j != bowDescriptor.cols - 1 ) descriptorsData << ";"; } } vecImages[ ii ].Data = descriptorsData.str(); }
|
|
pekfos |
» 2014-11-05 21:12:49 sprintf( filenameDesc, name.c_str() );
|
To nie jest dobry sposób na skopiowanie stringa. W tym kodzie nawet nie ma potrzeby kopiowania stringa. |
|
jawka7 Temat założony przez niniejszego użytkownika |
» 2014-11-06 12:33:24 Ale czy to może powodować wyrzucanie tego błędu? |
|
pekfos |
» 2014-11-06 15:39:01 Może tak, może nie. Sama bezsensowność części tego kodu nie jest wystarczającym powodem, by to poprawić? |
|
Monika90 |
» 2014-11-06 15:44:00 printf( "Descriptor: %s\n", name ); To też ma niezdefiniowane zachowanie (jeżeli da się skompilowac, bo nie musi). |
|
jawka7 Temat założony przez niniejszego użytkownika |
» 2014-11-06 17:36:46 http://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O
Dla mojego usprawiedliwienia podrzucam link skąd to pobrałem, chciałem jedynie sprawdzić rezulataty po wykonaniu tego algorytmu. A przez mój słaby poziom c++ zmarnowałem jedynie czas. Mam nauczkę zeby nie ufać gotowym programom. Chyba napiszę to od podstaw w .NET z użyciem EMGU. Myślałem że w tym kodzie tkwi jedynie jedna mała wada, ale skoro to ma zbyt dużo wad to wole już sam poświęcić czas na napisanie własnego kodu niż poprawę tego. |
|
« 1 » |