Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z dodawaniem danych do sringstream

Ostatnio zmodyfikowano 2014-11-06 17:36
Autor Wiadomość
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.
C/C++
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++ )
        {
            //w poniższej linijce tkwi problem
            descriptorsData << bowDescriptor.at < double >( i, j ); //tutaj otrzymuję wyjątek
           
            if( j != bowDescriptor.cols - 1 )
                 descriptorsData << ";";
           
        }
    }
   
    vecImages[ ii ].Data = descriptorsData.str();
}
P-120051
pekfos
» 2014-11-05 21:12:49
C/C++
sprintf( filenameDesc, name.c_str() );
To nie jest dobry sposób na skopiowanie stringa. W tym kodzie nawet nie ma potrzeby kopiowania stringa.
P-120052
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?
P-120077
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ć?
P-120085
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).
P-120086
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.
P-120088
« 1 »
  Strona 1 z 1