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がちゃんとあってるのかなあ、という大きな不安が。
ちょっとカッコ良くしたバージョン(ぐるぐるまわる)
ソースコードはこの下と。
#include <cstdio>
#include <cstdint> #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/viz/types.hpp> #include <opencv2/viz/viz3d.hpp> #include <opencv2/viz/vizcore.hpp> #include <opencv2/viz/widget_accessor.hpp> #include <opencv2/viz/widgets.hpp> using namespace cv; using namespace std; int main() { viz::Viz3d myWindow("Viz Demo"); cv::Mat image = cv::Mat::zeros(320, 240, CV_8UC1); viz::WImage3D myCameraWidget(image, Size2d(1.0, 1.0 * 240.0 / 320.0)); VideoCapture cap(0); // open the default camera if (!cap.isOpened()) { return -1; } myWindow.showWidget("test", myCameraWidget); float angle = 0.0; while (!myWindow.wasStopped()) { if(cap.read(image) ){ myCameraWidget.setImage(image); } myWindow.spinOnce(1, true); } return 0; }
/// もうちょっとかっこいい感じにしたの
#include <cstdio> #include <cstdint> #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/viz/types.hpp> #include <opencv2/viz/viz3d.hpp> #include <opencv2/viz/vizcore.hpp> #include <opencv2/viz/widget_accessor.hpp> #include <opencv2/viz/widgets.hpp> using namespace cv; using namespace std; int main() { viz::Viz3d myWindow("Viz Demo"); cv::Mat image = cv::Mat::zeros(320, 240, CV_8UC1); viz::WImage3D myImageWidget(image, Size2d(1.0, 1.0 * 240.0 / 320.0)); VideoCapture cap(0); // open the default camera if (!cap.isOpened()) { return -1; } cap.set(CV_CAP_PROP_FRAME_WIDTH, 320); cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240); myWindow.showWidget("test", myImageWidget); myWindow.showWidget("A", viz::WArrow(Point3f(0, 0, 0), Point3f(1, 0, 0), 0.004, cv::viz::Color::red())); myWindow.showWidget("B", viz::WArrow(Point3f(0, 0, 0), Point3f(0, 1, 0), 0.004, cv::viz::Color::green())); myWindow.showWidget("C", viz::WArrow(Point3f(0, 0, 0), Point3f(0, 0, 1), 0.004, cv::viz::Color::blue())); Affine3d transform = Affine3f().rotate(Vec3f(0.0f, 0.1f, 0.0f)); while (!myWindow.wasStopped()) { if (cap.read(image)) { myImageWidget.setImage(image); } myImageWidget.applyTransform(transform); myWindow.spinOnce(1, true); } return 0; }
Makefileはこんな感じ
a.out : a.cpp g++ \ -g \ -O2 \ -Wno-deprecated \ -Wno-unused-result \ -std=gnu++0x \ a.cpp \ -lvtkRendering -lvtkGraphics -lvtkIO -lvtkFiltering \ -lvtkCommon -lvtksys -lpthread -lm\ `pkg-config opencv --cflags --libs` \ -I/usr/include/vtk-5.8/