OpenCV

OpenCv_Mat のプロパティ

コピペ。 ex ) cv::Mat m1(3, 4, CV_64FC1); プロパティ 説明 出力 m1.rows 行数 3 m1.cols 列数 4 m1.dims 次元数 2 m1.size( ).width , m1.size( ).height サイズ 4, 3 m1.depth( ) ビット深度ID 6 m1.channels( ) チャンネル数 1 m1.elemSize( ) 複数チャ…

OpenCV_画像を Mat 型で読み込んで System::Drawing::Bitmap^ に変換 01

IplImage 型でなく Mat 型で試した。 System::Drawing::Bitmap^ bmpA = gcnew System::Drawing::Bitmap( mat.cols, mat.rows, mat.step, System::Drawing::Imaging::PixelFormat::Format24bppRgb, (IntPtr)mat.data); System::Drawing::Bitmap^ bmpB = gcnew…

OpenCV_画像を IplImage型 で読み込んで System::Drawing::Bitmap^ に変換

C# で new Bitmap (10, 10, ~ ) とプログラムから bmp 画像を作成することが出来ること忘れてた。 ※ 作成した Bitmap を スクロールバー付き ImageBox に表示し、スクロールバーを動かすと赤×になる。↓ はreturn bmp している。 cv::Ptr<IplImage> ipImag = cvLoadIma</iplimage>…

OpenCV_IplImage 型から Mat への変換

IplImage → System::Drawing::Bitmap^ 変換の過程メモ的な。 cvLoadImage を使う。 第一引数のファイル名の型は const char* 。 第二引数のパラメータは、( 読込:読み込まれる )CV_LOAD_IMAGE_COLOR :強制的に3チャンネルカラー画像として読込。CV_LOAD_IM…

OpenCV_ 2 点間の距離を求める

.x や pow、sqrt 使わないから楽。 cv::norm を使う。 cv::Point2f a(1, 3); cv::Point2f b(9, 14); float ans = cv::norm(a - b); std::cout << and << std::endl; //13.6015 ノルム ( 複数の説明引用 ) ・n 次元空間におけるベクトル間の距離を表わすもの…

OpenCV_Rect の追記

C# Rectにおける BottomLeft などと同様の関数があった。 tl が左上の座標を返し、br が右下の座標を返す。 ex ) cv::Rect hgoe(0, 10, 100, 200); //(x, y、w, h) hoge.tl(); // [0, 10] hoge.br(); // [100, 210] hoge.size(); // [100 * 200] こちらから…

メディアンフィルタとは

中央値を利用した平滑化フィルタ。 周辺画素の輝度値と大きく異なる画素を取り除くことができる。ノイズ除去で効果を発揮。メディアン:データを小さい順に並べた時の真ん中にある値。 注目画素の近傍の画素値を取得。( ex 8 近傍なら周囲が 8 画素 ) 9 つの…

OpenCV_画素アクセスメモ

