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

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

ヘッダの場所かわってますなあ(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>