版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
镜头边界检测
镜头边界检测01概念介绍三种方法实验小结02030405Contents01概念介绍三种方法实验小结02030405Contents01概念介绍01概念介绍基本概念视频由一个个镜头所组成,镜头是时间上连续的若干幅帧图像组成的片段。当镜头发生转变时,会产生一些明显的变化,镜头边界检测依据这些变化来判断镜头是否发生转变。镜头发生转变时的边界帧,也称关键帧。镜头镜头边界检测基本概念视频由一个个镜头所组成,镜头是时间上连续的若干幅帧图基本概念镜头边界检测的基础是两个连续镜头的内容有较大的不同性,因此可以用定量的方法来确定帧序列之间的差别;如果这种差别超出了给定的阈值,就可以提取出镜头的边界(关键帧)基本概念镜头边界检测的基础是两个连续镜头的内容有较大的不同性关键帧短片截图的关键帧关键帧短片截图的关键帧02三种方法02三种方法
一帧本质就是一张图片,因此衡量两帧之间变化本质就是衡量两张图片的区别。在KNN算法中衡量两张图片之间相似度就是图片对应像素相减之和,将其累加,值最小的即最接近的两张图片。连续帧相减法中,我们同样使用这个指标来评价两张图片的近似度,一旦区别大到一定地步则认为该两帧是镜头边界。连续帧相减一帧本质就是一张图片,因此衡量两帧之间变化本质就是衡量算法原理:计算相邻两帧像素变化的数目。当超过设定的阈值时,即找到镜头的边界缺点:对摄像机运动敏感,如放缩、平移,往往较小的物体运动会造成很大的帧间差,从而容易导致误检测解决办法:通过滤波器的使用来降低。在比较一帧的每个像素前,用它的邻近区域的平均值来代替,这也过滤了输入图像的一些噪声。连续帧相减算法原理:计算相邻两帧像素变化的数目。当超过设定的阈值时,即图片演示相邻连续帧图片演示相邻连续帧图片演示图片演示直方图相减代码算法原理:统计相邻两帧中所有像素在不同灰度(颜色)上的分布差异,当差异的累加值超过阈值T时,即检测到镜头边界优点:对对象运动不敏感,因为直方图忽略了帧内的空间变化缺点:可能两个图像有类似的直方图但却是完全不同的内容。然而,这种事件的概率是足够低直方图相减代码算法原理:统计相邻两帧中所有像素在不同灰度(颜图片演示相邻两个帧图像帧图像灰度图灰度图直方图图片演示相邻两个帧图像帧图像灰度图灰度图直方图时空切片代码切片就是从连续的视频图像序列的同一个位置提取出的一行(列)像素组合而成的一幅二维图像。如果将视频看作是一个(x,y,t)三维图像序列,其中(x,y)为图像维,t为时间维,则视频的时空切片可以看作是由时间维与图像维构成的一幅二维图像。时空切片代码切片就是从连续的视频图像序列的同一个位置提取时空切片切片颜色和纹理纹理中包含有对应视频的大量信息,包括镜头切变点、摄像机的运动方式等因为单个镜头内部的视频帧在时间、空间和图像结构上是连续的,在时空切片上的表现就是颜色和纹理空间上的连续性。
镜头发生切换时,视频数据会跟着发生一系列的变化,表现在颜色差异突然增大、运动的不连续等,时空切片上的颜色和纹理也会表现出明显的不连续现象。时空切片切片颜色和纹理纹理中包含有对应视频的大量信息,镜头边缘检测课件03实验03实验连续帧相减代码实现连续帧相减代码实现直方图相减代码实现//imhist(i);直接显示图像i的灰度直方图;直方图相减代码实现//imhist(i);直接显示图像i直方图相减代码实现直方图相减少关键帧直方图相减代码实现直方图相减少关键帧时空切片代码实现intmain(intargc,char**argv){ //voidcutColSlide(CvMat*,CvMat*,int,int); //垂直切片 voidcutRowSlide(CvMat*,CvMat*,int,int); //水平切片 inti; intnFrmNum=0; inttotalFrmNum; //总帧数 char*videofile="G:/Makoto.mkv"; //声明IplImage指针 IplImage*pFrame=NULL; //视频帧 //IplImage*pSlImg_col; IplImage*pSlImg_row; //水平切片图像 CvMat*pFrameMat=NULL; //视频帧数据矩阵 CvMat*pFrMat_r=NULL; //前景数据 CvMat*pFrMat_g=NULL; CvMat*pFrMat_b=NULL; //CvMat*pSlMat_col; CvMat*pSlMat_row; //CvMat*pSlMat_col_r[COL_NUM+1]; //垂直切片数据矩阵 CvMat*pSlMat_row_r[ROW_NUM+1]; //水平切片数据矩阵 //CvMat*pSlMat_col_g[COL_NUM+1]; //垂直切片数据矩阵 CvMat*pSlMat_row_g[ROW_NUM+1]; //水平切片数据矩阵 //CvMat*pSlMat_col_b[COL_NUM+1]; //垂直切片数据矩阵 CvMat*pSlMat_row_b[ROW_NUM+1]; //水平切片数据矩阵 CvCapture*pCapture=NULL; //读取视频数据的指针 charfilename[50];时空切片代码实现intmain(intargc,cha时空切片代码实现//打开视频文件 if(!(pCapture=cvCaptureFromFile(videofile))) { fprintf(stderr,"Cannotopenvideofile%s\n",videofile); return-2; } //printf("StarttoreadingVideo!Andyouhavetobepatient!\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=cvCreateMat(totalFrmNum,pFrame->width,CV_32FC3); for(i=0;i<=ROW_NUM;i++) { pSlMat_row_r[i]=cvCreateMat(totalFrmNum,pFrame->width,CV_32FC1); pSlMat_row_g[i]=cvCreateMat(totalFrmNum,pFrame->width,CV_32FC1); pSlMat_row_b[i]=cvCreateMat(totalFrmNum,pFrame->width,CV_32FC1); }
时空切片代码实现//打开视频文件时空切片代码实现//初始化并分配图像空间和矩阵空间 pFrMat_r=cvCreateMat(pFrame->height,pFrame->width,CV_32FC1); 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,pFrMat_g,pFrMat_b,NULL); //切片 for(i=0;i<=ROW_NUM;i++){ cutRowSlide(pFrMat_r,pSlMat_row_r[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); cutRowSlide(pFrMat_g,pSlMat_row_g[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); cutRowSlide(pFrMat_b,pSlMat_row_b[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); }时空切片代码实现//初始化并分配图像空间和矩阵空间 时空切片代码实现//不是第一帧,正常处理 else { cvConvert(pFrame,pFrameMat); cvSmooth(pFrameMat,pFrameMat); cvSplit(pFrameMat,pFrMat_r,pFrMat_g,pFrMat_b,NULL); //切片 for(i=0;i<=ROW_NUM;i++){ cutRowSlide(pFrMat_r,pSlMat_row_r[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); cutRowSlide(pFrMat_g,pSlMat_row_g[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); cutRowSlide(pFrMat_b,pSlMat_row_b[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); }} } //printf("ReadingDone!\n"); printf("Numberofframes:%d.\n",totalFrmNum); // cvReleaseImage(&pFrame); cvReleaseMat(&pFrameMat); cvReleaseMat(&pFrMat_r); cvReleaseMat(&pFrMat_g); cvReleaseMat(&pFrMat_b); cvReleaseCapture(&pCapture); printf("Save\n");时空切片代码实现//不是第一帧,正常处理时空切片代码实现//保存切片图像 for(i=0;i<=ROW_NUM;i++){ cvMerge(pSlMat_row_r[i],pSlMat_row_g[i],pSlMat_row_b[i],NULL,pSlMat_row); cvConvert(pSlMat_row,pSlImg_row); sprintf(filename,"G://1.bmp",i); cvSaveImage(filename,pSlImg_row); }//释放图像和矩阵 cvReleaseImage(&pSlImg_row); cvReleaseMat(&pSlMat_row); for(i=0;i<=ROW_NUM;i++){ cvReleaseMat(&pSlMat_row_r[i]); cvReleaseMat(&pSlMat_row_g[i]); cvReleaseMat(&pSlMat_row_b[i]); }return0;}时空切片代码实现//保存切片图像时空切片代码实现voidcutRowSlide(CvMat*pFrameMat,CvMat*pSlMat_row,introw_ind,intnFrmNum)//完成行切片的工作//pFrameMat -要进行切片的帧数据//pSlMat_row -目标切片数据//col_ind - -当前帧在视频流中的下标{ CvMat*temp_row; //临时存放提取出的行数据 temp_row=cvCreateMat(1,pFrameMat->width,CV_32FC1); //初始化 if(row_ind==pFrameMat->height) row_ind--; cvGetRow(pFrameMat,temp_row,row_ind); //从当前帧中提取出第row_ind列 for(inti=0;i<pFrameMat->width;i++) //将提取出的行添加到切片 cvSet2D(pSlMat_row,nFrmNum-1,i,cvScalar(((float*)(temp_row->data.ptr))[i]));//图像切片行坐标 //nFrmNum cvReleaseMat(&temp_row);}时空切片代码实现voidcutRowSlide(CvMat时空切片代码实现intmain(){ constchar*pstrImageName="G://1.bmp"; constchar*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,NULL); cvConvert(Mat_src,pImage);//将矩阵数据转化为iplImage,以便显示 cvNamedWindow(pstrWindowsTitle,CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsTitle,pImage); cvWaitKey(); cvDestroyWindow(pstrWindowsTitle); cvReleaseImage(&pImage); return0;}时空切片代码实现intmain()时空切片代码实现voidDetect_row(CvMat*src,int*tagetframe){ intwidth=src->width; intheight=src->height; intv=0,sv=0; //v是第N帧的像素值,sv是第N-1帧的像素值 intd=5; //(-d,d)的领域边界值 list<int>Frame_list; //c++列表,用于存放检测到的突变镜头边界 intthreshold=20; //threshold;人为设定的阈值,|v-sv|>threshold表明两个像素差异大 doublepdiff_rate=0.50;//差异率;人为设定,在(-d,d)中差异点的比例; CvMat*Mat_row_r=cvCreateMat(height,width,CV_32FC1);//创建R通道矩阵用于存放R通道像素值,注意CV_32FC1的含义 CvMat*Mat_row_g=cvCreateMat(height,width,CV_32FC1); CvMat*Mat_row_b=cvCreateMat(height,width,CV_32FC1); cvSplit(src,Mat_row_b,Mat_row_g,Mat_row_r,NULL);//将3通道矩阵src的数据分别放入r.g.b三个矩阵中 for(intj=1;j<height;j++) {intpdiff_num=0; //一行中检测到差异像素点个数 for(inti=0;i<width;i++) { v=cvmGet(Mat_row_r,j,i);//取像素(i,j)的值 intcount=0; //(-d,d)范围内的统计 doublediff_rate=0; //差异率=num_diff/count;见论文图3 intnum_diff=0; //差异点个数时空切片代码实现voidDetect_row(CvMat*时空切片代码实现for(intk=-d;k<=d;k++) { if(i+k>0&&i+k<width) { count++; sv=cvmGet(Mat_row_r,j-1,i+k); if(abs(v-sv)>threshold) //|v-sv|>threshold表明两个像素差异大 num_diff++;//像素相差大于阈值的个数 } } diff_rate=1.0*num_diff/count;//差异率=num_diff/count;注意乘以1.0// printf("diff_rate=%f,num_diff=%d,count=%d\n",diff_rate,num_diff,count); if(diff_rate>pdiff_rate)//当该点差异率大于设定值pdiff_rate pdiff_num++; //一行中差异点个数 }// printf("%d,%d\n",pdiff_num,j); if(pdiff_num>width/3) //一行中差异点个数>width/3;width/3是人为设定的值 { printf("pdiff_num=%d,Frame=%d\n",pdiff_num,j); Frame_list.push_back(j);//将检测到的突变帧号存放到列表中 } }时空切片代码实现for(intk=-d;k<=时空切片代码实现list<int>::iteratorj; for(j=Frame_list.begin();j!=Frame_list.end();++j)//遍历列表 { for(inti=0;i<width;i++) { cvmSet(Mat_row_b,*j,i,0);//将突变帧标红,即src的第*j行标红 cvmSet(Mat_row_g,*j,i,0); cvmSet(Mat_row_r,*j,i,255); } } cvMerge(Mat_row_b,Mat_row_g,Mat_row_r,NULL,src);//将标红后的数据合并成3通道的矩阵}时空切片代码实现list<int>::iteratorj;04小结04小结
本实验对镜头边界检测方法进行了探讨和研究,提取视频帧的特征,然后计算视频帧之间的时间特征值的差分,来衡量视频帧的相似度。最后使用基于阈值的判别方法,检测视频镜头的边界。我们可以在解码过程中获取视频帧对应的BMP图像,来判断该视频镜头边界检测实验的准确性。镜头边界检测的关键是通过利用合适的内容转换检测方法、合理的设置阈值,发现帧序列的内容变换点。三种方法较为简单,现有算法的检测效果较为理想。小结本实验对镜头边界检测方法进行了探讨和研究,提取视频帧的THANKS!THANKS!镜头边界检测
镜头边界检测01概念介绍三种方法实验小结02030405Contents01概念介绍三种方法实验小结02030405Contents01概念介绍01概念介绍基本概念视频由一个个镜头所组成,镜头是时间上连续的若干幅帧图像组成的片段。当镜头发生转变时,会产生一些明显的变化,镜头边界检测依据这些变化来判断镜头是否发生转变。镜头发生转变时的边界帧,也称关键帧。镜头镜头边界检测基本概念视频由一个个镜头所组成,镜头是时间上连续的若干幅帧图基本概念镜头边界检测的基础是两个连续镜头的内容有较大的不同性,因此可以用定量的方法来确定帧序列之间的差别;如果这种差别超出了给定的阈值,就可以提取出镜头的边界(关键帧)基本概念镜头边界检测的基础是两个连续镜头的内容有较大的不同性关键帧短片截图的关键帧关键帧短片截图的关键帧02三种方法02三种方法
一帧本质就是一张图片,因此衡量两帧之间变化本质就是衡量两张图片的区别。在KNN算法中衡量两张图片之间相似度就是图片对应像素相减之和,将其累加,值最小的即最接近的两张图片。连续帧相减法中,我们同样使用这个指标来评价两张图片的近似度,一旦区别大到一定地步则认为该两帧是镜头边界。连续帧相减一帧本质就是一张图片,因此衡量两帧之间变化本质就是衡量算法原理:计算相邻两帧像素变化的数目。当超过设定的阈值时,即找到镜头的边界缺点:对摄像机运动敏感,如放缩、平移,往往较小的物体运动会造成很大的帧间差,从而容易导致误检测解决办法:通过滤波器的使用来降低。在比较一帧的每个像素前,用它的邻近区域的平均值来代替,这也过滤了输入图像的一些噪声。连续帧相减算法原理:计算相邻两帧像素变化的数目。当超过设定的阈值时,即图片演示相邻连续帧图片演示相邻连续帧图片演示图片演示直方图相减代码算法原理:统计相邻两帧中所有像素在不同灰度(颜色)上的分布差异,当差异的累加值超过阈值T时,即检测到镜头边界优点:对对象运动不敏感,因为直方图忽略了帧内的空间变化缺点:可能两个图像有类似的直方图但却是完全不同的内容。然而,这种事件的概率是足够低直方图相减代码算法原理:统计相邻两帧中所有像素在不同灰度(颜图片演示相邻两个帧图像帧图像灰度图灰度图直方图图片演示相邻两个帧图像帧图像灰度图灰度图直方图时空切片代码切片就是从连续的视频图像序列的同一个位置提取出的一行(列)像素组合而成的一幅二维图像。如果将视频看作是一个(x,y,t)三维图像序列,其中(x,y)为图像维,t为时间维,则视频的时空切片可以看作是由时间维与图像维构成的一幅二维图像。时空切片代码切片就是从连续的视频图像序列的同一个位置提取时空切片切片颜色和纹理纹理中包含有对应视频的大量信息,包括镜头切变点、摄像机的运动方式等因为单个镜头内部的视频帧在时间、空间和图像结构上是连续的,在时空切片上的表现就是颜色和纹理空间上的连续性。
镜头发生切换时,视频数据会跟着发生一系列的变化,表现在颜色差异突然增大、运动的不连续等,时空切片上的颜色和纹理也会表现出明显的不连续现象。时空切片切片颜色和纹理纹理中包含有对应视频的大量信息,镜头边缘检测课件03实验03实验连续帧相减代码实现连续帧相减代码实现直方图相减代码实现//imhist(i);直接显示图像i的灰度直方图;直方图相减代码实现//imhist(i);直接显示图像i直方图相减代码实现直方图相减少关键帧直方图相减代码实现直方图相减少关键帧时空切片代码实现intmain(intargc,char**argv){ //voidcutColSlide(CvMat*,CvMat*,int,int); //垂直切片 voidcutRowSlide(CvMat*,CvMat*,int,int); //水平切片 inti; intnFrmNum=0; inttotalFrmNum; //总帧数 char*videofile="G:/Makoto.mkv"; //声明IplImage指针 IplImage*pFrame=NULL; //视频帧 //IplImage*pSlImg_col; IplImage*pSlImg_row; //水平切片图像 CvMat*pFrameMat=NULL; //视频帧数据矩阵 CvMat*pFrMat_r=NULL; //前景数据 CvMat*pFrMat_g=NULL; CvMat*pFrMat_b=NULL; //CvMat*pSlMat_col; CvMat*pSlMat_row; //CvMat*pSlMat_col_r[COL_NUM+1]; //垂直切片数据矩阵 CvMat*pSlMat_row_r[ROW_NUM+1]; //水平切片数据矩阵 //CvMat*pSlMat_col_g[COL_NUM+1]; //垂直切片数据矩阵 CvMat*pSlMat_row_g[ROW_NUM+1]; //水平切片数据矩阵 //CvMat*pSlMat_col_b[COL_NUM+1]; //垂直切片数据矩阵 CvMat*pSlMat_row_b[ROW_NUM+1]; //水平切片数据矩阵 CvCapture*pCapture=NULL; //读取视频数据的指针 charfilename[50];时空切片代码实现intmain(intargc,cha时空切片代码实现//打开视频文件 if(!(pCapture=cvCaptureFromFile(videofile))) { fprintf(stderr,"Cannotopenvideofile%s\n",videofile); return-2; } //printf("StarttoreadingVideo!Andyouhavetobepatient!\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=cvCreateMat(totalFrmNum,pFrame->width,CV_32FC3); for(i=0;i<=ROW_NUM;i++) { pSlMat_row_r[i]=cvCreateMat(totalFrmNum,pFrame->width,CV_32FC1); pSlMat_row_g[i]=cvCreateMat(totalFrmNum,pFrame->width,CV_32FC1); pSlMat_row_b[i]=cvCreateMat(totalFrmNum,pFrame->width,CV_32FC1); }
时空切片代码实现//打开视频文件时空切片代码实现//初始化并分配图像空间和矩阵空间 pFrMat_r=cvCreateMat(pFrame->height,pFrame->width,CV_32FC1); 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,pFrMat_g,pFrMat_b,NULL); //切片 for(i=0;i<=ROW_NUM;i++){ cutRowSlide(pFrMat_r,pSlMat_row_r[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); cutRowSlide(pFrMat_g,pSlMat_row_g[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); cutRowSlide(pFrMat_b,pSlMat_row_b[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); }时空切片代码实现//初始化并分配图像空间和矩阵空间 时空切片代码实现//不是第一帧,正常处理 else { cvConvert(pFrame,pFrameMat); cvSmooth(pFrameMat,pFrameMat); cvSplit(pFrameMat,pFrMat_r,pFrMat_g,pFrMat_b,NULL); //切片 for(i=0;i<=ROW_NUM;i++){ cutRowSlide(pFrMat_r,pSlMat_row_r[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); cutRowSlide(pFrMat_g,pSlMat_row_g[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); cutRowSlide(pFrMat_b,pSlMat_row_b[i],i*(int(pFrame->height/ROW_NUM)),nFrmNum); }} } //printf("ReadingDone!\n"); printf("Numberofframes:%d.\n",totalFrmNum); // cvReleaseImage(&pFrame); cvReleaseMat(&pFrameMat); cvReleaseMat(&pFrMat_r); cvReleaseMat(&pFrMat_g); cvReleaseMat(&pFrMat_b); cvReleaseCapture(&pCapture); printf("Save\n");时空切片代码实现//不是第一帧,正常处理时空切片代码实现//保存切片图像 for(i=0;i<=ROW_NUM;i++){ cvMerge(pSlMat_row_r[i],pSlMat_row_g[i],pSlMat_row_b[i],NULL,pSlMat_row); cvConvert(pSlMat_row,pSlImg_row); sprintf(filename,"G://1.bmp",i); cvSaveImage(filename,pSlImg_row); }//释放图像和矩阵 cvReleaseImage(&pSlImg_row); cvReleaseMat(&pSlMat_row); for(i=0;i<=ROW_NUM;i++){ cvReleaseMat(&pSlMat_row_r[i]); cvReleaseMat(&pSlMat_row_g[i]); cvReleaseMat(&pSlMat_row_b[i]); }return0;}时空切片代码实现//保存切片图像时空切片代码实现voidcutRowSlide(CvMat*pFrameMat,CvMat*pSlMat_row,introw_ind,intnFrmNum)//完成行切片的工作//pFrameMat -要进行切片的帧数据//pSlMat_row -目标切片数据//col_ind - -当前帧在视频流中的下标{ CvMat*temp_row; //临时存放提取出的行数据 temp_row=cvCreateMat(1,pFrameMat->width,CV_32FC1); //初始化 if(row_ind==pFrameMat->height) row_ind--; cvGetRow(pFrameMat,temp_row,row_ind); //从当前帧中提取出第row_ind列 for(inti=0;i<pFrameMat->width;i++) //将提取出的行添加到切片 cvSet2D(pSlMat_row,nFrmNum-1,i,cvScalar(((float*)(temp_row->data.ptr))[i]));//图像切片行坐标 //nFrmNum cvReleaseMat(&temp_row);}时空切片代码实现voidcutRowSlide(CvMat时空切片代码实现intmain(){ constchar*pstrImageName="G://1.bmp"; constchar*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,NULL); cvConvert(Mat_src,pImage);//将矩阵数据转化为iplImage,以便显示 cvNamedWindow(pstrWindowsTitle,CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsTitle,pImage); cvWaitKey(); cvDestroyWindow(pstrWindowsTitle); cvReleaseImage(&pImage); return0;}时空切片代码实现intmain()时空切片代码实现voidDetect_row(CvMat*src,int*tagetframe){ intwidth=src->width; intheight=src->height; intv=0,sv=0; //v是第N帧的像素值,sv是第N-1帧的像素值 intd=5; //(-d,d)的领域边界值 list<int>Frame_list; //c++列表,用于存放检测到的突变镜头边界 intthreshold=20; //threshold;人为设定的阈值,|v-sv|>threshold表明两个像素差异大 doublepdiff_rate=0.50;//差异率;人为设定,在(-d,d)中差异点的比例; CvMat*Mat_row_r=cvCreateMat(height,width,CV_32FC1);//创建R通道矩阵用于存放R通道像素值,注意CV_32FC1的含义 CvMat*Mat_row_g=cvCreateMat(height,width,CV_32FC1); CvMat*Mat_row_b=cvCreateMat(height,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品牌资产评价师冲突管理能力考核试卷含答案
- 珍珠岩加工工岗前规章考核试卷含答案
- 平板显示膜涂布工岗前持续改进考核试卷含答案
- 裁剪服装制版师安全知识宣贯能力考核试卷含答案
- 野生动物疫病防治工岗前能力评估考核试卷含答案
- 煤焦车司机岗前保密考核试卷含答案
- 预见性护理与多学科合作
- 2026钣金件建模面试题及答案
- 2026百度竞价面试题及答案大全解析
- 分级护理的护士角色
- 面粉粉尘爆炸应急演练预案
- 烟化炉车间技术、安全及设备维护保养手册
- 国家OTC药品目录(全部品种)
- 2023学年完整公开课版东南亚4
- 川2020J146-TJ 建筑用轻质隔墙条板构造图集
- 空气预热器检修工艺标准
- 测井沉积相课件
- 安全生产组织架构
- 超前钻勘查工程合同
- 弱电智能化工程施工组织设计方案方案
- LY/T 1697-2007饰面木质墙板
评论
0/150
提交评论