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 のWeb サイトを調べると、次のことがわかります。

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 に答える