[32/64bit] cv::SparseMat のインスタンスを生成します
core_SparseMat_new3 p1,p2
p1 = sptr : IntPtr m p2 = var : out IntPtr returnValue
(プラグイン / モジュール : OpenCvSharpExtern.dll)
SparseMat クラスは,多次元の疎な数値配列を表します. このような疎な配列は, Mat が格納できるあらゆる型の要素を格納できます.疎な配列とは,0 ではない要素のみが格納されていることを意味します(ただし,疎な行列に対する演算の結果,格納されている要素のいくつかは実際に 0 になる可能性があります.)0 ではない要素は,ハッシュテーブルに保存されます.このハッシュテーブルは,(要素が存在するかどうかに関わらず)平均して検索時間が O(1) になるように,埋められるたびに大きくなります.要素へのアクセスには,以下の方法があります. 例えば,クエリ操作(SparseMat::ptr や,上位の SparseMat::ref,SparseMat::value,SparseMat::find).const int dims = 5;int size[5] = {10, 10, 10, 10, 10};SparseMat sparse_mat(dims, size, CV_32F);for(int i = 0; i < 1000; i++){ int idx[dims]; for(int k = 0; k < dims; k++) idx[k] = rand() % size[k]; sparse_mat.ref<float>(idx) += 1.f;}cout << "nnz = " << sparse_mat.nzcount() << endl; 疎行列のイテレータ.これらは MatIterator と似ていますが,NAryMatIterator とは異なります.つまり,STL ユーザーにはおなじみの反復ループです.// 疎な浮動小数点型行列の要素//と要素の合計を表示します.SparseMatConstIterator_<float> it = sparse_mat.begin<float>(), it_end = sparse_mat.end<float>();double s = 0;int dims = sparse_mat.dims();for(; it != it_end; ++it){ // 要素のインデックスと要素の値を表示 const SparseMat::Node* n = it.node(); printf("("); for(int i = 0; i < dims; i++) printf("%d%s", n->idx[i], i < dims-1 ? ", " : ")"); printf(":%g\n", it.value<float>()); s += *it;}printf("Element sum is %g\n", s); このループを実行すると、要素が論理的な順序(辞書的な順序など)で列挙されていないことに気がつきます。ハッシュテーブルに格納されているのと同じ順序(半ランダム)で並んでいます。ノードへのポインタを集めてソートすれば、適切な順序になります。ただし,行列に要素を追加すると,ノードへのポインタが無効になることがあるので注意が必要です.これは,バッファが再割り当てされる可能性があるために起こります. 2つ以上の疎な行列を同時に処理する必要がある場合は,上記2つの方法を組み合わせます.double cross_corr(const SparseMat& a, const SparseMat& b){ const SparseMat *_a = &a, *_b = &b; // b の要素数が a よりも少ない場合は, // b を繰り返し処理した方が高速です if(_a->nzcount() > _b->nzcount()) std::swap(_a, _b); SparseMatConstIterator_<float> it = _a->begin<float>(), it_end = _a->end<float>(); double ccorr = 0; for(; it != it_end; ++it) { // 1 番目の行列から次の要素を取り出します float avalue = *it; const Node* anode = it.node(); // そして,2 番目の行列から同じインデックスを持つ要素を見つけようとします. // ハッシュ値は要素のインデックスにのみ依存するので, // ノードに格納されているハッシュ値を再利用します float bvalue = _b->value<float>(anode->idx,&anode->hashval); ccorr += avalue*bvalue; } return ccorr;}. 元関数名(C#): core_SparseMat_new3 元DLLエクスポート名: core_SparseMat_new3 参照元CSファイル: Internal\PInvoke\NativeMethods\core\NativeMethods_core_SparseMat.cs ▼ C言語側関数定義
CVAPI(ExceptionStatus) core_SparseMat_new3(cv::Mat *m, cv::SparseMat **returnValue) { BEGIN_WRAP *returnValue = new cv::SparseMat(*m); END_WRAP }
プラグイン / モジュール | OpenCvSharpExtern.dll |
バージョン | 1.00 |
作成日 | 2021/11/30 |
著作者 | inovia |
URL | https://hsp.moe/ |
備考 | #include "OpenCvSharpExtern32.as"
#include "OpenCvSharpExtern64.as" 使用するHSPランタイムのビット数に合わせたインクルードファイルを使用すること |
タイプ | OpenCVSharpラッパーDLL |
グループ | NativeMethods_core_SparseMat |
対応環境 |
|
hs ファイル | hsphelp\OpenCvSharpExtern.hs |