5

ある角度で撮ったチェス盤の画像があります。ここで、チェス盤の画像が真上から撮影されたかのように見えるように、パースペクティブをワープしたいと考えています。

一致したポイント間で「findHomography」を使用できることはわかっていますが、それを避けて、たとえばモバイルセンサーからの回転データを使用してホモグラフィマトリックスを独自に構築したかったのです。固有パラメータを取得するためにカメラを調整しました。次に、次の画像が x 軸を中心に約 60 度の角度で撮影されたとします。私がしなければならないことは、カメラ行列と回転行列を乗算して、ホモグラフィ行列を取得することだけだと思いました。次のコードを使用しようとしましたが、期待どおりに機能しないため、何かを正しく理解していないようです (結果の画像は完全に黒または白です。

ここに画像の説明を入力

import cv2
import numpy as np
import math 



camera_matrix = np.array([[ 5.7415988502105745e+02, 0., 2.3986181527877352e+02],
                           [0., 5.7473682183375217e+02, 3.1723734404756237e+02], 
                           [0., 0., 1.]])

distortion_coefficients = np.array([ 1.8662919398453856e-01, -7.9649812697463640e-01,
   1.8178068172317731e-03, -2.4296638847737923e-03,
   7.0519002388825025e-01 ])

theta = math.radians(60)

rotx = np.array([[1, 0, 0],
               [0, math.cos(theta), -math.sin(theta)],
               [0, math.sin(theta), math.cos(theta)]])   



homography = np.dot(camera_matrix, rotx)


im = cv2.imread('data/chess1.jpg')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

im_warped = cv2.warpPerspective(gray, homography, (480, 640), flags=cv2.WARP_INVERSE_MAP)
cv2.imshow('image', im_warped)
cv2.waitKey()
pass

私はまた、キャリブレーション後にdistortion_coefficientsを持っています。結果を改善するために、それらをどのようにコードに組み込むことができますか?

4

3 に答える 3

2

この答えは数年遅れていますが、ここにあります...

(免責事項:この回答での用語の使用は不正確または間違っている可能性があります。他のより信頼できる情報源からこのトピックを調べてください。)


覚えて:

  • 画像 (ビュー) が 1 つしかないため、完全な 3D ホモグラフィではなく、2D ホモグラフィ (1 つの 2D ビューと別の 2D ビュー間の遠近法の対応) のみを計算できます。
  • そのため、3D ホモグラフィ (回転行列、平行移動行列、焦点距離など) を直感的に理解することはできません。
  • 私たちが言っているのは、2D ホモグラフィでは、3D ホモグラフィのように 3x3 マトリックスを直感的な構成要素に因数分解することはできないということです。
  • あなたは 1 つのマトリックスを持っています - (これはあなたが知らないいくつかのマトリックスの積です) - そしてそれはそれです。

でも、

OpenCV は、getPerspectiveTransform2 つの平面四辺形間の 2D ホモグラフィに対して 3x3 透視行列 (同次座標系を使用) を解く関数を提供します。

ドキュメントへのリンク

この機能を使用するには、

  • 画像でチェス盤の四隅を見つけます。これらがソース座標になります。
  • 選択した 4 つの長方形の角を指定します。これらが目的地の座標になります。
  • ソース座標と宛先座標をgetPerspectiveTransformに渡して、チェス盤を直立した長方形に歪ませることができる 3x3 マトリックスを生成します。

注意事項:

  • 四隅の順番に注意してください。

    • ソース座標が時計回りに選択されている場合、宛先も時計回りに選択する必要があります。
    • 同様に、反時計回りの順序を使用する場合は、一貫して実行してください。
    • 同様に、z オーダー (左上、右上、左下、右下) を使用する場合は、一貫して実行してください。
    • コーナーを一貫して順序付けしないと、(数学的に言えば) ポイント ツー ポイントの対応を正確に実行するマトリックスが生成されますが、使用可能な出力画像は生成されません。
  • コピー先の長方形の縦横比は任意に選択できます。実際、「これは 3D ではなく 2D ホモグラフィである」ため、ワールド座標でオブジェクトの「元の縦横比」を推測することはできません。

于 2014-11-26T17:08:35.063 に答える
1

1 つの問題は、カメラ行列を乗算するには、z 座標の概念が必要なことです。ゆがみ係数について考える前に、オイラー角を指定して基本的な画像ワーピングを機能させることから始める必要があります。もう少し詳細な説明については、この回答を見て、私の結果を複製してみてください。画像を z 軸に沿って下に移動し、それをカメラ マトリックスで投影するという考えは、混乱を招く可能性があります。意味をなさない部分がある場合はお知らせください。

于 2012-10-23T22:41:09.377 に答える
0

カメラを調整したり、カメラの向きを推定したりする必要はありません (ただし、この場合、後者は非常に簡単です。これらの直交する線の束の消失点を見つけ、それらの外積をとって、カメラの法線を見つけます)。詳細については、Hartley & Zisserman のバイブルを参照してください)。

行う必要があるのは、チェッカーを正方形にマッピングするホモグラフィを推定し、それを画像に適用することだけです。

于 2012-10-25T13:43:07.520 に答える