透視投影した図形の法線ベクトルについて

このQ&Aのポイント
  • 透視投影した図形の法線ベクトルについて
  • 透視投影した図形の平面の法線ベクトルを元の画像の100pixel分の長さで描く方法はありますか?
  • 透視投影した図形の平面の法線ベクトルを描くための近似的な方法を探しています。
回答を見る
  • ベストアンサー

透視投影した図形の法線ベクトルについて

http://opencv.jp/sample/sampling_and_geometricaltransforms.html#perspective こちらの下部にあるような、正面から見た画像を、床面に敷いたように見た画像へ変換した際に、 平面の法線ベクトルを例えば元の画像における100pixel分の長さで描く方法ってありませんでしょうか? ここで算出する変換行列は3X3であくまで(縦,横)⇒(縦',横')の関係しかありませんので、 完全な変換は無理かもとは思っています。平行投影モデルなど、近似的な方法でも良いのですが。 ちなみに、こちらの論文にはそれらしい方法が書いてあるのですが、 実施してみたところ正しい結果には見えませんでした。ステレオカメラだから問題が異なるのでしょうか。。。 http://ci.nii.ac.jp/els/110002768491.pdf?id=ART0003067124&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1332593385&cp= ご存知の方、居ませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.4

> 面あるいは点が空間的にどう動いたかという情報があって投影点を計算するのではないのです。
 > あくまで元の正面にあった面が、別の見え方になりそれを表す射影変換行列のみが手に入ったという状態なんです。  もう少し考えてみました。  仰る所の「射影変換行列」から「面あるいは点が空間的にどう動いたかという情報」(平面上の点以外に関する変換方法)を(ほぼ)再現するのは、(先の回答では不可能と断じてしまいましたが、いや)可能です。可能ですが大変です。  「射影変換行列」は、どんなものかは知りませんが、ともかく線形変換ではありえません。このため、「射影変換行列」に書いてある係数から、平面Sの位置、すなわち空間中での回転(α,β,γ)と平行移動(x0, y0, z0)を再現するには、なかなか複雑な連立非線形方程式を数値計算で解く必要があります。プログラムを作るのは簡単とは言えませんし、しかも、これだけでは決められないパラメータが1個残ります。それでもやるかどうか。(やると仰るなら、方程式をupしても良いです。)  それよりは、できれば「面あるいは点が空間的にどう動いたかという情報」をなんとかナマで手に入れる算段をする方が合理的だと思うんですが。  ところで、ご質問の中で、「近似的な方法でも良い」と仰っている。どの程度の「近似的」を認めるかで話は全然違いますが、 (1) 平面S上の絵がカメラからかなり遠くにある(つまり、床面とカメラとの距離に比べて絵とカメラの距離が結構大きい)、 (2) 平面S上に任意に長方形を決めたとき、その各頂点が像のどこに来るか計算できる。 という状況だろうと思います。だとすれば、こんな手がありますので、ご検討下さい:  以下はカメラで得た画像(X,Y)上での操作です。  まず、長方形の像の対辺を延長して、それらの交点B1を見つけます。その交点は「消失点」です。2対の対辺を使って消失点B1, B2を得たら、これらを結ぶ直線が「(平面Sを無限に拡張した時にできる)水平線」です。  水平線から長方形の像の各頂点に垂線を下ろすと、この垂線は頂点上の法線をある程度近似しています。(カメラの向きに依存する誤差が出るのですが。) 垂線のひとつを決めて、その上に適当な内分点Pをひとつ取ります。このPはその頂点から生えている毛の先端、ということですので、短ければ誤差はあまり目立ちません。  消失点B1とPを結ぶ直線を描き、これが他の垂線と交わる交点を求めます。交点が平面Sより「上」にあれば、それが対応する頂点の毛の先端です。B2からも同じように直線を描けば、4つの頂点の毛の先が確定するでしょう。これらの毛先を結んだ四角形Rを描きます。  次に長方形の像の辺上の点Qについて、水平線から垂線を下ろします。これと、四角形Rの辺との交点が、Qの毛の先です。Qの毛の先と消失点とを結んだ直線と、四角形Rの辺とのもう一つの交点は、Qが乗っている辺の対辺上にある点の毛先です。この毛先に水平線から垂線を下ろして長方形の像の辺まで延長すると、その毛の根本が決まります。  辺上のいくつかの点についてこの操作を繰り返して行くと、長方形の像と四角形Rに格子が描かれます。すると、長方形の像上の格子点が毛の根本、四角形R上の格子点が毛先です。これで沢山の毛が生えました。  もとの長方形(像ではない)の辺上に等間隔で並ぶ点の像をQとすれば、毛は等間隔の格子点上から生えることになるので、見栄えが良いでしょう。  本当は、毛は根本より毛先の方がちょっとだけ広がって見える筈なのですが、上記の方法だと毛は全部平行になってしまいます。やっぱり法線は幾何学的にできるだけ正しいものである必要があるでしょうねえ。さもないと何でそんなもの描きたいのだか分からんわけですから。

