ROS indigo 系统下opencv为2.x的版本,但是有些package需要opencv 3,因此有了这篇文章。建议不要装在系统目录下,有需要用到不同于系统的版本时,在CMakeLists.txt中手动指定位置。
Linux下OpenCV的编译
1. 安装位置CMAKE_INSTALL_PREFIX = /home/yake/src/opencv_3.2.0/yake_opencv320_installed
2. 额外的模块OPENCV_EXTRA_MODULES_PATH=/home/yake/src/opencv_contrib-3.2.0/modules
3. BUILD_EXAMPLES=ON
4. BUILD_DOCS=ON
5. INSTALL_C_EXAMPLES=ON
6. INSTALL_PYTHON_EXAMPLES=ON
然后~/.bashrc中加入
能够找到OpenCVConfig.cmake文件的地方( /home/yake/src/opencv_3.2.0/yake_opencv320_installed/share/OpenCV),这个文件也包含CMakeLists.txt中的宏定义(如OpenCV_VERSION,OpenCV_LIBS等)。
而PKG_CONFIG_PATH的路径中包含的文件是opencv.pc含有opencv的安装版本,lib路径和include路径信息。
在~/.bashrc中加入以下环境变量
export PKG_CONFIG_PATH=/home/yake/src/opencv_3.2.0/yake_opencv320_installed/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/home/yake/src/opencv_3.2.0/yake_opencv320_installed/lib:$LD_LIBRARY_PATH
检测的时候
查看版本
pkg-config --modversion opencv
查看链接的库文件
pkg-config -cflags --libs opencv
必要时,在CMakeLists.txt中加入(/home/yake/src/opencv_3.2.0/samples/cpp/example_cmake/CMakeLists.txt这里是个官方CMakeLists.txt的写法)
SET(OpenCV_DIR /home/yake/src/opencv_3.2.0/yake_opencv320_installed/share/OpenCV)
find_package(OpenCV 3.2 EXACT REQUIRED)
IF ( OPENCV_FOUND )
message("OpenCV path dir = ${OpenCV_INCLUDE_DIRS}")
message("OpenCV path dir = ${OpenCV_VERSION}")
message("OpenCV path dir = ${OpenCV_LIBS}")
message("OpenCV path dir = ${OpenCV_INSTALL_PATH}")
message("OpenCV path dir = ${OpenCV_DIR}")
ENDIF ( OPENCV_FOUND )
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(helloCV src/helloCV.cpp)
targer_link_libraries(helloCV ${catkin_LIBRARIES} ${OpenCV_LIBS})
0.编译doc
参考这里好像不太起作用:https://docs.opencv.org/3.4/d7/d9f/tutorial_linux_install.html
后来利用doxygen可以生成
1.编译Samples
~/src/opencv_3.2.0/yake_opencv320_installed/share/OpenCV/samples/cpp目录下
/home/yake/src/opencv_3.4.1/data/haarcascades
/home/yake/src/opencv_contrib-3.3.0/modules/face/data/cascades
g++ -g facedetect.cpp -o facedetect `pkg-config --cflags --libs opencv`
./facedetect --cascade="../../haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="../../haarcascades/haarcascade_eye_tree_eyeglasses.xml" --scale=1.3
./facedetect --cascade="../../haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="../../haarcascades/haarcascade_eye.xml" --scale=1.3 /home/yake/src/opencv_3.4.1/samples/data/lena.jpg Detecting face(s) in /home/yake/src/opencv_3.4.1/samples/data/lena.jpg
2. 利用OpenCV抠图
g++ -g grabcut.cpp -o grab_cut `pkg-config --cflags --libs opencv`
./grab_cut /home/yake/src/opencv_3.2.0/samples/data/lena.jpg
先框选,然后Ctrl + Left Mouse GC_BGD Pixels 要去除的背景像素,然后按“n”,最后退出按ESC
3.相机标定
1./calibration -w=4 -h=5 -s=0.025 -o=camera.yml -op -oe
2. g++ -g imagelist_creator.cpp -o imagelist_creator `pkg-config --cflags --libs opencv`
./imagelist_creator image_list.xml ./cal/*.jpg
calibration -w=9 -h=6 -s=0.025 -o=camera.yml -op -oe image_list.xml
./facial_features -h
./facial_features lena.jpg ./haarcascades/haarcascade_frontalface_alt.xml
4.生成标定板(棋盘格或圆点标定板)
参考链接:
https://www.samontab.com/web/2012/06/installing-opencv-2-4-1-ubuntu-12-04-lts/
https://www.learnopencv.com/how-to-compile-opencv-sample-code/
另外自己还有两篇关于CMakeList的写法的文章
- https://blog.csdn.net/yaked/article/details/49388715 CMake的学习
- https://blog.csdn.net/yaked/article/details/80761976 PCL与boost
另外要注意的是*.pc 文件,如opencv.pc(临时变量), 以及系统的cv_bridge要特别注意依赖,不要交叉混用。比如同时依赖opencv和cv_bridge, 如果opencv是新版本则cv_bridge最好也是新版本,可以将cv_bridge的源码放在~/catkin_ws/src下,修改它的CMakeLists.txt文件,依赖新版的opencv。
我的CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(cv_bridge)
SET(BOOST_ROOT /home/yake/Downloads/boost_1_54_0_2)
SET(OpenCV_DIR /home/yake/src/opencv-3.3.1/yake_opencv331_installed/share/OpenCV)
SET(OpenCV_ROOT /home/yake/src/opencv-3.3.1/yake_opencv331_installed)
find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)
if(NOT ANDROID)
find_package(PythonLibs)
if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)
find_package(Boost REQUIRED python)
else()
find_package(Boost REQUIRED python3)
endif()
else()
find_package(Boost REQUIRED)
endif()
find_package(OpenCV 3.3.1 EXACT REQUIRED)
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS rosconsole sensor_msgs
# DEPENDS OpenCV
CFG_EXTRAS cv_bridge-extras.cmake
)
catkin_python_setup()
#include_directories(include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
include_directories(include ${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
if(NOT ANDROID)
add_subdirectory(python)
endif()
add_subdirectory(src)
if(CATKIN_ENABLE_TESTING)
add_subdirectory(test)
endif()
# install the include folder
install(
DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)
编译完成后,查验
另外,编译的时候也要特别注意~/catkin_ws/build记得删除,来启用重新编译,devel/lib下的lib*.so也要记得检查,还有就是share文件下的各种pc文件,保证环境没有依赖前一次的缓存。
pkgcofig
===========================
Visual Studio 6 : vc6
Visual Studio 2003 : vc7
Visual Studio 2005 : vc8
Visual Studio 2008 : vc9
Visual Studio 2010 : vc10
Visual Studio 2012 : vc11
Visual Studio 2013 : vc12
Visual Studio 2015 : vc14
Visual Studio 2017 : vc15
================================================
ROS kinetic OpenCV路径
头文件路径
/opt/ros/kinetic/include/opencv-3.3.1-dev /opt/ros/kinetic/include/opencv-3.3.1-dev/opencv
库文件路径
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so.3.3.1
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_highgui3.so.3.3.1
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1