OpenCV、機械学習、はやりのDeep learningの環境構築の方法、サンプルの動かし方、APIの使い方、Tipsなどをすぐに忘れてしまうので、備忘録として記録している。記憶がなくなるスピードが、早いのでメモしておかないと再現できなくなる確率が高まっている。 最近、再度HDDを飛ばしてしまい、過去の自分のページに再度助けられた。 また、DNNモジュールを触る機会が増えているので、C++からPyhonへと鞍替え中。 内容を気にいっていただければ、twitterで紹介願います。
2013年2月12日火曜日
OpenCVの今後
本日twitterのTL上にOpenCVの開発元であるWillow Garageが解散するのではというつぶやきが目立つようになった。
今のところ公式からのアナウンスは、ここに掲載されているが、OpenCVに関して何も触れられていないため、不安が増している。
OpenCVで平均2乗誤差を計算する
OpenCVで画像処理を行った結果、平均2乗誤差(Mean Square Error)を計算したい場合がある。
愚直に一画素ごとに計算していたが、OpenCV 2 プログラミングブック p194に簡単に計算するコードが記載さている
cv::Mat gray1 , gray2;
gray1.convertTo(gray16s1, CV_16S);
gray2.convertTo(gray16s2, CV_16S);
gray16s1 -= gray16s2;
cv::Scalar s = sum(gray16s1.mul(gray16s1));
double mse = s[0] / gray16s1.rows / gray16s1.cols;
蛇足
CV のMSE は Microsoft Security Essentials ではない
OpenCVのDocumentationのページがリニューアルされた
休み中、OpenCVのDocumentationのページにアクセスできなかったので更新中かと思っていたら、リニューアルされていた。
今回、バージョンごとのリファレンスやユーザーガイド、チュートリルのページのほかに、最新版(Night Build)のページも用意されている
Night Buildは、2/12の時点では、2.4.4.0ドキュメントのページとなる
2.4.3のリファレンス
以前の2.4.3のドキュメントのページ
今の2.4.3のドキュメントのページ
2013年2月10日日曜日
OpenCVのcalibration_artificialを試してみた
サンプルファイルは、samples\cpp\calibration_artificial.cppを使用
実行すると、20枚のチェスボード画像を作成し、cv::findChessboardCornersを使用してボードのコーナーを検出する。
検出したコーナーの座標を用いて、cv::calibrateCameraを使用してカメラパラメータを取得する。
最後に、チェスボード画像を作成したパラメータと計算したパラメータを表示して終了する。
実行すると、20枚のチェスボード画像を作成し、cv::findChessboardCornersを使用してボードのコーナーを検出する。
検出したコーナーの座標を用いて、cv::calibrateCameraを使用してカメラパラメータを取得する。
最後に、チェスボード画像を作成したパラメータと計算したパラメータを表示して終了する。
2013年2月9日土曜日
OpenCVでbrief_match_testを試してみた
sample\cpp\brief_match_test.cppを試したみた。
このサンプルでは、2枚の画像の特徴点を用いて、斜影変換行列のパラメータが取得できる
特徴点は、FastFeatureDetectorで検出し、各特長点の特徴量をBriefDescriptorExtractorを使用して得ている
BFMatcherをNORM_HAMMINGで(注意 NORM_HAMMING should be used with ORB and BRIEF)対応付けを行い、matches2pointsのモジュールで座標をリストとして得る
次に、得た座標をfindHomographyに与えて、cv::Mat Hに変換用のパラメータを取得する
ただし、サンプルでは
Mat H = findHomography(mpts_2, mpts_1, RANSAC, 1, outlier_mask);
のところで落ちてしまうので、
vector<char> outlier_mask;
を
Mat outlier_mask;
のように修正すると問題なく処理される
求めた、homographyを使用し、
warpPerspective(im2, warped, H, im1.size());
でwarpedに斜影変換した画像を得ることができる。
detectorのパラメータが50だと検出される点が多くなるので、
FastFeatureDetector detector(100);
値を大きくすることで、数を減らすことができるが、得られたhomographyの値がおかしくなるので、使用するパラメータは、試行錯誤が必要と思われる
このサンプルでは、2枚の画像の特徴点を用いて、斜影変換行列のパラメータが取得できる
特徴点は、FastFeatureDetectorで検出し、各特長点の特徴量をBriefDescriptorExtractorを使用して得ている
BFMatcherをNORM_HAMMINGで(注意 NORM_HAMMING should be used with ORB and BRIEF)対応付けを行い、matches2pointsのモジュールで座標をリストとして得る
次に、得た座標をfindHomographyに与えて、cv::Mat Hに変換用のパラメータを取得する
ただし、サンプルでは
Mat H = findHomography(mpts_2, mpts_1, RANSAC, 1, outlier_mask);
のところで落ちてしまうので、
vector<char> outlier_mask;
を
Mat outlier_mask;
のように修正すると問題なく処理される
求めた、homographyを使用し、
warpPerspective(im2, warped, H, im1.size());
でwarpedに斜影変換した画像を得ることができる。
detectorのパラメータが50だと検出される点が多くなるので、
FastFeatureDetector detector(100);
値を大きくすることで、数を減らすことができるが、得られたhomographyの値がおかしくなるので、使用するパラメータは、試行錯誤が必要と思われる
2013年2月8日金曜日
OpenCVのプログラム落ちる
OpenCVのAPIに対して、有効でないパラメータを渡すとプログラムが落ちてしまう。
今回は、std::vector<cv::Point>のデータを、cv::fitEllipseに渡すと時々落ちてしまう現象が生じた。
落ちる場所は、わかったのだがなぜ落ちるのかは、すぐにわからなかった。
cv::fitEllipseにも注意書きがない
そこで、まじめにtry {} catch (cv::Exception e) {} で問題箇所を囲ったところ
std::vector<cv::Point>のサイズが5必要というエラーであることがわかった。
教訓
原因が不明な場合は、落ちる場所で、try {} catch (cv::Exception e) {} で囲いましょう
OpenCVで値の保存と読み込みを行う
OpenCVに、XMLやYAML形式のファイルへの読み書きを行う cv::FileStorage が提供されているので、設定用の値を読み書きをためしてみた。
一部便利な機能もあるが、中途半端と思えるところもある
以下、YAMLで試した場合の話
便利な点
cv::Matの読み書きが オペレータ >> でできる
困った点
cv::Matと同じようにcv::Rectもオペレータが使えるかと期待したが、cv::Rectは、書き込みの場合は >> が利用できるが、読み込みの場合は、コンパイラにreadできないとはじかれる
cv::Rectを読み込みたい場合には、cv::FileNode と cv::FileNodeIterator で、自分でx, y, width, heightを読み込むことになる
これなら、書き込みのときに要素にばらして書き込み、要素ごとに読み込んだほうが簡単な気がした
登録:
投稿 (Atom)