本篇博客主要是记录一下自己在Ubuntu环境下如何编译OpenCV,并且跑通samples文件夹中的样例,之前一直遇到undefined reference to xxx的问题,试了好久,都不能使其执行,现在终于可以了!!(撒花) 以前都是在Windows上借助CMake对OpenCV进行configure, generate,然后使用Visual Studio生成解决方案,install等。现在使用ubuntu环境,还是需要适应一下。
方法如下:
- 常规的,从OpenCV官网下载对应的OpenCV版本,网址为:https://opencv.org/releases/
- 注意,如果此时直接在terminal中mkdir build; cd build; cmake … 和make -j8时,可以通过,但是默认的设置是没有对BUILD_EXAMPLES打勾的。采取的解决方案是:下载cmake-gui, 然后手动选择
- cmake-gui的安装方式:sudo apt-get cmake-gui即可。随后将其打开
- 将BUILD_EXMAPLES选项打上勾,其余的内容可以按照自己需求进行选择
- 选择完成以后,可以点击configure和generate
- 上述步骤完成后,重新进入opencv的build文件夹,从此处打开terminal。输入指令cmake …和 make -j8即可看到会对tutorials, examples等内容进行编译。注意,如果出现make -j8时运行到35%时就自动退出了的情况,使用sudo make -j8就可以继续往下执行(不知道为什么,,,后续深入学习以后来填坑)
- 上述步骤完成后,根据《视觉SLAM十四讲》的建议,执行sudo make install将Opencv安装到机器上
- 判断上述步骤6、7的方法是否成功的检验方法:
只需要看build/bin这个子目录下面是否有对应的cpp-tutorial-等可执行文件即可。如果不选择BUILD_EXAMPLES,这些可执行文件是不会被默认生成的 - 成功后,点击cpp-tutorial-pnp_detection可执行文件来查看效果
接下来就可以舒舒服服的看代码啦!!
如果想要自己从头开始编译cpp-tutorial_pnp_detection项目
- 将整个real_time_pose_estimation拷贝出来,然后修改CMakeLists.txt文件,这里的修改是指将opencv/samples/cpp/example_cmake目录下的CMakeLists.txt文件和real_time_pose_estimation目录下的CMakeLists.txt文件中的内容进行整合。因为前者包含了具体的项目生成语句,后者包含了real_time_pose_estimation项目中pnp_detection项目所使用的cpp, h文件等
- 如果直接这样就直接运行,cmake可以通过,但是make -j8 时就会出现很多undefined reference xxx问题。很明显,这是由于链接文件不正确导致。即{OPENCV_CPP_SAMPLES_REQUIRED_DEPS}和{OPENCV_LINKER_LIBS}两个变量
- 尝试将这两个变量使用message语句输出。会发现前者为空,后者有值。此时,接下来的操作就很直接了。将OPENCV_CPP_SAMPLES_REQUIRED_DEPS的值拷贝set一下即可,具体OPENCV_CPP_SAMPLES_REQUIRED_DEPS值见下
- set(OPENCV_CPP_SAMPLES_REQUIRED_DEPS
opencv_core
opencv_imgproc
opencv_flann
opencv_imgcodecs
opencv_videoio
opencv_highgui
opencv_ml
opencv_video
opencv_objdetect
opencv_photo
opencv_features2d
opencv_calib3d
opencv_stitching
${OPENCV_MODULES_PUBLIC}
${OpenCV_LIB_COMPONENTS}) - 接下来就可以直接cmake, make通过了