2012-02-28 11 views
0

私はSO-家賃 - コーダが、私は、私はC++Pythonのアレイ管理C++と同等

grey_image_as_array = numpy.asarray(cv.GetMat(grey_image)) 

non_black_coords_array = numpy.where(grey_image_as_array > 3) 

# Convert from numpy.where()'s two separate lists to one list of (x, y) tuples: 
non_black_coords_array = zip(non_black_coords_array[1], non_black_coords_array[0]) 

第1に翻訳を助ける必要があることは本当に簡単なPythonの例を持っているが、私は推測かなり単純ですされていません知っています - どのようなバイトがcv.GetMatからretrunedされている、線形インデックス配列が作成されますか?

ピトンのwhere、特にこのzipの機能に相当するものは何ですか?

+0

この質問を見る(あなたはboost :: zip_iteratorを使用できるはずです):http://stackoverflow.com/questions/8511035/sequence-zip-function-for-c11 – ChristopheD

+2

あなたは、 'non_black_coords_array'が望みの構造をすぐに持つようにコードを書いてしまうので、C++の同等物では' zip() 'が必要です。 'numpy.where()'の出力形式を制御することができないので、Pythonではこれが必要です。 –

答えて

0

私はOpenCVについて知らないので、何かを教えてください。cv.GetMat()明らかに、2次元配列として使用するか、2次元配列に変換できるものを返します。使用しているOpenCVへのCまたはC++インターフェイスには、おそらく同様の名前の機能があります。

次の行は、3より大きいgrey_image_as_arrayのエントリのインデックスペアの配列を作成します。 non_black_coords_arrayの各エントリは、grey_image_as_arrayにゼロベースのx-y座標です。このような座標ペアx,yが与えられた場合、2次元C++配列grey_image_as_arrayの対応するエントリにgrey_image_as_array[y][x]でアクセスできます。

Pythonコードは、優れたパフォーマンスを達成するために画像上の明示的なループを避けなければならないため、NumPyが提供するベクター化された関数を使用する必要があります。式grey_image_as_array > 3は、ベクトル化された比較であり、grey_image_as_arrayと同じ形状のブール配列になります。次に、numpy.where()は、このブール配列のTrueエントリのインデックスを抽出しますが、結果は上記の形式ではないため、再構成するにはzip()が必要です。

C++では明示的なループを避ける必要はなく、numpy.where()に相当するものは無意味です。ループを作成し、結果を任意の形式で保存するだけです。

+0

Sven、私の場合、最終的な行き先はC#です。私はC++開発者ではないので、C++で説明していることをどのように記述するかについてもわかりません。私はあなたの答えを拡張している知っているが、あなたはまた、> 3フィルタリングを行うために言及しているC + +のループを書いてください? –

+0

@ MaximV.Pavlov:これはC#とよく似ています。ループ自体はおそらく同じです。困難な部分は、ターゲット配列にどのようなデータ型を使用するかであり、それはさらに結果がどのように行われるかによって異なります。より多くの文脈がなければ、私はさらなるアドバイスをすることはできません。 –

関連する問題