zoukankan      html  css  js  c++  java
  • 《学习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;
    }
    



  • 相关阅读:
    获取AppSettings配置,获取连接字符串
    类在初始化的时候做了什么事
    Easyui Tabs 添加怎么添加。
    Tree数据格式 Easyui
    使用CodeFirst建表的时候要知道的特性
    从数据导出模型到pd设计器
    orm的几种排序写法
    Parallel.ForEach 并行循环的使用
    kendo gird 刷新数据源的几种方式
    表格设置宽度在ie9上无效
  • 原文地址:https://www.cnblogs.com/zcube/p/4196445.html
Copyright © 2011-2022 走看看