Использование итераторов открытого CV segfault - PullRequest
2 голосов
/ 04 мая 2011

Я хочу сделать что-то вроде eigenfaces , но с разными изображениями (не лицами). У меня есть вектор изображений, images. Из этих изображений я хочу сделать объект Mat, data, который содержит в каждой строке изображение, записанное в виде вектора строки. Вот что я пытался сделать:

// This is basically a matrix that needs to have a bunch of images as rows.
Mat data(numImages, IMAGE_SIZE * IMAGE_SIZE, CV_8UC1);
// I also replaced CV_8U by images[0].type() and CV_8U. no change
MatIterator_<unsigned short> iter = data.begin<unsigned short> (),
                             iter_end = data.end<unsigned short> (), 
                             iter2;

for (i = 0; i < numImages; ++i)
{
    MatIterator_<unsigned short> begin = images[i].begin<unsigned short> ();
    MatIterator_<unsigned short> end = images[i].end<unsigned short> ();
    for (iter2 = begin; iter2 != end; iter2++)
    {
        *iter = *iter2; // Segfault is here.
        if (iter != iter_end) // safety check
            iter++;
        else
            perror("Screwed!\n"); // This does not execute!
    }
}

Помогите!

Спасибо!

1 Ответ

1 голос
/ 04 мая 2011

Я думаю, что в вашей матрице каждое поле имеет 1 байт (CV_8UC1), но ваш итератор является "беззнаковым коротким" итератором. Short без знака обычно имеет 2 байта. измените его на

data.begin<unsigned char> ()

также проверьте stdint.h: http://en.wikipedia.org/wiki/Stdint.h

...