Ошибка утверждения OpenCV с помощью Stitcher

Я пишу программу, которая принимает видео в качестве входных данных и возвращает панорамное изображение. Я выполняю этот код:

vector< Mat > vImg;
Mat rImg;
Mat img;



VideoCapture cap("../Debug/vid/vid.avi");

if (!cap.isOpened())
{
    cout << "Can't open video";
    waitKey(0);
    return ;
}


//default stitcher
Stitcher stitcher = Stitcher::createDefault(true);

//set orb finder
Ptr<FeaturesFinder> finder=new OrbFeaturesFinder();
stitcher.setFeaturesFinder(finder); 

//set seam resolution
stitcher.setSeamEstimationResol(0.08);

//set confidence threshold
stitcher.setPanoConfidenceThresh(0.5);

//set warper
Ptr<WarperCreator> warper = new cv::PlaneWarper();
stitcher.setWarper(warper);

//set exposure compensation
Ptr<ExposureCompensator> exposure_compensator = ExposureCompensator::createDefault(ExposureCompensator::GAIN);
stitcher.setExposureCompensator(exposure_compensator);


//set seam finder
Ptr<SeamFinder> seam_finder = new DpSeamFinder(DpSeamFinder::COLOR_GRAD);
stitcher.setSeamFinder(seam_finder);

//set matcher
Ptr<FeaturesMatcher> matcher = new BestOf2NearestMatcher(true);
stitcher.setFeaturesMatcher(matcher);


//sett wave correction
stitcher.setWaveCorrection(true);

cap >> img;
vImg.push_back(img);
vImg.push_back(img);    



int counter = 1;



while (counter < total_frames)
{

    Mat img_loop;

    cap >> img_loop;


    vImg.at(1) = img_loop;



    stitcher.stitch(vImg, rImg);


    if (rImg.rows>0 && rImg.cols>0)
    {
        imshow("debug", rImg);      


        vImg.at(0) = rImg;
    }



    rImg = NULL;


    counter ++;

}

но это дает мне ошибку «Утверждение не выполнено (dims ‹ = 2 && data ...)». В чем может быть проблема?

Я использую сообщество Visual Studio 2013, opencv 2.4.10 и Windows 7 x64.

EDIT Добавлен "стек вызовов"

    KernelBase.dll!_RaiseException@16() 
Unknown>        msvcr120d.dll!_CxxThrowException(void *pExceptionObject, const_s__ThrowInfo * pThrowInfo) Riga 154  C++
    opencv_core2410d.dll!774ec7f8() Sconosciuto

РЕДАКТИРОВАТЬ Я заметил, что если я сшиваю 2 одинаковых изображения, это дает мне ошибку. Это нормально?


