Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 #ifndef dense_lk_h_DEFINED
00036 #define dense_lk_h_DEFINED
00037 
00038 
00039 #include <opencv2/core/core.hpp>
00040 #include <opencv2/highgui/highgui.hpp>
00041 
00042 
00043 #include <vector>
00044 #include <cpl_visual_features/motion/flow_types.h>
00045 
00046 namespace cpl_visual_features
00047 {
00048 class DenseLKFlow
00049 {
00050  public:
00051   DenseLKFlow(int win_size = 5, int num_levels = 4);
00052 
00053   virtual ~DenseLKFlow();
00054 
00055   std::vector<cv::Mat> operator()(cv::Mat& cur_frame, cv::Mat& prev_frame,
00056                                   bool color_in=true);
00057   std::vector<cv::Mat> hierarchy(cv::Mat& f2, cv::Mat& f1);
00058   std::vector<cv::Mat> baseLK(cv::Mat& cur_bw, cv::Mat& prev_bw);
00059   cv::Mat reduce(cv::Mat& input);
00060   cv::Mat expand(cv::Mat& input);
00061   cv::Mat smooth(cv::Mat& input, int n=1);
00062   cv::Mat warp(cv::Mat& i2, cv::Mat& vx, cv::Mat& vy);
00063   
00064   
00065   
00066   void setWinSize(int win_size);
00067 
00068   void setNumLevels(int num_levels);
00069   double r_thresh_;
00070  protected:
00071   int win_size_;
00072   int max_level_;
00073   cv::Mat dx_kernel_;
00074   cv::Mat dy_kernel_;
00075   cv::Mat g_kernel_;
00076   cv::Mat optic_g_kernel_;
00077 };
00078 
00079 void displayOpticalFlow(cv::Mat& color_frame, cv::Mat& flow_u, cv::Mat& flow_v,
00080                         float mag_thresh, bool display_uv=false)
00081 {
00082   cv::Mat flow_thresh_disp_img(color_frame.size(), CV_8UC3);
00083   flow_thresh_disp_img = color_frame.clone();
00084   for (int r = 0; r < flow_thresh_disp_img.rows; ++r)
00085   {
00086     for (int c = 0; c < flow_thresh_disp_img.cols; ++c)
00087     {
00088       float u = flow_u.at<float>(r,c);
00089       float v = flow_u.at<float>(r,c);
00090       if (std::sqrt(u*u+v*v) > mag_thresh)
00091       {
00092         cv::line(flow_thresh_disp_img, cv::Point(c,r), cv::Point(c-u, r-v),
00093                  cv::Scalar(0,255,0));
00094       }
00095     }
00096   }
00097   std::vector<cv::Mat> flows;
00098   cv::imshow("flow_disp", flow_thresh_disp_img);
00099   if (display_uv)
00100   {
00101     cv::imshow("u", flow_u);
00102     cv::imshow("v", flow_v);
00103   }
00104 }
00105 
00106 }
00107 #endif // dense_lk_h_DEFINED