资源简介
实现运动平滑约束(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)
- 上一篇:自己写的MFC串口调试软件
- 下一篇:门禁系统源代码 VC++
评论
共有 条评论