opencv视频边界检测,哪个大神知道这是什么算法啊啊啊,好急

问题描述

opencv视频边界检测,哪个大神知道这是什么算法啊啊啊,好急

#include "cv.h"
#include "highgui.h"
#include
#include
#include
using namespace std;

int window=15;

float LimenValue(float *comhist,int num)//阈值
{
float mean = 0;
float sum = 0;
float T;
float max;
float min;
float mmax = 0;
float mmin = 0;
float summin = 0;
float summax = 0;
float mincount = 0;
float maxcount = 0;
float median;
float factor = 4;
int i = 0;
max = comhist [num];
min = comhist [num];

for( i = 0;i<window;i++)
{
    sum +=comhist[num+i];
    if(comhist[num+i]>max)
    {
        max = comhist[num+i];
    }
    if(comhist[num+i]<min)
    {
        min = comhist[num+i];
    }
}
mean = sum / window;
median = (max +min) / 2;

//计算大小两集合均值
for (i = 0;i< window;i++)
{
    if (comhist[num+i] <= median)
    {
        summin +=comhist[num+i];
        mincount++;
    }
    else
    {
        summax +=comhist[num+i];
        maxcount++;
    }
}
mmin = summin / mincount;
mmax = summax / maxcount;

//计算是否有突变,返回阈值
if(fabs(mmax-mmin)>(factor*mean))    //如果 |mmax - mmin | > (Factor*mean)为真
    T = (mmin+mmax * 2) / 3;        //T = (mmin + mmax * 2) / 3作为阈值
else
    T = max + 10;
return T;

}

float LimenValue2(float * comhist, int num1, int num2)
{
float avervalue = 0; //均值
float variance = 0; //方差
float sum = 0; //和
float squaresum = 0; //差值平方的和x
float limen;
int num = num2 - num1 + 1;
for(int i = num1; i<= num2; i++)
{
sum += comhist[i];
squaresum += comhist[i] * comhist[i];
}
avervalue = sum / num;
variance = squaresum / num - avervalue*avervalue;
limen = avervalue + 30*variance;
return limen;
}

