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;
    }
    



  • 相关阅读:
    MVC ORM 架构
    Kubernetes 第八章 Pod 控制器
    Kubernetes 第七章 Configure Liveness and Readiness Probes
    Kubernetes 第六章 pod 资源对象
    Kubernetes 第五章 YAML
    Kubernetes 核心组件
    Kubernetes 架构原理
    Kubernetes 第四章 kubectl
    Kubernetes 第三章 kubeadm
    yum 配置及yum 源配置
  • 原文地址:https://www.cnblogs.com/zcube/p/4196445.html
Copyright © 2011-2022 走看看