OpenCV 2.4.9でカメラ画像をvizで表示してみる
ということで、gyaoのべるぜバブ見つつ、OpenCV 2.4.9 + vizでカメラのキャプチャ画像をぐりぐり表示するサンプル作ってみましたり。
ポイント。
- 画像を表示するには、WImage3DをWidgetとして使う。
- 画像を更新するには、WImage3D.setImage()で。
- 逐次更新するにはwhile(){ spinOnce(1, TRUE); }で。
<追記 2014/05/06 22:05>
setImageするたびにメモリリークしている可能性あり。
VTKのsmartPointerによって適切に管理されているかもしれない・・・が
Reference Counterがちゃんとあってるのかなあ、という大きな不安が。
ちょっとカッコ良くしたバージョン(ぐるぐるまわる)
ソースコードはこの下と。
続きを読むOpenCV 2.4.9 リリース
http://opencv.org/opencv-2-4-9-is-out.html をざっくり翻訳。
VTKに関しては既に書いてるから使い方マニュアルは不要かなーと思いつつ。
OpenCL最適化がいくつか実装されました。(ocl::sum, ocl::countNonZero, ocl::minMax, bitwise operationss, Haar face detector, etc)
[Android]
NativeCameraに関する複数の修正が入りました。(NativeCameraView, cv::VideoCapture);
全てのCUDAが利用可能なSOCに対して、CUDAが利用できるようになりました。
[VTK]
VTKを基本とした3次元可視化モジュールvizが、2.4ブランチにバックポートされました。
このモジュールは、クラウド・メッシュ・カメラ・曲線・単純なwidget(cube、line, circle)を表示・配置するのに非常に便利です。
デモ映像をItseez Youtube channelで確認できます。
Numerous bugfixes in code and docs from community
・156 pull requests have been merged since 2.4.8
・55 reported bugs have been closed since 2.4.8
ヘッダの場所かわってますなあ(OpenCV 3.0.0-dev superres, 超解像)
昨日のsuperresのコードを、3.0.0-devでコンパイルしようとするとerrorになる。
make g++ a.cpp `pkg-config opencv --cflags --libs` /tmp/ccddz3hX.o: In function `main': a.cpp:(.text+0x3c8): undefined reference to `cv::superres::createFrameSource_Video(std::string const&)' collect2: error: ld returned 1 exit status make: *** [a.out] Error 1
さて、これなんだべさー?って引数の形が変わってる。
Ver 3.0.0-3583-gdd6cf15-dirty
Ptr<framesource> cv::superres::createFrameSource_Video(const String& fileName) { return makePtr<videoframesource>(fileName); }
Ver 2.4.8
Ptr<framesource> cv::superres::createFrameSource_Video(const string& fileName) { return new VideoFrameSource(fileName); }
おや? /usr/local/include/の下を見ると
$find /usr/local/include/opencv2/ -name "superres*" /usr/local/include/opencv2/superres /usr/local/include/opencv2/superres/superres.hpp ← OpenCV 2.4.8 /usr/local/include/opencv2/superres.hpp ← OpenCV 3.0.0-dev
sudo make installで確認。
-- Up-to-date: /usr/local/lib/libopencv_superres.so.2.4.8 -- Up-to-date: /usr/local/lib/libopencv_superres.so.2.4 -- Installing: /usr/local/lib/libopencv_superres.so -- Installing: /usr/local/include/opencv2/superres/optical_flow.hpp -- Up-to-date: /usr/local/include/opencv2/superres/superres.hpp
v.s.
-- Up-to-date: /usr/local/lib/libopencv_superres.so.3.0.0 -- Up-to-date: /usr/local/lib/libopencv_superres.so.3.0 -- Installing: /usr/local/lib/libopencv_superres.so -- Up-to-date: /usr/local/include/opencv2/superres.hpp -- Installing: /usr/local/include/opencv2/superres/optical_flow.hpp
……って両方とも出ちゃってるですかやだー!!まだ慌てるような時間じゃない、opencv2/opencv.hppなら、opencv2/opencv.hppなら何とかしてくれる…
#ifndef __OPENCV_ALL_HPP__ #define __OPENCV_ALL_HPP__ #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/photo.hpp" #include "opencv2/video.hpp" #include "opencv2/features2d.hpp" #include "opencv2/objdetect.hpp" #include "opencv2/calib3d.hpp" #include "opencv2/highgui.hpp" #include "opencv2/contrib.hpp" #include "opencv2/ml.hpp" #endif
してくれませんでした。
結論:OpenCV 2.xとOpenCV 3.0.0とを共存させるような場合には、ヘッダの位置にも注意しないとダメですね、ということで。
OpenCV 2.x → #include <opencv2/superres/superres.hpp>
OpenCV 3.0.0 → #include <opencv2/superres.hpp>
ずっと求めていた「自分だけのブラック」(OpenCV 3.0.0-dev decolorのアルゴリズムをちら見する)
今回いきなりでてきたdecolorって、なんじゃらほいということでググる。今回Decolorizationで採用しているアルゴリズムはこちら(本文との一致性などから判断)
http://www.cse.cuhk.edu.hk/leojia/papers/decolorization_iccp12.pdf
斜め読みした感じだと「weak color order constraintっていうのを導入して、明瞭にorderの無いような色のペアに対しては、自動的に視覚的なコンテキストに基づいて明度の差をつけるよ!」っていう感じと思しき。
うーん、このアルゴリズムだと、「画像全体に対して処理した時」と「画像の一部を処理した結果を繋ぎ合せた時」で結果が変わっちゃうんじゃないのかなーと。
http://www.cse.cuhk.edu.hk/leojia/papers/decolorization_iccp12.pdf のP5から引用すると他の手法と比較すると、これだけ差が出ると。
上から3,4番目のものが一番さが解りやすいと思う。上から三番目は「模様の中で明快に差が付いている」し、4番目は「違和感の無いグラデーションが復元されている」し。流石でございます。
一方で、下2つで明るいオレンジ色が結構、濃い色にマッピングされているのは若干気になるなあという気がしないでもないですけどね。
適材適所ということでよろしくお願いいたします。
論文の一部の翻訳はこちら。誤訳ごめんなさい。
続きを読む