opticalflow + openCV

原创 2017年01月03日 14:49:00
#include "stdafx.h"

#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
#define UNKNOWN_FLOW_THRESH 1e9
 // Color encoding of flow vectors from:
 // http://members.shaw.ca/quadibloc/other/colint.htm
 // This code is modified from: 
 // http://vision.middlebury.edu/flow/data/
 
 
void makecolorwheel(vector<Scalar> &colorwheel)
{
 
int RY = 15;
int YG = 6;
int GC = 4;
int CB = 11;
int BM = 13;
int MR = 6;
int i;
for (i = 0; i < RY; i++) colorwheel.push_back(Scalar(255,255*i/RY,0));
for (i = 0; i < YG;i++) colorwheel.push_back(Scalar(255-255*i/YG,255,0));
for (i = 0; i < GC; i++) colorwheel.push_back(Scalar(0,255,255*i/GC));
for (i = 0; i < BM; i++) colorwheel.push_back(Scalar(255*i/BM,0,255));
for (i = 0; i < MR; i++) colorwheel.push_back(Scalar(255,0,255-255*i/MR));
 
 
}
 
void motionToColor(Mat flow,Mat &color)
{
 
  if (color.empty())
  color.create(flow.rows, flow.cols, CV_8UC3);
 
static vector<Scalar> colorwheel; //Scalar r,g,b 
    if(colorwheel.empty())
    makecolorwheel(colorwheel);
 
// determine motion range: 
  float maxrad = -1;
 // Find max flow to normalize fx and fy 
 for (int i= 0; i < flow.rows; ++i)
{
 
   for (int j = 0; j < flow.cols; ++j)
   {
 
    Vec2f flow_at_point=flow.at<Vec2f>(i,j);
       float fx=flow_at_point[0];
float fy = flow_at_point[1];
 if ((fabs(fx)>UNKNOWN_FLOW_THRESH)||(fabs(fy)>UNKNOWN_FLOW_THRESH))
continue;
      float rad = sqrt(fx * fx + fy * fy);
      maxrad = maxrad > rad ? maxrad : rad;
    
}
  
}
for(int i= 0; i < flow.rows; ++i)
     {
 
for(int j = 0;j<flow.cols;++j)
{
 
            uchar *data =color.data+color.step[0]* i+ color.step[1] * j;
Vec2f flow_at_point=flow.at<Vec2f>(i,j);
float fx =flow_at_point[0]/maxrad;
float fy = flow_at_point[1] / maxrad;
          if ((fabs(fx)>UNKNOWN_FLOW_THRESH)||(fabs(fy)>UNKNOWN_FLOW_THRESH))
{
 
          data[0] = data[1]=data[2]=0;
              continue;
           
}
        float rad = sqrt(fx*fx+fy*fy);
        float angle = atan2(-fy, -fx)/CV_PI;
         float fk = (angle + 1.0)/ 2.0 * (colorwheel.size()-1);
        int k0 = (int)fk;
      int k1=(k0 + 1) % colorwheel.size();
        float f = fk - k0;
//f = 0; // uncomment to see original color wheel 
for (int b = 0; b < 3; b++)
{
 
float col0 = colorwheel[k0][b] / 255.0;
float col1 = colorwheel[k1][b] / 255.0;
    float col = (1 - f) * col0 + f * col1;
if (rad <= 1)
        col = 1 - rad*(1 - col);// increase saturation with radius
      else
       col *= .75;// out of range
        data[2 - b] =(int)(255.0 * col);
 
}
 
}
 
}
 
}
 
  int main(int, char**)
{
 
VideoCapture cap;
cap.open(0);
cap.open("../22.avi");
 
if(!cap.isOpened())
    return -1;
 
Mat prevgray, gray, flow, cflow,frame;
Mat motion2color;
cv::Size default_size;
default_size.width = 235;
default_size.height = 189;
namedWindow("flow", 1);
 
 
for(;;)    //死循环
{
 
  double t = (double)cvGetTickCount();
 
  cap>>frame;
  cv::resize(frame, frame, default_size);
  cvtColor(frame, gray, CV_BGR2GRAY);
  imshow("original", frame);
 
  if( prevgray.data )
 {
 
    calcOpticalFlowFarneback(prevgray, gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
     motionToColor(flow, motion2color);
    imshow("flow", motion2color);
  
}
  if(waitKey(10)>=0)
 break;
 
 std::swap(prevgray, gray);
 t=(double)cvGetTickCount() -t;
     cout <<"cost time:"<<t/((double)cvGetTickFrequency()*1000.)<<endl;
         
}
    
}

光流OpticalFlow介绍与OpenCV实现

光流(optic flow)是什么呢?名字很专业,感觉很陌生,但本质上,我们是最熟悉不过的了。因为这种视觉现象我们每天都在经历。从本质上说,光流就是你在这个运动着的世界里感觉到的明显的视觉运动(呵呵,...
  • robberM
  • robberM
  • 2013年06月06日 21:05
  • 1807

LK OpticalFlow+OpenCV3

* File: opticalFlow.cpp * Brief: lk光流法做运动目标检测 #include "stdafx.h" #include #include #includ...

opticalFlow dfu

  • 2015年08月27日 13:24
  • 301B
  • 下载

opticalflow_image_LearningOpenCV.rar

  • 2012年11月09日 10:00
  • 2.13MB
  • 下载

OpenCV - 训练分类器

一.收集样本 正样本:待检目标样本 负样本:其它任意图片 PS.所有样本图片都应该有同一尺寸,如20 * 20 ACDSee软件:对图像批量处理为20x20大小的图片 1.把所有正样本图片放在posd...
  • SGamble
  • SGamble
  • 2016年10月22日 10:27
  • 4369

VS2013+opencv_contrib_lib_dill_x64

  • 2017年12月13日 16:03
  • 67B
  • 下载

opencv3.2.0_vs2013

  • 2017年12月13日 09:27
  • 25.9MB
  • 下载

准备做个魔镜(树莓派+HTK(或者Kaldi)+Opencv+apache)

想法来源几年前就听过别人用树莓派做魔镜的想法,看了下别人的流程感觉挺不错的。不过那时候他们应该还没有完全实现,看来下演示应该只能简单的进行文字交流,不是很智能。...

OpenCV-Python-Tutorial-中文版

  • 2017年12月04日 21:23
  • 4.23MB
  • 下载

ubuntu下opencv安装包

  • 2017年12月02日 08:33
  • 275KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opticalflow + openCV
举报原因:
原因补充:

(最多只允许输入30个字)