《学习openCV》例程解析 ex_9_1 (像素片段)

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



原文地址:https://www.cnblogs.com/zcube/p/4196445.html