2017-06-09 74 views
1

C++配列を2D opencv Matオブジェクトに変換する最も速い方法は何ですか? ブルートフォース方式は、2Dマットのすべてのエントリをループし、それらに配列の値を入力することです。
これを行うためのより良い/より速い方法がありますか? 何とか2次元配列に配列のポインタを渡すことができますか?
(私はopencv 2.4.8を使用しています)C++配列をopencvに変換する方法Mat

+0

OpenCV!それは明確に説明されている –

答えて

6

ありますが、documentationにはどのように達成できるかが分かります。

は、特にこのライン

C++:マット::マット(行INT、colsの、int型、void *型データをint型、size_tのステップ= AUTO_STEP)

これは、あなたが行うことができることを意味し何かのように

double x[100][100]; 

cv::Mat A(100, 100, CV_64F, x); 

これはデータをコピーしません。 openCVデータは行の長さであることを覚えておいてください。これは、1行のすべての列と次の行などを持つことを意味します。だからあなたの配列は、それが動作するためにこのスタイルに合っていなければなりません。

スピードについての資料もそれを語る:

データ - ポインタユーザデータに。データとステップパラメータを受け取る行列コンストラクタは行列データを割り当てません。代わりに、指定されたデータを指す行列ヘッダーを初期化するだけです。つまり、データはコピーされません。この操作は非常に効率的で、OpenCV関数を使用して外部データを処理するために使用できます。外部データの割り当てが自動的に解除されることはありませんので、注意してください。

これは非常に高速ですが、同じ配列です。変更しないとcv :: Matで変更され、破壊された場合は存在しない場所を指します。

UPDATE:

私はあなたにもマットを作成し、memcpyを行うことができると言うのを忘れていました。この方法でデータをコピーしますが、可能です。

double x[100][100]; 
cv::Mat A(100,100,CV_64F); 
std::memcpy(A.data, x, 100*100*sizeof(double)); 
関連する問題