otootooto
質問者

お礼

私の質問が悪かったにも関わらず、さらなる回答をいただき、ありがとうございます。 消失点を用いる方法は眼から鱗でした。擬似的に使えそうな方法で、提示していただけて大変参考になりました。 ありがとうございます!

その他の回答 (3)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.3

ANo.2へのコメントについてです。 > おそらく、私の説明が悪いために問題が正確に伝わっていない  いや、問題の意味は分かっているつもりです。(ANo.1の最初の段落にどう理解したかを書いたので、違っている所があるなら具体的に指摘して下さい。)だから、stomachmanの説明が悪いんですね。  繰り返しになりますが、「平面射影行列」とは、ANo.1で説明した射影変換を、ある平面(画像のある平面)S上の点だけに限定して適用するための公式の形に変形したものにほかなりません。  たとえば簡単な例として、平面S上の直交座標系(u,v)が、   x = u   y = v cosθ   z = v sinθ + C となっている(つまり、カメラの光軸=z軸上でカメラからCだけ離れていて、θだけ傾いている平面だと)とすると、これらの関係を用いて射影変換X=x/z, Y=y/zのx,y,zを消去したもの、つまり   X=u/(v sinθ+ C),   Y=(v cosθ)/(v sinθ+ C) (あるいはこれをu,vについて解いたもの)が、仰るところの「平面射影行列」であるはず。平面上の点の位置を表すu,vは入っているけれども、平面から離れた点の位置を表す手段は消去されています。  ですから、「平面射影行列」を使ってなんとかしようとしても、平面S上以外の場所にある点がどこに写るかを計算するのは不可能ということです。実際、ANo.1へのコメントに > そこから伸びる点qの計算の仕方がわかりません とお書きなのが、その証拠じゃないですか?  画像上の点(u,v)から伸びる長さwの毛の先の座標はx,y,zでなら表せます。すなわち   x = u   y = v cosθ + w sinθ   z = v sinθ - w cosθ + C です。しかし、「平面射影行列」にはwを入れるところがない。毛の先の像の位置(X,Y)を知るには、射影変換を「ある平面上の点だけに限定」した時点で捨ててしまった部分がどうしても必要なのですよ。だから、元の射影変換に戻るしかないのです。  おそらく、「解法が予想していたものと違う」というのがご不満なのでしょうが、それはしょうがないす。

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

> 根元の点は平面射影行列を掛けることで計算できますが、そこから伸びる点qの計算の仕方がわかりませんでした。 絵はある平面S上にある点の集まり。その各点から法線ベクトルの線が生えている。これらの点についてNo.1の計算だけやれば全部終わり。 「平面射影行列」なんて使わない。捨てるんです。その「平面射影行列」というものは、「No.1の計算において、点が平面S上にあるという条件を追加して式を単純化したもの」に他ならないからです。(ほんとにそうなってるか、確かめてみれば?)

otootooto
質問者

補足

おそらく、私の説明が悪いために問題が正確に伝わっていないように思います。平面射影行列すら使わないのであれば、定義している問題が異なると思います。 面あるいは点が空間的にどう動いたかという情報があって投影点を計算するのではないのです。 あくまで元の正面にあった面が、別の見え方になりそれを表す射影変換行列のみが手に入ったという状態なんです。 (画面上での投影⇒画面上での投影の関係性のみ。)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.1

 「正面から見た画像」の表面に法線ベクトルの毛が生えているのを床面に敷いたものを、ピンホールカメラで撮った写真がどうなるか、ということでござんしょう。しかも、その写真を撮るスクリーン(フイルム面)はどうやら平面であるらしい。そういう話ですね。  ピンホールカメラのピンホールの位置を(0,0,0)とし、フィルム面をz=1の面だとしましょう。すると、空間中の位置p=(x,y,z)にあるものの像は、(0,0,0)と(x,y,z)を結ぶ直線と、フィルム面との交点(X,Y,1)にできる。(手前にあるもののかげに隠れて見えない、という効果はここでは考慮しません。)すると、図を描いてみれば明らかなように、X=x/z, Y=y/zという簡単な関係になっています。  さらに、空間中の勝手な2点pとqを決めたとき、p, qを結ぶ直線上にある任意の点rのフィルム面上での像Rは、点pの像Pと点qの像Qとを結ぶ直線上に来ることが、関係式X=x/z, Y=y/zから容易に証明できます。  従って、「正面から見た画像」の表面に生えているある一本の毛の根元の点pと先の点qがフィルム上のどこに像を結ぶか、を計算すれば出来上がりです。

