背景:搞了个树莓派3b+想用来做opencv图像处理,已经在Windows里写好cpp代码,配好环境迁移就行。
流水账:电脑里的opencv是2413(我真是老古董了),官网最新的是4.1.0。
第0次:
apt-get install opencv2
本来以为就简单粗暴,结果python好使,cpp不好使。
第一次:寻思自己摸索(以前自己编译过2413)下了源码,下了cmake,依赖库觉得前面apt-get过了就没装
cmake
make
make install
一天后,finish,跑了个例程(还有点波折,后面说),缺gtk库。
第二次:查了必须的库,顺便发现make -j4可以提速。
make -j4,树莓派运行灯常亮,电源灯常灭,键鼠无法操作,熄屏无法唤醒,只有右上角有个闪电符号(后来知道是电量不足提示)。
三天后,死锁结束。其实opencv make打断是可以继续的,再运行make就行,又一天,还是没看到结果,也唤醒不了屏幕。
放弃
以前也跳过坑,可能是最新的版本有bug,也没有什么教程,我还是回去搞2413吧。
第三次,上传2413源码(用ftp,本猿linux很熟),仍然,cmake,make,报错,各种报错
查了资料以后说gcc版本太高导致,大家的做法是降低gcc版本。我不服,旧的东西就得淘汰。
第四次,这次服了,查教程,按部就班。
教程如下,实际仍然有出入,我会写下来。https://blog.youkuaiyun.com/leaves_joe/article/details/67656340
1.刷系统,去掉之前留下的坑。
2.安装各种工具和库,教程是逐个装的,一句话全装进去也可以
sudo apt-get install build-essential cmake git pkg-config
sudo apt-get install libjpeg8-dev
sudo apt-get install libtiff5-dev
sudo apt-get install libjasper-dev
sudo apt-get install libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python-dev python3-dev
大家灵活操作,一定要懂每个库的作用,我懒得抄注释,大家自行百度。之前死锁结束的时候就是卡在python库编译的过程。加上我计划用cpp(迷信cpp的性能,对python也不是特别熟悉,可惜树莓派大部分都是python教程,cpp只能自己摸索),python的库就没装。
我还多装了cmake-gui,功能嘛,嘿嘿
3.cmake-gui,configure,然后勾选需要生成的库,取消不用生成的库,例如python,虽然我没装,但是有可能系统自带了,还要手动取消。(其实后来还是坑在这步,有一个pkg-config的勾落了,导致了一些问题)。然后generate,忘了提上传代码和新建build文件夹的事。
4.进入build文件夹,make或make -j4,仍然提示make -j4会导致键鼠无响应。
5.这次比较顺利,后面出的错就好解决了,make剩不多的的时候如果有打断可以改成make -j3
6.make install ,sudo ldconfig
7.finish,开始跑例程。我就是一段调用摄像头的代码。
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/contrib/contrib.hpp>
#include <iostream>
#include <string>
#include<windows.h>
using namespace std;
using namespace cv;
Mat src ;
Mat dst, gray, gray1, output_mask, output_mask1, output_mask2, gray2, output_mask3, output_mask4;
int main()
{
VideoCapture cam(0);
while (!cam.isOpened())
waitKey(10);
//cam.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
//cam.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
//cam.set(CV_CAP_PROP_FPS, 30);
//cam.set(CV_CAP_PROP_EXPOSURE, 0); // where 0.25 means "manual exposure, manual iris"
//cam.set(CV_CAP_PROP_SETTINGS, 1);//各种相机设置,windows专用
while (waitKey(10)!= 27)
{
cam >> src;
if (src.empty()) { //判断图像是否载入
cout << "can not load the frame" << endl;
}
else {
imshow("src", src);
}
}
waitKey();
return 0;
}
这是windows上的代码,Linux要去掉stdafx.h和windows.h
8 g++ camera.cpp 报错,找不到opencv2。教程上说要这么运行
gcc test.cpp -o test `pkg-config --cflags --libs opencv`
然后我那边提示找不到opencv,让找opencv.pc,可让我好找啊。没找到。幸好我认识上面的代码,就是先运行pkg-config --cflags --libs opencv再把运行结果加到gcc test.cpp -o test后面运行。
9 我就找了别人运行pkg-config --cflags --libs opencv的结果https://www.jianshu.com/p/7eee92d8ad7b
拼了个超长的编译语句
gcc test.cpp -o test -I/usr/local/Cellar/opencv3/3.1.0_4/include/opencv -I/usr/local/Cellar/opencv3/3.1.0_4/include -L/usr/local/Cellar/opencv3/3.1.0_4/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lippicv -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
把语句中的地址挨个去找了一遍,替换成我的文件夹里类似的,就是
g++ edge.cpp -o test -I/usr/local/include/opencv4 -I/usr/local/include -L/usr/local/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
特别注意的是opencv3变成了opencv4,后面没有路径只有名字的就没检查,运行,果然报错,链接了两个不存在的库。删掉,最终的语句如下
g++ edge.cpp -o test -I/usr/local/include/opencv4 -I/usr/local/include -L/usr/local/lib -lopencv_stitching -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
(其实根据代码,我只需要链接用了的库就行,没必要全都链接上)前面第一次运行就已经踩了这个坑,不然根本看不到缺gtk库的提示,可惜语句没保存,我又重新查了一次。
10 再运行,成功
11 我有强迫症,一定要解决pkg-config的问题,怀疑是不是configure的时候落下了,仔细检查,果然,他还有个开头,又全大写,可费眼睛。重新勾选,configure,generate,make,make install,finish,因为前面已经编译过,这次飞快。
12再运行pkg-config --cflags --libs opencv还是提示出错,别着急,pkg-config --cflags --libs opencv4就有内容了
但是前面的短语句还是运行不出来,先放放。
13回来说我要迁移的程序,opencv2413版本的,有好多区别,以下列出给大家参考
CV_BGR2GRAY 变成了 COLOR_BGR2GRAY
CV_8UC3 没变 有人说CV全变成了COLOR我就全部替换了,仍然出错,坑人
CV_RETR_CCOMP 变成了 RETR_CCOMP
CV_CHAIN_APPROX_SIMPLE 变成了 CHAIN_APPROX_SIMPLE
CV_AA 变成了 LINE_AA
其他应该还有,我没遇到而已。建议大家直接找源码自带的例程,跑不起来也可以看看上面的定义,不然只能去查手册了,网上的教程时效太差。