OpenCV Study on Mac

view opticalflow/image.cpp @ 33:f5ca4d2805f2

add opticalflow
author shokai <hashimoto@shokai.org>
date Mon Oct 05 23:35:27 2009 +0900 (11 months ago)
parents
children d5aacddd1e72
line source
1 // オプティカルフロー(ブロックマッチング)
2 // http://opencv.jp/sample/optical_flow.html
4 #include <cv.h>
5 #include <highgui.h>
6 #include <cxcore.h>
7 #include <ctype.h>
8 #include <stdio.h>
9 #include <iostream>
10 #include <boost/format.hpp>
12 using namespace std;
13 using namespace boost;
15 void detect_flow(IplImage *img, IplImage *img_p, IplImage *dst);
17 int main(int argc, char* argv[]) {
18 IplImage *img = NULL;
19 CvCapture *capture = NULL;
20 capture = cvCreateCameraCapture(0);
21 //capture = cvCaptureFromAVI("test.avi");
22 if(capture == NULL){
23 cerr << "capture device not found!!" << endl;
24 return -1;
25 }
27 CvSize size = cvSize(240, 180);
28 IplImage *img_resized = cvCreateImage(size, IPL_DEPTH_8U, 3);
29 IplImage *img_gray = cvCreateImage(size, IPL_DEPTH_8U, 1);
30 IplImage *img_gray_p = cvCreateImage(size, IPL_DEPTH_8U, 1);
31 IplImage *img_dst = cvCreateImage(size, IPL_DEPTH_8U, 3);
33 char winNameCapture[] = "Capture";
34 cvNamedWindow(winNameCapture, CV_WINDOW_AUTOSIZE);
36 while (1) {
37 img = cvQueryFrame(capture);
38 cvResize(img, img_resized);
39 cvCvtColor(img_resized, img_gray, CV_BGR2GRAY);
40 cvCopy(img_resized, img_dst);
41 detect_flow(img_gray, img_gray_p, img_dst);
42 cvShowImage(winNameCapture, img_dst);
43 cvCopy(img_gray, img_gray_p);
44 if (cvWaitKey(10) == 'q') break;
45 }
47 cvReleaseCapture(&capture);
48 cvDestroyWindow(winNameCapture);
50 return 0;
51 }
53 void detect_flow(IplImage *src_img1, IplImage *src_img2, IplImage *dst_img){
54 int i, j, dx, dy, rows, cols;
55 int block_size = 10;
56 int shift_size = 1;
57 CvMat *velx, *vely;
58 CvSize block = cvSize(block_size, block_size);
59 CvSize shift = cvSize(shift_size, shift_size);
60 CvSize max_range = cvSize(50, 50);
62 rows = int(ceil (double (src_img1->height) / block_size));
63 cols = int(ceil (double (src_img1->width) / block_size));
64 velx = cvCreateMat(rows, cols, CV_32FC1);
65 vely = cvCreateMat(rows, cols, CV_32FC1);
66 cvSetZero(velx);
67 cvSetZero(vely);
69 cvCalcOpticalFlowBM(src_img1, src_img2, block, shift, max_range, 0, velx, vely);
71 for (i = 0; i < velx->width; i++) {
72 for (j = 0; j < vely->height; j++) {
73 dx = (int)cvGetReal2D(velx, j, i);
74 dy = (int)cvGetReal2D(vely, j, i);
75 cvLine(dst_img, cvPoint(i * block_size, j * block_size),
76 cvPoint(i * block_size + dx, j * block_size + dy), CV_RGB(255, 0, 0), 1, CV_AA, 0);
77 }
78 }
80 }