1. 查詢電腦上的opencv版本:
pkg-config --modversion opencv
2. 在電腦上安裝多個版本的opencv,可以通過指定安裝路徑進行設置:
下載源碼後進入文件夾,打開終端;
mkdir build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4
#CMAKE_BUILD_TYPE 確定了編譯類型,是release還是debug,一般release比較常用, ubuntu下就是.so庫,但是window下會有dll和lib之分;
#CMAKE_INSTALL_PREFIX 安裝路徑前綴, 確定了這個路徑後,make install的opencv 的includepath 和lib等都會安裝在這個文件夾下;
make -j4
sudo make install
接下來opencv就安裝到/usr/local/opencv3.4下的文件夾中,可以按照這個路徑查看你的opencv是否安裝成功;
同理,也可以使用這種方法安裝其他版本的opencv,只要將安裝路徑的prefix修改即可
3. 使用不同版本的opencv
如果想要在你的project中調用opencv庫,個人覺得比較方便的還是CMakeLists文件,也有可能是因爲用的比較多;
如果只有一個版本的opencv,我們一般直接使用:
FIND_PACKAGE(OpenCV REQUIRED)
這種情況適用於只有一個版本的opencv,安裝在默認路徑下,一般是/usr/local/lib下,比如我的opencv2.4.13, 因爲安裝的時候如果不指定prefix路徑,那麼在make install 時會將所有的 .so 文件安裝在 /usr/local/lib 下,所有的頭文件安裝在/usr/include下
但是這裏我們對opencv3.4的安裝指定了路徑,所以,如果想要使用opencv3.4,則需要在find_package之前設定cmake的查找路徑:
set(CMAKE_PREFIX_PATH "/usr/local/opencv3.4")
也就是讓cmake去這裏找opencv;
這裏需要贅述的是,find_package 其實尋找的是OpenCVConfig.cmake文件,打開這個文件就能看到當前opencv所對應的版本,同時也對一些路徑進行了定義,類似於c++中的宏的感覺,尤其是:OpenCV_LIBS OpenCV_INCLUDE_DIRS 兩個路徑,這就保證了cmake可以正常找到opencv所需要的頭文件和庫文件;
因此也就有了第三種包含opencv的方法,就是直接設定這兩個路徑:
set(OpenCV_DIR "/usr/local/opencv3.4/share/OpenCV")
find_package(OpenCV 3.4 REQUIRED COMPONENTS core highgui imgproc flann calib3d)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
然後將${OpenCV_INCLUDE_DIRS} 和 ${OpenCV_LIBS} 分別添加到 include_directories 和 target_link_libraries中即可;
白巧克力的在cmakelists中設定opencv: https://blog.csdn.net/heyijia0327/article/details/54575245
另外還有一種方法即設定makefile, 其實cmakelist的目的也是爲了生成makefile, 然後進行編譯,因此,我們也可以跳過cmakelist,直接寫makefile文件,這裏說一下如何在makefile中包含指定路徑的opencv:
這裏的設定也有兩種方法,第一種是指定INCLUDE 和lib 的路徑後進行鏈接,如下:
#這裏需要根據自己在linux上配置的opencv路徑修改
INCLUDES = -I/usr/local/opencv3.4/include/opencv #INCLUDES 指定了頭文件的路徑
LIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml # LIBS 指定了需要哪些庫
LIBDIRS = -L/usr/local/opencv3.4//lib #LIBDIRS 指定了需要的庫的路徑
OPT = -O3 -Wno-deprecated
CC=g++ # 使用g++進行編譯
.PHONY: all clean #說明 all 和clean 兩個目標文件都是僞目標文件 主要是爲了節省命令,每次自動指定test2目標的生成
OBJS= test2.o
clean: # 僞目標cleam, 這兩句話主要是爲了清除掉所有的依賴庫 .o 文件,以及 可執行文件 test2
rm -f *.o *~ test2
all:test2
echo all:make complete
%.o:%.cpp # 這兩句話表示 庫test.o 是依賴於 文件test.cpp 的
$(CC) -c $(INCLUDES) $+ $(OPT) #要生成.o 庫,需要利用g++ 進行編譯,同時包含 INCLUDES 這個變量所指定的頭文件,OPT指定的一些生成庫時的優化選項
test2:$(OBJS) # 這時已經生成了一個 test.o的 依賴庫, 接下來需要生成一個叫做test2的可執行文件
$(CC) $(LIBDIRS) $(LIBS) -o $@ $+ $(OPT) # 同理,也需要用g++進行編譯,然後需要鏈接到test.o的庫, $@ 其實表示所有的目標集,也就是.o文件,本例中只有test.o
makefile的文件來源於博客 https://blog.csdn.net/pbypby1987/article/details/18969441, 博客給了例子,沒有詳細的講解,這裏贅述一下;
更詳細的makefile的語法可以參考陳浩博士的 跟我一起學makefile系列,很詳細也很清晰;
上面的例子是自己的新建,比較簡短,只包含了opencv,且目標文件也比較少,當目標文件比較多 或這需要的庫也比較多時,可以利用pkg-config來進行設置;
首先來說一下具體的設置步驟,然後再來說一下這其中的包含關係以及爲什麼要這麼設定:
還是以自定義安裝路徑爲例,如果非自定義,一般會安裝在/usr/local/lib下,將對應的路徑修改就好;
這裏假裝回到剛剛執行完make install 命令,接下來就是配置環境變量,讓opencv3.4可以被找到:
sudo gedit /etc/ld.so.conf.d/opencv.conf
執行此命令後,有可能打開的是一個空白文件,也有可能文件中已經有/usr/local/lib, 只需要接着寫入:
/usr/local/opencv3.4/lib
即可;
生效配置文件:
執行如下的命令才能讓剛纔的配置路徑生效:
sudo ldconfig
配置 bash
sudo gedit /etc/bash.bashrc
在末尾追加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv3.4/lib/pkgconfig
保存, 執行如下命令使得配置生效:
source /etc/bahs.bashrc
更新:
sudo updatedb
其實執行完sudo ldconfig之後,就可以在對應的路徑,也就是/usr/local/opencv3.4/lib 中找到一個對應的pkgconfig文件,如下:
進入到pkgconfig路徑下後可以看到文件opencv.pc,具體內容如下:
# Package Information for pkg-config
prefix=/usr/local/opencv3.4
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.4.0
Libs: -L${exec_prefix}/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui
-lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_viz -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
從上面的文件也可以看出 .pc 文件其實就是包含了當前opencv版本的信息以及文件信息,其實其opencvconfig.cmake文件屬性類似;這裏需要設置的就是這個pc文件的路徑,可以讓pkgconfig可以找到;
這裏舉一個複雜的makefile的例子(對我比較複雜),部分makefile如下:
CC=g++ #設定編譯器類型
CFLAGS = -I ../common/inc -std=c++1y -g0 -O3 -I/usr/local/opencv3.4/include #編譯選項
$(shell mkdir -p $(OUT_DIR))
main: $(OUTPUT_SOC) $(OUTPUT_C) $(OUTPUT_MAP) $(OUTPUT_PACKET) $(OUTPUT_RX_DATA_PARSER) $(OUTPUT_DEBUG) $(OUTPUT_PROTOCOL) $(OUTPUT_DETECTIONDATA) $(OUTPUT_DOORFRAME) $(OUTPUT_LINESEGMENT)
@$(CC) -pthread -o $@ $(CFLAGS) $(OUTPUT_SOC) $(OUTPUT_C) $(OUTPUT_MAP) $(OUTPUT_PACKET) $(OUTPUT_RX_DATA_PARSER) $(OUTPUT_DEBUG) $(OUTPUT_PROTOCOL) $(OUTPUT_DETECTIONDATA) $(OUTPUT_DOORFRAME) $
(OUTPUT_LINESEGMENT) `pkg-config --libs --cflags opencv` #按照pkg的配置進行庫的查找
$(OUTPUT_SOC): src/socket.cpp #生成目標依賴庫
$(info Compiling $(<))
@$(CC) $(CFLAGS) -c $< -o $@
`pkg-config --libs --cflags opencv`
這句話設定了利用pkg-config進行opencv的庫的查找
爲了確定opencv是否在config的路徑中,可以用
export PKG_CONFIG_PATH 或者echo ${PKG_CONFIG_PATH}
進行檢驗;
.pc 文件參考:https://blog.csdn.net/absurd/article/details/599813