Используя код ниже:
#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 там. Я не знаю, что это значит, и при этом я не знаю, почему эта вещь испытывает трудности с каналами веб-камеры. В чем дело?
-Тони
Ошибка где-то в процессе захвата, а не в части сшивания. Этот код работает нормально (используя эти пример изображения):
#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 звучит так, будто брошюровщик не может соединить изображения. Достаточно ли четкие изображения, чтобы брошюровщик мог найти соответствия?
Если вы уверены, что это так, разделите вашу проблему дальше, чтобы найти реальную ошибку. Можете ли вы настроить брошюра для работы с кадрами из ваших камер? Правильно ли снимаются ваши камеры? Какой тип изображения они возвращают?
С другой стороны, сшивание вряд ли сработает в реальном времени, что делает ваш цикл во время захвата немного неуместным. Возможно, вы захотите либо захватить ваши кадры заранее и сделать все это в постобработке, либо ожидать, что большая ручная оптимизация приблизится к приемлемой частоте кадров.
Просматривая 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 нужно больше изображений.
Боюсь, не очень информативно, но это для вас начало. Вы смотрели на какие-нибудь примеры сшивания?
По какой-то причине проблема заключается в сегменте .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;
}
Это работало просто отлично.