4

使用下面的代码:

#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

3 回答 3

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 挖出的错误消息听起来像是拼接器无法连接图像。图像是否足够清晰,可以让缝合器找到对应关系?

如果您确定它们是,请进一步拆分您的问题以找到真正的错误。您可以调整拼接器以处理相机中的静止帧吗?您的相机是否正确捕捉?他们返回哪种类型的图像?

另一方面,拼接不太可能实时工作,这使得捕获期间的循环看起来有点不合适。您可能希望提前捕获帧并在后处理中完成所有操作,或者期望进行大量手动优化以接近可观的帧速率。

于 2013-04-10T07:51:22.427 回答
2

浏览 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。这表明贴纸需要更多图像。

恐怕不是很丰富,但这对你来说是一个开始。你看过那里的任何缝合例子吗?

于 2013-04-03T23:01:31.500 回答
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;
}

这工作得很好。

于 2013-04-12T14:58:55.770 回答