光流法-运动目标的检测二(opencv学习)
2011-12-01 18:59
405 查看
光流法-运动目标的检测二(opencv学习)
2011-11-04 11:05
2011-11-04 11:05
正如上一篇文章所述, cvCalcOpticalFlowPyrLK 需要确定特征点。 本程序,通过帧差获得运动的点作为特征点。 本程序原本的目的是计算运动点的速度,通过修正可以进行运动跟踪。 #include <cv.h> #include <highgui.h> #include <iostream> using namespace std; int const MAX_CORNERS = 1000; int main (int argc, char **argv) { CvCapture* capture = 0; capture = cvCaptureFromCAM( CV_CAP_ANY ); //get frame IplImage *src_img1; //the previous frame (gray) IplImage *src_img2; //the current frame(gray) IplImage *dst_img; //the result IplImage *cur_img; IplImage *pre_img; CvPoint2D32f * move_old_point = new CvPoint2D32f[ MAX_CORNERS]; CvPoint2D32f * move_new_point = new CvPoint2D32f[ MAX_CORNERS]; char *features_found = new char[MAX_CORNERS]; float *features_error = new float[MAX_CORNERS]; CvTermCriteria criteria; criteria = cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 64, 0.01); while(1) { int i,j; int dx, dy; int p = 0; int rows, cols; int countn = MAX_CORNERS; pre_img = cvQueryFrame(capture); CvSize img_sz = cvGetSize(pre_img); src_img1 = cvCreateImage(img_sz, IPL_DEPTH_8U, 1); cvCvtColor(pre_img, src_img1, CV_RGB2GRAY); cur_img = cvQueryFrame(capture); src_img2 = cvCreateImage(img_sz, IPL_DEPTH_8U, 1); cvCvtColor(cur_img, src_img2, CV_RGB2GRAY); dst_img = (IplImage *)cvClone(cur_img); IplImage *move_img = cvCreateImage(img_sz, IPL_DEPTH_8U, 1); cvZero(move_img); //cvAbsDiff(src_img1, src_img2,move_img); cols = src_img1->width; rows = src_img1->height; for (i = 0; i <cols; i++) { for (j = 0; j<rows; j++) { double a = abs(cvGet2D(src_img1, j, i).val[0]-cvGet2D(src_img2, j, i).val[0]); CvScalar b = cvScalar(a, 0, 0,0); cvSet2D(move_img, j, i,b); if (a>40) { if (p<MAX_CORNERS-1) { int d = ++p; move_old_point[d].x = i; move_old_point[d].y = j; } } } } cvNamedWindow("moving object", 1); cvShowImage("moving object", move_img); CvSize Pyrsize = cvSize(src_img1->width +8, src_img1->height/3); IplImage * pyrA = cvCreateImage(Pyrsize, IPL_DEPTH_32F, 1); //pyrA是需要寻找的点,不是没有初始化的 IplImage * pyrB = cvCreateImage(Pyrsize, IPL_DEPTH_32F, 1); cvCalcOpticalFlowPyrLK(src_img1, src_img2, pyrA, pyrB, move_old_point, move_new_point, countn, cvSize(10, 10), 3, features_found, features_error, criteria, 0 ); for (i = 0; i < countn; i++) { int x1 = (int)move_new_point[i].x; int x2 = (int)move_old_point[i].x; int y1 = (int)move_new_point[i].y; int y2 = (int)move_old_point[i].y; dx =(int) abs(x1 - x2) ; dy = (int)abs(y1 - y2); if (dx >= 5&& dy >= 5) { cvLine (dst_img, cvPoint(x2, y2),cvPoint(x2+5, y2+5) , CV_RGB (255, 0, 0), 1, CV_AA, 0); } } cvNamedWindow ("ImagePyrLK", 1); cvShowImage ("ImagePyrLK", dst_img); cvWaitKey (1); cvReleaseImage (&dst_img); cvReleaseImage(&pyrA); cvReleaseImage(&pyrB); cvReleaseImage(&move_img); } cvDestroyWindow("moving object"); cvDestroyWindow ("ImagePyrLK"); cvReleaseImage (&src_img1); cvReleaseImage (&src_img2); cvReleaseImage (&pre_img); cvReleaseImage (&cur_img); return 0; } |
相关文章推荐
- 光流法-运动目标的检测(opencv学习)
- OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope
- OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video
- 【OpenCV】OpenCV3的第二天——光流法(Optial Flow)运动目标检测
- 《OpenCV 3计算机视觉:Python语言实现》学习笔记——目标跟踪中基本运动检测的思考
- 我的OpenCV学习笔记(3):基于混合高斯模型GMM的运动目标检测
- OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video
- opencv学习---运动目标(前景)检测
- opencv学习---运动目标(前景)检测
- OpenCV学习之寻找轮廓实现视频流的运动目标检测
- 1.0.x-学习Opencv与MFC混合编程之---视频运动检测
- OpenCV运动目标检测——帧间差,混合高斯模型方法
- 【OpenCV学习】基于轮廓寻找的视频流运动检测
- OpenCV之光流法跟踪运动目标
- OpenCV_基于混合高斯模型GMM的运动目标检测
- OpenCV实现静止背景下运动目标的检测
- 1.0.x-学习Opencv与MFC混合编程之---视频运动检测
- openCV目标检测学习笔记(一)
- 运动目标检测(混合高斯)——opencv3.0.0
- opencv 光流法对运动目标跟踪Video