第九章 – 图像局部与分割 – 视频中是直线像素采样(cvInitLineIterator )
来源:互联网 发布:知到智慧树官网 编辑:程序博客网 时间:2024/06/07 03:25
本章开始学习新的内容,如何从图像中将目标或部分目标分割出来,也希望将感兴趣的目标区域分割出来,比如将一个人的脸或手分割出来。背景减除(差分)是最基本的图像处理操作,处理方法是建立背景模型,然后将背景模型和当前的图像进行比较,减去这些已知的背景信息,则剩下的目标物大致就是所求的前景目标了,但是该方法受累于一个不常成立的假设:所有像素点都是独立的。本例程考察图像中的像素点在一段时间内如何变化,从视频中读出一行直线,对这条直线的像素的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*/
程序注释表达了思路。
#include <cv.h>#include <highgui.h>#include <stdio.h>int main( int argc, char** argv ){if( argc != 2 )return -1;cvNamedWindow( "Example", CV_WINDOW_AUTOSIZE );CvCapture* capture = cvCreateFileCapture( argv[1] ); //加载视频if( !capture )printf( "Couldn't open %s\n", argv[1] );CvPoint pt1 = cvPoint( 10, 10 );CvPoint pt2 = cvPoint( 10, 20 ); //直线两个顶点,读取这两个端点连成直线的像素点,总共11个像素点int max_buffer;IplImage* rawImage;int r[10000], g[10000], b[10000]; //存储r,g,b三维的像素值FILE* fptrb = fopen( "blines.csv","w" ); //创建文件存储数据FILE* fptrg = fopen( "glines.csv", "w" ); //存储每个通道的像素值FILE* fptrr = fopen( "rlines.csv", "w" ); //存储为csv文件CvLineIterator iter; //采样迭代器int sign = 0;for( ;; ){if( !cvGrabFrame( capture ) ) //如果没捕捉到帧,退出,视频总共有68帧,30秒的画面break;rawImage = cvRetrieveFrame( capture ); //取回由函数cvGrabFrame抓取的图像max_buffer = cvInitLineIterator( rawImage, pt1, pt2, &iter, 8, 0); //初始化直线迭代器,返回直线上两端像素点个数,总共11个cvShowImage( "Example", rawImage ); //显示每一帧,连续显示每一帧就是视频的的原理int c = cvWaitKey(0);for( int j = 0; j < max_buffer; ++j ) //max_buffer = 11{fprintf( fptrb, "%d,", iter.ptr[0] ); //写蓝值fprintf( fptrg, "%d,", iter.ptr[1] );fprintf( fptrr, "%d,", iter.ptr[2] );iter.ptr[2] = 255; //将直线标记为红色CV_NEXT_LINE_POINT( iter ); //移动指针,指向下一个pixel}fprintf( fptrb, "\n" );fprintf( fptrg, "\n" );fprintf( fptrr, "\n" );sign++;printf("\n\n%d", sign);}fclose( fptrb );fclose( fptrg );fclose( fptrr );cvReleaseCapture( &capture );cvDestroyWindow( "Example" );return 0;}
-----------------------------------------------------------------------------------------
/*result*/
capture frame 38capture frame 60
pixel files
- 第九章 – 图像局部与分割 – 视频中是直线像素采样(cvInitLineIterator )
- 第九章 – 图像局部与分割 – 视频中是直线像素采样(cvInitLineIterator )
- 图像局部与分割 – 视频中是直线像素采样(cvInitLineIterator )
- 视频中直线像素采样(cvInitLineIterator )把每个像素点的三个值写入csv文件中
- opencv第九章-图像局部与分割
- opencv第九章 《图像局部与分割》知识点整理、总结
- 第九章 – 图像局部与分割 – 背景场景和分割前景目标的方法(平均背景法)(例程待实现)
- 图像局部与分割(一)
- opencv14-图像分割--超像素分割与形态学分割
- 视频图像分割研究与实现(二):常见图像和视频分割方法概述
- 图像局部与部分分割--opencv
- opencv 的图像局部与部分分割
- Python计算机视觉:第九章 图像分割
- 视频图像分割研究与实现(一):入门指导
- 超像素图像分割简述
- opencv学习笔记7:图像局部与分割
- 快速视频图像上采样
- 快速视频图像上采样
- 【programmingrobot】解题报告
- Session 会话
- joj2699
- Tiptop GP中Excel的控制方法
- 泛型的基础知识
- 第九章 – 图像局部与分割 – 视频中是直线像素采样(cvInitLineIterator )
- JSP
- joj2171
- 仿谷歌,百度查询页面技术实现分页分析
- 泛型
- java的线程介绍(一)
- 将阿拉伯数字123转换为中文大写
- 自定义标签 20111108
- 仿谷歌百度的查询分页技术