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