光流法测运动速度和个方向

donghuiyun6668 2014-03-06 09:38:58
请问谁下过这个代码?能否调试通过?WW_RETURN HumanMotion::ImgOpticalFlow(IplImage *pre_grey,IplImage *grey)
/*************************************************
Function:
Description: 光流法计算运动速度与方向
Date: 2006-6-14
Author:
Input:
Output:
Return:
Others:
*************************************************/
{

IplImage *velx = cvCreateImage( cvSize(grey->width ,grey->height),IPL_DEPTH_32F, 1 );
IplImage *vely = cvCreateImage( cvSize(grey->width ,grey->height),IPL_DEPTH_32F, 1 );

velx->origin = vely->origin = grey->origin;
CvSize winSize = cvSize(5,5);
cvCalcOpticalFlowLK( prev_grey, grey, winSize, velx, vely );

cvAbsDiff( grey,prev_grey, abs_img );
cvThreshold( abs_img, abs_img, 29, 255, CV_THRESH_BINARY);

CvScalar xc,yc;
for(int y =0 ;y<velx->height; y++)
for(int x =0;x<velx->width;x++ )
{
xc = cvGetAt(velx,y,x);
yc = cvGetAt(vely,y,x);


float x_shift= (float)xc.val[0];
float y_shift= (float)yc.val[0];
const int winsize=5; //计算光流的窗口大小


if((x%(winsize*2)==0) && (y%(winsize*2)==0) )
{

if(x_shift!=0 || y_shift!=0)
{

if(x>winsize && y>winsize && x <(velx->width-winsize) && y<(velx->height-winsize) )
{

cvSetImageROI( velx, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));
CvScalar total_x = cvSum(velx);
float xx = (float)total_x.val[0];
cvResetImageROI(velx);

cvSetImageROI( vely, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));
CvScalar total_y = cvSum(vely);
float yy = (float)total_y.val[0];
cvResetImageROI(vely);

cvSetImageROI( abs_img, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));
CvScalar total_speed = cvSum(abs_img);
float ss = (float)total_speed.val[0]/(4*winsize*winsize)/255;
cvResetImageROI(abs_img);

const double ZERO = 0.000001;
const double pi = 3.1415926;
double alpha_angle;

if(xx<ZERO && xx>-ZERO)
alpha_angle = pi/2;
else
alpha_angle = abs(atan(yy/xx));

if(xx<0 && yy>0) alpha_angle = pi - alpha_angle ;
if(xx<0 && yy<0) alpha_angle = pi + alpha_angle ;
if(xx>0 && yy<0) alpha_angle = 2*pi - alpha_angle ;



CvScalar line_color;
float scale_factor = ss*100;
line_color = CV_RGB(255,0,0);
CvPoint pt1,pt2;
pt1.x = x;
pt1.y = y;
pt2.x = static_cast<int>(x + scale_factor*cos(alpha_angle));
pt2.y = static_cast<int>(y + scale_factor*sin(alpha_angle));

cvLine( image, pt1, pt2 , line_color, 1, CV_AA, 0 );
CvPoint p;
p.x = (int) (pt2.x + 6 * cos(alpha_angle - pi / 4*3));
p.y = (int) (pt2.y + 6 * sin(alpha_angle - pi / 4*3));
cvLine( image, p, pt2, line_color, 1, CV_AA, 0 );
p.x = (int) (pt2.x + 6 * cos(alpha_angle + pi / 4*3));
p.y = (int) (pt2.y + 6 * sin(alpha_angle + pi / 4*3));
cvLine( image, p, pt2, line_color, 1, CV_AA, 0 );

/*
line_color = CV_RGB(255,255,0);
pt1.x = x-winsize;
pt1.y = y-winsize;
pt2.x = x+winsize;
pt2.y = y+winsize;
cvRectangle(image, pt1,pt2,line_color,1,CV_AA,0);
*/

}
}
}
}


cvShowImage( "Contour", abs_img);
cvShowImage( "Contour2", vely);

cvReleaseImage(&velx);
cvReleaseImage(&vely);
cvWaitKey(20);

return WW_OK;

}
...全文
587 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
donghuiyun6668 2014-03-06
  • 打赏
  • 举报
回复
能否提供 一下完整的代码?谢谢
视频检技术是多学科的交叉与结合,既是一门科学学科又是一门工程学科,运用机器视觉和数字图像处理技术,探讨机器视觉技术在驾驶员桩考系统中的实现方法,这对机器视觉技术方法研究和实际应用具有一定的价值。本文以驾驶员桩考系统为研究对象,采用图像处理技术和机器视觉理论方法,研究如何在熟悉或不熟悉环境条件下检和识别出运动目标,自动跟踪和量所监控运动的车辆目标。本文基于机器视觉研究从图像或图像序列中提取信息,对客观景物和物体进行形态和运动识别,获取周围环境的信息,计算目标物体运动方向速度。研究内容如下:1.采用了背景差分和帧间差分相结合的方法,对序列图像进行分析,分割运动区域,检、提取运动目标;2.对差分图中灰度值不为零的像素点,采用帧间差阈值和光流法求出其光流场分布;3.做了以针孔模型下摄像机标定,并分析计算图像中物体的深度信息;4.结合移动机器人系统,按照桩考系统的场景和要求,研究基于机器视觉的机器人模型设计,对桩考实现。在Windows环境下设计了系统整体功能结构和软件算法,实验证明,该方法对移动目标的提取识别与跟踪具备不易受干扰和快速的特性,效果良好。可有效地提高驾驶员桩考的公正性...

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