单目跟踪位姿产品研发(一)----树莓派入手设置+opencv+qt+raspicam配置开发环境

       最近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卡中。)