OpenCV

C++ で OpenCV を使う

前書いたのは、C# から ライブラリを C++ ( OpenCV ) として使う方法。これは C++ 単体で動かす。前と共通部分は略。 手順 Visual C++ をクリックし「空のプロジェクト」を選択。ex ) Foo という名 main.cpp を「 Projects フォルダ > Foo フォルダ > Foo フ…

OpenCV_輝度とコントラストを変更 02 ( cv::convertTo ) 訳

α がコントラスト。β が輝度。コントラスト:明暗の差。輝度:色による明るさの違いを考慮したもの。 下記の訳。 https://docs.opencv.org/3.4/d3/dc1/tutorial_basic_linear_transform.html ガンマ補正 ガンマ補正は、入力値とマップされた出力値との間の非…

OpenCV_輝度とコントラストを変更 01 ( cv::convertTo ) 訳

cv::convertTo () のアルファとベータをどう決めたらいいのかが疑問。元画像が 10 や 16 bit の時とか。 α がコントラスト。β が輝度。コントラスト:明暗の差。輝度:色による明るさの違いを考慮したもの。 下記の訳。 https://docs.opencv.org/3.4/d3/dc1/…

OpenCV_cv::normalize( ) メモ

異なるビット深度を変換して表示したかった。例外は発生していないが表示絵が正確なのかどうか不明。配列のノルムまたは値の範囲を正規化する。スケールを正規化し、入力配列要素をシフトする。正規化:データなどを使いやすいように整理したり変形したりす…

OpenCV_cv::saturate_cast<T> メモ

cv::convertTo( ) は、オーバフローを回避するために、処理の最後に saturate_cast<> が適用される。ある基本型から別の基本型へ効率的に、かつ正確に変換を行う。 名前の " saturate " は、入力値 v が変換後の型の範囲外にある場合、単に入力の下位ビット…

OpenCV_convertTo( ) メモ

void Mat::convertTo ( Mat& m, int rtype, double alpha = 1, double beta = 0 ) 行列のデータを別の型に変換。データはコピーされる。元の配列の各要素を alpha 倍して、beta を加算する。 第一引数 m:出力行列。適切なサイズやタイプでない場合は処理前…

OpenCV_ cv::minMaxIdx メモ

cv::minMaxLoc は多次元 ( シングルチャンネル ) にも対応しているが、入力型は cv::SparseMat 。 cv::minMaxIdx 使用して多次元の最大最小を確認。引数は cv::minMaxLoc () とほぼ同じなので略。 --- cv::Mat コンストラクタmemo --- cv::Mat::Mat ( int nd…

OpenCV_ cv::Mat ( シングルチャンネル ) の最大値 などを得る

cv::minMaxLoc 関数を使う。 配列全体 or 部分配列に対して、最小・最大の要素値やそれらの位置を求める。mask が空の配列でない場合は、指定された配列領域から探索される。※マルチチャンネル配列に対しては動作しない。 最初に cv::reshape() を用いて配列…

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_cv::Mat が 4 バイト云々 と step について

OpenCV_画像を IplImage型 で読み込んで System::Drawing::Bitmap^ に変換、の続き。よく分からんが、bitmap は 幅を 4 の倍数のバイトに調整しているがmat の step は 4 の倍数にしていない、ということでいいか。 横幅が 4 の倍数でないとエラーのワケ 画…

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, cv::Rect(10,10,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>…