問題タブ [affinetransform]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1286 参照

java - Java、偽の 3D 効果

下の写真のような効果を得るには、AffineTransformまたは何かを使用しAffineTransformますか? または、Javaで使用できるその他の効果/変換はありますBufferedImageか?

ここに画像の説明を入力

0 投票する
2 に答える
4461 参照

python - numpy/scipy での高速 2D 剛体変換

剛体変換を大量の 2D 画像行列に適用したいと考えています。理想的には、平行移動と回転の両方を指定するアフィン変換行列を提供し、これを一度に適用してから、出力に対して 3 次スプライン補間を実行できるようにしたいと考えています。

残念ながら、affine_transforminscipy.ndimage.interpolationは翻訳を行わないようです。shiftとを組み合わせて使用​​できることはわかっていますrotateが、これはややこしく、出力を複数回補間する必要があります。

geometric_transformationまた、次のようなジェネリックを使用してみました。

これは機能しますが、基本的にピクセル座標をループしているため、非常に遅くなります! これを行う良い方法は何ですか?

0 投票する
1 に答える
3277 参照

c++ - ホモグラフィを使用して x/y 軸を中心に回転する

プロジェクト

モバイル用のテクスチャ追跡プロジェクトに取り組んでいます。平面サーフェスのみを追跡するため、openCV の cv::FindHomography() を使用して 2 つのフレーム間のホモグラフィを計算しています。ただし、その関数は非常に遅く実行され、パイプラインの主要なボトルネックです。フレーム間のホモグラフィの変化は非常に小さいため、ホモグラフィの初期推定を行うことができるアルゴリズムははるかに高速に実行されると判断しました。また、私の外れ値の割合は非常に小さいため、堅牢な方法はオプションです。残念ながら、私の知る限り、Open CV には初期推定を行うホモグラフィ ファインダーが含まれていません。ただし、シーンの元の 3 次元ワールド座標、現在の 2 次元画像座標、カメラ マトリックス、歪みパラメーター、および最も重要な初期推定値を取得する solvePnP() は含まれています。FindHomography を solvePnP に置き換えようとしています。私はパイプライン全体で 2D 座標のみを使用し、solvePnP は 3D 座標を要求するので、2d->3d->3d_transform->2d_transform から移動しようとしています。現在、そのプロセスは、適切な初期推測が与えられていても問題がある場合、FindHomography() よりも 6 倍速く実行されます。

問題

変換方法に問題があります。私の理論では、ホモグラフィを見つけるためにカメラ行列は必要ないため、最終的にホモグラフィに含まれる情報のみが必要なため、このプロセスには必要ないはずです。また、最終的にすべての z 情報を破棄するため、z を初期化する方法は問題ではないと想定しました。私のプロセスは次のとおりです

最初に、最初の 2 次元座標をすべて 3 次元に変換します。これには、z pos に 1 を指定します。元の座標は xy 平面上で平らであると仮定できます。それで

ここでのホモグラフィへの変換は簡単です。ホモグラフィの最初の 2 列は 3x3 回転行列からのもので、最後の列は平行移動ベクトルです。1 つのトリックは、ホモグラフィ(2,2) がスケールに対応し、pnp_tran(2) が z 軸の動きに対応することです。z 座標を 1 に初期化すると、スケールは z_translation + 1 になります。このプロセスは、6 つの自由度のうち 4 つに対して完全に機能します。Translation_x、translation_x、スケール、および z に関する回転はすべて機能します。ただし、x と y を中心とした回転では、重大なエラーが表示されます。これは、ポイントを z = 1 で初期化したことが原因だと思いますが、修正方法がわかりません。

質問

偽のカメラ マトリックスと初期 z 座標を使用して、solvePnP から良い結果を得ることができるという私の仮定は正しかったですか? もしそうなら、x と y の回転を機能させるには、カメラ マトリックスと z 座標をどのように設定すればよいですか? また、最初の推測を取り、2次元でのみ機能するホモグラフィ検索アルゴリズムをどこで入手できるか、または自分で作成するためのテクニックに関する情報を誰かが知っている場合は、非常に役立ちます。これが機能するようになったら、おそらくその方向に進むでしょう。

アップデート

ホモグラフィを取得し、そのホモグラフィから同一平面上のポイントのセットを生成し、指定されたホモグラフィを復元するために solvePnP を介してポイントを実行するテスト プログラムを自分で作成しました。これを行う過程で、私はホモグラフィーがどのように構築されるかの一部を根本的に誤解していることに気付きました. ホモグラフィは次のように構成されると仮定しています。

