Сшивание двух каналов веб-камеры вместе в OpenCV

Используя код ниже:

#include <opencv2/opencv.hpp>
#include <opencv2/stitching/stitcher.hpp>
#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
Mat fr1, fr2, pano;
bool try_use_gpu = false;
vector<Mat> imgs;
VideoCapture cap(0), cap2(1);

while (true)
{
cap >> fr1;
cap2 >> fr2;
imgs.push_back(fr1.clone());
imgs.push_back(fr2.clone());

Stitcher test = Stitcher::createDefault(try_use_gpu);
Stitcher::Status status = test.stitch(imgs, pano);

if (status != Stitcher::OK)
{
cout << "Error stitching - Code: " <<int(status)<<endl;
return -1;
}

imshow("Frame 1", fr1);
imshow("Frame 2", fr2);
imshow("Stitched Image", pano);

if(waitKey(30) >= 0)
break;
}
return 0;
}

Этот код выдает ошибку состояния 1 там. Я не знаю, что это значит, и при этом я не знаю, почему эта вещь испытывает трудности с каналами веб-камеры. В чем дело?

-Тони

4

Решение

Ошибка где-то в процессе захвата, а не в части сшивания. Этот код работает нормально (используя эти пример изображения):

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/stitching/stitcher.hpp>
#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

int main()
{
Mat fr1 = imread("a.jpg");
Mat fr2 = imread("b.jpg");
Mat pano;
vector<Mat> imgs;

Stitcher stitcher = Stitcher::createDefault(); // The value you entered here is the default

imgs.push_back(fr1);
imgs.push_back(fr2);

Stitcher::Status status = stitcher.stitch(imgs, pano);

if (status != Stitcher::OK)
{
cout << "Error stitching - Code: " <<int(status)<<endl;
return -1;
}

imshow("Frame 1", imgs[0]);
imshow("Frame 2", imgs[1]);
imshow("Stitched Image", pano);
waitKey();

return 0;
}

Сообщение об ошибке Nik Bougalis duged звучит так, будто брошюровщик не может соединить изображения. Достаточно ли четкие изображения, чтобы брошюровщик мог найти соответствия?

Если вы уверены, что это так, разделите вашу проблему дальше, чтобы найти реальную ошибку. Можете ли вы настроить брошюра для работы с кадрами из ваших камер? Правильно ли снимаются ваши камеры? Какой тип изображения они возвращают?

С другой стороны, сшивание вряд ли сработает в реальном времени, что делает ваш цикл во время захвата немного неуместным. Возможно, вы захотите либо захватить ваши кадры заранее и сделать все это в постобработке, либо ожидать, что большая ручная оптимизация приблизится к приемлемой частоте кадров.

4

Другие решения

Просматривая OpenCV Веб-сайт, мы находим это:

class CV_EXPORTS Stitcher
{
public:
enum { ORIG_RESOL = -1 };
enum Status { OK, ERR_NEED_MORE_IMGS };

// ... other stuff

Поскольку возвращаемый код имеет тип Sticher::Status мы можем быть уверены, что 1 на самом деле Sticher::Status::ERR_NEED_MORE_IMGS, Что говорит о том, что sticher нужно больше изображений.

Боюсь, не очень информативно, но это для вас начало. Вы смотрели на какие-нибудь примеры сшивания?

2

По какой-то причине проблема заключается в сегменте .clone (). Изменение кода на:

int main(int argc, char *argv[])
{
Mat fr1, fr2, copy1, copy2, pano;
bool try_use_gpu = false;
vector<Mat> imgs;
VideoCapture cap(0), cap2(1);

while (true)
{
cap >> fr1;
cap2 >> fr2;
fr1.copyTo(copy1);
fr2.copyTo(copy2);

imgs.push_back(copy1);
imgs.push_back(copy2);

//ETC
}
return 0;
}

Это работало просто отлично.

1
По вопросам рекламы [email protected]