#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int main( int argc, char** argv )
{
// if( argc != 2 )
// return -1;
cvNamedWindow( "Example", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateFileCapture( "video1.avi" ); //加载视频
if( !capture )
printf( "Couldn't open %s\n", argv[1] );
CvPoint pt1 = cvPoint( 10, 10 );
CvPoint pt2 = cvPoint( 10, 20 ); //直线两个顶点,读取这两个端点连成直线的像素点,总共11个像素点
int max_buffer;
IplImage* rawImage;
int r[10000], g[10000], b[10000]; //存储r,g,b三维的像素值
FILE* fptrb = fopen( "blines.csv","w" ); //创建文件存储数据
FILE* fptrg = fopen( "glines.csv", "w" ); //存储每个通道的像素值
FILE* fptrr = fopen( "rlines.csv", "w" ); //存储为csv文件
CvLineIterator iter; //采样迭代器
int sign = 0;
for( ;; )
{
if( !cvGrabFrame( capture ) ) //如果没捕捉到帧,退出,视频总共有68帧,30秒的画面
break;
rawImage = cvRetrieveFrame( capture ); //取回由函数cvGrabFrame抓取的图像
max_buffer = cvInitLineIterator( rawImage, pt1, pt2, &iter, 8, 0); //初始化直线迭代器,返回直线上两端像素点个数,总共11个
cvShowImage( "Example", rawImage ); //显示每一帧,连续显示每一帧就是视频的的原理
// int c = cvWaitKey(0);
for( int j = 0; j < max_buffer; ++j ) //max_buffer = 11
{
fprintf( fptrb, "%d,", iter.ptr[0] ); //写蓝值
fprintf( fptrg, "%d,", iter.ptr[1] );
fprintf( fptrr, "%d,", iter.ptr[2] );
iter.ptr[2] = 255; //将直线标记为红色
CV_NEXT_LINE_POINT( iter ); //移动指针,指向下一个pixel
}
fprintf( fptrb, "\n" );
fprintf( fptrg, "\n" );
fprintf( fptrr, "\n" );
sign++;
printf("\n\n%d", sign);
}
fclose( fptrb );
fclose( fptrg );
fclose( fptrr );
cvReleaseCapture( &capture );
cvDestroyWindow( "Example" );
return 0;
}