OpenCV 3.0に果敢に挑戦し続けてみる

個人的な趣味の一環として、OpenCV 3.0がらみの情報をまとめてみる。「引用はいぃんよー、無断転載はあかんよー」ということで。

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がちゃんとあってるのかなあ、という大きな不安が。

 

f:id:anobiidae:20140506093951p:plain

 ちょっとカッコ良くしたバージョン(ぐるぐるまわる)

f:id:anobiidae:20140506221727p:plain

 

ソースコードはこの下と。

 

#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/