OpenCV

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) を抽出する。 ※写真などから赤を抽出する際は、薄~濃と赤の色にも範囲がある…

OpenCV_ 値の書き出しと読込み

yml 拡張子 only かと思っていたが違う。 cv::Matの中身 や int 型、string 型、キーポイント点などのパラメータを出力できる。yml とか xml で保存。( pca とかも出力できる ) cv::FileStorage を用いることでファイル入出力が出来る。 YAML とは、データ構…

OpenCV_ 画像の読込み と 表示

前に読込み・書き出しはメモしていたわ…。 imread で画像を読み込み、imshow で表示。 ※ Mat 画像 を C# の pictureBox に表示するにはBitmap 形式に直して C# に渡す必要があるが、一先ず置いておく。 ソース cv::Mat img = cv::imread("./001img.jpg"); cv…

OpenCV_ Mat の基本操作 (追記)

画像のコピー 完全なコピーの場合は、clone( ) を用いる。 cv::Mat tmp = origImg.clone( );※ img は Mat 型変数。 サイズとデータ型のみをコピーしたい場合。 cv::Mat tmp( origImg.size( ), origImg.type( ), Scalar::all(xxx) );※ cv::Scalar() は任意の…

OpenCV_ Mat の基本操作

Mat 続き。 画像情報の取得 画像の行、列を取り扱うことが出来る。 rows:画像の高さ ( 行数に対応 )cols:画像の幅 ( 列数に対応 ) ex ) cv::Mat hoga( cv::Size(200, 100), CV_8UC3, cv::Scalar(0, 0, 255) );hoga.clos で 200。 channels でチャンネル数…

OpenCV_Mat の基本

Matrix ( 行列 ) の略。画像データを格納するデータ構造。データ構造:データの集まりを扱いやすいように、一定の形式で格納したもの。 画像生成 cv::Mat hoga( cv::Size(200, 100), CV_8UC3, cv::Scalar(0, 0, 255) ); これでインスタンスが生成。画像の幅 …

OpenCV_ インストール

よく分からないけど動いた!( 環境変数パスは設定していない ) https://sourceforge.net/projects/opencvlibrary/files/から OpenCV をダウンロード。( opencv-win をダウンロードした ) ダウンロードした .exe を展開 C++ のプロジェクト内へinclude と ( x…