• 正文
  • 相关推荐
申请入驻 产业图谱

opencv安装实录附十几行C++实现的一个人脸识别demo

03/13 09:46
1233
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

之前写过一篇在nano上使用opencv,nano上默认是安装了opencv的库,除了nano,我们自己电脑上也想使用opencv做一些平时图像处理验证。

本来也是看一些资料安装好的,觉得也没必要写。但是实际安装还是出现了不少问题,所以记录分享一下。

环境:系统为ubuntu20.04

cv版本为 4.5

欢迎关注微信公众号:羽林君,或者添加作者个人微信:become_me

oepncv介绍:

OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。

OpenCV用C++语言编写(基本上现在新的开发和算法都是用C++接口),它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以透过在线文档获取。现在也提供对于C#, Ch,Ruby的支持。

OpenCV可以在Windows, Android, Maemo, ?FreeBSD, OpenBSD, iOS, Linux和Mac OS等平台上运行。用户可以在Github获得官方版本,或者从Git获得开发版本。OpenCV也是用CMake.

安装:

到了安装环节了,先装一堆依赖包。

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的经验就装好了,所以建议装最新的。

下载之后,我们就开始编译安装了,

常规操作:

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

但是事情不是按照命令这么发展的,命令很少,解决问题确是很多。

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:

执行命令:sudo apt-get install libeigen3-dev 进行安装。

方法2:因为我安装过一次了,所以我查看了一下我的eigen,使用是locate 查询了一下,locate eigen3

/usr/include/eigen3

/usr/include/eigen3/Eigen

发现了我的Eigen在eigen3目录下。

所以我写了一个软链进行了链接

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

继续编译 `make -j8

编译 opencv 出现 internal compiler error:Segmentation fault,并且一直出现。

出错的原因是(虚拟机)运行内存不足,而大量template的扩展需要足够的内存。

下面给大家分享一种方法解决这个报错,我选择不管,继续编译。

可以通过临时使用交换分区来解决:

sudo dd if=/dev/zero of=/swapfile bs=64M count=16
#count的大小就是增加的swap空间的大小,64M是块大小,所以空间大小是bs*count=1024MB
sudo mkswap /swapfile
#把刚才空间格式化成swap格式
sudo swapon /swapfile
#使用刚才创建的swap空间
在编译完成后,最好可以关闭(释放)交换空间

sudo swapoff /swapfile
sudo rm /swapfile

以上交换分区方法为引用了别的博主的片段

编译的时候,也设置 cmake 选项 ENABLE_PRECOMPILED_HEADERS=OFF ,启用预编译头支持。缩短构建时间。

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

继续 make -j8

终于编译完成,进入了安装阶段 make install

sudo?make?install

可以看到安装的动态库和文件都在/usr/local/目录里面

配置全局环境

OpenCV4默认不生成.pc文件,所以我们需要自己去设置,也有人建议cmake后再加一条-D OPENCV_GENERATE_PKGCONFIG=ON才会生成。该编译选项开启生成opencv4.pc文件,就支持pkg-config功能,这个部分大家可以自行去尝试一下,我自己使用了手动添加的方法,比较笨,但是可以用。

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

文件内容如下:对应的Version大家按照自己的版本修改,libs内容需要微调,后面有给我自己的情况。

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}

后续在使用makefile -L链接时候 发现本机上面-lopencv_xfeatures2d 没有此动态库,所以就去掉了,大家也可以自行去测试,有些部分的版本有点区别,对应makefile的操作,大家可以移步看我之前的文章:jetson-nano opencv基础使用

sudo vi /etc/bash.bashrc

修改bash.bashrc文件,增加如下文件

export?PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH


再执行source /etc/bash.bashrc

这样之后,我们就可以pkg-config查询对应安装好的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
>>>?

对应的截图:

十几行C++代码实现一个人脸识别

#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);//左右翻转?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>());
??//?解析结果
??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})

对应的CMakeLists.txt文件和jetson-nano opencv基础使用基本一样。详细注解大家可以移步去看这篇文章。

上面那两个文件是调用opencv里面dnn的例子,对应的文件获取方式如下:

涉及到pb文件需要下载,有可能出现下载失败的情况,如果大家需要这个文件,也可以加我微信,我私发给需要的朋友们。

其中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)这个参数是/opencv-4.5.5/samples/dnn里面对应的,models.yml文件里面有。

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

最终实现效果如下:

结语

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


作者:良知犹存,白天努力工作,晚上原创公号号主。公众号内容除了技术还有些人生感悟,一个认真输出内容的职场老司机,也是一个技术之外丰富生活的人,摄影、音乐 and 篮球。关注我,与我一起同行。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

一个程序员,喜欢写文章,还喜欢打篮球,也喜欢吉他钢琴的驳杂之人。日常更新自己,分享包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,公众号内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!