使用以下代码:
#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。我不知道这意味着什么,也不知道为什么这个东西在使用网络摄像头时非常困难。怎么了?
托尼
答案 0 :(得分:4)
错误位于捕获过程中的某个位置,而不是拼接部分。此代码工作正常(使用these示例图像):
#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挖出的声音就像拼接器无法连接图像一样。图像是否足够清晰,以便缝合器找到对应关系?
如果您确定它们是,请进一步分解您的问题以找到真正的错误。您是否可以调整拼接器以使用相机中的静止帧?你的相机是否正确捕捉?他们返回了哪种类型的图像?
另一方面,拼接不太可能实时工作,这使得捕捉过程中的循环看起来有点不合适。您可能希望提前捕获帧并在后处理中完成所有操作,或者期望进行大量手动优化以获得接近可观帧率的任何值。
答案 1 :(得分:2)
通过OpenCV website,我们发现:
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 :(得分:1)
无论出于何种原因,问题都存在于.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;
}
这很好用。