基于opencv目标跟踪与检测课程设计内容摘要:
要一些视频的转换器。 自己就在网上下载了一个狸窝视频转换器用来转换视频格式。 (3)流程图 开始 创建一个 CvCapture 指针加载一个视频。 得到一个IplImage 指针以获取下一帧视频 按下 esc键 加载一个窗口 创建一个窗口以显示所加载的视频,以每一帧的方式 关闭视频 结束 继续播放视频 播放结束 (4)加载视频中可能遇到的问题以及可能的原因。 1视频文件路径没写对 2没有安装解码器 3 如 果 使 用 的 是 或 更 高 版 本 , 那 么 , 能 否 正 确 加 载 4尽管是 AVI 文件,但也可能使用了某种 codec,例如 :MJPEG Depressor。 需要把它转换 OpenCV 支持的 AVI文件 . OpenCV 支持的 AVI。 例如使用狸窝全能视频转换器,在《预置方案》处,选择 AVIAudio_Video Interleaved(*.avi)。 或者使用格式工厂也可以。 5读摄像头数据,需要安装与摄像头相应的驱动程序。 ( 5)运行结果 (6)加载视频既可以使用加载一段视频,也可以打开一个自己电脑上的摄像头。 CvCapture 是一个结构体,用来保存图像捕获所需要的信息。 opencv 提供两种方式从外部捕获图像 一种是从摄像头中,一种是通过解码视频得到图像。 两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。 比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器类型,下一次如果要获取将需要解码哪一帧等。 这些信息都保存在 CvCapture 结构中,每获取一帧后,这些信息都将被更新,获取下一帧需要将新信息传给获取的 api 接口 获取摄像头,显示图像。 (1)与其相关的说明 在获取摄像头之前先来熟悉以下 opencv 中视频获取的数据结构的管理方式。 :视频获取结构 说明: OpenCV中的视频获取结构。 结构 CVCapture 没有公共接口,它只能用来作视频获取函数中实用的一个参数。 :初始化文件中获取视频 语法: CvCapture * cvCreateFileCapture(const char *filename)。 摄像头 cvQueryFrame 视频文件 cvCreateFileCapture CvCapture cvCreateCameraCapture IplImage 参数 类型 说明 Filename const char* 使用视频文件名 说明:该函数给指定文件的视频流分配和初始化 CvCapture. 返回值。 分配的 CvCapure :从摄像头中获取视频 语法: CvCapture * cvCaptureFromCAM(int index) 参数 类型 说明 Index in t index 指的是摄像头的索引,当只有一个摄像头时, index 设为 1 4. cvQueryFrame:从摄像头或者文件中抓取并返回一帧 语法: IplImage* cvQueryFrame(CvCapture * capture) 参数 类型 说明 cvCapture CvCapture* 视频获取结构 cvQueryFrame:从摄像头或者文件中抓取一帧,然后解压并返回一帧。 返回的图 像不可以被用户释放或者修改。 返回值。 IplImage 获取的指针 (2)相关代码 对 AVI 文件中的视频进行处理,可用如下程序。 获得图像的效果如下图。 include int main(int argc, char* argv[]) { cvNamedWindow(avi)。 CvCapture* capture = cvCreateCameraCapture(1)。 IplImage* frame。 while(1) { frame = cvQueryFrame(capture)。 if(!frame)break。 cvShowImage(avi,frame)。 char c = cvWaitKey(33)。 if(c==27) break。 } cvReleaseCapture(amp。 capture)。 cvDestroyWindow(avi)。 return 0。 } (3)相关代码的解释。 该代码与加载视频基本一致。 只是有一处代码有所改只需把cvCreateFileCapture 改成 cvCreateCameraCapture 即可。 该函数的输入参数是一个 ID 号,只有存在多个摄像头时才起作用。 当 ID=1 时,表示随机选择一个。 HighGUI 做了很多工作,使得摄像机图像序列像一个视频文件一样。 (4)运行结果。 opencv 运动目标跟踪系统实现的详细说明。 运动目标检测时各种后续高级应用如目标跟踪,目标分类,目标行为理解等的基础主要目的是从视频图像中提取出运动目标并获得运动目标的特征信息,如颜色,形状,轮廓等。 提取运动目标的过程实际上就是一个图像分割的过程,而运动物体就只有在 连续的图像序列(如视频图像序列) 中才能体现出来,运动目标的提取过程就是在连续的图像序列中寻找差异,并把由于物体运动和表现出来的差异提取出来。 一般目标跟踪的实现的流程图。 本文的检测算法。 连续适应性均值移动算法( CamShift) 本平台在进行运动物体检测跟踪时所采用的算法是:首先利用“帧差法”检测出初始的运动目标;一旦认为此目标合法,便根据目标在 HSI(色调、饱和度、强度)空间中 H 通道的色调特性,利用“连续适应性均值移动算法( CamShift)”,对目标进行跟踪。 CamShift 算法简述如下: ( 1) 在图像 HSI 空间中计算 H通道(色彩通道)分量的 1D 直方图 ( 2) 利用此 1D 直方图将原图改建成 2D 概率分布图 ( 3) 计算出目标区域的重心。 ( 4) 利用经典的“ Mean Shift”算法,不断平移调整窗口中心到与目标重心重合 ( 5)将上一帧的窗口大小和中心,作为下一帧 Mean Shift 算法搜索窗口的初始值,在下一帧中继续 Mean Shift 运算。 上述运动物体检测和跟踪的算法的流程图 计算 H 通道分量的1 D 直方图根据 1 D 直方图建立2 D 概率分布图计算出目标区域的重心Me a n S h if t 算法将上一帧结果作为下一帧初始窗口 Camshift算法原理及其 Opencv实现。 CamShift 算法,即 Continuously Apative MeanShift算法,是一种运动跟踪算法。 它主要通过视频图像中运动物体的颜色信息来达到跟踪的目的。 我把这个算法分解成三个部分,便于理解: 1) Back Projection 计算 2) Mean Shift 算法 3) CamShift 算法 Projection 计算 Back Projection 的步骤是这样的: 1. 计算被跟踪目标的色彩直方图。 在各种色彩空间中,只有 HSI 空间 (或与 HSI类似的色 彩空间 )中的 H 分量可以表示颜色信息。 所以在具体的计算过程中,首先将其他的色彩空间的值转化到 HSI 空间,然后会其中的 H 分量做 1D 直方图计算。 2. 根据获得的色彩直方图将原始图像转化成色彩概率分布图像,这个过程就被称作 Back Projection。 在 OpenCV 中的直方图函数中,包含 Back Projection 的函数,函数原型是: void cvCalcBackProject(IplImage** img, CvArr** backproject, const CvHistogram* hist)。 传递给这个函数的参数有三个: 1. IplImage** img:存放原始图像,输入。 2. CvArr** backproject:存放 Back Projection 结果,输出。 3. CvHistogram* hist:存放直方图,输入 Back Projection 的 OpenCV 代码。 ( 1) 准备一张只包含被跟踪目标的图片,将色彩空间转化到 HSI 空间,获得其中的 H分量: IplImage* target=cvLoadImage(,1)。 //装载图片 IplImage* target_hsv=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 )。 IplImage* target_hue=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 )。 cvCvtColor(target,target_hsv,CV_BGR2HSV)。 //转化到 HSV 空间 cvSplit( target_hsv, target_hue, NULL, NULL, NULL )。 //获得 H分量 ( 2) 计算 H分量的直方图,即 1D直方图: IplImage*h_plane=cvCreateImage( cvGetSize(target_hsv),IPL_DEPTH_8U,1 )。 int hist_size[]={255}。 //将 H分量的值量化到 [0,255] float* ranges[]={ {0,360} }。 //H 分量的取值范围是 [0,360) CvHistogram* hist=cvCreateHist(1, hist_size, ranges, 1)。 cvCalcHist(amp。 target_hue, hist, 0, NULL)。 在这里需要考虑 H 分量的取值范围的问题, H分量的取值范围是 [0,360),这个取值范围的值不能用一个 byte 来表示,为了能用一个 byte 表示,需要将 H值做适当的量化处理 ,在这里我们将 H分量的范围量化到 [0,255]. ( 3) 计算 Back Projection: IplImage* rawImage。 // //get from video frame,unsigned byte,one channel // IplImage* result=cvCreateImage(cvGetSize(rawImage),IPL_DEPTH_8U,1)。 cvCalcBackProject(amp。 rawImage,result,hist)。 用在 cvCalcBackProject 处理中的模板是目标图像色调 (HUE)的直方图,而直方图可以看作是一种概率分布图。 在处理前,目标图像中的每一个象素的值描述的在这一点的颜色信息,而处理后,图像中每一个象素的值就变成了这个颜色信息出现在此处的可能性的一种离散化的度量,出现的可能性大,象素的值就大,反之则小。 这样就为后面的匹配和跟踪提供了线索。 (2)meanshift CamShift 算法, OpenCV 实现的第二部分,这一次重点讨论 Mean Shift 算法。 ( 1)计算重心。 .在讨论 Mean Shift 算法之前,首先讨论在 2D 概率分布图像中,如何计算某个区域的重心 (Mass Center)的问题,重心可以通过以下公式来计算: 0阶矩 for(int i=0。 iheight。 i++) for(int j=0。 jwidth。 j++) M00+=I(i,j) 1阶矩: for(int i=0。 iheight。 i++) for(int j=0。 jwidth。 j++) { M10+=i*I(i,j)。 M01+=j*I(i,j)。 } Mass Center 为: Xc=M10/M00。 Yc=M01/M00 Mean Shift 算法的具体步骤 接下来,讨论 Mean Shift 算法的具体步骤, Mean Shi。基于opencv目标跟踪与检测课程设计
相关推荐
模块式 PLC由于PLC内框架或基板和各种模块组成。 模拟装在框架或基板的插座上。 这种模块式 PLC的特点是配置灵活,可根据需要选配不同模块的系统,而且装配方便,便于扩展和维修。 大、中型 PLC一般采用模块式结构。 还有一些PLC将整体和模块式的特点结合起来,构成所谓叠装式 PLC。 叠装式 PLC南京工程学院自动化学院自考助学本科毕业设计(论文) 5 其 CPU、电源、
做出了集成 优化,形成了自主知识产权,设计了一条不同于任何一家的、适合自身需求的最优工艺路线,代表了当前及今后 PC 发展的技术方向。 历经数载孕育,持续的坚持创新和探索终得回报。 2020 年 PC 项目实现达标达产,质量优等,成功打破了德国拜耳、美国通用、日本帝人等外资寡头垄断,改写了国内无万吨级以上 PC 自主工业化装置的历史。 PC 项目成功投产也得到了各级领导的高度赞扬和认可
操作系统内的程序,从而显著的减少所需要的用户存储器容量,它们可以用于中断处理、出错处理、复制和处理数据等。 S7300 有 350 多条指令,其编程软件 STEP7 功能强大,可以使用多种编程语言,有的编程语言可以相互转换。 STEP7 用软件工具来为所有的模块和网络设置参数。 CPU 用智能化的诊断系统连续监控系统的功能是否正常、记录错误和特殊系统事件(例如超时、模块更换等)。 S7300
应用已经悄然开始。 移动通信和 Inte 以其市场潜力最大、应用领域最广、吸纳用户最多而成为两大支柱产业。 全球移动用户已超过 l4亿,我国移动用户已 跃居全球第一,预计至 2020年底用户数将达到 6亿;全球互联网用户已超过 9. 65亿,我国互联网用户突破 9450万,仅次于美国和日本,居世界第三。 目前两网用户仍显高速增长趋势。 到 2020年全球移动互联网用户达 7300万,
, and also the electronic ANDgate logic circuit. Frequency hopping is also mentioned in radio pioneer Johannes Zenneck39。 s book Wireless Telegraphy (German, 1908, English translation McGraw Hill,
MSP430 的存储器结构采用了统一编址方式,可以使得对外围模块寄存器的操作象普通的 RAM 单元一样方便、灵活。 MSP430 存储器的信息类型丰 富 并具有很强的系统外围模块扩展能力。 (二 ) MSP430系列单片机特点 1 低电压, 超低功耗 MSP430系列单片机在 , 1MHZ的时钟条件在运行,耗电电流( )因工作模式不同而不同;具有 16个中断源并可以任意嵌套,使用灵活方便