2017-08-18 20 views
1

私はOpenCV 3.0で "warpPerspective"関数を使用しようとしています。私はこの例を使用しています:OpenCV - warpPerspective

http://answers.opencv.org/question/98110/how-do-i-stitch-images-with-two-different-angles/

私は最初の画像の右側にROIと第2の画像の左側に別のものを作成する必要があります。 ORBを使用して説明を抽出して計算し、これらの記述に一致させます。私は元のコードの多くを変更しませんでした。 ROIだけです。

問題は、私は視点をワープしようとするすべての画像は次のように出てくるということです。私はすでに画像の複数のペアを試してみました。問題が解決しない

warped image

#include "opencv2/opencv.hpp" 
#include <iostream> 
#include <fstream> 
#include <ctype.h> 

using namespace cv; 
using namespace std; 


int main(int argc, char* argv[]) 
{ 

Mat img1 = imread("image2.jpg"); 
Mat img2 = imread("image1.jpg"); 
namedWindow("I2", WINDOW_NORMAL); namedWindow("I1", WINDOW_NORMAL); 

Ptr<ORB> o1 = ORB::create(); 
Ptr<ORB> o2 = ORB::create(); 
vector<KeyPoint> pts1, pts2; 
Mat desc1, desc2; 
vector<DMatch> matches; 

Size s = img1.size(); 
Size s2 = img2.size(); 

Rect r1(s.width - 200, 0, 200, s.height); 
//rectangle(img1, r1, Scalar(255, 0, 0), 5); 
Rect r2(0, 0, 200, s2.height); 
//rectangle(img2, r2, Scalar(255, 0, 0), 5); 
Mat mask1 = Mat::zeros(img1.size(), CV_8UC1); 
Mat mask2 = Mat::zeros(img1.size(), CV_8UC1); 
mask1(r1) = 1; 
mask2(r2) = 1; 
o1->detectAndCompute(img1, mask1, pts1, desc1); 
o2->detectAndCompute(img2, mask2, pts2, desc2); 
BFMatcher descriptorMatcher(NORM_HAMMING, true); 

descriptorMatcher.match(desc1, desc2, matches, Mat()); 
// Keep best matches only to have a nice drawing. 
// We sort distance between descriptor matches 
Mat index; 
int nbMatch = int(matches.size()); 
Mat tab(nbMatch, 1, CV_32F); 
for (int i = 0; i<nbMatch/2; i++) 
{ 
    tab.at<float>(i, 0) = matches[i].distance; 
} 
sortIdx(tab, index, SORT_EVERY_COLUMN + SORT_ASCENDING); 
vector<DMatch> bestMatches; 
vector<Point2f> src, dst; 
for (int i = 0; i < nbMatch/2; i++) 
{ 
    int j = index.at<int>(i, 0); 
    cout << pts1[matches[j].queryIdx].pt << "\t" << pts2[matches[j].trainIdx].pt << "\n"; 
    src.push_back(pts1[matches[j].queryIdx].pt + Point2f(0, img1.rows)); // necessary offset 
    dst.push_back(pts2[matches[j].trainIdx].pt); 
} 
cout << "\n"; 
Mat h = findHomography(src, dst, RANSAC); 
Mat result; 
cout << h << endl; 

warpPerspective(img2, result, h.inv(), Size(3 * img2.cols + img1.cols, 2 * img2.rows + img1.rows)); 

imshow("I1", img1); 
imshow("I2", img2); 

Mat roi1(result, Rect(0, img1.rows, img1.cols, img1.rows)); 
img1.copyTo(roi1); 
namedWindow("I3", WINDOW_NORMAL); 
imshow("I3", result); 
imwrite("result.jpg", result); 
waitKey(); 
return 0; 

それは悪いマッチから来ますか?何か不足していますか?私はこの話題に少し慣れているので、どんな助けやアイデアも本当に感謝しています。

+0

非反転ホモグラフィ行列を使用できますか? –

+0

問題が解決しない場合。同じ画像で最初の画像の反対側に画像が伸びます。 – GDias

+1

私はちょうど言う:http://answers.opencv.orgは開いているとアクティブです。あなたの問題を解決する最善の方法は@LBerger(コードの作者)に依頼することです。答えが得られなかったら、他の方法で試してみてください。 – sturkmen

答えて

3

ここでは、あなたのワープパースペクティブが

  1. はあなたが両方の画像に右の点を選択しましたworking-されていない場合にチェックする必要があり、迅速なものですか? 理由:パースペクティブトランスフォームを検出するときに、それぞれ に対応する同じポイントを正確に選択する必要があります。無関係な点がそれを台無しにする。

  2. ポイントは配列内で正しい順序で表示されていますか? R:findhomographyに渡す前に、ソースと の両方の目的地に対応する順番に並べる必要があります。

  3. findHomographyに正しい順序で渡していますか?あなたがわからない場合は ケースに切り替えてみてください。それは反りません。

これは私が最初に使ったときの誤りです。あなたの画像を見ると、両方の画像に重なり合っている部分があります。あなたはそこをさらに慎重にする必要があります。あなたの矩形マスクは欠陥かもしれません。

+0

私はちょっとしました。しかし、私がプログラムを実行するたびに、結果が異なる。ときにはうまく動作しないことがあります。ある種のパターンが存在するはずですね。 – GDias

+0

ええ、それは公正です。画像を縫い合わせるだけがあなたが望むものであれば、手動で縫い目を選んでみましたか?あなたがマウスでポイントとステッチを選択することができるように、 –

+0

あなたが望むなら、コードであなたを助けます。 –

関連する問題