镜头边缘检测ppt课件

上传人:F****n 文档编号:88167930 上传时间:2019-04-20 格式:PPTX 页数:33 大小:1.27MB
返回 下载 相关 举报
镜头边缘检测ppt课件_第1页
第1页 / 共33页
镜头边缘检测ppt课件_第2页
第2页 / 共33页
镜头边缘检测ppt课件_第3页
第3页 / 共33页
镜头边缘检测ppt课件_第4页
第4页 / 共33页
镜头边缘检测ppt课件_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《镜头边缘检测ppt课件》由会员分享,可在线阅读,更多相关《镜头边缘检测ppt课件(33页珍藏版)》请在金锄头文库上搜索。

1、,镜头边界检测,01,概念介绍,三种方法,实验,小结,02,03,04,05,Contents,01概念介绍,基本概念,视频由一个个镜头所组成,镜头是时间上连续的若干幅帧图像组成的片段。,当镜头发生转变时,会产生一些明显的变化,镜头边界检测依据这些变化来判断镜头是否发生转变。,镜头发生转变时的边界帧,也称关键帧。,镜头,镜头边界检测,基本概念,镜头边界检测的基础是两个连续镜头的内容有较大的不同性,因此可以用定量的方法来确定帧序列之间的差别;如果这种差别超出了给定的阈值,就可以提取出镜头的边界(关键帧),关键帧,短片截图的关键帧,02三种方法,一帧本质就是一张图片,因此衡量两帧之间变化本质就是衡

2、量两张图片的区别。在KNN算法中衡量两张图片之间相似度就是图片对应像素相减之和,将其累加,值最小的即最接近的两张图片。 连续帧相减法中,我们同样使用这个指标来评价两张图片的近似度,一旦区别大到一定地步则认为该两帧是镜头边界。 ,连续帧相减,算法原理:计算相邻两帧像素变化的数目。当超过设定的阈值时,即找到镜头的边界 缺点:对摄像机运动敏感,如放缩、平移,往往较小的物体运动会造成很大的帧间差,从而容易导致误检测 解决办法:通过滤波器的使用来降低。在比较一帧的每个像素前,用它的邻近区域的平均值来代替,这也过滤了输入图像的一些噪声。 ,连续帧相减,图片演示,相邻连续帧,图片演示,直方图相减,代码,算法

3、原理:统计相邻两帧中所有像素在不同灰度(颜色)上的分布差异,当差异的累加值超过阈值T时,即检测到镜头边界 优点:对对象运动不敏感,因为直方图忽略了帧内的空间变化 缺点:可能两个图像有类似的直方图但却是完全不同的内容。然而,这种事件的概率是足够低,图片演示,相邻两个帧图像,帧图像灰度图,灰度图直方图,时空切片,代码,切片就是从连续的视频图像序列的同一个位置提取出的一行 (列 )像素组合而成的一幅二维图像 。 如果将视频看作是一个 ( x, y, t)三维图像序列 ,其中 ( x, y)为图像维 , t为时间维 ,则视频的时空切片可以看作是由时间维与图像维构成的一幅二维图像 。,时空切片,切片颜色

4、和纹理纹理中包含有对应视频的大量信息 ,包括镜头切变点 、摄像机的运动方式等 因为单个镜头内部的视频帧在时间、空间和图像结构上是连续的 ,在时空切片上的表现就是颜色和纹理空间上的连续性 。 镜头发生切换时 ,视频数据会跟着发生一系列的变化 ,表现在颜色差异突然增大 、运动的不连续等 , 时空切片上的颜色和纹理也会表现出明显的不连续现象 。,03实验,连续帧相减代码实现,直方图相减代码实现,/imhist( i );直接显示图像i的灰度直方图;,直方图相减代码实现,直方图相减少关键帧,时空切片代码实现,int main(int argc, char* argv) /void cutColSlid

5、e(CvMat*, CvMat*, int, int); /垂直切片 void cutRowSlide(CvMat*, CvMat*, int, int); /水平切片 int i; int nFrmNum = 0; int totalFrmNum; /总帧数 char* videofile = “G:/Makoto.mkv“; /声明IplImage指针 IplImage* pFrame = NULL; /视频帧 /IplImage* pSlImg_col; IplImage* pSlImg_row; /水平切片图像 CvMat* pFrameMat = NULL; /视频帧数据矩阵 CvM

6、at* pFrMat_r = NULL; /前景数据 CvMat* pFrMat_g = NULL; CvMat* pFrMat_b = NULL; /CvMat* pSlMat_col; CvMat* pSlMat_row; /CvMat* pSlMat_col_rCOL_NUM+1; /垂直切片数据矩阵 CvMat* pSlMat_row_rROW_NUM + 1; /水平切片数据矩阵 /CvMat* pSlMat_col_gCOL_NUM+1; /垂直切片数据矩阵 CvMat* pSlMat_row_gROW_NUM + 1; /水平切片数据矩阵 /CvMat* pSlMat_col_b