最初の 2 列は、3x3 回転行列の最初の 2 列であると想定しました。これは基本的に、3x4 変換を実行して column(2) を破棄することになります。しかし、これは真実ではないことを発見しました。私のやり方の誤りを示すテストケースは、点をy軸の周りに小さな角度で回転させるホモグラフィを作ろうとしていた。

上記の同形異義語はまったく機能しません。x > 58 の点 x,y,1 を例にとります。結果は x,y,some_negative_number になります。同次座標からデカルト座標に戻すと、x 値と y 値の両方で符号が反転します。

つまり、すべてを解決できると思われる、はるかに単純な質問ができました。x 軸と y 軸を中心にある角度だけポイントを回転させるホモグラフィを作成するにはどうすればよいですか?

0 投票する
2 に答える
177 参照

java - Java2D API での変換

Rectangle2D.Float と Point2D.Float との衝突をテストしようとしています。カメラを含む 2D ワールドがあります (カメラの AffineTransform に基づいて graphics2D キャンバスを変換します)。次に、サブオブジェクト Y を含むオブジェクト X のリストを作成します。キャンバスは X の AffineTransformation へのカメラの変換の上に変換されるため、オブジェクトは正しい位置にレンダリングされます。オブジェクト X 内のマウスとの衝突を正常にテストできますが、サブオブジェクト Y のテストで問題が発生しています。これは、Y オブジェクトが、他の場所に配置されているにもかかわらず、位置 (0,0) にあると「考える」ためです。 (200,200) と言うように再配置された親オブジェクト X。つまり、オブジェクト X と Y は (200,200) の位置に表示されますが、衝突は (200, 200) ではなく (0,0) で発生します。

AffineTransform.transform と AffineTransform.inverseTransform の呼び出しの正しい組み合わせに関係していると思いますが、正しい組み合わせに頭を悩ませることはできません。

0 投票する
1 に答える
775 参照

opencv - C++でOpenCVを使用してアフィンモーションモデル係数を計算します

カメラの動きの特性を正しく表現するには、ビデオでさまざまなカメラ操作(ズーム、パン、回転、傾斜など)を見つける必要があります。これらのカメラの動作は、ファインモーションモデルの係数に基づいてしきい値を設定することで決定できます。
参考: MPEGビデオインデックス作成のための効率的なカメラモーション特性評価

以下は動きベクトル(u、v)で、2 x 1行列は、2x1行列であるマクロブロック(x、y)の位置として表されます。(a1、a4)は別の2x1行列であり、(a2、a3、a、a6)は2x2行列です。

したがって、私の質問は、これらのパラメーターを決定するためにどのOpenCVAPI/関数を使用できるかということです。ありがとう

0 投票する
3 に答える
1842 参照

java - 座標を取得できませんgraphics2D mouseclick java

JLabel以下のコードを使用してマップを描画する拡張クラスを取得しました。new AffineTransform()これは、画像をそのままにしておくためのアイデンティティです (0,0,w,h)

JLabelこのイベントを使用してクリックすると:

新しい座標を取得したい「スケーリング、回転...座標」を試しました

しかし、ptDstは(スケーリング、回転、..)座標とは異なります。助けてください!!!

0 投票する
0 に答える
389 参照

java - パンとズームおよびユーザーインタラクションをサポートする画像表示キャンバスの作成

私はAdobeIllustratorに似ていますが、はるかに単純で、画像ではなくコードを生成するプログラムを作成しています。

私が抱えている問題は、AffineTransformが正しく機能しないことです。誤用が原因である可能性があります。はい、AffineTransformスレッドがたくさんあることは知っていますが、私の質問には答えられません。

現在、画像の表示を制御するために3つの変数(scale、centerX、centerY)を使用しようとしています。centerXとcenterYは、画面の座標ではなく、画像を基準にしています。それらの目的は、ズームインとズームアウトを左上隅ではなくJPanelの中​​心から行うことです。

私は非常に接近するためにいくつかの異なる試みをしましたが、私がしていることに対して十分に正確ではありません。これを達成した後、AfflineTransform.createInverse()がNoninvertibleTransformExceptionをスローするため、ユーザーの操作を処理する方法がわかりません。これに関するアドバイスもいいでしょう。

私は多くの構成されていないものを試しましたが、運がありませんでした。これが、私がやろうとしていることのアイデアをあなたに与えるための最後のアプローチです。

私は自分自身を十分に説明したと思います。このAffineTransformのものは私を混乱させたので、私がもう何をしようとしているのか説明することはほとんどできません。

