之前寫(xiě)過(guò)一篇在nano上使用opencv,nano上默認(rèn)是安裝了opencv的庫(kù),除了nano,我們自己電腦上也想使用opencv做一些平時(shí)圖像處理驗(yàn)證。
本來(lái)也是看一些資料安裝好的,覺(jué)得也沒(méi)必要寫(xiě)。但是實(shí)際安裝還是出現(xiàn)了不少問(wèn)題,所以記錄分享一下。
環(huán)境:系統(tǒng)為ubuntu20.04
cv版本為 4.5
歡迎關(guān)注微信公眾號(hào):羽林君,或者添加作者個(gè)人微信:become_me
oepncv介紹:
OpenCV的全稱是Open Source Computer Vision Library,是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺(jué)庫(kù)。OpenCV是由英特爾公司發(fā)起并參與開(kāi)發(fā),以BSD許可證授權(quán)發(fā)行,可以在商業(yè)和研究領(lǐng)域中免費(fèi)使用。OpenCV可用于開(kāi)發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺(jué)以及模式識(shí)別程序。
OpenCV用C++語(yǔ)言編寫(xiě)(基本上現(xiàn)在新的開(kāi)發(fā)和算法都是用C++接口),它的主要接口也是C++語(yǔ)言,但是依然保留了大量的C語(yǔ)言接口。該庫(kù)也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。這些語(yǔ)言的API接口函數(shù)可以透過(guò)在線文檔獲取?,F(xiàn)在也提供對(duì)于C#, Ch,Ruby的支持。
OpenCV可以在Windows, Android, Maemo, ?FreeBSD, OpenBSD, iOS, Linux和Mac OS等平臺(tái)上運(yùn)行。用戶可以在Github獲得官方版本,或者從Git獲得開(kāi)發(fā)版本。OpenCV也是用CMake.
安裝:
到了安裝環(huán)節(jié)了,先裝一堆依賴包。
sudo?apt-get?install?build-essential?libgtk2.0-dev?libavcodec-dev?libavformat-dev?libjpeg-dev?libswscale-dev?libtiff5-dev??pkg-config
下載opencv,下載地址:https://opencv.org/releases/,大可以點(diǎn)擊Sources進(jìn)行下載自己需要的版本。
剛開(kāi)始選擇了4.1 安裝出錯(cuò)之后,選擇了 4.5就一路按照4.1的經(jīng)驗(yàn)就裝好了,所以建議裝最新的。
下載之后,我們就開(kāi)始編譯安裝了,
常規(guī)操作:
cd?opencv-4.5.5
mkdir?build
cmake?../
make
但是事情不是按照命令這么發(fā)展的,命令很少,解決問(wèn)題確是很多。
cmake編譯的時(shí)候,推薦一個(gè)cmake圖形化工具,很方便。
sudo?apt?install?cmake-qt-gui?
cmake-gui?../
我們Search一欄選擇我們要配置的cmake 選項(xiàng),然后選擇 generate生成就好了。
cmake ../
之后開(kāi)始make:
make?-j8
eigen庫(kù)未安裝遇到fatal error: Eigen/Core: No such file or directory
這個(gè)錯(cuò)誤:
方法1:
執(zhí)行命令:sudo apt-get install libeigen3-dev
進(jìn)行安裝。
方法2:因?yàn)槲野惭b過(guò)一次了,所以我查看了一下我的eigen,使用是locate 查詢了一下,locate eigen3
,
/usr/include/eigen3
/usr/include/eigen3/Eigen
發(fā)現(xiàn)了我的Eigen在eigen3目錄下。
所以我寫(xiě)了一個(gè)軟鏈進(jìn)行了鏈接
sudo?ln?-s?/usr/include/eigen3/Eigen?/usr/include/Eigen
繼續(xù)編譯 `make -j8
編譯 opencv 出現(xiàn) internal compiler error:Segmentation fault,并且一直出現(xiàn)。
出錯(cuò)的原因是(虛擬機(jī))運(yùn)行內(nèi)存不足,而大量template的擴(kuò)展需要足夠的內(nèi)存。
下面給大家分享一種方法解決這個(gè)報(bào)錯(cuò),我選擇不管,繼續(xù)編譯。
可以通過(guò)臨時(shí)使用交換分區(qū)來(lái)解決:
sudo dd if=/dev/zero of=/swapfile bs=64M count=16
#count的大小就是增加的swap空間的大小,64M是塊大小,所以空間大小是bs*count=1024MB
sudo mkswap /swapfile
#把剛才空間格式化成swap格式
sudo swapon /swapfile
#使用剛才創(chuàng)建的swap空間
在編譯完成后,最好可以關(guān)閉(釋放)交換空間sudo swapoff /swapfile
sudo rm /swapfile以上交換分區(qū)方法為引用了別的博主的片段
編譯的時(shí)候,也設(shè)置 cmake 選項(xiàng) ENABLE_PRECOMPILED_HEADERS=OFF ,啟用預(yù)編譯頭支持??s短構(gòu)建時(shí)間。
sudo?cmake?-D?CMAKE_BUILD_TYPE=Release?-D?CMAKE_INSTALL_PREFIX=/usr/local?ENABLE_PRECOMPILED_HEADERS=OFF?
繼續(xù) make -j8
終于編譯完成,進(jìn)入了安裝階段 make install
sudo?make?install
可以看到安裝的動(dòng)態(tài)庫(kù)和文件都在/usr/local/
目錄里面
配置全局環(huán)境
OpenCV4默認(rèn)不生成.pc文件,所以我們需要自己去設(shè)置,也有人建議cmake后再加一條-D OPENCV_GENERATE_PKGCONFIG=ON
才會(huì)生成。該編譯選項(xiàng)開(kāi)啟生成opencv4.pc文件,就支持pkg-config功能,這個(gè)部分大家可以自行去嘗試一下,我自己使用了手動(dòng)添加的方法,比較笨,但是可以用。
cd?/usr/local/lib
sudo?mkdir?pkgconfig?&&?cd?pkgconfig
sudo?vi?opencv.pc
文件內(nèi)容如下:對(duì)應(yīng)的Version大家按照自己的版本修改,libs內(nèi)容需要微調(diào),后面有給我自己的情況。
prefix=/usr/local
exec_prefix=${prefix}
includedir=/usr/local/include
libdir=/usr/local/lib
?
Name:?OpenCV
Description:?Open?Source?Computer?Vision?Library
Version:?4.5.5
Libs:?-L${exec_prefix}/lib?-lopencv_stitching?-lopencv_superres?-lopencv_videostab?-lopencv_aruco?-lopencv_bgsegm?-lopencv_bioinspired?-lopencv_ccalib?-lopencv_dnn_objdetect?-lopencv_dpm?-lopencv_face?-lopencv_photo?-lopencv_freetype?-lopencv_fuzzy?-lopencv_hdf?-lopencv_hfs?-lopencv_img_hash?-lopencv_line_descriptor?-lopencv_optflow?-lopencv_reg?-lopencv_rgbd?-lopencv_saliency?-lopencv_stereo?-lopencv_structured_light?-lopencv_phase_unwrapping?-lopencv_surface_matching?-lopencv_tracking?-lopencv_datasets?-lopencv_text?-lopencv_dnn?-lopencv_plot?-lopencv_xfeatures2d?-lopencv_shape?-lopencv_video?-lopencv_ml?-lopencv_ximgproc?-lopencv_calib3d?-lopencv_features2d?-lopencv_highgui?-lopencv_videoio?-lopencv_flann?-lopencv_xobjdetect?-lopencv_imgcodecs?-lopencv_objdetect?-lopencv_xphoto?-lopencv_imgproc?-lopencv_core
Libs.private:?-ldl?-lm?-lpthread?-lrt
Cflags:?-I${includedir}
后續(xù)在使用makefile -L鏈接時(shí)候 發(fā)現(xiàn)本機(jī)上面-lopencv_xfeatures2d 沒(méi)有此動(dòng)態(tài)庫(kù),所以就去掉了,大家也可以自行去測(cè)試,有些部分的版本有點(diǎn)區(qū)別,對(duì)應(yīng)makefile的操作,大家可以移步看我之前的文章:jetson-nano opencv基礎(chǔ)使用
sudo vi /etc/bash.bashrc
修改bash.bashrc文件,增加如下文件
export?PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
再執(zhí)行source /etc/bash.bashrc
這樣之后,我們就可以pkg-config查詢對(duì)應(yīng)安裝好的opencv信息了
pkg-config?--modversion?opencv
pkg-config?--libs?opencv?
此外我們也可以通過(guò)使用python3 import cv2的方法查詢opencv是否安裝成功
lyn@lyn:/usr/local/lib/pkgconfig$?python3
Python?3.8.10?(default,?Nov?26?2021,?20:14:08)?
[GCC?9.3.0]?on?linux
Type?"help",?"copyright",?"credits"?or?"license"?for?more?information.
>>>?import?cv2
>>>?print(cv2.__version__)
4.5.5
>>>?
對(duì)應(yīng)的截圖:
十幾行C++代碼實(shí)現(xiàn)一個(gè)人臉識(shí)別
#include?<stdio.h>
#include?<iostream>
#include?<vector>
#include<opencv2/opencv.hpp>
using?namespace?cv;
using?namespace?std;
void?face_detection_demo()?
{
?std::string?root_dir?=?"/home/lyn/Documents/opencv/learn_code/face_detector/";
?dnn::Net?net?=?dnn::readNetFromTensorflow(root_dir+?"opencv_face_detector_uint8.pb",?root_dir+"opencv_face_detector.pbtxt");
?VideoCapture?capture(0);
?Mat?frame;
?while?(true)?{
??capture.read(frame);
??if?(frame.empty())?{
???break;
??}
??flip(frame,?frame,?1);//左右翻轉(zhuǎn)?y對(duì)稱
??Mat?blob?=?dnn::blobFromImage(frame,?1.0,?Size(300,?300),?Scalar(104,?177,?123),?false,?false);
??net.setInput(blob);//?NCHW
??Mat?probs?=?net.forward();?//?
??Mat?detectionMat(probs.size[2],?probs.size[3],?CV_32F,?probs.ptr<float>());
??//?解析結(jié)果
??for?(int?i?=?0;?i?<?detectionMat.rows;?i++)?{
???float?confidence?=?detectionMat.at<float>(i,?2);
???if?(confidence?>?0.5)?{
????int?x1?=?static_cast<int>(detectionMat.at<float>(i,?3)*frame.cols);
????int?y1?=?static_cast<int>(detectionMat.at<float>(i,?4)*frame.rows);
????int?x2?=?static_cast<int>(detectionMat.at<float>(i,?5)*frame.cols);
????int?y2?=?static_cast<int>(detectionMat.at<float>(i,?6)*frame.rows);
????Rect?box(x1,?y1,?x2?-?x1,?y2?-?y1);
????rectangle(frame,?box,?Scalar(0,?0,?255),?2,?8,?0);
???}
??}
??imshow("人臉檢測(cè)演示",?frame);
??int?c?=?waitKey(1);
??if?(c?==?27)?{?//?退出
???break;
??}
?}
}
int?main(int?argc,char?**argv)?{
??face_detection_demo();
??return?0;
}
CMakeLists.txt文件
cmake_minimum_required(?VERSION?2.8?)
project(opencv_test)
set(CMAKE_CXX_FLAGS??"-std=c++14?${CMAKE_CXX_FLAGS}?-Wall?-Wformat?-Wformat-security?-Werror=format-security?-Wunreachable-code")
find_package(OpenCV?REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(opencv_test?main.cpp?)
target_link_libraries(opencv_test??${OpenCV_LIBS})
對(duì)應(yīng)的CMakeLists.txt文件和jetson-nano opencv基礎(chǔ)使用基本一樣。詳細(xì)注解大家可以移步去看這篇文章。
上面那兩個(gè)文件是調(diào)用opencv里面dnn的例子,對(duì)應(yīng)的文件獲取方式如下:
涉及到pb文件需要下載,有可能出現(xiàn)下載失敗的情況,如果大家需要這個(gè)文件,也可以加我微信,我私發(fā)給需要的朋友們。
其中opencv_face_detector.pbtxt文件在samples/dnn/face_detector/目錄中
cd?opencv-4.5.5/samples/dnn/face_detector/
ls
opencv_face_detector_uint8.pb比較麻煩些,需要下載。方式如下:
cd?opencv-4.5.5/samples/dnn
python3?download_models.py
有Caffe模型,還有tensorflow模型。我們用的tensorflow模型,opencv_face_detector_uint8.pb文件就是從這里來(lái)。
Scalar(104, 177, 123)這個(gè)參數(shù)是/opencv-4.5.5/samples/dnn里面對(duì)應(yīng)的,models.yml文件里面有。
如上所示,我也是直接使用了。
最終實(shí)現(xiàn)效果如下:
結(jié)語(yǔ)
這就是我自己安裝opencv的過(guò)程分享。如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。
作者:良知猶存,白天努力工作,晚上原創(chuàng)公號(hào)號(hào)主。公眾號(hào)內(nèi)容除了技術(shù)還有些人生感悟,一個(gè)認(rèn)真輸出內(nèi)容的職場(chǎng)老司機(jī),也是一個(gè)技術(shù)之外豐富生活的人,攝影、音樂(lè) and 籃球。關(guān)注我,與我一起同行。