7、COL_NUM+1; /垂直切片数据矩阵 CvMat* pSlMat_row_bROW_NUM + 1; /水平切片数据矩阵 CvCapture* pCapture = NULL; /读取视频数据的指针 char filename50;,时空切片代码实现,/打开视频文件 if (!(pCapture = cvCaptureFromFile(videofile) fprintf(stderr, “Can not open video file %sn“, videofile); return -2; /printf(“Start to reading Video!And you have to

8、be patient!n“); /逐帧读取视频 while (pFrame = cvQueryFrame(pCapture) nFrmNum+; /如果是第一帧,需要申请内存,并初始化 if (nFrmNum = 1) totalFrmNum = (int)cvGetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_COUNT); /获取视频文件总帧数 /创建切片初始矩阵 pSlImg_row = cvCreateImage(cvSize(pFrame-width, totalFrmNum), IPL_DEPTH_8U, 3); pSlMat_row =

9、cvCreateMat(totalFrmNum, pFrame-width, CV_32FC3); for (i = 0; i width, CV_32FC1); pSlMat_row_gi = cvCreateMat(totalFrmNum, pFrame-width, CV_32FC1); pSlMat_row_bi = cvCreateMat(totalFrmNum, pFrame-width, CV_32FC1); ,时空切片代码实现,/初始化并分配图像空间和矩阵空间 pFrMat_r = cvCreateMat(pFrame-height, pFrame-width, CV_32FC

10、1); pFrMat_g = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); pFrMat_b = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); pFrameMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC3); /转化成单通道图像再处理 cvConvert(pFrame, pFrameMat); cvSmooth(pFrameMat, pFrameMat); cvSplit(pFrameMat, pFrMat_r, pF

11、rMat_g, pFrMat_b, NULL); /切片 for (i = 0; i height / ROW_NUM), nFrmNum); cutRowSlide(pFrMat_g, pSlMat_row_gi, i*(int(pFrame-height / ROW_NUM), nFrmNum); cutRowSlide(pFrMat_b, pSlMat_row_bi, i*(int(pFrame-height / ROW_NUM), nFrmNum); ,时空切片代码实现,/不是第一帧,正常处理 else cvConvert(pFrame, pFrameMat); cvSmooth(pF

12、rameMat, pFrameMat); cvSplit(pFrameMat, pFrMat_r, pFrMat_g, pFrMat_b, NULL); /切片 for (i = 0; i height / ROW_NUM), nFrmNum); cutRowSlide(pFrMat_g, pSlMat_row_gi, i*(int(pFrame-height / ROW_NUM), nFrmNum); cutRowSlide(pFrMat_b, pSlMat_row_bi, i*(int(pFrame-height / ROW_NUM), nFrmNum); /printf(“Reading

13、 Done!n“); printf(“Number of frames : %d.n“, totalFrmNum); / cvReleaseImage(,时空切片代码实现,/保存切片图像 for (i = 0; i = ROW_NUM; i+) cvMerge(pSlMat_row_ri, pSlMat_row_gi, pSlMat_row_bi, NULL, pSlMat_row); cvConvert(pSlMat_row, pSlImg_row); sprintf(filename, “G:/1.bmp“, i); cvSaveImage(filename, pSlImg_row); /

14、释放图像和矩阵 cvReleaseImage( ,时空切片代码实现,void cutRowSlide(CvMat* pFrameMat, CvMat* pSlMat_row, int row_ind, int nFrmNum) /完成行切片的工作 / pFrameMat - 要进行切片的帧数据 / pSlMat_row - 目标切片数据 / col_ind - - 当前帧在视频流中的下标 CvMat* temp_row; /临时存放提取出的行数据 temp_row = cvCreateMat(1, pFrameMat-width, CV_32FC1); /初始化 if (row_ind = p

15、FrameMat-height) row_ind-; cvGetRow(pFrameMat, temp_row, row_ind); /从当前帧中提取出第row_ind列 for (int i = 0; iwidth; i+) /将提取出的行添加到切片 cvSet2D(pSlMat_row, nFrmNum - 1, i, cvScalar(float*)(temp_row-data.ptr)i); /图像切片行坐标 / nFrmNum cvReleaseMat( ,时空切片代码实现,int main() const char *pstrImageName = “G:/1.bmp“; const char *pstrWindowsTitle = “1.bmp“; /从文件中读取图像 IplImage *pImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED); CvMat* Mat_src = cvCreateMat(pImage-height, pImage-width, CV_32FC3); cvConvert(pImage, Mat_src);/将iplImage数据转化为矩阵,以便计算 Detect_row(Mat_src,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号