Wolfram Mathematicaのさまざまな方法を使用して、道路上のカメラの設置角度を見つける問題を解決します。 パート1





問題の声明



道路の上にビデオカメラを含むシステムがあります。 既知のカメラ解像度と表示角度。 道路に関しては、ビデオカメラは次のように設置されます。車線の上から、最も近い制御車線の端から3メートル以内の道路の側面に。 同時に制御される車線の数は4以下です。ビデオカメラは、特定のフレームレートで制御ゾーンの写真を撮ります。 撮影されたすべてのフレームはナンバープレート認識システムに入力されます。 車両通過の結果(以下「TS」と呼びます)は、車両ナンバープレートフレームの中心の座標が次の形式のトラックになります。



x11 y11 x12 y12 … x1i y1i … x1n y1n







複数の車両を運転した結果、次の形式のトラックファイルが作成されます。



x11 y11 x12 y12 … x1i y1i … x1n y1n





x21 y21 x22 y22 … x2i y2i … x2n y2n





...





xi1 yi1 xi2 yi2 … xii yii … xin yin





...





xn1 yn1 xn2 yn2 … xni yni … xnn ynn







トラックファイルの例:



1420 23 1399 44 1377 62 1351 82





417 327 368 359 313 392 119 500 48 540





2300 62 2291 91 2275 125 2267 159 2254 197





2298 114 2263 223 2199 413 2180 470 2158 532







上記の構造のファイルを使用して、車両の軌道に対するビデオカメラの角度と縁石の縁に対するビデオカメラの回転を決定する必要があります。



データのインポート



使用するデータをインポートします。



このファイルは、recdat.txtファイルと呼ばれるラップトップを起動するディレクトリ(Mathematicaドキュメント)にあります。 インポートするには、次を入力します。



file = Import[NotebookDirectory[] <> "recdat.txt", "Table"];







file



インポート先の変数

NotebookDirectory[]



-ラップトップが置かれているディレクトリを文字列として返します

<>



-線をつなぐ関数の省略表記

"recdat.txt"



-トラックを含むファイルの名前を示す文字列

"Table"



はインポート[]機能のオプションで、このファイルをテーブルとしてインポートする必要があることを示すため、ファイル変数にはテーブル(リスト)のタイプが含まれます。

記号;



行の最後に、記述された関数の実行後にMathematicaが結果を出力しないことが記載されています。

Shift + Enterを押すと、ファイルがインポートされます。



データがどのようにインポートされたかを正確に確認するには、ファイルを入力してShift + Enterを押す必要がありますが、情報をより視覚的に表示するには、次の機能を使用します。



TableForm[file]







1420 23 1399 44 1377 62 1351 82





417 327 368 359 313 392 119 500 48 540





2300 62 2291 91 2275 125 2267 159 2254 197





2298 114 2263 223 2199 413 2180 470 2158 532







TableForm[list]



-長方形要素の配列にあるリスト項目で出力を実行します



カメラの解像度と表示角度を指定する定数を決定します。



Xlen = 2360; (* *)





Ylen = 1776; (* *)





Xang = 14; (* *)





Yang = Xang*3/4; (* *)







ファイル内のトラックの数を決定します。



length = Length[file];







Length[list]



-1次元リストリストの要素数、または多次元リストの場合は次元数を返します



インポートされたデータを構造に展開する



インポートされたデータは、Mathematicaでの作業には不向きな構造です。 インデックスi、jの要素が2つの要素(ナンバープレートのシリアル番号をi、ナンバープレートの中心のx座標とy座標)で構成されている3次元リストの形式で構造に展開すると、作業がはるかに便利になります。 -i番目のナンバープレートのトラックポイントのシリアル番号。



トピックからの小さな余談:


Mathematicaでは、同じアクションを異なる方法で実行できます。 この環境には、さまざまな機能の膨大なセットが含まれています。 ループを使用して同じアクションを実行することも、特別なMathematica関数を使用して実行することもできます。 原則として、同じ機能を目的としたアクションの実行時間は、標準のWolfram関数を使用して実行した場合、自己記述ループを使用して実行した場合よりも短くなります。 関数または関数セットのタイミングは、 Timing[]



関数の決定に役立ちます。




構造を分解するリストを作成するには、最初に変数をリストとして宣言します。



num = {};







データを構造に分解するには、サイクルを記述します。



Do[num = Append[num,





Partition[file[[i]], 2]],





{i, length}]







Do



[アクション、{ループ実行条件}]

Append[list,element]



追加-リストの最後に要素を追加します

Partition[list,n]



-リストリストを長さnの重複しない部分に分割します。 リスト内の要素の数がnで完全に分割されていない場合、最後のk(k <n)個の要素が削除されます。

file[[i]]



-リストのi要素を返します



今、私たちはすでに知っている関数に目を向け、構造がどのように見えるかを見て、さらなる処理に便利です:



TableForm[num, TableSpacing -> {3, 4}]











TableSpacing -> {3, 4}



-表示するときにリスト項目間のインデントを設定します



トラック方程式を取得する



