前言
博主想要TX2上使用opencv中的viz模塊,需要安裝opencv_contrib,目前TX2的opencv版本是刷機的時候安裝的opencv3.3.1,需要先卸載,再安裝。后來發現opencv3.3.1版本中本含有viz模塊,只是更高版本的opencv中viz模塊是在opencv_contirb中。
步驟
1. 卸載TX2刷機的opencv版本;
sudo apt-get purge libopencv* sudo apt autoremove sudo apt-get update
2. 安裝帶有viz模塊的opencv3.3.1版本;
2.1. 安裝opencv的依賴庫,必須在安裝opencv之前安裝好;
[compiler] sudo apt-get install build-essential [required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev [optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
viz模塊
sudo apt-get install libvtk5-dev
2.2. 下載源碼並解壓,包括opencv-3.3.1和opencv_contrib-3.3.1,從github下載,注意兩者的版本必須要一致;
/opt$ sudo unzip opencv-3.3.1.zip opencv_contrib-3.3.1.zip /opt$cd opencv-3.3.1 /opt/opencv-3.3.1$sudo mv ../opencv_contrib-3.3.1 ./ /opt/opencv-3.3.1$sudo mkdir build /opt/opencv-3.3.1$cd build
2.3. 編譯安裝;
/opt/opencv-3.3.1/build$ sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.3.1/modules/ -D WITH_VTK=ON .. /opt/opencv-3.3.1/build$sudo make -j8(wait long time) /opt/opencv-3.3.1/build$sudo make install
其中,
-D WITH_VTK=ON
是關於viz模塊的;
問題:cmake的時候正常,make的時候出錯,顯著性的錯誤如下:
xfeatures2d/boostdesc: Download failed: 7;"Couldn't connect to server"
and
/opt/opencv-3.3.1/modules/stitching/include/opencv2/stitching/detail/matchers.hpp:52:42: fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory compilation terminated.
step1:
Github上有網友指出是因為OpenCVDownload.cmake
在日志記錄功能中出現問題,找到文件
~/opencv-3.3.1/cmake/OpenCVDownload.cmake
將以下代碼
macro(ocv_download_log) file(APPEND "${OPENCV_DOWNLOAD_LOG}" "${ARGN}\n") endmacro()
修改成
function(ocv_download_log) file(APPEND "${OPENCV_DOWNLOAD_LOG}" "${ARGN}\n") endfunction()
step2:
cmake命令添加以下內容:
cmake -D BUILD_opencv_xfeatures2d=OFF
還有說HTTP的安裝需要某個版本的cmake(博主沒有進行這個問題的操作,具體可參考github的issue),其他的原因有可能是內存空間不足等。
問題
/opt/opencv-3.3.1/modules/cudacodec/src/precomp.hpp:60:37: fatal error: dynlink_nvcuvid.h: No such file or directory compilation terminated.
原因:這個問題與系統是否安裝CUDA、安裝CUDA的版本有關,可以使用-D WITH_CUDA=OFF解決該問題;
make這一步驟完成,build目錄占了差不多11G的空間,不清楚build目錄能否刪除,只安裝opencv而不安裝contrib則build差不多3G的空間。
3. 測試opencv和viz模塊;
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) set(CMAKE_CXX_COMPILER "g++") set_property(GLOBAL PROPERTY USE_FOLDERS ON) list(APPEND CMAKE_CXX_FLAGS "-O3 -DEBUG -ffast-math -Wall -pthread -fopenmp -std=c++11") #-DNDEBUG project(test_viz) # OpenCV find_package(OpenCV 3.3.1 REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) # message("OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}") # message("OpenCV_LIBS: ${OpenCV_LIBS}") # VTK find_package(VTK 5.10 REQUIRED) include(${VTK_USE_FILE}) # message("VTK_USE_FILE: ${VTK_USE_FILE}") # message("VTK_LIBRARIES: ${VTK_LIBRARIES}") # PROJECT include_directories(include) aux_source_directory(src DIR_SRCS) add_executable(${PROJECT_NAME} ${DIR_SRCS}) target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${VTK_LIBRARIES})
test_code(可以參考github_viz_samples運行各個demo):
#include <iostream> #include <opencv2/viz.hpp> #include <opencv2/highgui.hpp> #include <opencv2/calib3d.hpp> using namespace std; using namespace cv; int main() { viz::Viz3d window("window"); window.showWidget("Coordinate", viz::WCoordinateSystem()); viz::WPlane plane(Size2d(2,2), viz::Color::white()); plane.setRenderingProperty(viz::LINE_WIDTH, 5); plane.setPose(Affine3f()); window.showWidget("plane", plane); Mat rvec = Mat::zeros(1, 3, CV_32F); while(!window.wasStopped()) { rvec.at<float>(0,0) = 0.f; rvec.at<float>(0,1) += CV_PI*0.01f; rvec.at<float>(0,2) = 0.f; Mat rmat; Rodrigues(rvec, rmat); Affine3f pose(rmat, Vec3f(0,0,0)); window.setWidgetPose("plane", pose); window.spinOnce(1, true); } }
其中,可能會用一些已有的文件,比如bunny.ply,編譯之后所在目錄為:
/opt/opencv-3.3.1/samples/cpp/tutorial_code/viz/
后記
可以正常使用opencv viz模塊之后,博主想使用之前安裝的PCL開源庫,發現PCL不能正常使用,不能find PCL的配置文件,可能是安裝的時候有沖突,比如VTK;
參考
1. Jetson TX2 卸載並安裝OpenCV3.4.0;
2. linux系統卸載opencv;
3. linux系統opencv以及opencv_contrib的安裝與使用;
4. opencv_installation_on_linux;
完