cv::Mat の深度とアクセス時の型を合わせる必要あり。合わせないと例外が発生する。 ex )CV_8U は unsigned char 型なので アクセス時の型もこれにする。 cv::Mat hoge = cv::Mat::zeros(3, 1, CV_8U); for (int y = 0; y < hoge.rows; y++) { for (int x = …

OpenCV_ROI とは

Region Of Interest : 関心領域。( 対象領域 ) ROI を設定すると、その部分領域を扱う際に本来なら考慮すべきことをしないで処理できる。 ex ) ※ 変数名は適当に使いまわし。 cv::Mat img ( Size(320,240), CV_8UC3 ); cv::Mat roi ( img, Rect(10,10,100,1…

OpenCV_cv::Mat の行を指定して削除したい

経緯メモ) 要素を順次見ていき、条件が true の行だけを cv::Mat 型として欲しい。resize だと欲しいデータにならない。 結論 mat.row( int ); で mat から int 行を取り出し、別 Mat へ挿入する。 cv::Mat mv; mv.push_back ( mat.row( i ) ); mat が元 Mat…

OpenCV_Mat の行削除

OpenCV 逆引きリファレンス で 削除 と検索かけてもヒットしなくて焦った。リサイズ でヒット。 mat.resize(2); 行単位のみで変更。mat は cv::Mat 型。 3 * 3 を 2 * 3 にしたり、 mat.resize(2); → 5 * 3 に削除・拡大できる。 mat.resize(5, cv::Scalar(1…

OpnCV _ C++ _引数の & と const のありなし

型の前の & は参照を示す宣言子。 参照したサイトでは cv::Mat 型だが、他の型も挙動は同じ ? かと。 以下の違い。 cv::Matconst cv::Matcv::Mat&const cv::Mat& 前知識 Memo -- cv::Mat のコピー -- cv::Mat は代入演算子を使うと、浅いコピーが行われコピ…

OpenCV_cv::VideoCapture を C++/CLI で使う

C++ cv::VideoCapture cap("./動画ファイル"); cv::Mat mat; cap >> mat; C++/CLI cv::VideoCapture * capX; capX = new cv::VideoCapture("./動画ファイル"); cv::Mat mat; *capX >> mat; しかし、capX をメンバ変数に代入して関数間で使おうとすると例外発…

OpenCV_背景差分

3.x は、BackgroundSubtractorMOG2 を使うもよう。 ---追記--- 違う。2.x の時からあった。書き方が変わっただけ。3.x からはアルゴリズムが増えた。LBP を使った手法など。使うには #include <opencv2/bgsegm.hpp> が必要。 http://whoopsidaisies.hatenablog.com/entry/2018/03</opencv2/bgsegm.hpp>…

OpenCV_RGB 画像を分離

cv::split を使う。 分離した R・G・B は 1 チャンネルなので、カラーで表示するには他の輝度 (輝度値 0 ) で補う。 なお、分離した 1 チャンネル Mat を 3 チャンネルに統合するにはcv::merge を使う。 ex ) // 分離 splitTmp[0] ~ splitTmp[2] に B・G・R…

CMake とは

lib つくるとかよく分からん。配布されてるんでないの ? という疑問があり調べた。 OpenCV に限った話ではないが、 Linux とか Unix 使う気配ないのでOpenCV のカテゴリにした。 同じソースツリーからさまざまなコンパイラー向けにビルドを行えるようにする…

OpenCV_透過データありの 4 チャンネル を CV_8UC1 にしたらおかしい

チャンネル数を 1 にすればグレースケール!ではないらしい。CV_8UC1 にするなら convertTo だ…。 ↓を実行しても想定通りの結果が出なかった。 cv::Mat gray cv::cvtColor(mat, gray, CV_8UC1); //mat は cv::Mat 型の 4 チャンネル。透過データあり。 黒 ( …

Opncv_データ型

Vec2b や Vec3d とか何を指しているか分からなくなる。 利便性のために、型の別名が定義されている。 my環境では cv::Point2fなど、cv::付ける。 別名 型 Point2i Point_<int> Point Point2i Point2f Point_<float> Point2d Point_<double> Point3i Point3_<int> Point3f Point3_<float> Poin</float></int></double></float></int>…

OpenCV_ Mat 行列の変形

reshape( ) を使う。 reshape ( int cn, int row = 0 ); int cn:チャンネル数を指定。0 の場合はそのまま。 int row:新しい行数 row を指定。0 の場合はそのまま。 ex ) 1 × Cols の Mat型に変換。 cv::Mat srcMat = cv::imread("./test.jpg"); cv::Mat ds…

OpenCV_ undistortPoints( ) の結果がおかしい

1000 や 100 の座標なのにマイナスや 0. XXX になってしまった。 結論から。 第 6 引数 ( カメラ行列 ) を指定する。第 5 引数 ( 平行化変換 ) は指定しなくとも 出力結果見た範囲では 問題なかった。 ※何故だかわからん。 緑字以外、値は格納済み。std::vec…

OpenCV_座標を Mat 型にする

諸事情により、[x, y, z] を Mat 型にしたかった。 ( cv::Mat_< T >( 行, 列) ) << 行×列 ); 以下で、座標 [ 1, 2, 3 ] を 3 × 1 の行列に。 cv::Mat pMat = (cv::Mat_<double>(3, 1) << 1, 2, 3); で、pMat は行列として扱われる 座標 [ 1, 2, 3 ] が格納。正しいか</double>…

OpenCV_ cv::findCirclesGrid

キャリブレーショ ンのコードは大体こんな感じ。 チェスボードのコーナ、サークルグリッドの中心を検出。findChessboardCorners 関数、findCirclesGrid 関数。 検出した位置精度を高める。cornerSubPix 関数。 検出した位置 ( 座標 ) を imagePoints に格納…

OpenCV_内部パラメータと外部パラメータ

カメラの位置・姿勢 調べの続き。だが脇道にずれてる。calibrateCamera 関数で出力される歪み係数 ( distCoeffs ) だが、出力したデータ開くと見方が不明。rvec と tvec も同様。 内部パラメータ intrinsic parameter 焦点 距離、画像中心座標、アスペク ト…

OpenCV_ チャンネル 4 の Mat に矩形などを描く

Scalar を 4チャンネルにすればよい。 cv::Scalar(B, G, R, 255) でOK。 透過度の値を知りたい場合は、( matHoga は Mat 型 4 チャンネル ) auto v = matHoga.at<cv::Vec4b>(y, x); で、Debug か log 出力する。ペイントで png 保存した画像は、v[3] の値が 255 だった。</cv::vec4b>…

OpenCV_ CV_8UC1 から CV_8UC3 に変換する

チャンネル数 1 から チャンネル数 3 に変換。グレー画像からカラーに変換したい。 cv::Mat imgAfter;cv::cvtColor ( matC1, imgAfter, CV_GRAY2BGR ); matC1 は Mat型 CV_8UC1。imgAfter は 無事 CV_8UC3 となった。 Mat::convertTo で 型の変換を試みたが…

OpenCV_Mat::type( ) の値

「行列要素の型を返す」とあるが、img.type(); で取得した値は ( img は Mat 型 ) 、16 や 24 と出て読み方が分からなかった。 Mat::type で返ってくる数値は、ビット深度とチャンネル数を表している。 表より 16 ならば CV_8U の C2。24 ならば CV_8U の C4…

OpenCV_二値化 ( threshold )

threshold 関数を用いる。( グローバル閾値法 )シングルチャンネルの配列に対して、ある定数での閾値処理を行う。閾値より大きいと 1 に、 小さいと 0 に設定して二値画像を作成する。二値画像生成やノイズ除去などに利用される場合が多い。 adaptiveThresho…

OpenCV_グレースケールに変換

モノクロ画像に変換する。2 通りある。 画像をグレースケールとして読み込む cv::Mat img = cv::imread("./001img.jpg", CV_LOAD_IMAGE_GRAYSCALE); cv::imshow("gray", img); cvtColor で変換する cv::Mat img = cv::imread("./001img.jpg"); cv::Mat gray;…

OpenCV_ copyTo について

深いコピー ( clone と同様 )とマスク行列 ( Mat ) を用いてのコピーが出来る。 深いコピー cv::Mat を代入演算子でコピーすると、浅いコピー ( shallow copy ) が行われ、コピー元とコピー先で cv::Mat のデータが共有される。(参照渡し的な感じ)先も元も同…

OpenCV_色抽出とマスキング

マスキング:描画など作業したくない領域を指定し、保護すること。包み隠す、覆い隠す。画像処理では隠したい領域は黒、抽出したい領域は白。 色抽出 下記画像から赤 (255, 0, 0) を抽出する。 ※写真などから赤を抽出する際は、薄~濃と赤の色にも範囲がある…