最近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:按照此链接的步骤http://www.javashuo.com/article/p-xrkchidh-oa.html,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 copier软件进行备份到另一个TF卡中。)