person bjorn    schedule 18.03.2015    source источник
comment
Вы пробовали показывать изображения перед прошивкой?   -  person api55    schedule 18.03.2015
comment
Да, с imshow изображения отображаются корректно!   -  person bjorn    schedule 19.03.2015
comment
Пробовал с отладчиком. Если я не поставлю ключ ожидания после imshow, он откроет только серое окно!   -  person bjorn    schedule 19.03.2015
comment
да, это ожидаемо... если вы хотите показать это на короткое время, используйте небольшое число, например waitkey(10), но это не должно приводить к ошибке утверждения   -  person api55    schedule 19.03.2015
comment
Как вы думаете, мне стоит попробовать версию 3 opencv?   -  person bjorn    schedule 19.03.2015
comment
Я плохо проверял, но вы можете попробовать. Где вы инициализировали переменную сшивателя? Я думаю, что вы пропустили шаг, но я не уверен, можете ли вы отредактировать и добавить все места, где вы используете переменную сшивателя? Я думаю, у меня есть идея, что не так   -  person api55    schedule 19.03.2015
comment
Отредактировано с частью инициализации!   -  person bjorn    schedule 19.03.2015
comment
Спасибо, вы пробовали использовать false в значении try_use_gpu? (тот, что при создании прошивальщика). Я читал, что значения по умолчанию предназначены для режима процессора ... Кроме того, вы пытались использовать сшиватель по умолчанию без каких-либо дополнительных вещей (warper, resol и т. д.)?   -  person api55    schedule 19.03.2015
comment
да, со значениями по умолчанию выдает ошибку «Недостаточно памяти». Я не могу понять проблему :/   -  person bjorn    schedule 19.03.2015
comment
Заметил отладчиком, что rImg после команды stack.stich всегда пустой. Может ли это быть полезным для вас?   -  person bjorn    schedule 19.03.2015
comment
Хмммм, эта ошибка нехватки памяти тоже странная.... это происходит с первой парой? ну, это ваша ошибка, jeje... изображение пустое, поэтому, когда вы переходите ко второй итерации, на одном изображении что-то есть, а на другом пусто... так что это несоответствие размера и, следовательно, дает вам ошибка подтверждения.... вы должны проверить возвращаемое значение функции стежка (она возвращает Stitcher::Status, который может быть приведен как int)   -  person api55    schedule 19.03.2015
comment
Я пробовал с Stitcher::status, и он дает мне 1 (я думаю, что это ERR_NEED_MORE_IMGS), поэтому я читаю 4 кадра за раз таким образом: cap >> img_loop; cap >> img_loop2; cap >> img_loop3; vImg.at(1) = img_loop; vImg.at(2) = img_loop2; vImg.at(3) = img_loop3;, и это дает мне ошибку нехватки памяти.   -  person bjorn    schedule 20.03.2015
comment
Считаете ли вы, что выполнение конвейера вручную вместо использования сшивателя по умолчанию может решить проблему?   -  person bjorn    schedule 20.03.2015
comment
кажется, что ему нужно более 2 изображений... теперь у вас другая ошибка.... Ошибка нехватки памяти... это странно.... обычно эта ошибка появляется, когда она находится в графическом процессоре.... если она в ЦП обычно это не говорит вам ... либо ваш компьютер перестает отвечать на запросы, либо программа неожиданно умирает. попробуйте использовать Stitcher::createDefault(false);   -  person api55    schedule 20.03.2015
comment
Я пробовал с Stitcher::createDefault(false);, но выдает ошибку о нехватке памяти. Может быть, изображения слишком похожи?   -  person bjorn    schedule 20.03.2015
comment
можете ли вы отладить его и посмотреть, где он дает эту ошибку?   -  person api55    schedule 20.03.2015
comment
Вы имеете в виду отладку функции прошивания?   -  person bjorn    schedule 20.03.2015
comment
ваша программа, посмотрите, какая инструкция (стежка opencv) дает вам недостаточно памяти... Чтобы иметь представление о том, что может происходить...   -  person api55    schedule 20.03.2015
comment
Я не знаю почему, но я не могу отладить функцию сшивания (я установил символ сервера Microsoft). Однако это ошибка, которую запускает приведенный выше код: OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)si ze.p[0] && (unsigned)i1 < (unsigned)size.p[1] && type() == DataType<_Tp>::type) in cv::Mat_<int>::operator (), file C:\builds\2_4_PackSlave-win32-vc12-shared\op encv\modules\core\include\opencv2/core/mat.hpp, line 993   -  person bjorn    schedule 20.03.2015
comment
Но это ваша первая ошибка... она была исправлена ​​(одно из изображений пустое)   -  person api55    schedule 20.03.2015
comment
Вы правы (извините, эта проблема меня бесит xD). Вот ошибка: OpenCV Error: Insufficient memory (Failed to allocate 501945556 bytes) in cv::Ou tOfMemoryError, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\co re\src\alloc.cpp, line 52   -  person bjorn    schedule 20.03.2015
comment
Ну, он пытается выделить около 500 МБ, довольно много для сшивания 4 изображений .... У вас есть трассировка (добавьте ее к вашему вопросу), чтобы увидеть, какая функция отвечает ...   -  person api55    schedule 20.03.2015
comment
Правда я переделал код, так что сшивает всего 2 картинки. Для стека вызовов у меня есть только это `KernelBase.dll!_RaiseException@16() Sconosciuto › msvcr120d.dll!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo) Riga 154 C++ opencv_core2410d.dll!774ec7f8() Sconosciuto ` но я думаю, что это бесполезно :/. Ps: Я очень ценю вашу преданность моей проблеме: D   -  person bjorn    schedule 20.03.2015
comment
Извините, я отредактировал сообщение с вызовом стека!   -  person bjorn    schedule 20.03.2015


Ответы (2)


Если проблема связана с выделением памяти, вы можете попробовать объявить свой вектор статическим.

static vector<Mat> vImg;

Я не уверен в этом, но я столкнулся с этой проблемой при выделении огромного массива, и этот трюк решил мою проблему вместо использования указателей.

Я надеюсь, что это помогает.

person alitemel    schedule 20.03.2015
comment
Я попробую позже, и я дам вам знать! - person bjorn; 20.03.2015

Я решил реализовать ручное управление конвейером сшивания. Спасибо вам всем!

person bjorn    schedule 25.03.2015