现在的位置: 首页 > 综合 > 正文

第九章 – 图像局部与分割 – 视频中是直线像素采样(cvInitLineIterator )

2018年07月30日 ⁄ 综合 ⁄ 共 3711字 ⁄ 字号 评论关闭

from:http://blog.csdn.net/hitwengqi/article/details/6949954

本章开始学习新的内容,如何从图像中将目标或部分目标分割出来,也希望将感兴趣的目标区域分割出来,比如将一个人的脸或手分割出来。背景减除(差分)是最基本的图像处理操作,处理方法是建立背景模型,然后将背景模型和当前的图像进行比较,减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标了,但是该方法受累于一个不常成立的假设:所有像素点都是独立的。本例程考察图像中的像素点在一段时间内如何变化,从视频中读出一行直线,对这条直线的像素的RGB值进行采样,收集这些数值并存入三个文件。大致的思路参见代码注释。

本视频30s,68帧画面,每次采样11个像素点,总共有3*68*11个数据。

----------------------------------------------------------------------------------------------------

数据结构:CvLineIterator iter;   //采样迭代器

方法:

cvCreateFileCapture
初始化从文件中获取视频 

CvCapture* cvCreateFileCapture( const char* filename );
filename 
视频文件名。 
函数cvCreateFileCapture给指定文件中的视频流分配和初始化CvCapture结构。 

当分配的结构不再使用的时候,它应该使用cvReleaseCapture函数释放掉。

 

cvGrabFrame 
从摄像头或者视频文件中抓取帧 

int cvGrabFrame( CvCapture* capture );
capture 
视频获取结构指针。 
函数cvGrabFrame从摄像头或者文件中抓取帧。被抓取的帧在内部被存储。这个函数的目的是快速的抓取帧,这一点对同时从几个摄像头读取数据的同步是很重要的。被抓取的帧可能是压缩的格式(由摄像头/驱动定义),所以没有被公开出来。如果要取回获取的帧,请使用cvRetrieveFrame。

 

cvRetrieveFrame 
取回由函数cvGrabFrame抓取的图像

IplImage* cvRetrieveFrame( CvCapture* capture );
capture 
视频获取结构。 
函数cvRetrieveFrame返回由函数cvGrabFrame抓取的图像的指针。返回的图像不可以被用户释放或者修改。

 

InitLineIterator

初始化直线迭代器

 

int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2,

                        CvLineIterator* line_iterator, int connectivity=8,

                        int left_to_right=0 );

img

用以获取直线的图像。

pt1

线段的第一个端点。

pt2

线段的第二个端点。

line_iterator

指向直线迭代状态结构体的指针。

connectivity

直线的邻接方式,4邻接或者8邻接。

left_to_right

标志值,指出扫描直线是从pt1和pt2外面最左边的点扫描到最右边的点(left_to_right≠0),还是按照指定的顺序,从pt1到pt2(left_to_right=0)。

函数cvInitLineIterator初始化直线迭代器并返回两个端点间点的数目。两个端点都必须在图像内部。在迭代器初始化以后,所有的在连接两个终点的栅栏线上的点,可以通过访问CV_NEXT_LINE_POINT点的方式获得。在线上的这些点使用4-邻接或者8-邻接的Bresenham算法计算得到。

-----------------------------------------------------------------------------------------

/*code*/

程序注释表达了思路。

  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #include <stdio.h>  
  4.   
  5. int main( int argc, char** argv )  
  6. {  
  7.     if( argc != 2 )  
  8.         return -1;  
  9.     cvNamedWindow( "Example", CV_WINDOW_AUTOSIZE );  
  10.     CvCapture* capture = cvCreateFileCapture( argv[1] );  //加载视频  
  11.     if( !capture )  
  12.         printf( "Couldn't open %s\n", argv[1] );  
  13.     CvPoint pt1 = cvPoint( 10, 10 );  
  14.     CvPoint pt2 = cvPoint( 10, 20 );  //直线两个顶点,读取这两个端点连成直线的像素点,总共11个像素点  
  15.   
  16.     int max_buffer;  
  17.     IplImage* rawImage;  
  18.     int r[10000], g[10000], b[10000];  //存储r,g,b三维的像素值  
  19.     FILE* fptrb = fopen( "blines.csv","w" );  //创建文件存储数据  
  20.     FILE* fptrg = fopen( "glines.csv""w" );  //存储每个通道的像素值  
  21.     FILE* fptrr = fopen( "rlines.csv""w" );  //存储为csv文件  
  22.     CvLineIterator iter;  //采样迭代器  
  23.   
  24.     int sign = 0;  
  25.     for( ;; )  
  26.     {  
  27.         if( !cvGrabFrame( capture ) )  //如果没捕捉到帧,退出,视频总共有68帧,30秒的画面  
  28.             break;  
  29.         rawImage = cvRetrieveFrame( capture );  //取回由函数cvGrabFrame抓取的图像  
  30.         max_buffer = cvInitLineIterator( rawImage, pt1, pt2, &iter, 8, 0);  //初始化直线迭代器,返回直线上两端像素点个数,总共11个  
  31.         cvShowImage( "Example", rawImage );   //显示每一帧,连续显示每一帧就是视频的的原理  
  32.         int c = cvWaitKey(0);  
  33.         forint j = 0; j < max_buffer; ++j ) //max_buffer = 11  
  34.         {  
  35.             fprintf( fptrb, "%d,", iter.ptr[0] );  //写蓝值  
  36.             fprintf( fptrg, "%d,", iter.ptr[1] );  
  37.             fprintf( fptrr, "%d,", iter.ptr[2] );  
  38.             iter.ptr[2] = 255; //将直线标记为红色  
  39.             CV_NEXT_LINE_POINT( iter );  //移动指针,指向下一个pixel  
  40.         }  
  41.         fprintf( fptrb, "\n" );  
  42.         fprintf( fptrg, "\n" );  
  43.         fprintf( fptrr, "\n" );  
  44.         sign++;  
  45.         printf("\n\n%d", sign);  
  46.     }  
  47.       
  48.     fclose( fptrb );  
  49.     fclose( fptrg );  
  50.     fclose( fptrr );  
  51.     cvReleaseCapture( &capture );  
  52.     cvDestroyWindow( "Example" );  
  53.       
  54.     return 0;  
  55. }  

-----------------------------------------------------------------------------------------

/*result*/

capture frame 38

capture frame 60

pixel files


@那些年de孩子气

抱歉!评论已关闭.