カメラと戦ったか、GMTが無能な人と戦ったか

こんばんは、親愛なるハブロビテス、こんばんは、ベルゴロドの栄光の街。

今日はバカについての話をします。 そして、彼は1つの単純な真実に従わなかったので、彼は馬鹿です(私は、それから走ります)。



有名なプログラミングの怠慢は、不必要なジェスチャー(自分のもの、機械のもの)の代わりに、よりエレガントでシンプルな解決策を考えて見つける方が良いという事実にあります。




そして、それは愚か者が宇宙でカメラの位置を見つけるためにどのように教えようとしたかについてです。







ことわざ





2年目の終わりにプログラミングプロジェクトを作成する必要がありました。 私はいつものように、景品を探して、年末にいくつかのグループに参加することにしました。 うまくいきませんでした。 彼は学部長に同意し、8月末にプロジェクトの完了について準備し、落ち着いて子どもたちにアートを教えました。 ネリジノバヤに戻って、私は本質的に2週間残っていることに気づきました。 それ以来、私はほとんどいつもコーヒーショップに座って、かなりいいコーディングをしていた。 プロジェクトの本質は、リアルタイムで2つのWebカメラを使用して、指の先端の空間的位置を決定することでした。



空間内のカメラからの画像内のすべてのピクセルが空間内のある種の光線に対応していることは明らかです。 2台のカメラ- 突然 、関心のあるポイントで交差する2つの光線。 理論的には、すべてが単純です。 実際には、OpenCVライブラリをMSVSに一晩固定し、その後1週間半にわたってさまざまな画像処理アルゴリズムを作成し、簡単な3Dビューアーをすばやく作成し、2台のカメラを一緒にコンパイルし、デバッグ、デバッグ、デバッグを行いました... 1行で、それらを「ほぼ上向き」に向け、従来の1000台のカメラ間の距離をカウントしました。



一般的に、すべてがほぼ準備完了です。 カメラは個別に1本の指を捉えることができ、高い精度で、再計算のすべての数学関数が計算され、黒ではなく動きのない背景を可能にする機能が記述されました。 しかし、何かが間違っていました-宇宙のある場所は、手で動くとき、およそ1センチメートルの振幅で奇妙な宙返りをしました。 トラブル! それから、3時間前にウェイトレスがカメラに少し触れただけだということに気付きました。



画像



ステージング





私はため息をつき、カメラ自体の位置と向きを決定する関数を作成する必要があることに気付きました。 カメラの視野は、理想的には、底辺に長方形がある無限の四角錐です。 完全に8つの値で設定されます。頂点の3座標、方向ベクトルの2座標(ピラミッド、軸の「二等分線」)、1-軸の周りの回転、さらに2-角度表示幅。



最後の2つの座標は最初に既知です。カメラの視野角を斜めにグーグルし、最も単純な幾何学的問題を解決します。 軸を中心とした回転-それは明らかですが、カメラの位置によって異なる場合があります。 方向ベクトルには2つの座標があります。特定の長さ(3座標)のベクトルの終わりとして指定でき、方程式x ^ 2 + y ^ 2 + z ^ 2 = l ^ 2から未知の1つが削除されるためです。 さて、頂点の3つの座標は理解できます。 合計で、6つの数量を計算する必要があります。



「ああ! 三角形が必要です!」と叫んだ。 3ポイント、各画像から2つの数字を取得します。 完全な計画-空間に直角二等辺三角形を配置し、その座標は(100、0、0)、(0、0、0)および(0、100、0)であると言います。 次に、カメラ画像でこの三角形の頂点にマークを付けます。あとは、単純な式で値を置き換えるだけです。 とにかく、私はそう思った。



しかし、そこにありました。 正確な数学の通常の方法を使用してこの式を見つけるために4時間を費やし、私の最高の数学の友人2人を解決策の検索に接続し、パスワードよりも速くWolframalfaのアドレスを入力し始めましたが、正確な解決策が存在するということだけが見つかりました私は禅を知っています。



そして、愚か者は間違いを犯しました。 円の方程式と密接に結びついた6つの三角方程式のシステムがありました。 そして、次の学期に計算を通過しました。計算では、ご存知のように、非線形システムを解く方法が説明されています。 そして、理論を読んで、期待どおりにすべてを行うのは正しいでしょう。時間がかかるという事実にもかかわらず、結果はより良く、より速くなり、自己開発にも役立ちます。 しかし、いや、ピーターのトリックが私に目を覚まし、私はxでチョップすることにしました。



解決策





面積測定の学校のコースから知られているように、特定のセグメント(AB)が特定の角度(アルファ)で見える幾何学的なフィールドは、円弧です。 図はすべてを明確にします。



画像



さらに、空間では、この画像をセグメントの周りで回転させることができます。 穴のないトーラスのようなものが得られます。 3つのセグメントがあるため、3つのトーラス、または3つのトーラスサーフェスが得られます。 1つの表面は平らな図形であり、2つの交差点はすでに線(一般的な場合、複数の閉じた曲線)です。3つの表面は既に点です。 下の写真の律法。



そのため、不器用な方法:これら3つのトーラスを渡らなければなりません。 また、コンピューターサイエンスは離散的であるため、トーラスの表面をメッシュのノードを伸ばして表現する必要があります。 このように:



画像



鈍点に加えて、ポイント間の距離が比較され、互いに最も近いものが見つかります。



その結果、この関数は、すべてのデバッグ画像と必要なジャンクの山で、プロジェクトの残りの部分よりも多くのメモリを消費し、1台のカメラで5分間動作しました(長時間のリアルタイム!)、そして時々間違っていました。



そして、半年後、退屈から、カップルとして、私はこれらのトーラスを交差させる機能を書きました。 減算、行列など、すべてが本来あるべきものです。 彼女は即座に働き、確かに考え、一般的に軽くて快適でした。 しかし、そのプロジェクトは終わったので、そのデザインはゼロデザインでオンザフライで書かれたので、テキストでは何も理解できません(それから、「クラス」という言葉がまだ怖かった)、私はオフィスにソースコードを残しました。 そして今、ついにこのプロジェクトを終了する時が来ました。それは実際、私がやっていることです。 しかし、これはまったく異なる話です。



さようなら、親愛なるハブロビテス、良い夢、ベルゴロドの街。



PSすぐに画像処理アルゴリズムを説明する予定です-自分で覚えています。 じゃあね!



All Articles