前言:

之前写过一篇在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.

安装:

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

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

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

常规操作:

  1. cd opencv-4.5.5
  2. mkdir build
  3. cmake ../
  4. make

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

cmake编译的时候,推荐一个cmake图形化工具,很方便。

  1. sudo apt install cmake-qt-gui
  2. cmake-gui ../

我们Search一栏选择我们要配置的cmake 选项,然后选择 generate生成就好了。

cmake ../之后开始make:

  1. 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目录下。

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

  1. 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 ,启用预编译头支持。缩短构建时间。

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

继续 make -j8

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

  1. sudo make install

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

配置全局环境

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

  1. cd /usr/local/lib
  2. sudo mkdir pkgconfig && cd pkgconfig
  3. sudo vi opencv.pc

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

  1. prefix=/usr/local
  2. exec_prefix=${prefix}
  3. includedir=/usr/local/include
  4. libdir=/usr/local/lib
  5. Name: OpenCV
  6. Description: Open Source Computer Vision Library
  7. Version: 4.5.5
  8. 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
  9. Libs.private: -ldl -lm -lpthread -lrt
  10. Cflags: -I${includedir}

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

sudo vi /etc/bash.bashrc

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

  1. export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

再执行source /etc/bash.bashrc

这样之后,我们就可以pkg-config查询对应安装好的opencv信息了

  1. pkg-config --modversion opencv
  2. pkg-config --libs opencv

此外我们也可以通过使用python3 import cv2的方法查询opencv是否安装成功

  1. lyn@lyn:/usr/local/lib/pkgconfig$ python3
  2. Python 3.8.10 (default, Nov 26 2021, 20:14:08)
  3. [GCC 9.3.0] on linux
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> import cv2
  6. >>> print(cv2.__version__)
  7. 4.5.5
  8. >>>

对应的截图:

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

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <vector>
  4. #include<opencv2/opencv.hpp>
  5. using namespace cv;
  6. using namespace std;
  7. void face_detection_demo()
  8. {
  9. std::string root_dir = "/home/lyn/Documents/opencv/learn_code/face_detector/";
  10. dnn::Net net = dnn::readNetFromTensorflow(root_dir+ "opencv_face_detector_uint8.pb", root_dir+"opencv_face_detector.pbtxt");
  11. VideoCapture capture(0);
  12. Mat frame;
  13. while (true) {
  14. capture.read(frame);
  15. if (frame.empty()) {
  16. break;
  17. }
  18. flip(frame, frame, 1);//左右翻转 y对称
  19. Mat blob = dnn::blobFromImage(frame, 1.0, Size(300, 300), Scalar(104, 177, 123), false, false);
  20. net.setInput(blob);// NCHW
  21. Mat probs = net.forward(); //
  22. Mat detectionMat(probs.size[2], probs.size[3], CV_32F, probs.ptr<float>());
  23. // 解析结果
  24. for (int i = 0; i < detectionMat.rows; i++) {
  25. float confidence = detectionMat.at<float>(i, 2);
  26. if (confidence > 0.5) {
  27. int x1 = static_cast<int>(detectionMat.at<float>(i, 3)*frame.cols);
  28. int y1 = static_cast<int>(detectionMat.at<float>(i, 4)*frame.rows);
  29. int x2 = static_cast<int>(detectionMat.at<float>(i, 5)*frame.cols);
  30. int y2 = static_cast<int>(detectionMat.at<float>(i, 6)*frame.rows);
  31. Rect box(x1, y1, x2 - x1, y2 - y1);
  32. rectangle(frame, box, Scalar(0, 0, 255), 2, 8, 0);
  33. }
  34. }
  35. imshow("人脸检测演示", frame);
  36. int c = waitKey(1);
  37. if (c == 27) { // 退出
  38. break;
  39. }
  40. }
  41. }
  42. int main(int argc,char **argv) {
  43. face_detection_demo();
  44. return 0;
  45. }

CMakeLists.txt文件

  1. cmake_minimum_required( VERSION 2.8 )
  2. project(opencv_test)
  3. set(CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS} -Wall -Wformat -Wformat-security -Werror=format-security -Wunreachable-code")
  4. find_package(OpenCV REQUIRED)
  5. include_directories(${OpenCV_INCLUDE_DIRS})
  6. add_executable(opencv_test main.cpp )
  7. target_link_libraries(opencv_test ${OpenCV_LIBS})

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

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

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

其中opencv_face_detector.pbtxt文件在samples/dnn/face_detector/目录中

  1. cd opencv-4.5.5/samples/dnn/face_detector/
  2. ls