0 投票する
2 に答える
10412 参照

java - AffineTransform.rotate() - xlate、rotate、および scale を同時に行うにはどうすればよいですか?

次のコードは、チェス盤にいくつかの駒を描いて欲しいこと (の最初の部分) を行います。

つまり、チェスの駒の画像と画像の高さを取得し、その画像の描画を駒のある正方形に変換し、画像を正方形のサイズにスケーリングします。

黒い部分を 180 度回転させたいとしましょう。どこかに次のようなものがあると期待しています:

しかし、X と Y として何を入力すればよいかわかりません。何も入力しないと、チェス盤の正方形の 0,0 点を中心に画像がうまく回転し、その北東の正方形にピースが上下逆さまになります。それはあるはずです。x,y の他のさまざまな組み合わせを推測しましたが、まだ運がありません。

私はすでに翻訳を使用してピースを正しい正方形に配置しています。回転変換は、物事を回転させる別の x、y を必要としていますが、1 つの x、y を中心にピースを回転させて書き込むように変換に指示する方法がわかりません。画像を別の x、y にします。誰かが回転パラメーターを手伝ってくれたり、これらがどのように機能するかを説明してくれるものを教えてくれますか? それらがどのように機能するかを説明していないものの例を見つけましたが、これまでのところ、それらを自分の状況に変更する方法がわかりません...


主な編集: 作業コードの追加。申し訳ありませんが、画像を投稿する方法がわかりません。自分の画像に置き換えてください。

次のコマンドを実行すると、左上にルーク、右下にナイトの 2x2 チェス盤が表示されます。

SmallChessboardComponent に移動し、最初の回転変換ステートメントからコメント delims を削除すると、ルークが元の場所に逆さまになり、ナイトは表示されません。代わりに、2 番目の変換ステートメントからコメント delims を削除すると、どちらの部分もまったく表示されません。

とにかく表示される正方形でピースを上下逆さまにする方法を探しています。各ピースをボードに描きたいです。ボードをひっくり返すコードは必要ありません。

メインプログラム:

チェス盤クラス:

チェス盤コンポーネント クラス:

ピース.java

および PieceImages.java

0 投票する
2 に答える
1821 参照

c++ - opencvwarpAffineの外れ値の数をテストしています

私はopencvを使用して2つの画像間のアフィン変換を推定しています(これをAとBと呼び、AからBまで推定したい)。可能な限り最良の推定を行うには、RANSACを実装する必要があります。これまでのところ、RANSACのフレームワーク(両方の画像とそれらの間の一致のキーポイントがすでにあることを考慮して):

1:ランダムに一致するものを3つ選択し、AとBの一致点を関数getAffineTransformへの入力として使用します。

2:関数warpAffineを使用してAからのポイントをワープし、結果をBのポイントと比較して、外れ値の割合を取得します。

3:サンプルのサイズが3ポイント(getAffineTransformは変換を見つけるために3ポイントが必要)であり、外れ値eの割合があることを考慮すると、RANSACを実行する必要がある回数を見つけることができます。 N回である良い推定;

4:最小の外れ値率で変換を維持しながらステップ1と2をN回再実行します。

基本的な考え方は問題ないようですが、実行、特にステップ2で問題が発生しています。問題は、外れ値の数をテストする方法がわからないことです。ワープアフィンを使用してAからBのポイントをマッピングすることを考えましたが、関数がポイントのマット(Mx2マットであり、Mはポイントの数であり、マップしたいポイントのセットではなく、画像としてポイントの座標xとyを列に並べます。これどうやってするの?

私はc++でopencv2.4.2を使用しています。

0 投票する
0 に答える
345 参照

objective-c - バウンディングボックスに従って頂点(ポリゴン)の配列をワープ

私はObjective-Cで作業しており、頂点をNSArrayに保存しています。

私は「ポリゴン」と呼んでいる境界ボックスを持つ 2D 頂点の配列を持っています。

バウンディングボックスのコーナーポイントを移動する方法に従って、ポリゴン全体を歪めたいと思います。ドラッグしているコーナーに応じて、いくつかの比率を計算する必要があると思います。しかし、どこから計算を開始すればよいか、また、このための単純で高速なアルゴリズムがあるかどうかはわかりません。外部ライブラリを使用したくないので、プログラムで直接計算を実行します。

ここの画像は、画像ソフトウェアの「歪み」機能を使用して作成されたもので、まさに私が望むものです。ビットマップ画像で可能であれば、任意の点のマトリックスで可能だと思います。

歪ませる