特定のケースでは、トラックポイントを線形化する必要があります。 「プライベート」-上記のデータは車両が高速で移動する直接道路で得られたものであり、通過中は制御ゾーンがその速度で物理的に単純に直線とは非常に異なる軌道に沿って移動できないためです。



リストに記載する車両の運動方程式。 これを行うには、まず宣言してください:



numeq = {};







そして、制御ゾーンを通る車両の運動方程式を決定する関数を書きます。 ここで、フレームの原点はフレームの左上隅であると言う必要があります。



Do[numeq = Append[numeq,





Fit[num[[i]], {1, x}, x]],





{i, length}]







Fit [data、funs、vars]-データのリストについて、データはvars変数のfuns関数の線形結合の形式で最小二乗近似を探します。 データデータの形式は{{x1、y1、...、f1}、{x2、y2、...、f2}、...}です。ここで、座標x、y、...の数は、varsリスト内の変数の数と等しくなります。 。 また、データデータは{f1、f2、...}の形式で表現でき、1つの座標は値1,2、...を取ります。funs引数には、varsオブジェクトのみに依存する関数のリストを指定できます。



私たちの場合、ポイントの2次元配列を含む多次元リストnumの各i番目の要素(車両のナンバープレートの中心)について、既存のポイントのセットに最も近いkx + bの形式の関数を最小二乗法で決定します。



このサイクルの結果は、およそ次のリストです。



{1167.11 - 0.803101 x, 568.193 - 0.571513 x, 6110.1 - 2.62293 x, 6471.36 - 2.75496 x, 1199.09 - 0.812067 x, 2491.96 - 1.29425 x, 1121.33 - 0.787616 x, 2933.43 - 1.75218 x, 625.959 - 0.609492 x, 2512.3 - 1.30408 x, 7805.9 - 3.3897 x, 881.413 - 0.698268 x, 2651.99 - 1.3463 x, 6140.19 - 2.61239 x, 2594.17 - 1.27645 x, 557.83 - 0.587095 x, 1195.29 - 0.82697 x, 6346.13 - 2.73884 x, 6887.01 - 2.92561 x, 2377.62 - 1.26743 x, 3241.53 - 1.72441 x, 1424.49 - 0.846298 x, 1218.75 - 0.83174 x, 7203.35 - 3.089 x, 5420.94 - 2.28441 x, 2500.74 - 1.29295 x, 2402.61 - 1.25934 x, 6760. - 2.89566 x, 1175.7 - 0.794353 x, 1117.2 - 0.77705 x, 7066.9 - 3.00537 x, 2346.99 - 1.24765 x, 2698.98 - 1.39178 x, 1277.43 - 0.849703 x, 633.372 - 0.61772 x, 2578.56 - 1.3082 x, 2952.21 - 1.47007 x, 1107.8 - 0.7861 x, 2352.46 - 1.24075 x, 2326.56 - 1.23348 x...}







方程式のリストからのデータと行のグラフィカルな表現



方程式を受け取った後、グラフにすべてのポイントと対応する方程式を表示できます。

Mathematicaには、グラフ上の点のリストを表示するListPlot[]



関数と、関数を表示するPlot[]



関数があります。 1つのグラフ上にポイントと関数グラフを含むグラフを表示するため、またはグラフパラメーターをオーバーライドするために、 Show[]



関数があります。 私たちのケースのためにこれらの関数を書きます:



eqlineplot = Plot[numeq[[Range[length]]], {x, 0, Xlen}];





numplot = ListPlot[num[[Range[length]]]];





Show[





eqlineplot,





numplot,





AspectRatio -> 3/4, Frame -> False,





PlotRange -> {{0, Xlen}, {0, Ylen}}]







そして、その実装の結果:







このグラフは、OX軸について可逆です。 彼の原点は左下の端にあり、左上のカメラとは異なります。 しかし、これは、線が1つのポイント(角度のカウントを続けるポイント)の近くで交差することを理解することを妨げません。 以下は、わずかに変更された描画領域を備えたグラフで、1つの点の近くにある線の交点を示しています。







関数のエントリを詳しく見てみましょう。



eqlineplot = Plot [numeq [[Range [length]]]、{x、0、Xlen}];



プロット[チャートに表示される関数のリスト、

{関数の構築に関連する変数、

その最小値

最大値}]



範囲[imax]-数値要素のリストを生成します{1、2、...、imax}



表示[

eqlineplot、

ヌプロット

AspectRatio-> 3/4、Frame-> False、

PlotRange-> {{0、Xlen}、{0、Ylen}}]



AspectRatio-> 3/4-チャートのアスペクト比を設定します

PlotRange-> {{0、Xlen}、{0、Ylen}}は、座標XおよびYでプロットするグラフの範囲を設定します

フレーム-> False-Mathematicaにグラフの周りにフレームを描く必要がないことを伝えます。



次は?



続編では、興味深く必要な場合は、グラフの交点を見つけるいくつかの方法について説明し、検討中の問題の例を使用して統計データ処理とデータ分析を紹介します。



All Articles