3

getHomography と warpPerspective を使用して、画像を正面から見たビューに変更します。

画像は目的のパースペクティブにワープしますが、トリミングはオフになっています。歪んだ画像を画像ボックスの外に大きく移動します。その理由は、操作の結果が負の座標になるためだと思います。

チェス盤の関数が適切な点を検出できなかったため、opencv:s 関数を使用せずに、手動で変換行列を計算するための点を計算しました。

これは、変換マトリックスに追加の変更を加えることで修正できると思います。しかし、それはどのように行われますか?また、変換された画像がx軸に沿って中央に配置されていることを確認してから、y軸を目的の位置に調整する方法はありますか?

今仕事をするコードスニペット:

cv::Mat image; // image is loaded with the original image

cv::Mat warpPers; // The container for the resulting image
cv::Mat H;

std::vector<cv::Point2f> src;
std::vector<cv::Point2f> dst;

// In reality several more points.
src.push_back(cv::Point2f(264,301));
src.push_back(cv::Point2f(434,301));
src.push_back(cv::Point2f(243,356));
src.push_back(cv::Point2f(476,356));

dst.push_back(cv::Point2f(243,123));
dst.push_back(cv::Point2f(476,123));
dst.push_back(cv::Point2f(243,356));
dst.push_back(cv::Point2f(476,356));

H = cv::findHomography(src, dst, CV_RANSAC);

cv::warpPerspective(image, 
newPers,
H,
cv::Size(3000,3000),
cv::INTER_NEAREST | CV_WARP_FILL_OUTLIERS
);

cv::namedWindow("Warped persp", cv::WINDOW_AUTOSIZE );
cv::imshow( "Warped persp", newPers);
4

3 に答える 3

13

Opencv は、透視変換を行うための非常に便利な方法を提供します。あなたがしなければならない唯一のことは、findHomography によって返されるホモグラフィを処理することです。確かに、あなたが提供する画像のいくつかの点が x 軸または y 軸の負の部分にあるかもしれません。そのため、画像をワープする前にいくつかのチェックを行う必要があります。

ステップ 1: findHomography でホモグラフィ H を見つけます。ホモグラフィの古典的な構造が得られます。

H = [ h00, h01, h02;
      h10, h11, h12;
      h20, h21,   1];

ステップ 2: ワープ後の画像の角の位置を検索する

それでは、コーナーの順序を定義しましょう。

(0,0) ________ (0, w)
     |        |
     |________|
(h,0)          (h,w)

これを行うには、次のようなマトリックスを作成します。

P = [0, w, w, 0;
     0, 0, h, h;
     1, 1, 1, 1]

H で製品を作成し、歪んだ座標を取得します。

P' = H * P

ステップ 3: これらの新しい 4 ポイントで x と y の最小値を確認し、歪んだ画像のサイズを取得します。

P' = [s1*x1, s2*x2, s3*x3, s4*x4;
      s1*y1, s2*y2, s3*y3, s4*y4;
      s1   , s2   , s3   , s4]

したがって、新しい有効な座標を取得するには、行 1 と 2 を行 3 で割るだけです。

その後、1 行目の列の最小値と 2 行目の行の最小値を確認します (cvReduce を使用)。

画像を含む境界ボックス (つまり、warpPerspective 関数の dst マトリックスの次元) を見つけるには、cvReduce で各行の最大値を見つけます。

minx を最初の行 (つまり、列) の最小値、maxx (1 行の最大値)、miny および 2 番目の行の maxy とします。

したがって、ワープされた画像のサイズは cvSize(maxx-minx, maxy-miny) になります。

ステップ 4: ホモグラフィに修正を追加する minx および/または miny が負であるかどうかを確認します。minx < 0 の場合は -minx を h02 に追加し、miny < 0 の場合は -miny を h12 に追加します

したがって、H は次のようになります。

H = [ h00, h01, h02-minx; //if minx <0
      h10, h11, h12-miny; //if miny <0
      h20, h21,   1];

ステップ 5: 画像をゆがめる

于 2014-04-13T16:34:44.287 に答える