• 正文
    • oepncv介紹:
    • 安裝:
    • 配置全局環(huán)境
    • 十幾行C++代碼實現(xiàn)一個人臉識別
    • 結(jié)語
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

opencv安裝實錄附十幾行C++實現(xiàn)的一個人臉識別demo

03/13 09:46
928
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

之前寫過一篇在nano上使用opencv,nano上默認是安裝了opencv的庫,除了nano,我們自己電腦上也想使用opencv做一些平時圖像處理驗證。

本來也是看一些資料安裝好的,覺得也沒必要寫。但是實際安裝還是出現(xiàn)了不少問題,所以記錄分享一下。

環(huán)境:系統(tǒng)為ubuntu20.04

cv版本為 4.5

歡迎關(guān)注微信公眾號:羽林君,或者添加作者個人微信:become_me

oepncv介紹:

OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫。OpenCV是由英特爾公司發(fā)起并參與開發(fā),以BSD許可證授權(quán)發(fā)行,可以在商業(yè)和研究領(lǐng)域中免費使用。OpenCV可用于開發(fā)實時的圖像處理、計算機視覺以及模式識別程序。

OpenCV用C++語言編寫(基本上現(xiàn)在新的開發(fā)和算法都是用C++接口),它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。這些語言的API接口函數(shù)可以透過在線文檔獲取?,F(xiàn)在也提供對于C#, Ch,Ruby的支持。

OpenCV可以在Windows, Android, Maemo, ?FreeBSD, OpenBSD, iOS, Linux和Mac OS等平臺上運行。用戶可以在Github獲得官方版本,或者從Git獲得開發(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/,大可以點擊Sources進行下載自己需要的版本。

剛開始選擇了4.1 安裝出錯之后,選擇了 4.5就一路按照4.1的經(jīng)驗就裝好了,所以建議裝最新的。

下載之后,我們就開始編譯安裝了,

常規(guī)操作:

cd?opencv-4.5.5
mkdir?build
cmake?../
make

但是事情不是按照命令這么發(fā)展的,命令很少,解決問題確是很多。

cmake編譯的時候,推薦一個cmake圖形化工具,很方便。

sudo?apt?install?cmake-qt-gui?

cmake-gui?../

我們Search一欄選擇我們要配置的cmake 選項,然后選擇 generate生成就好了。

cmake ../之后開始make:

make?-j8

eigen庫未安裝遇到fatal error: Eigen/Core: No such file or directory 這個錯誤:

方法1:

執(zhí)行命令:sudo apt-get install libeigen3-dev 進行安裝。

方法2:因為我安裝過一次了,所以我查看了一下我的eigen,使用是locate 查詢了一下,locate eigen3

/usr/include/eigen3

/usr/include/eigen3/Eigen

發(fā)現(xiàn)了我的Eigen在eigen3目錄下。

所以我寫了一個軟鏈進行了鏈接

sudo?ln?-s?/usr/include/eigen3/Eigen?/usr/include/Eigen

繼續(xù)編譯 `make -j8

編譯 opencv 出現(xiàn) internal compiler error:Segmentation fault,并且一直出現(xiàn)。

出錯的原因是(虛擬機)運行內(nèi)存不足,而大量template的擴展需要足夠的內(nèi)存。

下面給大家分享一種方法解決這個報錯,我選擇不管,繼續(xù)編譯。

可以通過臨時使用交換分區(qū)來解決:

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è)置 cmake 選項 ENABLE_PRECOMPILED_HEADERS=OFF ,啟用預(yù)編譯頭支持??s短構(gòu)建時間。

sudo?cmake?-D?CMAKE_BUILD_TYPE=Release?-D?CMAKE_INSTALL_PREFIX=/usr/local?ENABLE_PRECOMPILED_HEADERS=OFF?

繼續(xù) make -j8

終于編譯完成,進入了安裝階段 make install

sudo?make?install

可以看到安裝的動態(tài)庫和文件都在/usr/local/目錄里面

配置全局環(huán)境

OpenCV4默認不生成.pc文件,所以我們需要自己去設(shè)置,也有人建議cmake后再加一條-D OPENCV_GENERATE_PKGCONFIG=ON才會生成。該編譯選項開啟生成opencv4.pc文件,就支持pkg-config功能,這個部分大家可以自行去嘗試一下,我自己使用了手動添加的方法,比較笨,但是可以用。

cd?/usr/local/lib
sudo?mkdir?pkgconfig?&&?cd?pkgconfig
sudo?vi?opencv.pc

文件內(nèi)容如下:對應(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鏈接時候 發(fā)現(xiàn)本機上面-lopencv_xfeatures2d 沒有此動態(tài)庫,所以就去掉了,大家也可以自行去測試,有些部分的版本有點區(qū)別,對應(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查詢對應(yīng)安裝好的opencv信息了

pkg-config?--modversion?opencv

pkg-config?--libs?opencv?

此外我們也可以通過使用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
>>>?

對應(yīng)的截圖:

十幾行C++代碼實現(xiàn)一個人臉識別

#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對稱
??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("人臉檢測演示",?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})

對應(yīng)的CMakeLists.txt文件和jetson-nano opencv基礎(chǔ)使用基本一樣。詳細注解大家可以移步去看這篇文章。

上面那兩個文件是調(diào)用opencv里面dnn的例子,對應(yīng)的文件獲取方式如下:

涉及到pb文件需要下載,有可能出現(xiàn)下載失敗的情況,如果大家需要這個文件,也可以加我微信,我私發(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文件就是從這里來。

Scalar(104, 177, 123)這個參數(shù)是/opencv-4.5.5/samples/dnn里面對應(yīng)的,models.yml文件里面有。

如上所示,我也是直接使用了。

最終實現(xiàn)效果如下:

結(jié)語

這就是我自己安裝opencv的過程分享。如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。


作者:良知猶存,白天努力工作,晚上原創(chuàng)公號號主。公眾號內(nèi)容除了技術(shù)還有些人生感悟,一個認真輸出內(nèi)容的職場老司機,也是一個技術(shù)之外豐富生活的人,攝影、音樂 and 籃球。關(guān)注我,與我一起同行。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

一個程序員,喜歡寫文章,還喜歡打籃球,也喜歡吉他鋼琴的駁雜之人。日常更新自己,分享包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學(xué)習(xí)筆記,同時,公眾號內(nèi)包含大量的學(xué)習(xí)資源。歡迎關(guān)注,一同交流學(xué)習(xí),共同進步!