2011-06-13 89 views
-1

我不是一個大的C++程序員,但我想編譯下面的代碼。 g ++給了我下面的錯誤。cpp代碼錯誤

opencv.cpp: In function ‘int main(int, char**)’: 
opencv.cpp:111: error: missing template arguments before ‘freenect’ 
opencv.cpp:111: error: expected ‘;’ before ‘freenect’ 
opencv.cpp:112: error: ‘freenect’ was not declared in this scope 
opencv.cpp:112: error: expected primary-expression before ‘>’ token 



    #include "libfreenect.hpp" 
    #include <iostream> 
    #include <vector> 
    #include <cmath> 
    #include <pthread.h> 
    #include <cv.h> 
    #include <cxcore.h> 
    #include <highgui.h> 

    using namespace cv; 
    using namespace std; 

    class Mutex { 
    public: 
     Mutex() { 
      pthread_mutex_init(&m_mutex, NULL); 
     } 
     void lock() { 
      pthread_mutex_lock(&m_mutex); 
     } 
     void unlock() { 
      pthread_mutex_unlock(&m_mutex); 
     } 
    private: 
     pthread_mutex_t m_mutex; 
    }; 

    class MyFreenectDevice : public Freenect::FreenectDevice { 
     public: 
     MyFreenectDevice(freenect_context *_ctx, int _index) 
      : Freenect::FreenectDevice(_ctx, _index),     m_buffer_depth(FREENECT_DEPTH_11BIT_SIZE),m_buffer_rgb(FREENECT_VIDEO_RGB_SIZE),   m_gamma(2048), m_new_rgb_frame(false), m_new_depth_frame(false), 
       depthMat(Size(640,480),CV_16UC1),   rgbMat(Size(640,480),CV_8UC3,Scalar(0)), ownMat(Size(640,480),CV_8UC3,Scalar(0)) 
     { 
      for(unsigned int i = 0 ; i < 2048 ; i++) { 
       float v = i/2048.0; 
       v = std::pow(v, 3)* 6; 
       m_gamma[i] = v*6*256; 
      } 
     } 
     // Do not call directly even in child 
     void VideoCallback(void* _rgb, uint32_t timestamp) { 
      std::cout << "RGB callback" << std::endl; 
      m_rgb_mutex.lock(); 
      uint8_t* rgb = static_cast<uint8_t*>(_rgb); 
      rgbMat.data = rgb; 
      m_new_rgb_frame = true; 
      m_rgb_mutex.unlock(); 
     }; 
     // Do not call directly even in child 
     void DepthCallback(void* _depth, uint32_t timestamp) { 
      std::cout << "Depth callback" << std::endl; 
      m_depth_mutex.lock(); 
      uint16_t* depth = static_cast<uint16_t*>(_depth); 
      depthMat.data = (uchar*) depth; 
      m_new_depth_frame = true; 
      m_depth_mutex.unlock(); 
     } 

     bool getVideo(Mat& output) { 
    m_rgb_mutex.lock(); 
      if(m_new_rgb_frame) { 
       cv::cvtColor(rgbMat, output, CV_RGB2BGR); 
       m_new_rgb_frame = false; 
       m_rgb_mutex.unlock(); 
       return true; 
      } else { 
       m_rgb_mutex.unlock(); 
       return false; 
      } 
     } 

     bool getDepth(Mat& output) { 
       m_depth_mutex.lock(); 
       if(m_new_depth_frame) { 
        depthMat.copyTo(output); 
        m_new_depth_frame = false; 
        m_depth_mutex.unlock(); 
        return true; 
       } else { 
        m_depth_mutex.unlock(); 
        return false; 
       } 
      } 

     private: 
     std::vector<uint8_t> m_buffer_depth; 
     std::vector<uint8_t> m_buffer_rgb; 
     std::vector<uint16_t> m_gamma; 
     Mat depthMat; 
     Mat rgbMat; 
     Mat ownMat; 
     Mutex m_rgb_mutex; 
     Mutex m_depth_mutex; 
     bool m_new_rgb_frame; 
     bool m_new_depth_frame; 
    }; 



    int main(int argc, char **argv) { 
     bool die(false); 
     string filename("snapshot"); 
     string suffix(".png"); 
     int i_snap(0),iter(0); 

     Mat depthMat(Size(640,480),CV_16UC1); 
     Mat depthf (Size(640,480),CV_8UC1); 
     Mat rgbMat(Size(640,480),CV_8UC3,Scalar(0)); 
     Mat ownMat(Size(640,480),CV_8UC3,Scalar(0)); 

    Freenect::Freenect freenect; 
    MyFreenectDevice& device = freenect.createDevice<MyFreenectDevice>(0); 

namedWindow("rgb",CV_WINDOW_AUTOSIZE); 
namedWindow("depth",CV_WINDOW_AUTOSIZE); 
device.startVideo(); 
device.startDepth(); 
while (!die) { 
    device.getVideo(rgbMat); 
    device.getDepth(depthMat); 
    cv::imshow("rgb", rgbMat); 
    depthMat.convertTo(depthf, CV_8UC1, 255.0/2048.0); 
    cv::imshow("depth",depthf); 
    char k = cvWaitKey(5); 
    if(k == 27){ 
     cvDestroyWindow("rgb"); 
     cvDestroyWindow("depth"); 
     break; 
    } 
    if(k == 8) { 
     std::ostringstream file; 
     file << filename << i_snap << suffix; 
     cv::imwrite(file.str(),rgbMat); 
     i_snap++; 
    } 
    if(iter >= 1000) break; 
    iter++; 
} 

device.stopVideo(); 
device.stopDepth(); 
return 0; 
    } 
+0

對不起,我們不是您定製的調試器。你必須自己做點努力。 – 2011-06-13 21:38:07

+4

也許你在第111行的「freenect」之前缺少一個模板參數? – trutheality 2011-06-13 21:38:27

+0

哪條線是111?我沒有倒數那麼遠。 – 2011-06-13 21:40:45

回答

2

請閱讀如何創建最小工作示例。提供的代碼太大,但不是最小的。

你的代碼的失敗就行Freenect::Freenect freenect;

由於您沒有提供libfreenect.hpp的內容,這是一個有點很難說究竟哪裏出了問題。錯誤消息給出了一些線索。 Freenect :: Freenect是一個模板,你沒有像這樣調用它。