C++ opencv基于帧差法的关键帧提取

读取视频

    VideoCapture cap;
	//视频路径
	cap.open("test.mp4");
	//如果视频不能正常打开则返回
	if (!cap.isOpened())
	{
		cout << "cannot open video!" << endl;
		return 0;
	}
	Mat frame_key;
	cap >> frame_key;
	//定义当前帧  frame_key=currentFrame
	long currentFrame = 1;
	if (frame_key.empty())
		cout << "frame_key is empty!" << endl;
	//显示视频
	imshow("fram_1", frame_key);
	waitKey(20);
	//把第一帧写入关键帧
	stringstream str;
	str << "./keyframe/" << currentFrame << ".jpg";
	imwrite(str.str(), frame_key);

定义一个循环,使得前一帧和当前帧进行对比

while (1)
	{
	    //定义后一帧  frame=currentFrame+1
		currentFrame++;
		Mat frame;
		cap >> frame;
		if (frame.empty())
		{
			//cout << "frame is empty!" << endl;
			break;
		}
		waitKey(20);
		Mat srcImage_base;
		Mat srcImage_test1;
		srcImage_base = frame_key;
		srcImage_test1 = frame;
        
		Mat previousImage, currentImage, resultImage;
		//将图像从BGR色彩空间转换到 HSV色彩空间
		cvtColor(srcImage_base, previousImage, COLOR_BGR2GRAY);
		cvtColor(srcImage_test1, currentImage, COLOR_BGR2GRAY);
		//帧差法,相减
		absdiff(currentImage, previousImage, resultImage);  
		//二值化,像素值相差大于20则置为255,其余为0。可以通过改变像素差值来调整视频关键帧
		threshold(resultImage, resultImage, 10, 255.0, THRESH_BINARY); 

		
		float counter = 0, num = 0;
		// 统计两帧相减后图像素
		for (int i = 0; i < resultImage.rows; i++)
		{
			//获取每一行的指针
			uchar *data = resultImage.ptr<uchar>(i); 
			for (int j = 0; j < resultImage.cols; j++)
			{
				//计算总像素个数
				num = num + 1;
				//访问到像素值
				if (data[j] == 255) 
				{
					//计算像素值变化的像素个数
					counter = counter + 1;
				}
			}
		}
		//p设置的阈值
		float p;
		p = counter / num;
		//阈值大于0.55是关键帧
		if (p > 0.55) 
		{
			frame_key = frame;
			cout << "正在写第" << currentFrame << "帧" << endl;
			//写入关键帧
			stringstream str;
			str << "./keyframe/" << currentFrame << ".jpg";
			imwrite(str.str(), frame_key);
		}
	}

完整代码项目

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值