otootooto
質問者

補足

根元の点は平面射影行列を掛けることで計算できますが、そこから伸びる点qの計算の仕方がわかりませんでした。

関連するQ&A

  • ピエゾアクチュエータ、微動位置決め機構のモデルに…

    ピエゾアクチュエータ、微動位置決め機構のモデルについて 参考URL資料の1ページ目から2ページ目にかけて、 式(1)から式(2)(G(s)=・・・)を求めていますが、 式(2)を求める過程を教えて下さい。 まず、式(1)をどう変えていくのか、から分かりません。 ラプラス変換を使うと思うのですが。 よろしくお願いします。 http://ci.nii.ac.jp/els/110002385168.pdf?id=ART0002667293&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1425024460&cp=

  • 類比について教えて下さい。

    「帰属の類比」(analogia attributionis)、「比例性の類比」(analogia proportionalitatis)、「比例の類比」(analogia proportionis)の3種の類比について、わかりやすく、出来れば例をあげて教えて下さい。この3つとも下の論文に出ているのですが、いくら読んでもよくわからないのです。 お助け願います。 http://ci.nii.ac.jp/els/110007353231.pdf?id=ART0009216249&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1369913308&cp=

  • 独歩の「我が過去」が掲載されている本を教えて!

    国木田独歩の作品で「我が過去」という文があるそうですが、全集を調べても見つかりません。 ちなみに「わが過去」という短文がありますが、これとは違います。感じの「我が」です。 全集の何巻、もしくは何という著書に掲載されているか御存知の方、お教え願います。 下の論文の冒頭に出てくる「我が過去」という一文です。繰り返しますが「わが過去」とは別です! http://ci.nii.ac.jp/els/110000967443.pdf?id=ART0001139556&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1374413983&cp=

  • 上顎洞にビタペックス

    こんにちは。いつもお世話になっております。 上の歯の治療で、根尖よりビタペックスを漏洩する治療を受けた後、 舌のしびれ、舌の奥・喉・耳・眼・肩・顔(すべて片側だけ)など、 不定期にだらだらと続く痛みと不調が出て続いています。 その後、転院し、意図的再植をして、できる限りの掻爬をしてもらいましたが 上は上顎洞粘膜に少し突出し、下は根尖あたりまで続くビタペックスが残ってしまいました。 メーカーのサイトにも、「本品が上顎洞及び下顎管に迷入すると、比較的長期間、患者に不快感を与える場合があるので、解剖学的位置関係に注意すること」とあります。 https://www.jstage.jst.go.jp/article/jjoms1967/46/1/46_1_46/_pdf http://ci.nii.ac.jp/els/110004689618.pdf?id=ART0007426058&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1437190797&cp= http://ci.nii.ac.jp/els/110004689618.pdf?id=ART0007426058&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1437126487&cp= 上は、下顎の麻痺について書かれたものですが、 「24周以内に症状が消失しなければ、自然治癒は著名に低下する」とあり 焦っております。 今かかっている先生は「(口腔内の)頬側から取り除けるかもしれない」と言ってくださっていますが 簡単なことではないので悩んでいます。 1今の不調はビタペックスの影響によるものと考えられるでしょうか。 2上顎洞の粘膜に少し出ているということは、少しづつ鼻から排除されることも考えられるでしょうか。 何でもよいのでご意見をお聞かせいただけるとありがたいです。

  • メタノールを使ったCVDダイヤモンド合成装置

     東海大学の広瀬洋一先生が広めた、メタノールを使ったCVDダイヤモンド合成方法は、簡単で安全にダイヤモンドを合成できる実験として、高校の教科書やウェブサイトにも出ている有名なものです。 詳しくは↓ http://nels.nii.ac.jp/els/110001828953.pdf?id=ART0001987507&type=pdf&lang=en&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1256725691&cp=  この装置では、メタノール(CH3OH)で満たしたガラス管の中をフィラメントで約2000℃に加熱する、とありますが、その熱によって、ガラス管やゴム栓は溶けたりしないのでしょうか?

  • ウィットネジとユニファイネジの互換性について

    最近、インチネジの互換性について悩んでいます。 当社では以前からアメリカ用としてW5/8規格の、電動・空気圧工具、砥石を販売してきました。 最近、砥石の方で振れのクレームがあり、その原因としてネジを疑ったわけです。アメリカはユニファイ規格のネジが一般的です。取引のある別のメーカーに聞いてみましたが、工具側の主軸ネジはユニファイでした。 とすると、工具はユニファイの主軸、砥石はウィットのメネジで使用されているおそれが充分あります。取付の問題がないことはネジゲージ2級で確認しています(オネジ-メネジがユニファイ-ウィットがOK、ウィット-ユニファイはNGでした)。 ネット検索して http://nels.nii.ac.jp/els/110002444120.pdf;jsessionid=CF31267F91E23A4F63CF36F16F297B43?id=ART0002594105&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1228789727&cp= を読んでみるとそれほど問題はないようですが。 知識のある方のアドバイスをお願いします。 電動・空気圧工具とはグラインダー、サンダー、ポリッシャのことです。

  • WebページのPDF変換について

    Webページを「Adobe Acrobat 8 Standard」で簡単変換していますが、 ある時からページの設定がA4サイズの縦から横になってしまっています。 少しのサイズで印刷では1ページに収まるのに、PDFファイルに変換して保存しようとすると必ず横設定になってしまいます。 (1)何か設定方法はありますでしょうか? (2)また、変換したものを軽く修正する方法はありますか?  (特にレシピ等で画像部分と文字列がずれてしまうことがあって困っています・・・) よろしくお願いします。

  • 画像の縮小について。

    こんにちは。 自分で描いたイラストを待ち受け画像として、あるサイトに投稿したいんです。 その時に、画像を色々なサイズに変換しなくてはなりません。 それで困っています。 例えば、240×320を120×160に変換するように、横と縦の比率が同じならば上手く縮小できるのですが、 240×320を120×120のような横と縦の比率が全く違う画像を作ろうとすると、縦に画像が潰れるような形になってしまって、なかなか上手くいきません。 多少、画像の上下左右の端が削れてもいいので、変に潰れない方法はありますか? よろしくお願いします。

  • 透視投影図形の回転

    C言語で透視投影の図形(3次元)を作成しました。 プログラムは下のような感じになりました。 static struct {int f; double x,y,z;}a[] ...(略) for(j=0; a[j].f!=-999; j++){//-999が来るまで描画  h=-a[j].x*sin(ay)/vp+a[j].z*cos(ay)/vp+n/vp+1;  px=(a[j].x*cos(ay)+a[j].z*sin(ay)+1)/h;  py=(a[j].y+m)/h;   if(a[j].f==-1) //-1が先頭にあるなら    pDC->MoveTo(px+200,-py+200);//描画の始点   else //そうでないなら    pDC->LineTo(px+200,-py+200);//線の終点 } これに、わかっているx軸まわり・y軸まわりの回転変換マトリックスを掛け合わせた、統合変換マトリックスの式 x=x*cosθ-z*sinθ y=x*sin^2θ+y*cosθ+z*sinθcosθ z=x*sinθcosθ-y*sinθ+z*cos^2θ を使用して図形を回転させたいのですが、プログラム中にはpDC->MoveTo(px+200,-py+200);のようにxとyしか出力がなく、z=をどう出力しようかと悩んでいます。また、回転を表示させるのに、 描画→回転させたx,y座標の算出→一度画面を白く塗りつぶす→描画 ということをfor文でやっていこうと思うのですが、画面がとてもちらついてしまいます。ちらつかない方法があれば教えてください。

  • excelをPDFに

    office2010の機能を用いてxcelのファイルをPDFに変換したのですが、問題が発生してしまいました。 (1)表示されるタブのみ変換される (2)xcelファイルが横に長いので途中で切れてしまう 複数のタブを一括して変換し、縦でなく横表示のPDFファイルにする方法はあるのでしょうか?ご回答お願いします。