2017-06-13 8 views
0

私はステッチアルゴリズムを作成しようとしています。私は必要ないくつかの調整を加えて作成に成功しました。以下の写真はこれまでのステッチングプログラムの例です。私は(そう長く画像を横に飛行経路または側にあるとして、それはお互いに関係なく、自分の向きに動作する画像の順不同のリストでそれを提供することができるよ。 img1 then img2 enter image description hereOpenCV Center Homography

画像ならば問題があります実際のステッチングのコードは次のとおりです。キーポイント、マッチング、およびホモグラフィの検索が正しく行われたとします。

このコードを変更すると、また、私はスタックオーバーフロー(Opencv Image Stitching or Panorama)でこのコードを取得し、それがどのように動作し、誰かそれを説明することができます。

事前にお問い合わせいただきありがとうございます。

Mat stitchMatches(Mat image1,Mat image2, Mat homography){ 
    Mat result; 
    vector<Point2f> fourPoint; 
    //-Get the four corners of the first image (master) 
    fourPoint.push_back(Point2f (0,0)); 
    fourPoint.push_back(Point2f (image1.size().width,0)); 
    fourPoint.push_back(Point2f (0, image1.size().height)); 
    fourPoint.push_back(Point2f (image1.size().width, image1.size().height)); 
    Mat destination; 
    perspectiveTransform(Mat(fourPoint), destination, homography); 

    double min_x, min_y, tam_x, tam_y; 
    float min_x1, min_x2, min_y1, min_y2, max_x1, max_x2, max_y1, max_y2; 
    min_x1 = min(fourPoint.at(0).x, fourPoint.at(1).x); 
    min_x2 = min(fourPoint.at(2).x, fourPoint.at(3).x); 
    min_y1 = min(fourPoint.at(0).y, fourPoint.at(1).y); 
    min_y2 = min(fourPoint.at(2).y, fourPoint.at(3).y); 
    max_x1 = max(fourPoint.at(0).x, fourPoint.at(1).x); 
    max_x2 = max(fourPoint.at(2).x, fourPoint.at(3).x); 
    max_y1 = max(fourPoint.at(0).y, fourPoint.at(1).y); 
    max_y2 = max(fourPoint.at(2).y, fourPoint.at(3).y); 
    min_x = min(min_x1, min_x2); 
    min_y = min(min_y1, min_y2); 
    tam_x = max(max_x1, max_x2); 
    tam_y = max(max_y1, max_y2); 

    Mat Htr = Mat::eye(3,3,CV_64F); 
    if (min_x < 0){ 
     tam_x = image2.size().width - min_x; 
     Htr.at<double>(0,2)= -min_x; 
    } 
    if (min_y < 0){ 
     tam_y = image2.size().height - min_y; 
     Htr.at<double>(1,2)= -min_y; 
    } 


    result = Mat(Size(tam_x*2,tam_y*2), CV_32F); 
    warpPerspective(image2, result,  Htr, result.size(), INTER_LINEAR, BORDER_CONSTANT, 0); 
    warpPerspective(image1, result, (Htr*homography), result.size(), INTER_LINEAR, BORDER_TRANSPARENT,0); 
    return result;` 
+0

トピックオフ:あなたは楽しんでいるように見えます。他の仕事に移る前に、無人でのパイプライン漏れを検出するためにこれを少し前に見ました。誰もそれを構築したかどうかは分かりません。 – user4581301

+0

「逆転」とはどういう意味ですか? – KjMag

+0

[テンプレートマッチングとwarpAffineを使用した画像のステッチング]の可能な複製(https://stackoverflow.com/questions/44457064/stitching-images-using-template-matching-and-warpaffine) –

答えて

1

通常、イメージを中央に配置するのは簡単です。ゼロ(または任意の色)を埋め込んだ大きなマトリックスを作成し、同じサイズの画像で中央にROIを定義してそこに配置するだけです。ただし、一般的には2つの画像ではこれを行うことはできません。問題は、画像の一部が移動先の画像範囲外になるように画像をシフトまたは回転させると、返されたワープ画像がwarpPerspectiveからそれらの境界で切り取られることです。あなたがしなければならないことは、パッディングされた画像を作成し、好きな場所で歪まされていない画像を挿入し、そのピクセルへの翻訳を加えて変形(この場合はホモグラフィ)を修正することです。

たとえば、中央に配置された画像の左上の点が埋め込まれた画像の(400,500)にある場合は、(400, 500)の翻訳をあなたのホモグラフィーに追加して、ピクセルが正しいスペースにマッピングされるようにする必要があります。あなたのパッディングされたイメージは十分に大きく、それのどれもカットされません。

翻訳ホモグラフィを作成し、元のホモグラフィでそれを構成して翻訳を追加する必要があります。たとえば、埋め込まれたイメージ内の反りのないイメージのアンカーポイントが(x,y)であるとします。ホモグラフィでの翻訳は、最後の2つの列によって与えられます。あなたの同音異義語が3x3の場合H(通常の数学的なインデックスを使用して)H(1,3)xの翻訳であり、H(2,3)の翻訳はyです。 H_n = H_t * H

 1 0 x 
H_t = 0 1 y 
     0 0 1 

は、その後、あなたのオリジナルのホモグラフィH(行列の乗算を使用して)でこれを構成することができます。だから我々は新しいIDホモグラフィH_tを作成し、それらの中で翻訳を追加する必要があります。新しいホモグラフィH_nを使用して、このパッド付きスペースにイメージをワープして、追加された変換を使用して、通常通りwarpPerspectiveを使用して正しいスポットに移動させることができます。

これを自動化してイメージを必要なだけ正確にパディングすることができます。余分なパディングがなく、必要に応じてパディングが伸びます。埋め込まれたスペースにイメージをワープして計算する方法の詳細については、私の答えhereを参照してください。

+0

これらのすばらしい提案とリソースをチェックしていただきありがとうございます。これの数学的側面は、私にとっては少しですが、そこに行くことです。ヘルプをよろしくお願いいたします。 –

+0

@ C.Radford問題はありません。それは多すぎる数学、単なる線形代数ではありません。それでも、あなたが知る必要があるのは、ホモグラフィが現在のピクセルを取り、マトリックス乗算を使ってそれらを新しい場所に写像することだけです。 'warpPerspective'がこれを行い、ピクセル値(色)が新しい場所に置かれます。私が本質的に示唆しているのは、目的地の画像をゼロの大きな行列の中心に置き、上辺と左辺でどのくらいのパディングを使用したかをホモグラフィに伝えることです。それ以外のものは反ります)。 –