int main(int argc, char** argv)
{
CvCapture * capture = NULL; //设置读取视频数据的指针

IplImage * Frame = NULL;
IplImage * preFrame = NULL;    //前一帧
IplImage * frame1 = NULL;
IplImage * frame2 =NULL;
int HistogramBins = 256;
float HistogramRange1[2] = {0,255};
float * HistogramRange[1] = {&HistogramRange1[0]};

char * aviname = "F://视频//2.MP4";     //输入视频
char filename[3000];                     //保存图片时用的变量

int totalFrmNum;                       //总帧数
int nFrmNum = 0;

float * pCompareHist;                  //存放所有相邻帧间直方图差值的指针

int * sceneframe;                      //镜头突变处,后一镜头第一帧表示//int * keyframe;

float fLimenValue;                     //阈值
float fLimenValue2;

int scenecount = 0;

cvNamedWindow("新闻视频",CV_WINDOW_AUTOSIZE);//读入视频
capture = cvCaptureFromAVI(aviname);
totalFrmNum =(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT)-1;

if(!capture)
{
    fprintf(stderr,"Could not initialize capturing...n");
    return -1;
}

while(Frame = cvQueryFrame( capture))
{
    sprintf(filename,"allframe/%d.jpg",nFrmNum);
    cvSaveImage(filename, Frame);
    nFrmNum++;

    cvShowImage("新闻视频",Frame);

     cvWaitKey(5) ;

}
cvReleaseCapture(&capture);
cvDestroyWindow("新闻视频");

//创建直方图
CvHistogram*Histogram=cvCreateHist(1,&HistogramBins,CV_HIST_ARRAY,HistogramRange);
CvHistogram*Histogram2=cvCreateHist(1,&HistogramBins,CV_HIST_ARRAY,HistogramRange);

//计算相邻帧间直方图差值
pCompareHist = new float [totalFrmNum];
float CompareHist = 0;
pCompareHist[0] = 0;

capture = cvCaptureFromAVI(aviname);
nFrmNum = 0;
while (Frame = cvQueryFrame(capture))
{
    if (nFrmNum==0)
    {
        frame1 = cvCreateImage(cvSize(Frame->width,Frame->height),IPL_DEPTH_8U,1);
        frame2 = cvCreateImage(cvSize(Frame->width,Frame->height),IPL_DEPTH_8U,1);

    }
    else if(nFrmNum > 1)
    {
        cvCvtColor(Frame,frame1,CV_BGR2GRAY);
        cvCvtColor(preFrame,frame2,CV_BGR2GRAY);

        cvCalcHist(&frame1,Histogram,0,0);//计算当前帧的直方图
        cvCalcHist(&frame2,Histogram2,0,0);//计算前一帧的直方图

        //直方图归一化
        cvNormalizeHist(Histogram,1);
        cvNormalizeHist(Histogram2,1);

        //计算当前帧与前一帧的直方图差
        CompareHist = (float)cvCompareHist(Histogram,Histogram2,CV_COMP_CHISQR);
        pCompareHist[nFrmNum-1] = CompareHist;
    }
    preFrame = cvCloneImage(Frame);
    nFrmNum++;
}
//释放图像和矩阵
cvReleaseCapture(&capture);
cvReleaseImage(&Frame);
cvReleaseImage(&frame1);
cvReleaseImage(&frame2);
cvReleaseHist(&Histogram);
cvReleaseHist(&Histogram2);

printf("镜头突变处帧:n");
sceneframe = new int[totalFrmNum];

//计算突变帧
for (int i = 0; i < (totalFrmNum - (totalFrmNum%window));)

{
    fLimenValue = LimenValue(pCompareHist,1);
    for (int j = 0; j < window; j++)
    {
        if (pCompareHist[i+j] > fLimenValue)
        {
            printf("%d,",i+j+1);
            /*cvNamedWindow("突变帧",CV_WINDOW_AUTOSIZE);
        cvShowImage("突变帧",sceneframe);
        cvDestroyWindow("突变帧");
        cvReleaseImage;*/
            sceneframe[scenecount] = i+j+1;
            scenecount++;
        }
    }
    i +=window;
}
scenecount++;

//保存pCompareHist数组到CompareHist.txt文件中
//保存sceneframe数组到SceneFrame.txt文件中

fstream out1;
out1.open("CompareHist.txt",ios::out);
if (!out1)
{
    cerr<<"CompareHist.txt can not open.n";
    abort();
}
for (int i = 0; i < totalFrmNum; i++)
{
    out1<<pCompareHist[i];
    out1<<"n";
}
out1.close();
out1.open("ScenceFrame.txt",ios::out);
if (!out1)
{
    cerr<<"ScenceFrame.txt can not open.n";
    abort();
}
for (int i = 0; i < scenecount-1; i++)
{
    out1<<sceneframe[i];
    out1<<"n";
}
out1.close();

//保存突变帧
int count = 0;
nFrmNum = 0;
capture = cvCreateFileCapture(aviname);
while (Frame = cvQueryFrame( capture))
{
    if (nFrmNum == sceneframe[count])
    {
        sprintf(filename,"sceneframe/%d.jpg",nFrmNum);
        cvSaveImage(filename, Frame);
        count++;
    }
    nFrmNum++;
}

cvReleaseCapture(&capture);

解决方案

这个就是通过灰度直方图判断两个图片(相邻的帧)的差异,差异大说明切换了。

时间: 2024-10-03 23:44:21

opencv视频边界检测,哪个大神知道这是什么算法啊啊啊,好急的相关文章

图转换为视频-C# 如何中ffmpeg将指定文件夹中的图片转换为视频(求大神指点)

问题描述 C# 如何中ffmpeg将指定文件夹中的图片转换为视频(求大神指点) C# 如何中ffmpeg将指定文件夹中的图片转换为视频 如题,求命令格式,和详细的命令.

怎么进行播放视频,求大神急救

问题描述 怎么进行播放视频,求大神急救 /usr/local/teacher_courseware/2013/10/11/Wildlife.wmv 服务器上的路径不能播放.需要怎么转换.求高手解救

cifar10-那位caffe大神,帮忙看看这是什么问题,急求

问题描述 那位caffe大神,帮忙看看这是什么问题,急求 caffe里cifar10运行自己的图片库时出现的问题,不知道怎样解决,帮忙看看!谢谢谢谢 解决方案 cuda的驱动版本太低了. 解决方案二: 先运行一次CUDA再来试试跑这个! 解决方案三: 我之前出现这问题是因为显卡驱动装了当时的最新版352的...后来重装成旧版346的就可以了...你可以试试看...装完驱动之后跑一下CUDA SAMPLE能跑才说明你安装CUDA成功...

unity3D 求大神帮忙指点!!!!!!急急急

问题描述 unity3D 求大神帮忙指点!!!!!!急急急 unity场景里有三个cube 在plan上 选中其中一个后:在plan上点哪里选中的cube 就去那里!! 我不会的地方就是 这个选中的部分 !!!和选中后如何连接寻路那个script的地方!!麻烦大神指点!!!!! 解决方案 先用射线找到点到的那个物体 具体代码 RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physi

各位大神,可用于推荐算法功能的图模型都有哪些?

问题描述 各位大神,可用于推荐算法功能的图模型都有哪些? 二部图是不是图模型的一种?提前谢谢各位前辈的指导!比如微博中好友推荐,或者淘宝的产品推荐

选择方向!-大神,大神,看过来。求解,求解。急,急,急

问题描述 大神,大神,看过来.求解,求解.急,急,急 本来学习java,哪位大神可否指点指点该如何选择啊?哪个方向对以后影响更大? 解决方案 选手机软件开发跟JEE吧或者jsp 解决方案二: jee吧 这个还是不错的 解决方案三: 手机开发也很热目前感觉应该不错 解决方案四: 题主你好,我大学学的是网络工程,虽然跟你的软件工程不太一样,不过还是挺像的. 我们当时的方向有:网络安全方向,硬件方向和软件方向. 专业100多人毕业后有一半从事的是跟专业不相关的职业或考研,剩下的一些一小部分从事运维,还

spring mvc-Spring web MVC问题,麻烦大神们帮忙看看哪里出错了?很急很急!!!!谢谢啦

问题描述 Spring web MVC问题,麻烦大神们帮忙看看哪里出错了?很急很急!!!!谢谢啦 报错日志: java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.(Unknown Source) at org.springframework.asm.ClassReader.(Unknown Source) at org.springframework.asm.ClassReader.(Unknown

方法-大神看过来,基础算法判断

问题描述 大神看过来,基础算法判断 基础算法类型的校验 _mName 方法名 比如 加法 减法 乘法 除法 _paraValueType 各参数类型名 长度 速度 经纬度 return 校验的错误结果 逻辑:判断方法: 1)参数无单位:正确 这个完成了 2) 必须类型相同的方法;加法,减法 列出 2)其它只有一个有单位时:必须是第一个参数 3) 固定关系:列出 public string ParaCheck(string _mName,List _paraValueType) { if(_par

c++ opencv 分裂合并-求大神帮忙把代码改成调用opencv库的,谢谢。

问题描述 求大神帮忙把代码改成调用opencv库的,谢谢. include using namespace std; #include //需要使用堆栈,对堆栈进行操作 #include "conio.h" include "viLib.h" // 包含头文件 pragma comment( lib, "viLib.lib" ) // 包含viLib.lib库 include "viImage.h" // 包含头文件 prag