2012-06-03 3 views
4

Запуск проблемы с opencv 2.4.0 Функция findContours постоянно сбой. К сожалению, мне было очень сложно определить проблему. Надеюсь, что кто-то столкнулся с подобной проблемой.C++ OpenCV 2.4.0 findContours crashing with Kinect Depth Stream

Я собираю поток глубины с сенсора Kinect с помощью Microsoft K4W SDK 1.5, копируя его в Matrix OpenCV, а затем преобразуя его в изображение 8UC1 через cvtColor и порог. Я запускаю countNonZero, чтобы убедиться, что изображение не пустое, прежде чем передать его в findContours. Но даже простейшая реализация findcountours падает.

Вот мой основной код:

rawdepth = Mat(Size(640,480),CV_8UC4); 
thresh = Mat::zeros(640,480,CV_8UC1); 

// storage for contours 
vector<vector<Point>> contours; 

cvtColor(rawdepth,thresh,CV_RGB2GRAY); 
threshold(thresh,thresh,0,255,THRESH_BINARY); 

if(countNonZero(thresh) > 100) { 
    // This crashes 
    findContours(thresh,contours,RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);   
} 

Я проверить, что фактический Mat передается в findcontours является одноканальным изображением, и что это не пустое (то есть, есть некоторые 500+ очков). Но мне интересно, если это проблема с кучей или потоком, так как я слышал, что findcontours могут действительно модифицировать входной Mat?

На этом этапе я попытаюсь использовать OpenCV 2.4.1, который был только что выпущен, хотя я не вижу никаких исправленных ошибок, которые указывают на устранение этой проблемы.

Любые идеи очень ценятся ...

+0

Вы проследили крах обратно до 'findContours()'? – karlphillip

+0

Да. На самом деле, я могу запустить другие функции, такие как Canny, на одном и том же изображении, и он отлично работает. Я также проверил, что «thresh» Mat передается findContours - это одноканальное изображение. – eclay

ответ

2

Проблема оказалась флаг компилятора, который ограничивал использование стека программы до 10 МБ (10 000 000 байт). К сожалению, этого было недостаточно для видео Kinect, которое я снимал. После удаления флага компилятора findContours теперь будут компилироваться и работать правильно!

Я использую VC++ 2010, а флаги компилятора - в Project Properties -> Linker-> System. Эти два поля были: "Stack Reserve Size" и "Stack Commit Size"

После очистки их и перекомпиляции, проект прекрасно работает!

1

Здесь есть две возможные проблемы.

Во-первых, необработанный поток глубины от Kinect составляет 16 бит (3 младших разряда - индекс игрока, остальные 13 бит - глубина в мм), поэтому, если вы копируете эти данные в 8-битное изображение, вы получаете только половину его, и это gobbledegook.

Во-вторых, OpenCV скомпилирован по-разному для конфигураций отладки и выпуска. Если вы компилируете профиль Debug, вам нужно использовать библиотеки отладки (версия # d). Поэтому для использования cv :: findContours вам нужно opencv_imgproc240. [Lib/dll] и opencv_core240. [Lib/dll]. Ни cv :: namedWindow/cv :: imshow (которые очень удобны для отладки), либо cv :: findContours будут работать правильно, если вы используете неправильную конфигурацию.

Надеюсь, что помогает.

1

Я хотел бы заметить, что у меня была такая же проблема, связанная с сбоем метода findContours(), как упоминалось во втором ответе, проблема заключалась в том, что я использовал не-отладочную версию opencv_imgproc240.dll и opencv_core240. dll в режиме отладки, сменив на XXd.dll проблему.

+1

Возможно, это скорее комментарий к существующему ответу, чем сам ответ. –

Смежные вопросы