三、opencv软件环境配置
linux子系统中opencv安装位置:D:\ubuntu\opencv-4.5.0
虚拟机opencv安装位置:/home/pi/opencv-4.5.0
树莓派opencv安装位置:/home/pi/opencv-4.5.0
3.1 编译流程
-
opencv版本下载:opencv-4.5.0
opencv和opencv_contrib一定要版本一致
(1)官网下载地址:https://opencv.org/releases/
选择源文件下载opencv-4.5.0.zip和opencv_contrib-master.zip。两个压缩包都下载后,新建文件夹opencv-4.5.0,将两个压缩包文件解压到opencv-4.5.0文件夹下。并将opencv_contrib-master改名为opencv_contrib-4.5.0.
(2)打开树莓派硬件,将下载好的opencv-4.5.0拷贝到树莓派系统 /home/pi/opencv-4.5.0目录下。
-
更新软件系统:输入命令 sudo apt-get update 等待下载更新完成。下载完成后输入命令sudo apt-get upgrade 使安装包适应当前系统环境。
-
根目录扩容:由于使用的是内存卡,在安装软件时可能会出现内存不足,所需要将系统扩展至全内存卡。在终端输入sudo raspi-config 命令。选择“高级Advanced Options”,然后选择扩展系统,然后按键盘“Enter”后点击“finish”,在终端输入 sudo reboot重启系统。检查输出磁盘是否扩展 输入命令 df –h ,可以看到磁盘已用和可用的容量。一般16G内存卡,在装完系统后可用容量在6G左右。
-
安装opencv软件所需要的依赖包:安装命令如下:
sudo apt install build-essential
sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
//第三行中,可能会出现 无法定位软件包libjasper-dev 的错误提示
//解决方法如下:
sudo add-apt-repository “deb http://security.ubuntu.com/ubuntu xenial-security main”
sudo apt update
sudo apt install libjasper1 libjasper-dev -
编译安装opencv-4.5.0
(1)进入到 opencv-4.5.0目录 输入命令 cd /home/pi/opencv-4.5.0/opencv-4.5.0,改变文件权限 输入命令 sudo chmod 777 * -R
(2)创建并进入编译目录
输入如下命令:mkdir build & cd bulid
(3)编译
输入命令 sudo cmake -DOPENCV_EXTRA_MODULES_PATH=…/…/opencv_contrib/modules …
生成本地Makefile文件(注意命令后两个符号是英文“…”)。
然后输入编译命令
sudo make -j4 2>&1 | tee make.log
使用最多4线程编译,加快编译速度。同时保存编译信息到make.log,方便离线查看编译进度。编译进度会显示出来。
编译时间比较长大约5-8小时。当断电或者重启后,直接进入到build目录路径
输入 sudo make 命令继续编译直到编译完成到100%。如下图所示
(4)安装编译好的opencv
输入命令sudo make install
动态链接库安装
输入命令sudo ldconfig
-
查看已经安装的opencv版本。
输入命令python3
可以看到当前python3的版本号。
输入 命令 import cv2
输入命令
cv2.__version__
可以看到当前安装的opencv的版本(命令中“__”是两个下划线)。
到此时opencv-4.5.0已经编译安装完成了。
3.2 编译过程遇到问题及解决
-
问题一:
-
在72%的时候遇到了出错,fatal error: boostdesc_bgm.i: 没有那个文件或目录#include “boostdesc_bgm.i”
-
解决方法:出现这个问题就是boostdesc和vgg文件缺失导致的编译失败问题。
首先我们要进入到/home/pi/…/opencv_contrib/modules/xfeatures2d/src目录下,下载此文件https://download.youkuaiyun.com/download/ninwji/11739702 将压缩包内的文件均复制到此目录下。
-
-
问题二:
-
/home/pi/opencv-4.5.0/opencv_contrib-4.5.0/modules/xfeatures2d/test/test_features2d.cpp:51:10: fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录
#include “features2d/test/test_detectors_regression.impl.hpp” -
解决方法一:
-
把这几个文件从D:\ubuntu\opencv-4.5.0\opencv-4.5.0\modules\features2d\test复制到D:\ubuntu\opencv-4.5.0\opencv_contrib-4.5.0\modules\xfeatures2d\test
test_descriptors_invariance.impl.hpp
test_descriptors_regression.impl.hpp
test_detectors_invariance.impl.hpp
test_detectors_regression.impl.hpp
test_invariance_utils.hpp -
修改D:\ubuntu\opencv-4.5.0\opencv_contrib-4.5.0\modules\xfeatures2d\test:test_features2d.cpp中51\52行和test_rotation_and_scale_invariance. cpp中7\8行,把features2d/test/去掉
-
-
解决方法二:
- 把\opencv-4.5.0\opencv\modules\features2d文件夹复制到\opencv-4.5.0\opencv\build
-
-
问题三:
- fatal error: opencv2/video/detail/tracking.private.hpp: No such file or directory #include “opencv2/video/detail/tracking.private.hpp”
- 解决不了,似乎是版本opencv和opencv_ctrib版本不一致,重新下载,两个都下4.5.0
-
问题四:click
-
97%卡死
-
添加树莓派的SWAP交换区
-
编辑dphys-swapfile文件,
nano /etc/dphys-swapfile
-
将conf_swapsize 的值修改成你想要的大小,以mb为单位,设置为2G大小,保存之后,重启dphys-swapfile服务
sudo /etc/init.d/dphys-swapfile restart
-
最后查看交换空间的大小:free -m
-
-
用多线程来进行编译的时候,前期编译速度很快,但是到大概到70%的时候,编译的速度就越来越慢。可以用htop查看一下进程的信息,发现进程处于D状态,D状态表示进程正在不可中断的等待状态。用make -j1来编译
-
3.3 虚拟机遇到的问题及解决
-
任务栏消失及解决:click
- $rm -rf ~/.config/lxpanel/LXDE-pi
这段话意思就是删除LXDE-pi文件,手动删也可以 - 重启:$ sudo reboot
- $rm -rf ~/.config/lxpanel/LXDE-pi
-
摄像头打开黑屏:click
- 将usb兼容性改成3.0
-
opencv摄像头闪退:click
-
waitKey返回值问题
waitkey(30) 如果不按键的时候是返回 oxff,这个无符号就是255,有符号就是-1
windows vs 的环境默认了这个为非符号数 即255解决方案:把原始代码中循环读取帧的
if (waitKey(30)>=0) break;
改为
if (waitKey(30) != 255) break;
或者把waitkey的返回值用有符号数去读取。
-
3.4 测试代码
编译命令:g++ test.cpp pkg-config opencv --libs
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgcodecs/legacy/constants_c.h"
#incldue <opencv2/highgui/highgui_c.h>
using namespace cv;
int main(int argc,char *argv[])
{
Mat img=imread("/home/pi/Desktop/1.jpg",CV_LOAD_IMAGE_COLOR);
if(img.empty())
return -1;
namedWindow("1".CV_WINDOW_AUTOSIZE);
imshow("1",img);
waitKey(0);
return 0;
}
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc, char *argv[])
{
Mat img = imread("/home/pi/Desktop/1.jpg", CV_LOAD_IMAGE_COLOR);
if(img.empty())
return -1;
namedWindow("arnold_schwarzenegger", CV_WINDOW_AUTOSIZE );
imshow("arnold_schwarzenegger", img);
waitKey(0);
return 0;
}
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
std::cout << "hello world!" << std::endl;
Mat srcImage = imread("/home/pi/Desktop/1.jpg");
imshow("冰冰", srcImage);
waitKey(0);
return 0;
}