樹莓派+opencv+xtion/kinect

1. 安裝xtion/kinect 驅動

1.1. 安裝支持庫

sudo apt-get update
sudo apt-get install g++ python libusb-1.0-0-dev freeglut3-dev
sudo apt-get install doxygen graphviz mono-complete
sudo apt-get install openjdk-7-jdk

1.2. 下載驅動

git clone https://github.com/OpenNI/OpenNI.git
git clone git://github.com/avin2/SensorKinect.git (如果你的是kinect 下載此項)
git clone https://github.com/PrimeSense/Sensor.git (如果你的是xtion下載此項)
分別修改OpenNI 和Sensor
兩個文件夾下的Platform.Arm 文件,將其中的
-mfloat-abi=softfp 改爲 -mfloat-abi=hard
操作如下圖
這裏寫圖片描述

這裏寫圖片描述

最後到 software/OpenNI/Platform/Linux/Bin/Arm-Release目錄執行(其中的software爲自己建立的文件夾)

cd ~/software/OpenNI/Platform/Linux/Bin/Arm-Release
sudo ./Sample-NiCRead

執行完畢,如果遇到 usb transfer timeout 的情況,則是樹莓派的usb供電不足,不能啓動xtion/kinect

解決方法:

cd /boot
sudo vim config.txt

在最後一行加入
max_usb_current=1
重啓

2. 安裝opencv

sudo apt-get install libcv-dev

安裝中如果遇到 Failed to fetch http://xxx.deb, 如下圖所示的情況
這裏寫圖片描述

解決方法:
執行:
1. wget http://xxx.deb
2. sudo dpkg -i xxx.deb
3. 重新執行

sudo apt-get install libcv-dev

這裏寫圖片描述

這裏寫圖片描述
這裏寫圖片描述

3. 使用opencv+openni 讀取xtion的數據(彩色圖和深度圖)

新建loadimage.cpp

#include <stdlib.h>   
#include <iostream>   
#include <string>   
#include <XnCppWrapper.h>   
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>   
using namespace std;  
using namespace cv;  

void CheckOpenNIError( XnStatus result, string status )  
{   
    if( result != XN_STATUS_OK )   
        cerr << status << " Error: " << xnGetStatusString( result ) << endl;  
}  

int main( int argc, char** argv )  
{  
    XnStatus result = XN_STATUS_OK;    
    xn::DepthMetaData depthMD;  
    xn::ImageMetaData imageMD;  

    namedWindow("depth",1);  
    namedWindow("image",1);  
    char key=0;  
    // context    
    xn::Context context;   
    result = context.Init();   
    CheckOpenNIError( result, "initialize context" );    
    // creategenerator     
    xn::DepthGenerator depthGenerator;    
    result = depthGenerator.Create( context );   
    CheckOpenNIError( result, "Create depth generator" );    
    xn::ImageGenerator imageGenerator;  
    result = imageGenerator.Create( context );   
    CheckOpenNIError( result, "Create image generator" );    
    //map mode     
    XnMapOutputMode mapMode;   
    mapMode.nXRes = 640;    
    mapMode.nYRes = 480;   
    mapMode.nFPS = 30;   
    result = depthGenerator.SetMapOutputMode( mapMode );    
    result = imageGenerator.SetMapOutputMode( mapMode );    

    depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator );   

    result = context.StartGeneratingAll();    
    Mat cvDepthImg;
    Mat cvBGRImg;
    context.WaitAndUpdateAll( );
    while( (key!=27) && !(result = context.WaitNoneUpdateAll( )))   
    {    
        //get meta data   
        depthGenerator.GetMetaData(depthMD);   
        imageGenerator.GetMetaData(imageMD);  
        //OpenCV output 
Mat cvDepthRawImg(depthMD.FullYRes(),  depthMD.FullXRes(), CV_16UC1, (char *)depthMD.Data());  
        cvDepthRawImg.convertTo(cvDepthImg, CV_8U, 255.0/(depthMD.ZRes()));  
imshow("depth", cvDepthImg);

Mat cvRGBImg(imageMD.FullYRes(), imageMD.FullXRes(), CV_8UC3, (char *)imageMD.Data());  
cvtColor(cvRGBImg, cvBGRImg, CV_RGB2BGR);  
        imshow("image", cvBGRImg); 
        key=cvWaitKey(20);  
    }  

    //destroy   
    destroyWindow("depth");  
    destroyWindow("image");  

    context.StopGeneratingAll();  
    context.Release();  
    return 0;  
}

新建makefile

CC = g++
TARGET = loadimage
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/ni
SRCS = loadimage.cpp
OBJS = $(SRCS:.cpp=.o)
# 庫文件
DLIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui -lOpenNI
# 鏈接可執行文件
$(TARGET):$(OBJS)
    $(CC) -o $@ $^ $(DLIBS)
clean:
    rm -rf $(TARGET) $(OBJS)
# 編譯規則 $@代表目標文件 $<代表第一個依賴文件
%.o:%.cpp
    $(CC) -o $@ -c $<

執行
make
這裏寫圖片描述
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章