Разделение кадра стереокамеры на левую и правую рамку датчика
Я работаю со стереокамерой и снимаю кадры с помощью opencv. Захваченный кадр содержит изображение от левого и правого датчика, соединенных вместе в одном изображении. Итак, с разрешением 640*480 у меня есть изображение с 1280 столбцами и 480 строками. Первые 640 столбцов принадлежат одному датчику, а 641-1280 - второму датчику. Мне нужно разделить его на левую и правую рамку. Я пытаюсь обрезать левый и правый кадры, но получаю ошибку. Я удалил лишний код и показываю только проблемную область.
cap >> frame; // get a new frame from camera
Mat fullframe = frame(Rect(0, 0, 1280, 480 )); //only to check that I have 1280 columns and 480 rows.and this line works
Mat leftframe= frame(Rect(0,0,640,480)); // This also works
Mat rightframe= frame(Rect(641,0,1280,480));// this gives an error
Ошибка приходит в cmd.exe и является:
OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x +roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <=m.rows) in cv::Mat::Mat, file C:\builds\2_4_PackSlave-win64-vc11-shared\opencv\modules\core\src\matrix.cpp, line 323
Что я не понимаю. Если у меня 1280 столбцов, почему я не могу оставить только 641–1280 столбцов. Все, что выше 0, выдает ту же ошибку, так что даже если я использую:
Mat rightframe= frame(Rect(1,0,1280,480)); // I still get same error
Любая помощь?
2 ответа
Просмотрите документацию Rect(x, y, width, height), где x, y - координаты верхнего левого угла. Соответственно должно быть Mat rightframe= frame(Rect(641,0,640,480));// this gives an error
,
OpenCV обычно предполагает, что верхняя и левая границы прямоугольника являются включающими, а правая и нижняя - нет. Поэтому я предлагаю, чтобы ваш код выглядел следующим образом.
cap >> frame;
Mat fullframe = frame(Rect(0, 0, 1280, 480 ));
Mat leftframe= frame(Rect(0, 0, 640, 480));
Mat rightframe= frame(Rect(640, 0, 640, 480));
Я знаю, что уже немного поздно, но это может помочь другим, кто взглянет на этот вопрос в будущем.