[32bit] cv::Mat のインスタンスを生成します
core_Mat_new7 p1,p2,p3
p1 = sptr : IntPtr mat p2 = ARGS_RECT : Rect roi p3 = var : out IntPtr returnValue
(プラグイン / モジュール : OpenCvSharpExtern.dll)
n-dimensional dense array クラス クラス Mat は,シングルチャンネルまたはマルチチャンネルの,n-dimensional dense 数値配列を表します.これは,実数または複素数のベクトルや行列,グレースケールやカラーの画像,ボクセルボリューム,ベクトルフィールド,点群,テンソル,ヒストグラム(ただし,非常に高次元のヒストグラムは, SparseMat に格納した方が良いかもしれません)を格納するために利用できます.配列 M のデータレイアウトは,配列 M.step[] によって定義されており,要素 ?((i_0,...,i_{M.dims-1})?)のアドレスは,次のように計算されます: ?((i_k<M.size[k]?)) \Addr(M_{i_0,...,i_{M.dims-1}}) = M.data + M.step[0]*i_0 + M.step[1]*i_1 + ...+ M.step[M.dims-1]*i_{M.dims-1}\] 2次元配列の場合,上の式は次のようになります. \Addr(M_{i,j}) = M.data + M.step[0]*i + M.step[1]*j\]」となります。 M.step[i] >= M.step[i+1] (実際には、M.step[i] >= M.step[i+1]*M.size[i+1] ) であることに注意してください。つまり,2次元の行列は行ごとに,3次元の行列は面ごとに,それぞれ格納されているということです.M.step[M.dims-1] は最小で,常に要素サイズ M.elemSize() と等しくなります. つまり,Mat のデータレイアウトは,Numpy (ndarray) や Win32 (independent device bitmaps) などの標準的なツールキットや SDK で提供されている密な配列タイプの大半,つまり,ピクセルの位置を計算するのにステップ(またはストライド)を利用するあらゆる配列と互換性があります.この互換性により,ユーザが割り当てたデータの Mat ヘッダを作成し,OpenCV の関数を使ってその場で処理することができます. Mat オブジェクトを作成するには,様々な方法があります.最も一般的な方法を以下に示します. create(nrows, ncols, type) メソッドや,類似の Mat(nrows, ncols, type[, fillValue]) コンストラクタを利用します.type は, cvCreateMat メソッドと同じ意味を持ちます.例えば, CV_8UC1 は 8 ビットシングルチャンネル配列を意味し, CV_32FC2 は 2 チャンネル(複素数)浮動小数点型配列を意味します.// 1+3 で埋め尽くされた 7x7 の複素行列を作成します。j.Mat M(7,7,CV_32FC2,Scalar(1,3));// そして今度は,M を 100x60 の 15 チャンネル 8 ビット行列に変えます。 // 古い内容は解放されます。M.create(100,60,CV_8UC(15)); 本章のイントロダクションで述べたように, create() は,現在の配列の形状や型が指定されたものと異なる場合にのみ,新しい配列を確保します. 多次元の配列を作成します。// 100x100x100 の 8 ビット配列を作成しますint sz[] = {100, 100, 100};Mat bigCube(3, sz, CV_8U, Scalar::all(0)); Mat のコンストラクタに次元数 =1 を渡していますが,作成される配列は列数が 1 の 2 次元になります. 右辺に配列や式が存在する可能性がある場合は,コピーコンストラクタや代入演算子を利用します(後述).導入部で述べたように,配列の代入は,ヘッダのコピーと参照カウンタの増加だけなので,O(1) の処理です.Mat::clone() メソッドを利用すれば,必要な時に配列の完全な(深い)コピーを得ることができます. 別の配列の一部に対するヘッダを作成します.それは,1 つの行,1 つの列,複数の行,複数の列,配列中の矩形領域(代数学ではマイナーと呼ばれます),または対角線のいずれかです.このような操作も,新しいヘッダが同じデータを参照するため,O(1)となります.この機能を使って,実際に配列の一部を変更することができます.例えば// 5 番目の行に 3 を掛けたものを 3 番目の行に追加するM.row(3) = M.row(3) + M.row(5)*3;// 7 番目の列を 1 番目の列にコピーする// M.col(1) = M.col(7); // これは動作しませんMat M1 = M.col(1);M.col(7).copyTo(M1);// 320x240 の新しい imageMat img(Size(320,240),CV_8UC3);// ROIMat roi(img, Rect(10,10,100,100));// ROI を (0,255,0) (RGB 空間では緑) で埋める.// オリジナルの 320x240 の画像が変更されます. roi = Scalar(0,255,0); 追加の datastart および dataend メンバにより, locateROI() を用いて,メインコンテナ配列内の相対的なサブアレイの位置を計算することができます.Mat A = Mat::eye(10, 10, CV_32S);// A の列,1 (including) から 3 (exclusive) を抽出します.Mat B = A(Range::all(), Range(1, 3));// B の行,5 (including) から 9 (exclusive) を抽出します.locateROI(size, ofs);// size は (width=10,height=10) となり,ofs は (x=1, y=5) 行列全体の場合と同様に,深いコピーが必要な場合は,抽出された部分行列の clone() メソッドを利用します. ユーザが割り当てたデータのヘッダを作成します。以下のようにすると便利です. OpenCV を用いて,「外部」のデータを処理します(例えば,DirectShow* のフィルタや,gstreamer の処理モジュールを実装する場合など).例えば,以下のようになります.Mat process_video_frame(const unsigned char* pixels, int width, int height, int step){ // 入力バッファをラップします. Mat img(height, width, CV_8UC3, (unsigned char*)pixels, step); Mat result; GaussianBlur(img, result, Size(7, 7), 1.5, 1.5); return result;}. double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};Mat M = Mat(3, 3, CV_64F, m).inv(); MATLAB スタイルの配列初期化子,zeros(), ones(), eye() などを利用します.// 倍精度の単位行列を作成し,それを M.M += Mat::eye(M.rows, M.cols, CV_64F) に追加します. コンマで区切られたイニシャライザを利用します.// 3x3 の倍精度単位行列を作成します。Mat M = (Mat_<double>(3,3) << 1, 0, 0, 1, 0, 0, 1); この方法では,まず適切なパラメータを指定して Mat クラスのコンストラクタを呼び出し,次に << 演算子の後に定数,変数,式などのコンマで区切られた値を置くだけです.また,コンパイルエラーを避けるために,余分な括弧が必要であることにも注意してください. 配列が作成されると、参照カウントの仕組みによって自動的に管理されます。配列のヘッダがユーザが割り当てたデータの上に構築されている場合は,そのデータを自分で処理する必要があります.配列データは、誰からも指されなくなると解放されます。配列デストラクタが呼ばれる前に,配列ヘッダが指し示すデータを解放したい場合は, Mat::release() を利用してください. 配列クラスについて次に学ぶべき重要なことは,要素へのアクセスです.このマニュアルでは,各配列要素のアドレスを計算する方法を既に説明しました.通常は,コード内で直接その式を使う必要はありません.配列要素の型(メソッド Mat::type() を用いて取得できます)を知っていれば,2 次元配列の要素 \(M_{ij}\) に,次のようにアクセスできます.M.at<double>(i,j) += 1.f; M は倍精度浮動小数点型配列であると仮定します.M.at<double>(i,j) += 1.f; Mは倍精度の浮動小数点配列であると仮定しています。 2 次元配列の行全体を処理する必要がある場合,最も効率的な方法は,最初に行へのポインタを取得し,次に C の単純な演算子 [] を使用することです: // 正の行列要素の総和を求めます // (M が倍精度の行列であると仮定して)double sum=0;for(int i = 0; i < M. .rows; i++){ const double* Mi = M.ptr<double>(i); for(int j = 0; j < M.cols; j++) sum += std::max(Mi[j], 0.);}.上の例のように,実際には配列の形状に依存しない演算もあります.このような演算は,配列の要素を1つずつ処理するだけです(あるいは,配列の加算など,同じ座標を持つ複数の配列の要素を処理することもあります).このような操作を「要素ワイズ」と呼びます。すべての入出力配列が連続しているかどうか,つまり,各行の終わりに隙間がないかどうかをチェックすることは意味があります.もしそうであれば,それらを長い1つの行として処理します.// 最適化された正の行列要素の和を求めるtdouble sum=0;int cols = M.cols, rows = M.rows;if(M.isContinuous()){ cols *= rows; rows = 1;}for(int i = 0; i < rows; i++){ const double* Mi = M.ptr<double>(i); for(int j = 0; j < cols; j++) sum += std::max(Mi[j], 0.);}.連続した行列の場合,外側のループ本体は1回しか実行されません.そのため,オーバーヘッドが小さくなり,特に小さな行列の場合には顕著です. 最後に,連続した行の間のギャップをスキップすることができる STL スタイルのイテレータを紹介します.// 正の行列要素の総和を計算する,イテレータベースのバリアントdouble sum=0;MatConstIterator_<double> it = M.begin<double>(), it_end = M.end<double>();for(; it != it_end; ++it) sum += std::max(*it, 0.); 行列イテレータは,ランダムアクセスイテレータなので,std::sort() を含む,あらゆる STL アルゴリズムに渡すことができます. 注釈matrix Expressions and arithmetic see MatExpr 例: fld_lines.cpp,modules/shape/samples/shape_example.cpp,samples/cpp/camshiftdemo.cpp,samples/cpp/connected_components.cpp,samples/cpp/contours2.cpp,samples/cpp/convexhull.cpp,samples/cpp/cout_mat.cpp,samples/cpp/create_mask.cpp,samples/cpp/demhist.cpp,samples/cpp/distrans.cpp, samples/cpp/edge.cpp, samples/cpp/facedetect.cpp, samples/cpp/falecolor.cpp, samples/cpp/ffilldemo.cpp, samples/cpp/filestorage.cpp, samples/cpp/fitellipse.cpp, samples/cpp/grabcut.cpp, samples/cpp/image_alignment.cpp, samples/cpp/intersectExample.cpp, samples/cpp/kalman.cpp, samples/cpp/kmeans.cpp,samples/cpp/laplace.cpp,samples/cpp/lkdemo.cpp,samples/cpp/minarea.cpp,samples/cpp/pca.cpp,samples/cpp/peopledetect.cpp,samples/cpp/polar_transforms.cpp,samples/cpp/segment_objects.cpp,samples/cpp/squares.cpp,samples/cpp/stitching.cpp,samples/cpp/stitching_detailed.cpp,samples/cpp/train_HOG.cpp, samples/cpp/tutorial_code/features2D/Homography/decompose_homography.cpp, samples/cpp/tutorial_code/features2D/Homography/homography_from_camera_displacement.cpp, samples/cpp/tutorial_code/features2D/Homography/pose_from_homography.cpp, samples/cpp/tutorial_code/HighGUI/AddingImagesTrackbar.cpp, samples/cpp/tutorial_code/Histograms_Matching/MatchTemplate_Demo.cpp, samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp, samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_2.cpp, samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp, samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp, samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp, samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp, samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp, samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp, samples/cpp/tutorial_code/ImgTrans/houghlines.cpp, samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp, samples/cpp/tutorial_code/ml/introduction_to_pca/introduction_to_pca.cpp, samples/cpp/tutorial_code/photo/non_photorealistic_rendering/npr_demo.cpp, samples/cpp/tutorial_code/photo/seamless_cloning/cloning_demo.cpp, samples/cpp/tutorial_code/videoio/video-write/video-write.cpp, samples/cpp/videowriter_basic.cpp, samples/cpp/warpPerspective_demo.cpp, samples/cpp/watershed.cpp, samples/dnn/classification.cpp, samples/dnn/colorization.cpp, samples/dnn/object_detection.cpp, samples/dnn/openpose.cpp, samples/dnn/segmentation.cpp, samples/dnn/text_detection.cpp, and samples/tapi/squares.cpp. 元関数名(C#): core_Mat_new7 元DLLエクスポート名: core_Mat_new7 参照元CSファイル: Internal\PInvoke\NativeMethods\core\NativeMethods_core_Mat.cs ▼ C言語側関数定義
CVAPI(ExceptionStatus) core_Mat_new7(cv::Mat *mat, MyCvRect roi, cv::Mat **returnValue) { BEGIN_WRAP *returnValue = new cv::Mat(*mat, cpp(roi)); 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_Mat |
対応環境 |
|
hs ファイル | hsphelp\OpenCvSharpExtern.hs |