opencv_face_detector_uint8.pb比较麻烦些,需要下载。方式如下:

  1. cd opencv-4.5.5/samples/dnn
  2. 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 篮球。关注我,与我一起同行。

  1. ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

推荐阅读

【1】jetson nano开发使用的基础详细分享

【2】Linux开发coredump文件分析实战分享

【3】CPU中的程序是怎么运行起来的 必读

【4】cartographer环境建立以及建图测试

【5】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比

本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。

opencv安装实录附十几行C++实现的一个人脸识别demo的更多相关文章

  1. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  2. OpenCV学习记录(一):使用haar分类器进行人脸识别 标签: opencv脸部识别c++ 2017-07-03 15:59 26人阅读

    OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).OpenCV2之后的C++接口除了Haar特征 ...

  3. 六十来行python代码完成一个文件分类器

    ​    你的桌面是否像这样的一样被各种文件给堆满了,但是每一个文件又不清楚是否后面还有作用,也不敢删除,自己一个一个转移又太麻烦了.没关系,今天我带大家用python一起来做一个文件归类器,一键进行 ...

  4. opencv 人脸识别

      背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  5. 基于Dlib、OpenCV开发人脸识别程序的开发建议

    前言 在去年十月的时候参加了一个小比赛,做了一个人脸识别程序并很意外地获得省里面的一等奖,视频演示链接在这里,有同学想要做这方面的毕业设计or课程设计,发一篇博客来分享一下当时的开发过程. 视频演示链 ...

  6. 基于 OpenCV 的人脸识别

    基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...

  7. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  8. 【python人脸识别】使用opencv识别图片中的人脸

    概述: OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库 为什么有OpenCV? 计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种: 1.研究 ...

  9. opencv 人脸识别 (二)训练和识别

    上一篇中我们对训练数据做了一些预处理,检测出人脸并保存在\pic\color\x文件夹下(x=1,2,3,...类别号),本文做训练和识别.为了识别,首先将人脸训练数据 转为灰度.对齐.归一化,再放入 ...

随机推荐

  1. k8s中的nginx-ingress如何配置路径重定向

    k8s中的nginx-ingress如何配置路径重定向 一. 需求描述 路径重定向的一般应用场景: 调整用户浏览的URL,看起来更规范 为了让搜索引擎收录网站内容,让用户体验更好 网站更换新域名后 根 ...

  2. 论文解读DEC《Unsupervised Deep Embedding for Clustering Analysis》

    Junyuan Xie, Ross B. Girshick, Ali Farhadi2015, ICML1243 Citations, 45 ReferencesCode:DownloadPaper: ...

  3. Maven Archetype 多 Module 自定义代码脚手架

    大部分公司都会有一个通用的模板项目,帮助你快速创建一个项目.通常,这个项目需要集成一些公司内部的中间件.单元测试.标准的代码格式.通用的代码分层等等. 今天,就利用 Maven 的 Archetype ...

  4. 在Linux系统(centos7)中,安装VScode,并在VScode上编写HTML网页

    [实验目的] 在Linux系统中,搭建编写HTML网页的环境.在VS code官网上,下载VS code安装程序,进行安装.在VS code软件中编写HTML页面,并正确运行. [实验步骤] 1)   ...

  5. pytest文档8-参数化(parametrize)结合allure.title()生成不同标题报告

    参数化parametrize 先看一个简单的pytest参数化案例演示test_a.py # test_a.py import pytest import allure def login(usern ...

  6. 新手如何入门linux,linux原来还可以这么学

    前言 在这个只有cangls和小白两人的小房间中,展开了一次关于学习方法的讨论. 小白:cangls啊,我想请教一个问题,您是如何记住那么多linux命令的. cangls:我啊,别人都看我的小电影, ...

  7. python29day

    内容回顾 网络编程 概念 B/S C/S架构 B/S browser server C/S client 装客户端使用的 server远程服务器的 osi七层协议 今日内容 tcp协议的编程 如何在连 ...

  8. 布客&#183;ApacheCN 编程/后端/大数据/人工智能学习资源 2020.6

    公告 我们的群共享文件有备份到 IPFS 的计划,具体时间待定. 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复 ...

  9. sqlserver查出来的数据丢失

    问题描述 今天利用sqlserver查数据,使用了一个ROUND(308.16000, 2)函数,发现在sqlserver工具中显示正常,但是在服务端查出来就会发生精度丢失问题. ROUND和CAST ...

  10. shiro-springboot整合,平行依赖

    最近在弄shiro,把shiro单独提出来,弄成一个子项目,这样可以降低项目的冗余,但是把shiro打成jar包后,另一个项目添加其依赖后,在IDE项目中正常的运行,打成jar包后运行,则不断的报错 ...