目录
最近要搞树莓派上的目标识别,装了一手opencv,折腾了不少,在这里记录一下安装过程,也为了以后的再安装给自己一个参考。
第一次发csdn,格式按着hexo排的,感觉有点看着不太舒适,先不改了
如果有问题的话可以看我的博客
环境:
opencv - 4.5.5
opencv_contrib - 4.5.5
xmake - v2.6.3
raspberrypi - 4b with bullseye
storage -16G
cmake用的不熟,所以偷懒选择了xmake, 理论上除了树莓派不用局限在上面的版本
建议卡还是大一点,32G往上吧,可以少走点弯路
如无特殊说明,安装、下载、解压目录均在
~
aka/home/pi
下进行bash里粘贴不是ctrlCV,用右键-粘贴或者它的快捷键都可以,^C是关闭进程,复制用鼠标选中就可以
树莓派的系统直接选择了官网上给出的烧录软件Raspberry Pi Imager,安装后打开的画面如下:
选择SD所在的驱动器以及要烧录的系统,因为方便用树莓派的摄像头所以我用了默认的系统,16G的话必须选recommend的系统或者更简,再往上可以安装full
进入设置,配置wifi、用户名等信息,并选择“跳过启动向导”
注1:若使用VNC显示画面,自行百度
注2:HDMI接口可能会因为外壳厚度而无法输出信号,建议裸机连接排障
电脑上安装git,利用里面的git bash
安装FileZilla,用于传输文件
树莓派官方给的找树莓派方法是手机用Fing
之类的,这个就看吧,我用的华为路由器的ip管理,总之得获取一个树莓派的地址
打开bash,输入
ssh {刚才设置的用户名,默认为pi}@{查到的树莓派地址}
弹出询问的时候输入yes
如果是重装的话需要在连接前,先删除电脑C:\Users\{yourname}\.ssh\known_hosts
里的树莓派指纹
输入密码,没有更改的话应该是raspberry
,进入系统
FileZilla的方法类似,主机名为sftp://{yourip}
完成ssh连接
国内访问apt的速度比较慢,因此切换到清华源
安装过程参考:
# 编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代: deb [arch=armhf] http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi # 如果需要 arm64 软件源,在 `/etc/apt/sources.list` 中加上 # (这个一般不用) deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/raspbian/multiarch/ bullseye main # 编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代: deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
因为我安装xmake时用默认方法没法编译,所以参考了issue使用了clang来编译
实际操作可以先试试不用clang,如果安不了再装
安装过程参考:
前往github release下载clang安装包,其名称应为clang+llvm-{version}-armv7a-linux-gnueabihf.tar.xz
通过FileZilla将安装包传输至树莓派/home/pi
目录下
解压并安装
tar -xvf clang+llvm-{version}-armv7a-linux-gnueabihf.tar.xz rm clang+llvm-{version}-armv7a-linux-gnueabihf.tar.xz mv clang+llvm-{version}-armv7a-linux-gnueabihf clang_{version} sudo mv clang_{version} /usr/local
配置clang环境变量
export PATH=/usr/local/clang_{version}/bin:$PATH export LD_LIBRARY_PATH=/usr/local/clang_{version}/lib:$LD_LIBRARY_PATH
长久配置clang变量
echo 'export PATH=/usr/local/clang_9.0.0/bin:$PATH' >> .bashrc echo 'export LD_LIBRARY_PATH=/usr/local/clang_9.0.0/lib:$LD_LIBRARY_PATH' >> .bashrc . .bashrc
确定是否成功安装
clang++ --version
我的输出如下:
pi@raspberrypi:~ $ clang++ --version clang version 13.0.1 (http://git.linaro.org/toolchain/jenkins-scripts.git d04b0fafc2d906fd9b2e8e55efb35c9cf7114e68) Target: armv7l-unknown-linux-gnueabihf Thread model: posix InstalledDir: /usr/local/clang_13.0.1/bin
原文中还附带了卸载方法,我就没尝试,一般直接remake了(
在我的项目中需要用的eigen来解算,为了与opencv连接,在opencv前安装eigen,如果项目中没有使用可以跳过
安装过程参考
安装
sudo apt-get install libeigen3-dev
调整安装路径(好像不调整也可以,但是保险还是调了,反正是cp
cd /usr/include/eigen3 sudo cp Eigen/ .. -R
原文有测试方法,我直接装了也没啥问题(
xmake还是一个非常香的编译器,所以用了它(其实还是不会cmake
遇到的最主要的问题还是make build
和make LDFLAGS="-latomic
都没成功,所以按照作者意见用了clang
安装过程参考:
安装依赖
sudo apt-get install git
默认搭建过程:
git clone --recursive https://gitee.com/tboox/xmake.git cd ./xmake make build ./scripts/get.sh __local__ __install_only__ source ~/.xmake/profile
clang搭建过程:
git clone --recursive https://gitee.com/tboox/xmake.git cd ./xmake export CC=clang bash <(curl -fsSL https://xmake.io/shget.text)
主角登场,这次还查了不少的参考
这玩意儿安的挺多,每次都给我整点新花样
什么时候能出opencv一键编译安装
安装过程参考:
增大可用空间(如果卡大的话应该不需要
sudo raspi-config
方向键选择如下
重启树莓派
安装依赖
sudo apt-get install -y build-essential sudo apt-get install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install -y python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev sudo apt-get install -y libxvidcore-dev libx264-dev sudo apt-get install -y libatlas-base-dev gfortran sudo apt-get install -y ffmpeg
参考1里给了使用脚本的安装方式,可以看一下
在电脑上下载opencv源码
opencv 的 release页 下载Sources
opencv_contrib 的 tag页 下载与opencv版本相同的第三方库
用FileZilla传输至树莓派
解压并改名
unzip opencv.zip unzip opencv_contrib.zip mv opencv-{version} opencv mv opencv_contrib-{version} opencv_contrib
预编译opencv
cd opencv #创建build文件夹 mkdir build cd build
#直接粘贴,包括换行 cmake \ -D CMAKE_BUILD_TYPE=RELEASE \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D CMAKE_SHARED_LINKER_FLAGS='-latomic' \ -D OPENCV_ENABLE_NONFREE=ON \ -D WITH_TBB=ON \ -D WITH_EIGEN=ON \ -D WITH_GTK=ON \ -D WITH_OPENGL=ON \ -D WITH_V4L=ON \ -D WITH_OPENCL=OFF \ -D WITH_CUDA=OFF \ -D BUILD_NEW_PYTHON_SUPPORT=ON \ -D BUILD_DOCS=ON \ -D BUILD_TESTS=OFF \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_EXAMPLES=ON \ -D BUILD_opencv_gpu=OFF \ -D BUILD_opencv_gpuarithm=OFF \ -D BUILD_opencv_gpubgsegm=OFF \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=ON \ -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local/ \ -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv_contrib/modules .. #上面这个OPENCV_EXTRA_MODULES_PATH要填刚才解压移动的opencv_contrib文件夹里modules的位置,如果名字不一样记得改
在预编译的过程中可能会出现下载不了的问题,一般是xfeature2D之类的容易出问题,可以百度一下怎么解决,我以前遇到了这次都还好,如果下次出问题再更新
编译opencv
sudo make -j4
-j4 说明使用4核心(raspberry pi 4b的核心数)进行编译
等待时间很长就等着吧
在这个过程中可能会出现包下载不下来的问题,可以参照参考1进行排障
编译到100%即可安装
sudo make install
配置环境
查找opencv4.pc文件,在/usr/local/lib/目录下建立pkgconfig目录,然后将build文件夹下编译生成的opencv4.pc 拷贝进/usr/local/lib/pkgconfig
find ./ -name opencv4.pc
我的返回如下
pi@raspberrypi:~/opencv/build $ find ./ -name opencv4.pc ./unix-install/opencv4.pc
进行复制
sudo cp ./unix-install/opencv4.pc /usr/local/lib/pkgconfig
检查在系统中是否能找到头文件
pkg-config --cflags --libs opencv4
返回应该如下(具体的lib可能会有多有少,问题大部分情况不大
pi@raspberrypi:~/opencv/build $ pkg-config --cflags --libs opencv4 -I/usr/local/include/opencv4 -L/usr/local/lib/arm-linux-gnueabihf -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
修改opencv.conf
sudo nano /etc/ld.so.conf.d/opencv.conf #在opencv.conf中添加内容: /usr/local/lib
ctrl+o enter 保存
ctrl+x 退出
执行生效命令
sudo ldconfig
修改bash.bashrc
sudo nano /etc/bash.bashrc #文件末尾加入: export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
这里应该会有一个更新命令,但好像要装mlocate,我就贴个命令,不执行好像也没事
source /etc/bash.bashrc sudo updatedb
我们的opencv搭完啦!
针对树莓派官方的摄像头,其他的没试过(
设置过程参考:
硬件安装上,把板子放在桌面上,黑抽屉的两个耳朵往上拉,然后把排线塞进去即可
如果有问题的话先看硬件连接,没问题去百度
设置代码
sudo raspi-config
选择Interface Options
-Legency Camera
,启用它,重启
这时候好像就用不了VNC了,目前没有找解决方案除了直接外接显示器
测试代码
vcgencmd get_camera
我的输出
pi@raspberrypi:~/opencv/build $ vcgencmd get_camera supported=1 detected=1
可以输入命令
raspistill -o image.jpg
会调用摄像头生成一张名为image.jpg
的图片到/home/pi
下
如果测试时,xmake可以顺利下载依赖就不需要了
设置过程参考:
Linux中加速访问github - zonyZhang - 博客园 -- 本块基本全文粘贴
查询以下域名映射,并分别取访问速度较快的一个ip
github.global.ssl.fastly.net -> 151.101.229.194
assets-cdn.github.com -> 203.208.39.99
TTL值越大证明响应速度越快
将查询到的ip和域名设置到host中
sudo nano /etc/hosts
在hosts加入结果
#github 151.101.229.194 github.global.ssl.fastly.net 203.208.39.99 assets-cdn.github.com
保存,退出,并重启网络服务
/etc/init.d/networking restart
测试代码考虑到不一定有桌面输出,所以写了无需imshow
的程序
TODO:
还没有做摄像头的捕捉,过一阵更新吧
设置过程参考:
xmake去github下载包失败 该如何绕过? · Issue #I1AW6Z · tboox/xmake - Gitee.com -- 最终未使用,仅作为github下载失败的解决方案之一
在/home/pi
下建立workspace/opencv-test
(这部分文件夹起名随意,但建议放在/home/pi
下,其中opencv-test
即为我们的项目储存地
cd ~ mkdir workspace/opencv-test cd workspace/opencv-test
创建代码,可以在电脑上编完再放上去,也可以在树莓派上现写
#在/home/pi/workspace/opencv-test目录下 touch test.cpp nano test.cpp
或者FileZilla直接传写好的test.cpp
测试代码如下
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main(){ cout << "Programme begin." << endl; Mat input_image = imread("./image.jpg"); cout << "Finish reading image." << endl; Mat output_image; cvtColor(input_image, output_image, COLOR_BGR2GRAY); cout << "Gen gray image." << endl; imwrite("./image_gray.jpg", output_image); return 0; }
使用xmake编译
xmake
输入y
确定,首次或者下面更改完xmake.lua
后可能会下载一些依赖,等待下载,如果不行参照1.9处理
这时候会找不到opencv.hpp
更改xmake.lua
nano xmake.lua
将其修改为
add_requires("opencv4") target("test") set_kind("binary") add_rules("mode.debug", "mode.release") add_includedirs("/usr/include", "/usr/local/include", "/usr/local/include/opencv4") add_packages("opencv4") add_files("test.cpp") set_languages("cxx17")
这里注意的有:
add_requires()
和add_packages()
用的是opencv4
而非opencv
这好像与pkg的安装有关,以后也得加4
如果多文件的话需要看一下参考,这个是不够的
再次编译
xmake
在这之前设置了
/usr/local/include/opencv4/opencv2
到/usr/local/include/opencv4
的软链接,如果下文出现错误可以尝试建立软链接(方法百度)
运行文件
xmake -r
终端和FileZilla都进入./build/linux/armv7a/release/
cd build/linux/armv7a/release/
FileZilla在release
下上传名为image.jpg
的图片(比如测试摄像头的那一张)
运行
./test
我的输出
pi@raspberrypi:~/workspace/opencv-test/build/linux/armv7a/release $ ./test Programme begin. Finish reading image. Gen gray image. pi@raspberrypi:~/workspace/opencv-test/build/linux/armv7a/release $ ls image_gray.jpg image.jpg test
应该会在同一文件夹下生成image_gray.jpg
的灰度图,可以用FileZilla下载到电脑上查看(注意F5刷新FileZilla)
至此除了没有测试opencv读取摄像头已经全部完成了,在测试环境可能会出现各种各样烦得要死的问题,善用百度、csdn、git issue等平台吧
希望搭建顺利!
以下是我在搭建环境时或多或少参照的内容,感谢他们的付出
clang搭建
eigen安装
opencv搭建
xmake搭建
摄像头设置
xmake测试
github代理
搭建环境综合(为什么我最后才看见)