最近3个月做了一个基于单目相机跟踪物体位姿的横向项目,所用到的硬件主要有Raspberry Pi 3B+,Raspberry Pi Camera V2红外夜视相机,以及嘉肯光电定制的红外环形光源。
初次接触树莓派,配置上踩过一些坑,现记录下来:
1、装系统。由于是工业项目,追求鲁棒性,所以安装的是树莓派官方推荐的Debain系统,这也是linux系统之一。在自己pc上通过SDFormatter工具先格式化tf卡,然后使用Win32DiskImager工具安装下载好的Debain镜像文件。
2、开机后配置:在config中拓展系统空间、改位置、时区、键盘布局、enable camera、enable SSH、enable VNC,参考此链接http://www.cnblogs.com/crosys/p/6220168.html,若显示器不能全屏,在设置中over scan选项选择disable,安装中文字体 、中文字库:sudo apt-get install ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy,安装ibus中文输入法(只有这个才能支持在qt creator中输入中文)通过下图所示方法设置相关内容更方便
3、下载并编译opencv:按照此链接的步骤https://blog.csdn.net/leaves_joe/article/details/67656340,make之前注意:添加contrib选项编译的时候可能会报错,如果报错,去掉此目录就行(这个是opencv的拓展库,一般用不到),另外把c加上。注意,编译时间要6个小时,中间可能会出错,不要怀疑,重复试,可以先sudo apt-get update、upgrade编译的时候千万不要更改下载源。编译成功后,编译生成的头文件在/usr/local/include,生成的动态
链接库so文件在/usr/local/lib,以后移植的时候,可以直接把这些文件拷贝到对应目录中,不用再麻烦的编译了;
4、Qt安装:sudo apt-get install qt5-default、qtcreator
在菜单栏Tools->Options->Build&Run,进去之后,单击Compilers,在选择Add->GCC->Compiler Path为/usr/bin/gcc. 之后单击Kits,Manual->Compiler->GCC,Debugger: System GDB at /usr/bin/gdb, Qt Version: Qt 5.5.1(qt5).之后选择Apply,再选择OK(若代码从win下移植到linux,汉字注释会乱码,选择GBK即可)
5、由于要用c++控制原装的CSI相机,要编译相机库raspicam:下载地址https://sourceforge.net/projects/raspicam/ 若是用python开发,则不需要编译此库,因为树莓派系统自带了python版相机库
对raspicam进行编译(我第一次编译的时候失败的原因是/tmp文件不能写入,解决方法:万能的重启)
cd raspicam #库下载位置
mkdir build
cd buil
cmake ..
make
sudo make install
sudo ldconfig
6、新建qt 工程测试:在pro文件中加入如下内容:
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2 \
/usr/local/include/raspicam
LIBS += /usr/local/lib/libopencv_highgui.so \
/usr/local/lib/libopencv_core.so \
/usr/local/lib/libopencv_imgproc.so \
/usr/local/lib/libopencv_video.so \
/usr/local/lib/libopencv_videoio.so \
/usr/local/lib/libopencv_videostab.so \
/usr/local/lib/libraspicam.so \
/usr/local/lib/libraspicam_cv.so \
-L/usr/local/lib \
-lopencv_core \
-lopencv_imgcodecs \
-lopencv_highgui \
-lopencv_video \
-lopencv_videoio \
-lopencv_videostab \
-lraspicam \
-lraspicam_cv
7、开始测试
测试代码1
/* 这是下载的库文件中opencv测试的例子*/
#include <ctime>
#include <iostream>
#include <raspicam/raspicam_cv.h>
using namespace std;
int main ( int argc,char **argv ) {
time_t timer_begin,timer_end;
raspicam::RaspiCam_Cv Camera;
cv::Mat image;
int nCount=100;
//set camera params
Camera.set( CV_CAP_PROP_FORMAT, CV_8UC1 );
//Open camera
cout<<"Opening Camera..."<<endl;
if (!Camera.open()) {cerr<<"Error opening the camera"<<endl;return -1;}
//Start capture
cout<<"Capturing "<<nCount<<" frames ...."<<endl;
time ( &timer_begin );
for ( int i=0; i<nCount; i++ ) {
Camera.grab();
Camera.retrieve ( image);
if ( i%5==0 ) cout<<"\r captured "<<i<<" images"<<std::flush;
}
cout<<"Stop camera..."<<endl;
Camera.release();
//show time statistics
time ( &timer_end ); /* get current time; same as: timer = time(NULL) */
double secondsElapsed = difftime ( timer_end,timer_begin );
cout<< secondsElapsed<<" seconds for "<< nCount<<" frames : FPS = "<< ( float ) ( ( float ) ( nCount ) /secondsElapsed ) <<endl;
//save image
cv::imwrite("raspicam_cv_image.jpg",image);
cout<<"Image saved at raspicam_cv_image.jpg"<<endl;
}
测试代码2
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include <iostream>
#include <raspicam/raspicam_cv.h>
using namespace cv;
using namespace std;
int main()
{
raspicam::RaspiCam_Cv Camera;
cout << "Built with OpenCV " << CV_VERSION << endl;
Mat image;
//set camera params
Camera.set( CV_CAP_PROP_FORMAT, CV_8UC1 );
//Open camera
if (!Camera.open()) {cout<<"Error opening the camera"<<endl;return -1;}
//Start capture
else{
while(1)
{
Camera.grab();
Camera.retrieve ( image);
if(image.empty())
break;
imshow("Sample", image);
if(waitKey(10) >= 0)
break;
waitKey(100);
}
}
return 0;
}
至此,配置全部结束。既然配置这么麻烦、耗时,那是不是我们可以备份系统呢?毫无疑问,我们可以将此系统通过Win32DiskImager工具进行读取备份在pc上,生成一个镜像文件,后面若出了问题,可直接重新烧录系统即可。(注意,此方法会将整个TF卡备份下来,包括空的硬盘空间,因此备份前可以删除无用的软件,精简系统,然后备份到8gTF卡中;还可直接用树莓派附件中的SD Card Copier软件进行备份到另一个TF卡中,然后拷贝到PC备份。)