Visual Studio 2010 で OpenCV 2.3.1 を使用してイメージ スティッチングのプロジェクトに取り組んでいます。
私は現在2つの問題を抱えています。
(私の評判は10を超えていないので、この投稿には2つのハイパーリンクしか投稿できません。コメント領域に別の2つを投稿します)
次のリンクで説明されている手順に従いました opencvで2つの画像をステッチする
- 両方の画像で SURF 特徴を見つけて一致させる
- RANSAC による外れ値の除去
- ホモグラフィの計算
- ターゲット画像を参照画像にワープする
下の写真は私が現在持っている結果です:
2 つの画像は、カメラを使用して同じ位置で別の方向から撮影されています(三脚を使用しました)。
それから私は別のテストを試みました。今回も同じカメラで2枚撮影。しかし、カメラを元の位置から少し動かしてから、2 枚目の写真を撮りました。結果は、次のようにかなりひどいものです。
問題 1:**2 台のカメラが異なる位置にある場合、**標準のパノラマ スティッチング技術 (ホモグラフィまたはカメラ回転モデルに基づく) が機能しないということですか?
将来、FOVを広げるために、異なる位置にある2台のカメラにスティッチングアルゴリズムを実装したいので、異なる位置で撮影した画像をスティッチングしようとしました:(コメントに写真を投稿します。 plz チェックFOVを広げます )
しかし今、私は間違った方向に進んでいるようです:(。
アルゴリズムの実行中、特徴の検出と照合にほとんどの時間がかかることがわかりました。
問題 2: 2 つの画像の特定の部分 (オーバーラップ領域) の特徴を計算するだけで、ホモグラフィを使用して変換を実行できますか? つまり、画像全体を計算するわけではありません。
このように考えるのは、2 枚の画像の重なり部分の量を指定すれば、画像全体の特徴量を計算する必要がないと思うからです。オーバーラップ領域の特徴を計算して一致させることができれば、速度が大幅に向上するはずです。
以下に示す最初のコードは、画像全体の特徴を計算する元のコードです。
int minHessian = 3000;
SurfFeatureDetector detector( minHessian );
vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect( frm1, keypoints_1 );
detector.detect( frm2, keypoints_2 );
//-- Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor; ///
Mat descriptors_1, descriptors_2;
extractor.compute( frm1, keypoints_1, descriptors_1 );
extractor.compute( frm2, keypoints_2, descriptors_2 );
アルゴリズム全体の実行に必要な時間を短縮するために、次のことを行いました。
//detector.detect( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1 );
//detector.detect( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2 );
//-- Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor; ///
Mat descriptors_1, descriptors_2;
extractor.compute( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1, descriptors_1 );
extractor.compute( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2, descriptors_2 );
上記のコードを使用すると、計算時間は大幅に短縮されますが、悪い結果が得られます: (コメントに写真を投稿します。悪い結果を確認してください)
現在立ち往生しており、次に何をすべきかわかりません。本当に希望し、助けを感謝します。ありがとう。