正方形から台形への射影変換

正方形から台形への射影変換をしたいと考えています。
projective2d を使えばできると分かったのですが行列にどのような値を入れればいいのかがあるのかが分かりません。
もしわかる人がおりましたら教えていただきたいです。

 Risposta accettata

Hernia Baby
Hernia Baby il 7 Lug 2021

1 voto

回転というよりは四隅の投影をおこないました。
以下を参照しています。
-------------------------------
初期化
clc,clear,close;
画像の読み込み
使用している画像は愛犬チャチャです。
img = imread('chacha_sq.jpeg' );
imshow(img)
投影前と投影後の4隅の設定
 各点の(x,y)座標を設定します。
 movingPoints :投影前の [左上, 右上, 左下, 右下]
 fixedPoints :投影後の [左上, 右上, 左下, 右下]
movingPoints = [1 1; size(img,2) 1; 1 size(img,1); size(img,2) size(img,1)];
fixedPoints = [500 700; 1500-500 700; 35 1500-500; 1500 1500-500];
画像の変換
 投影を行います。具体的には四隅をフィットさせるイメージです。
 詳しくは fitgeotrans と imref2d を参照してください。
tform = fitgeotrans(movingPoints, fixedPoints, 'Projective');
RA = imref2d([size(img,1) size(img,2)], [1 size(img,2)], [1 size(img,1)]);
[out,r] = imwarp(img, tform, 'OutputView', RA);
画像の表示
imshow(out, r);
axis off;

7 Commenti

Hernia Baby
Hernia Baby il 7 Lug 2021
ちなみに projective2d では回転と拡大・縮小があるのですが上手くできませんでした。
拡大・縮小が上手くできればなんとかできるかもしれません。
clc,clear,close;
img = imread('chacha_sq.jpeg' );
t = 45;
% 回転する場合はこちら
% Rx = [1 0 0; 0 cosd(t) -sind(t); 0 sind(t) cosd(t)];
% Ry = [cosd(t) 0 sind(t); 0 1 0; -sind(t) 0 cosd(t)];
Rz = [cosd(t) -sind(t) 0; sind(t) cosd(t) 0; 0 0 1];
tform = projective2d(Rz);
outputImage = imwarp(img,tform);
imshow(outputImage);
Atsushi Ueno
Atsushi Ueno il 7 Lug 2021
そう、直前のコメントが@akasaさんの知りたい(射影変換の次に知るべき)内容だと思います。射影変換は3軸の回転と拡大縮小が混ざった変換です。
過去の質問を踏まえると@akasaさんの目的が分かってきました
  • 立方体のオブジェクトが表示されたCG画像(動画)からオブジェクトの座標を認識したい
  • 画像内における任意の4隅の座標に別画像を貼り付けたい⇒その為に射影変換をしたい
  • 射影変換のパラメータを知りたい⇒変換前後の四隅の座標が分かれば回答の通り変換可能
  • 更に4隅の座標から3次元空間におけるスクリーンの角度(3軸)を計算できる(リンク先参照)
  • 多分将来は対象をCG画像⇒カメラ画像に変えてAR(拡張現実)を実現したい(間違いない!)
私は当初、立方体のオブジェクトを(OpenGLで)表示しているのだから「自分でそのプログラムにテクスチャを付け足せば良いではないか」と回答しましたが、目的が違う事にやっと気づきました。既に表示された2次元の画像内のオブジェクトを認識してそこに画像を貼り付けたいのです。それ即ちARじゃないですか。
AR関係の書籍やサイトを探して一読してみるのはどうでしょうか>@akasaさん
Atsushi Ueno
Atsushi Ueno il 7 Lug 2021
MATLABで拡張現実の応用例を紹介している情報(Image Processing Toolbox)も沢山ありますね
akasa
akasa il 8 Lug 2021
お二方ご回答ありがとうございます。
添付画像の赤い部分に今回適用した変形をして貼り付けることは可能でしょうか?
OpenGLで作成しているので、赤い部分の四つ角の座標は分かっておらず、色も正確な赤ではないです。
matlabから呼び出せるOpenGLを用いたテクスチャマッピングの関数が調べても出てこないため、このような回りくどい方法を試しております。
Atsushi Ueno
Atsushi Ueno il 8 Lug 2021
2つのアプローチが考えられます
  • その画像を作っているプログラムを改造して画像を貼り付ける(CG)
  • その画像を別アプリに取り込み、別画像を貼り付けた画像を出力する(AR)
前者(CG)と後者(AR)は、内部で取り扱う情報が全く違います。@akasaさんの目的は前者(CG)ではなく後者(AR)ですよね。それを確認しないと的外れな回答になる可能性があります。
akasa
akasa il 8 Lug 2021
ご回答ありがとうございます。
間にある回答を見ておりませんでした。
私の目的としては、上の画像の赤い部分に他の画像を貼って掲示板のように見せたいと考えています。
別アプリで作るとなると手間が多くなるため、matlab上で完結させたいと考えています。
またこの画像を作っているプログラムを改造できるならそれが手っ取り早いと思うのでそうしたいです。
よろしくお願いいたします。
Atsushi Ueno
Atsushi Ueno il 8 Lug 2021
この質問は「射影変換を行う方法」であり既に完結しているので、コメントを別の質問に改めます。

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su グラフィックス パフォーマンス in Centro assistenza e File Exchange

Prodotti

Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!