捣腾了好几天时间,终于让opencv2.4.9在linux上安家落户了,因此写下此篇博客给那些像我一样的linux小白一丢丢的参考和建议,因为前后时间确实长了些(大佬略过),所以很多错误不能用界面来给大家显示,只能尽我所能向大家描述我遇到的错误,不过我之前在txt中做过笔记错误我都记录下来,如果是相同的错误,大家很容易就可以找到。下面就开始吧。
首先介绍我所使用的虚拟机版本和装载的系统
虚拟机:VMware W-14.1.1
系统:树莓派Debian-amd64(64位linux系统)
因为linux是吃版本的,所以版本不同错误可能就不一样,如果对于安装的系统没有太多要求,可以安装和我一样的系统,这样可以让错误对号入座。系统安装参考我之前的一篇博客,写的还算详细。https://blog.csdn.net/yuan123890/article/details/107607400
准备工作做好后就开始安装opencv了。
一、首先要执行的是如下几条指令
sudo raspi-config // 进入后打开摄像头、SSH
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
第一行指令是打开系统的相关设置界面,我看了不同版本的目录有些区别,本次使用的系统是有一个SSH选项,直接enter进去,enable就行了,这条指令是打开树莓派的摄像头操作,由于是虚拟机所以这个就是个流程,然后就是检查更新并升级,由于这里提到了这两条指令,就先说一个错误吧(这个错误是我在后面update时遇到的)
a.错误:关键显示为“NO_PUBLIC_KEY UGFEDCGB7854(这里是随便打的一串数字字母)”,大概就是更新时缺少秘钥
解决:输入指令
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 5543141274TGGY//所缺失的秘钥
二、安装opencv所需要的工具包
sudo apt-get install libgtk2.0-dev
sudo apt-get install libavcodec-dev
sudo apt-get install libavformat-dev
sudo apt-get install libswscale-dev
sudo apt-get install libtiff-dev
这里要注意的一点就是安装libtiff-dev,我在网上搜的工具包很多人都说是安装libtiff4-dev,但是我安装4版本时出现了一个问题直接提示我用libtiff-dev替换,所以就换成了提示版本,这里就不当做错误了,所问题的时候可以从提示信息中找出解决方法。
我在安装这五个包的时候基本上没有问题,但是除了这五个以外还有一个比较难以安装的包,如下所示
sudo apt-get install libjasper-dev
如果执行上面的指令没有问题那就最好,但是我在安装的时候出了问题
b.错误:提示信息显示unable to locate package,大意为找不到包,无法定位
解决:这个错误解决和源有关系,因此要换源。
我下面把我换过的源都列出来,第一个源是清华源,但是行不通,有需要的可以更换,现在我把自己的流程都列出来,首先要执行指令
sudo nano /etc/apt/sources.list
执行完之后出现一个界面就是有多行deb开头的源地址,把里面所有的deb用#注释掉,加上下面的源
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
之后ctrl+x退出,输入Y,保存
同样输入下面指令
sudo nano /etc/apt/sources.list.d/raspi.list
同样的方法,注释后加入下面的源
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
以上就换源成功了,换的是清华源,接着
sudo apt update
sudo apt upgrade
执行完之后再次sudo apt-get install libjasper-dev,发现不行,于是又换了个中科大的源,我下面把指令和源都列出来,添加方法和上面一样。
sudo nano /etc/apt/sources.list //添加指令
//下面是添加的源
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
再次执行sudo apt update && upgrade,这时出现了一个错误
c.错误:最后提示 Sub-process /usr/bin/dpkg returned an error code
解决:执行如下指令
sudo mv /var/lib/dpkg/info /var/lib/dpkg/info.bk
sudo mkdir /var/lib/dpkg/info
sudo apt-get update
sudo apt-get install -f
sudo mv /var/lib/dpkg/info /var/lib/dpkg/info.bk
sudo rm -rf /var/lib/dpkg/info
sudo mv /var/lib/dpkg/info.bk /var/lib/dpkg/info
sudo apt-get install libjasper-dev//libjasper-dev //安装成功
几个dev的安装就解决了,当时我是换了中科大的源之后解决这个错误,可能安装清华源的时候按照这种方式就可以,但是我没有试,如果安装完清华源就出现了上述错误可以这样解决。
三、安装编译opencv2.4.9
首先要下载OpenCV2.4.9的包,下载网址为
http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip/download opencv-2.4.9.zip
下载的指令如下
wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip/download opencv-2.4.9.zip
也可以直接在linux下的浏览器下载,下载好之后解压,可以右击解压,也可以指令解压。
解压完成之后,计入解压文件的目录,执行如下指令
cd opencv-2.4.9
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
下面就要解决这里的问题了,下面为可能出现的问题。
d.问题:cmake command not find,找不到cmake指令
解决:sudo apt-get install cmake
这里可能发现找不到cmake的包,下面提供两种解决方案及出现的问题,我用的是第二种方式。
下载压缩包,网址:https://cmake.org/download/
tar zxvf cmake-********.tar.gz(后缀为.xz使用-xvf)
ln -s /usr/cmake-********/bin/* /usr/bin/(创建软连接安装成功)
cmake -version //查看版本
下载压缩包,网址:https://cmake.org/download/
tar zxvf cmake-********.tar.gz
cd 进入解压好的文件夹
./configure(错误:找不到OpenSSL 解决:在cmake解压目录下文件夹中打开CMakeLists.txt,首行添加set(CMAKE_USE_OPENSSL OFF) )
make
sudo make install
cmake -version //查看版本
e.错误:提示信息大意是找不到qt的相关文件,显示多组QT*******.cmake找不到
解决:在上述执行的cmake指令中,找到-D WITH_QT=ON改为-D WITH_QT=OFF。再次执行
f. 错误:找不到头文件stdlib.h
解决:在cmake指令最后加上_PRECOMPILED_HEADERS=OFF,再次编译。
执行完cmake之后,再执行如下
sudo make install
g.错误:error**will be never beNULL,显示****不会为空
解决:进入release/modules/contrib/CMakeFiles/opencv_contrib.dir/flags.make文件中删除-Werror=address,再执行。
上面都正常之后接着执行下面的指令
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf' //配置路径
sudo ldconfig //更新路径
这样opencv2.4.9就安装好了。
四、编译运行
找到一个目录新建一个cpp文件,并且有gedit进行编译,指令如下,这里将cpp文件取名为test。
sudo gedit test.cpp
这里可能会出现错误,提示gedit找不到命令,那么就执行下面的指令
sudo apt-get install gedit
这里有可能会出现找不到包或者包已经损毁的情况,那就只能下载编译安装了,和前面的cmake一样,可能出现的错误也列在里面,这里用到aptitude,要注意和apt-get一样用于安装,但是aptitude用于降级安装,找不到指令的话就sudo apt-get install aptitude
下载包网址:https://download.gnome.org/sources/gedit/3.37/
tar -xvf gedit-3.37.3.tar.xz //解压
sudo apt-get install gedit(提示缺失依赖项换用sudo aptitude install gedit,直到遇到The following actions will resolve these dependencies:选择Y,其他都选n)
gedit --version //查看版本
安装好之后执行sudo gedit test.cpp
写入如下代码并保存,在test.cpp同级目录下要先保存好一张jpg的图片,我这里取名为1.jpg。
#include
#include
using namespace cv;
int main()
{
Mat image;
image = imread("1.jpg");
namedWindow("Display Image", CV_WINDOW_AUTOSIZE);
imshow("Display Image", image);
waitKey(0);
return 0;
}
在同目录下新建CMakeLists.txt文件写入如下的内容,这里所有的test都是可变,cpp文件名叫什么这里就叫什么,因为这里用的是test.cpp,所以都是test。
project(test)
find_package(OpenCV REQUIRED)
add_executable(test test)
target_link_libraries(test ${OpenCV_LIBS})
cmake_minimum_required(VERSION 2.8)
写完保存,再执行
sudo cmake .
sudo make //得到可执行文件
在目录下执行ls指令,可以看到可执行的文件,如下所示,绿色的test就是生成的可执行文件。
接下来最后一步,执行
./test
屏幕上就显示了之前保存为1.jpg的图片。
这下就大功告成啦。
如果能够帮助到有需要的人也是非常开心的,一起学习,一起加油。fighting!!!