Farneback 稠密光流--求两幅图像之间的光流--代码(本人略有修改)

trecvidDateMaker.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



// Farneback dense optical flow calculate and show in Munsell system of colors
// Author : Zouxy
// Date   : 2013-3-15
// HomePage : http://blog.csdn.net/zouxy09
// Email  : zouxy09@qq.com

// API calcOpticalFlowFarneback() comes from OpenCV, and this
// 2D dense optical flow algorithm from the following paper:
// Gunnar Farneback. "Two-Frame Motion Estimation Based on Polynomial Expansion".
// And the OpenCV source code locate in ..\opencv2.4.3\modules\video\src\optflowgf.cpp

#include <iostream>
#include "opencv2/opencv.hpp"
#include "motionToColor.h"

using namespace cv;
using namespace std;


// 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/



int main(int, char**)
{
    
    VideoCapture cap;
	cap.open(0);
	cap.open("G:\\TrecvidData\\08\\DEV\\LGW_20071101_E1_CAM2.mpg");

    ///if( !cap.isOpened() )
     ///   return -1;

	IplImage* start_img=cvLoadImage("C:\\Users\\Dell\\Desktop\\output\\0450.bmp",CV_LOAD_IMAGE_GRAYSCALE);
    IplImage* later_img=cvLoadImage("C:\\Users\\Dell\\Desktop\\output\\0455.bmp",CV_LOAD_IMAGE_ANYCOLOR);
	IplImage* temp_save= NULL;

    Mat  prevgray,gray,flow, cflow, frame;
	//Mat prevgray(imgA);
	//Mat gray(imgB);
    namedWindow("flow", 1);

	Mat motion2color;

    for(;;)
    {
		double t = (double)cvGetTickCount();

        cap >> frame;
		frame=later_img;
		//cvWaitKey();
        cvtColor(frame, gray, CV_BGR2GRAY);
		imshow("original", frame);
		//cvWaitKey();
		//std::swap(prevgray, gray);
		prevgray=start_img;
        if( prevgray.data )
        {
            calcOpticalFlowFarneback(prevgray, gray, flow, 0.8, 5, 15, 3, 5, 1.2, 0);
			motionToColor(flow, motion2color);
            imshow("flow", motion2color);
			IplImage temp=motion2color;
			//IplImage* img = cvCreateImage(cvGetSize(motion2color),8,3);
			//cvGetImage(matI,img);
			//cvSaveImage("rice1.bmp",img);
			//temp_save=motion2color;
			cvSaveImage("C:\\Users\\Dell\\Desktop\\output1.bmp", &temp);
        }
        if(waitKey(10)>=0)
            break;
      

		t = (double)cvGetTickCount() - t;
		cout << "cost time: " << t / ((double)cvGetTickFrequency()*1000.) << endl;
		break;
    }
	cvWaitKey();
    return 0;
}
</pre><pre class="cpp" name="code">#include "stdafx.h"
#include <iostream>
#include "opencv2/opencv.hpp"
//#include "makecolorwheel.cpp"
using namespace cv;
using namespace std;
#define UNKNOWN_FLOW_THRESH 1e9
</pre><pre class="cpp" name="code">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 < CB; i++) colorwheel.push_back(Scalar(0,     255-255*i/CB, 255));
    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));
}
</pre><pre class="cpp" name="code">
//MOTIONTOCOLOR_H
#ifndef MOTIONTOCOLOR_H
#define MOTIONTOCOLOR_H
#include "opencv2/opencv.hpp"
using namespace cv;
void motionToColor(Mat flow, Mat &color);
void makecolorwheel(vector<Scalar> &colorwheel);
#endif
</pre><pre class="cpp" name="code">
//motionToColor.cpp
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);
   }
  }
 }
}
</pre><pre class="cpp" name="code">
</pre><pre class="cpp" name="code"><img width="721" height="574" style="width: 341px; height: 459px;" src="https://img-blog.csdn.net/20140725134010988?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdm9sYTk1Mjc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" /><img width="721" height="575" style="width: 335px; height: 459px;" src="https://img-blog.csdn.net/20140725134051938?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdm9sYTk1Mjc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" /><img width="719" height="574" style="width: 345px; height: 540px;" src="https://img-blog.csdn.net/20140725134255272?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdm9sYTk1Mjc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值