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を使用してカメラパラメータを取得する。

最後に、チェスボード画像を作成したパラメータと計算したパラメータを表示して終了する。

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の値がおかしくなるので、使用するパラメータは、試行錯誤が必要と思われる

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を読み込むことになる

これなら、書き込みのときに要素にばらして書き込み、要素ごとに読み込んだほうが簡単な気がした