/*
(1)利用cvInitLineIterator() CV_NEXT_LINE_POINT()对视频中任意直线上的像素进
行采样,并把每一帧的BGR 像素值,分别输出到文件中
(2)把视频中采样的线段标记为红色
如上图表格中为B 通道的像素值,每一行代表每一帧,每一列代表线段中从pt1到pt2每个
像素B 通道的像素值.因为该视频68帧,所以有68行信息,pt1到pt2有81个像素,所以共
有81列。
*/
/************************************************************************/ /* Example 9-1. Reading out the RGB values of all pixels in one row of a video and accumulating those values into three separate files. */ /************************************************************************/ #include "stdafx.h" #include "cv.h" #include "highgui.h" int main() { char* wnd_name = "Example9_1"; cvNamedWindow(wnd_name, CV_WINDOW_AUTOSIZE); CvCapture* capture = cvCreateFileCapture("tree.avi"); //初始化从文件中获取视频 如同cvLoadImage if (!capture) { printf("Couldn't open the capture\n"); return -1; } CvPoint pt1 = cvPoint(10, 10); CvPoint pt2 = cvPoint(90, 90); //两个端点连成一条线段,两点需在获取的图像内部 FILE* fptrb = fopen("blines.csv", "w"); FILE* fptrg = fopen("glines.csv", "w"); FILE* fptrr = fopen("rlines.csv", "w"); //把视频中在该线段上的每一帧图像的BGR 颜色信息输出到上面三个文件中 IplImage* rawImage; CvLineIterator iterator; //创建一个迭代器,配合CV_NEXT_LINE_POINT获取直线迭代器中的点信息 for (;;) { if (!cvGrabFrame(capture)) //从摄像头或者视频文件中抓取帧,抓取后capture 指向下一帧 break; rawImage = cvRetrieveFrame(capture); //取回由函数cvGrabFrame抓取的图像,返回的图像不可以被用户释放或者修改 int max_buffer = cvInitLineIterator( //初始化直线迭代器,返回两端点间点的数目 rawImage, //用以获取直线的图像 pt1, //线段第一个端点 pt2, //线段第二个端点 &iterator, //指向直线迭代状态结构体的指针 8, //直线的邻接方式,8方向邻接 0 //标志值,按照指定的顺序,从pt1到pt2(left_to_right=0) ); for (int j=0; j<max_buffer; j++) { fprintf(fptrb, "%d,", iterator.ptr[0]); fprintf(fptrg, "%d,", iterator.ptr[1]); fprintf(fptrr, "%d,", iterator.ptr[2]); //每个通道的像素值通过iterator.ptr[0]/ptr[1]依次得到分别为BGR //然后分别输出到fptrb, fptrg, fptrr三个文件 iterator.ptr[0] = 0; iterator.ptr[1] = 0; iterator.ptr[2] = 255; //iterator中每个像素点赋为红色,使视频中出现一条红色线段(pt1pt2) CV_NEXT_LINE_POINT(iterator); //每次调用CV_NEXT_LINE_POINT 使iterator指向下一个像素 } fprintf(fptrb, "\n"); fprintf(fptrg, "\n"); fprintf(fptrr, "\n"); //输出完每一帧图像该线段上的像素值后在文件中换行 cvShowImage(wnd_name, rawImage); if (cvWaitKey(33) == 27) //每帧停顿33ms 如用户按下ESC 断开循环 break; } printf("\nData stored to files: blines.csv, glines.csv and rlines.csv\n"); fclose(fptrb); fclose(fptrg); fclose(fptrr); cvReleaseCapture(&capture); cvDestroyWindow(wnd_name); return 0; }