/*
(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;
}