• 大小: 11KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: C/C++
  • 标签: 光流场  

资源简介

实现运动平滑约束(Horn-Schunck)光流场估计算法,对两幅连续图像进行光流场估计,画出光流场图及残差图。

资源截图

代码片段和文件信息

 /* This program is “optical flow“.It is pragrammed with “OPEN CV“.
    It can only be used in picture of BMP(8bitone channel).
It is written by DENGTAO.
E-MAIL: dengtao520@gmail.com
24th/Apr/2011
 */

#include “stdafx.h“
#include 
#include 
#include “highgui.h“
#include “cv.h“

#define pic_width 512                               //处理图片的像素
#define pic_height 384
#define block_size 8                               //分块的大小(因为把每个像素的光流都画出的话,就看不清了,只能画一小块中某点的光流矢量)
#define V_width_size pic_width/block_size           //块的数目(横向和纵向的数目)
#define V_height_size pic_height/block_size
#define ws 10

                                        //控制平滑约束权重常数                                                                 
#define AMP_CON 5                                //调整光流失量的常数
#define ARROR_AMP_CON 3
static const double pi=3.14159265358979323846;


using namespace std;
inline static void allocateOnDemand(IplImage **imgCvSize sizeint depthint channels);
void  optical_paint(IplImage *frameint pixel_xint pixel_yint amp_xint amp_y);
void pic_infor(char *nameint ifstream *infileBITMAPFILEHEADER *bmp_file_headBITMAPINFOHEADER *bmp_inf);
void save_pic_infor(char **p);
void disp_opfl_reer(IplImage **frame_blankIplImage **resi_err
char frame1[pic_width][pic_height]char frame2[pic_width][pic_height]);
void show_pict(char *p[2]IplImage **frame_blankIplImage **resi_err
   char frame1[pic_width][pic_height]char frame2[pic_width][pic_height]);

                                                                       // 主函数lightflow.cpp : 程序入口
int main(int argcchar* argv[])
{   
static char frame1[pic_width][pic_height]frame2[pic_width][pic_height]; //存储两帧图像像素信息的二维数组
char *p[2]={(char*)frame1(char*)frame2};                          
IplImage *frame_blank=NULL*resi_err=NULL;                        // 定义OpenCV的结构体指针变量(分别用来指向光流图和残差图) 
show_pict(p&frame_blank&resi_errframe1frame2);                // 画出光流图和残差图
    return 0;
}

 void show_pict(char **pIplImage **frame_blankIplImage **resi_err
 char frame1[pic_width][pic_height]char frame2[pic_width][pic_height])
 {  char *q[2]={p[0]p[1]};
    char input_char[10];                                                
    while(1)                                                           //画出多组连续图像的光流图和残差图                     

     cout<<“show the optical flow?  YES or NO“<  cin>>input_char;
 if(!strcmp(input_char“YES“))                                     //需要画出光流和残差图时,输入YES
 {  p[0]=q[0];                                                     //每次处理前,要将指针数组p指向frame1和纷扰me
    p[1]=q[1];
save_pic_infor(p);                                             //该函数将保存并显示bmp图像的相关信息
    disp_opfl_reer(frame_blankresi_errframe1frame2);            //画出光流场和残差图
 }
 else 
 {
      cout<<“BYEBYE!“<   break;
 }
}
 }
            
 void save_pic_infor(char **p)                                

评论

共有 条评论