python opencv之SURF算法示例_python

来源:脚本之家  责任编辑:小易  

你好,下面是相应的一个2113代码,你可以参考5261一下:import cv2import os# 先导入openCV# 将一个长的视4102频缩短,按照比1653例缩短,只保存其中的一部分# 如下面代码就是将一个长视频每10秒取10秒,合并成一个短视频cap = cv2.VideoCapture('myvideo.avi')if not cap.isOpened():    print('video is not opened')else:    # 每秒25帧    num = 0    # 取10秒    needTime = 250    # 每10秒    timeSpace = 250    # 获取视频帧率    fps = cap.get(cv2.CAP_PROP_FPS)    # AVI格式编码输出XVID    videoWriter = cv2.VideoWriter('result//resultVideo_2.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,frameSize=(320,288))    while(1):        success,frame = cap.read()        if (num%timeSpace <= needTime):            videoWriter.write(frame)            print('write'+ str(num))        num = num + 1        if not success:            print('finished')            break        if cv2.waitKey(100) & 0xFF == ord('q'):            break    cap.release()更多追问追答追问这种我知道,但是这样只能截取前10秒的视频保存,我想知道的是每10秒截取一次保存,最后不足10秒的保存追答这个就是这样的呀,其实它就是按每秒25帧来计算出来10秒需要250帧。然后每250帧进行一次切割。追问我试了的,第一个10秒切割以后并不用继续切割第二个10秒没有追答我修改了一下,你再试试import cv2import oscap = cv2.VideoCapture('myvideo.avi')if not cap.isOpened():    print('video is not opened')else:    # 每秒25帧    num = 0    # 取10秒    needTime = 250    # 每10秒    timeSpace = 250    # 获取视频帧率    fps = cap.get(cv2.CAP_PROP_FPS)    # AVI格式编码输出XVID    videoWriter = cv2.VideoWriter('result//resultVideo_2.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,frameSize=(320,288))    while(1):        success,frame = cap.read()        if (num%timeSpace <= needTime):             if (num%timeSpace ==0):                yy = str(num/timeSpace)                fileName = "result//resultVideo_2_"+yy+".avi"                videoWriter = cv2.VideoWriter(fileName,cv2.VideoWriter_fourcc('X','V','I','D'),fps,frameSize=(320,288))                 videoWriter.write(frame)            print('write'+ str(num))        num = num + 1        if not success:            print('finished')            break        if cv2.waitKey(100) & 0xFF == ord('q'):            break    cap.release()www.zgxue.com防采集请勿采集本网。

本文介绍了python opencv之SURF算法示例,分享给大家,具体如下:

谁有opencv python版本的将长视频分成10S一段的短视频 谢谢大佬. 谢谢大佬 展开 我来答 rogging 来自娱乐休闲类芝麻团 2019-03-04 rogging 采纳数:1758 获赞数:2387 LV

目标:

    SURF算法基础 opencv总SURF算法的使用

python-opencv - Python bindings for the computer vision library python2.3-opencv - Python bindings for the computer vision library 在这里,OpenCV的库CxCore和Cv都被包含入De

原理:

上节课使用了SIFT算法,当时这种算法效率不高,需要更快速的算法。在06年有人提出了SURF算法“加速稳定特征”,从名字上来看,他是SIFT算法的加速版本。

python opencv 显示图片未响应 python 2.7.10 opencv2 img = cv2.imread( c:\canny22.bmp ) img.shape (600, 600, 3) cv2.namedWindow( Image ) cv2.imshow( Image , img) 用鼠

(原文)

在SIFT算法当中使用高斯差分方程(Difference of Gaussian)对高斯拉普拉斯方程( Laplacian of Gaussian)进行近似。然而,SURF使用盒子滤波器进行近似,下面的图片显示了这种近似的方法。在进行卷积计算的时候可以利用积分图像,这是使用盒子形滤波器的一个优点,即计算某个窗口中的像素和的时候,计算量大小,也就是时间复杂度不受到窗口大小的影响。而且,这种运算可以在不用的尺度空间当中实现。

用的 opencv 先灰度模糊,再二值化,找到图形轮廓最后确定中心点·~

SURF算法计算关键点的尺度和位置信息使用Hessian矩阵实现。

百度知道官方认证企业 2018-11-04 腾讯电脑管家 腾讯电脑管家是腾讯公司推出的免费 //注:《学习OpenCV》中此处用cvCreateCameraCapture为错 else { capture=cvCreateF

(解释)

文中的高斯拉普拉斯方程(算子)是检测图像中斑点的一种十分常用的方法。以一维高斯函数来检测一维信号中的斑点为例。有一维信号f,高斯函数的一阶导数ddxg" role="presentation">,信号与高斯函数的一阶导数卷积后,会在边缘处出现极值。如图:

这里写图片描述 

上面图片是在一维情况下,使用高斯函数的一阶导数的情况,另一种方法是使用高斯函数的二阶导数与信号进行卷积,高斯函数的二阶导数也叫做拉普拉斯变换。

但是,在一维信号斑点检测的实际情况当中,一个斑点可以考虑成是两个相邻的跳突组成,如下图。

这里写图片描述 

类似于在图像当中,一个轮胎可以当成一个斑点,一个苍蝇也可以当成一个斑点。但是在使用高斯函数的二阶导数来检测斑点的时候,使用不同的高斯核(就是方差)运算不同大小的斑点时,计算出来的极值,即响应值会出现衰减。

此时,需要将高斯函数的二阶导数进行正规化,去除方差值不同导致响应值出现的衰减。

以上,是一维高斯函数检测一维信号的原理。二维的图像信号,使用二维高斯函数来检测斑点原理基本相同,此处的二维高斯函数的二阶导数,就叫做高斯拉普拉斯算子也就是LOG,通过改变不同的方差值,可以检测不同尺寸的二维斑点,如图。

这里写图片描述

文中的高斯差分方程是SIFT算法当中,发明者想要利用两个相邻高斯尺度空间的图像相减来得到一个LOG的近似,因为这样做可以节省时间,而且可以控制精度变化,类似于高等数学当中泰勒公式那玩意-_- 。关于SIFT原理可以看上一篇博客

文中提到的积分图像实际上原理非常简单,类似递推方程。积分图像的目的是想建立一个函数,能够快速得到一个矩形图像区域当中所有像素值的和是多少。那么,设p(i,j)" role="presentation">表示从(0,0)" role="presentation">点到(i,j)" role="presentation">点的所有像素的和是多少,存储在p(i,j)" role="presentation">这个数组里面,如果想要获得W区域的像素和是多少,如图,只要计算p(i4,j4)&#x2212;p(i2,j2)&#x2212;p(i3,j3)+p(i1,j1)" role="presentation">即可。

这里写图片描述 

如何求得p(i,j)" role="presentation">? 递推公式为,p(i,j)=p(i&#x2212;1,j)+p(i,j&#x2212;1)+I(i,j)&#x2212;p(i&#x2212;1,j&#x2212;1)" role="presentation">,这里面I(i,j)" role="presentation">表示像素点(i,j)" role="presentation">处的像素值。

文中提到的Hessian矩阵,学过数学分析、最优化、机器学习之类的人肯定对这玩意非常熟悉,实际上黑塞矩阵就是一个多元函数的二阶偏导数构成的方阵,它的行列式值(Determinant of Hessian )可以反映的局部结构信息,简称DOH。与LOG类似,DOH可以使用不同方差生成高斯函数对各个元的二阶偏导模板,以此来对图像进行卷积运算。 同样,DOH也会在卷积后的函数中,得到对图像信号斑点极值的响应。如图

这里写图片描述

在SURF算法当中,黑塞矩阵中的L,即为二维高斯函数与图像的卷积,求得黑塞矩阵后,会得到如图。

这里写图片描述

将上面得到的模板与图像的卷积转换为盒子滤波器,这里使用原文中的图像,如图。

这里写图片描述

得到三个不同的盒子滤波器以后,对其进行近似和简化操作,并用其表示图像中某点的斑点响应值,遍历图像当中的所有像素,就得到了在某一尺度下斑点检测的响应图像。然后,利用不同的模板尺寸,获取多尺度斑点响应金字塔,在金字塔中搜索极值点,下面的操作就和SIFT算法类似了。

(原文)

为了给找到的特征点赋予方向,以特征点为中心,6s为半径获取水平和垂直小波响应运算结果,这里s是特征点尺度,同时使用高斯加权的方法。然后,他们会被绘制在如下图当中。其中,特征点的主方向估计运算是有一个弧度为60的扇形窗口,在滑动的过程中不断计算其中的响应值之和。有趣的是,小波响应值在任意尺度下使用积分图像很容易被获取。但是在多数情况下,旋转不变性不是必须的,可以代码当中将这一步取消,这样还能够提高算法计算速度,而且在+-15度的情况也保持稳定,此时该方法称作 U-SURF。用户可以设置upright参数,当参数为0计算方向,参数为1不计算方向。

这里写图片描述

对于特征点描述的建立,SURF再一次使用Haar小波响应,同时使用积分图像使操作变得简单。在一个矩形区域当中,以特征点为中心,划取周围20s×20s区域的大小,以特征点为原点,主方向为横轴,分成四个子区域,每个子区域使用2s的Haar小波响应,对于每个子区域,获取一个向量,记录垂直、水平方向上的小波响应值,如图。

这里写图片描述 

这个特征描述符的长度使64,降低维度可以加速计算,又可以区分特征。为了更好的区分特征点,SURF还使用了长度为128特征描述符。当dy小于0或者大于0时,计算dx或|dx|的和。同样,根据dx的符号计算不同的dy和。因此能够获得双倍的特征。计算复杂度也不会增加。opencv当中的extended参数为0或1时分别对应64和128的特征。

另外一个重要的改善是对潜在的兴趣点使用了拉普拉斯算子符号(黑塞矩阵的迹)。由于之前的计算已经完成对黑塞矩阵的构造,所以这步不会增加复杂度。

拉普拉斯符号在不同明暗背景下区分不同亮度的斑点,在匹配阶段,我们只需要比较拥有相同对比度的特征是否匹配即可,这样加快了计算速度,如图。

这里写图片描述 

SURF算法的速度是SIFT速度的3倍,善于处理模糊和旋转的图像,但是不善于处理视角变化和关照变化。

(解释)

文中的小波响应运算,全称是haar小波运算。这里使用haar小波目的是为了获取图像梯度,使用之前计算好的图像积分结果,这样能够提高计算速度。与SIFT算法类似,在对每个特征点获取主方向时,使用原文中提到的一个π/3大小的扇形窗口,同时以0.2弧度为步长旋转滑动此窗口,在每个窗口当中对的haar响应值的水平方向,垂直方向进行累加。由于时使用一个圆形区域,转换成类似极坐标矢量的方式来表示,每个窗口中的结果(mw,&#x03B8;w)" role="presentation">,如图。

这里写图片描述

主方向最大Haar响应值累加对应的方向。其中,如果除了主方向,还有其它方向的响应累加值较大,算法当中还会额外添加一个特征点,并赋予另外一个次大方向。

文中建立的特征描述符顾名思义,就是描述一个特征点的一组向量,里面唯一确定了一个特征。SURF获取主方向后,需要获取特征点描述子。以特征点为原点,主方向为横轴建立一个二维坐标系,区域大小是20s×20s,分成是个之块,每个子块利用2s的haar模板进行响应计算。然后统计&#x03A3;dx&#x3001;&#x03A3;|dx|&#x3001;&#x03A3;dy&#x3001;&#x03A3;|dy|" role="presentation">,每个20s的窗口分成4×4的子窗口,每个子窗口中又5s×5s个像元。如图

这里写图片描述 

又4×4个子块,每个子块里面记录四个值,所以描述子一共又4×4×4=64个特征。

最后将沿着主方向的小波响应值扭转过来,原理就是简单的旋转矩阵。

代码部分

opencv里面提供的SURF算法和SIFT差不多,这两个玩意都是受到版权保护的,如果你是用pip 一条命令安装的opencv,那么恭喜你用不了SURF和SIFT算法,印象中只有2.4.9版本的opencv库才可以使用。

不过,办法还是有的,再控制台当中输入pip install opencv-contrib-python 就可以用了。

如果还是无法安装,可以直接网站早opencv-contrib-python的轮子,然后放到对应的文件下安装就行了。

我的版本是opencv 3.2,和教程文档中的使用方法不同。

详细参数可以自己去查一查,一查一个准的

https://docs.opencv.org/master/d5/df7/classcv_1_1xfeatures2d_1_1SURF.html

import cv2 import numpy as np img = cv2.imread('feng.jpg')#参数为hessian矩阵的阈值surf = cv2.xfeatures2d.SURF_create(400)#找到关键点和描述符key_query,desc_query = surf.detectAndCompute(img,None)#把特征点标记到图片上img=cv2.drawKeypoints(img,key_query,img)cv2.imshow('sp',img)cv2.waitKey(0)

这里写图片描述

凤的嘴上特征点占了这么多,辨识度还是蛮高的~ -_-|||

下面是设置方向,和输出一些值的方法

import cv2 import numpy as np img = cv2.imread('feng.jpg')#参数为hessian矩阵的阈值surf = cv2.xfeatures2d.SURF_create(4000)#设置是否要检测方向surf.setUpright(True)#输出设置值print(surf.getUpright())#找到关键点和描述符key_query,desc_query = surf.detectAndCompute(img,None)img=cv2.drawKeypoints(img,key_query,img)#输出描述符的个数print(surf.descriptorSize())cv2.imshow('sp',img)cv2.waitKey(0)

0.下载安装Opencv,当前版本为249.1.下载Python,当前OPencv版本为249,不过其支持的最新版本的Python为2.7,所以可以下载276版本。2.下载numpy,下载最新的1.8.1版本。3.将Opencv安装目录下opencv\\build\\python\\2.7\\x86中的cv2.pyd复制到python安装目录Lib\\site-packages下。4.找到opencv源文件内的draw.py运行。如果你认可我的回答,请及时点击【采纳为满意回答】按钮手机提问的朋友在客户端右上角评价点【满意】即可。你的采纳是我前进的动力O(∩_∩)O,记得好评和采纳,互相帮助,谢谢内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • django unittest 设置跳过某些case的方法
  • pyqtgraph在pyqt中的应用及安装过程
  • python实现确认字符串是否包含指定字符串的实例
  • 利用pyinstaller将python程序.py转为.exe的方法详解
  • 实例探究python以并发方式编写高性能端口扫描器的方法
  • django处理文件上传file uploads的实例
  • python创建关联数组(字典)的方法
  • python实现接口并发测试脚本
  • 深入解析python编程中super关键字的用法
  • python爬虫框架scrapy实现模拟登录操作示例
  • 如何在Python中使用OpenCV的
  • python如何用opencv把一个视频按每10秒一小段切下来
  • 怎么用python opencv连线画图?
  • 基于python的opencv学习——copyMakeBorder()函数
  • 谁有opencv python 版本的将长视频分成10S一段的短视频
  • Python写opencv报错No module named 'video'
  • python opencv 显示图片未响应
  • Python Opencv中对图像的reshape(1,48,48,1)转换的意思
  • python opencv 在使用从cv2 时后面的东西跳不出来,用imread 还有...
  • opencv 的python 问题
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页django unittest 设置跳过某些case的方法pyqtgraph在pyqt中的应用及安装过程python实现确认字符串是否包含指定字符串的实例利用pyinstaller将python程序.py转为.exe的方法详解实例探究python以并发方式编写高性能端口扫描器的方法django处理文件上传file uploads的实例python创建关联数组(字典)的方法python实现接口并发测试脚本深入解析python编程中super关键字的用法python爬虫框架scrapy实现模拟登录操作示例python入门教程 超详细1小时学会python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解pycharm 使用心得(一)安装和首python strip()函数 介绍python 中文乱码问题深入分析python中使用xlrd、xlwt操作excepython科学计算环境推荐——anacpython逐行读取文件内容的三种方django中的forms组件实例详解python输出汉字字库及将文字转换为图片的python使用cpickle模块序列化实例matlab灰度图像调整及imadjust函数的用法使用python的dataframe取两列时间值相差一python使用opencv读取图片的实例解析python的缩进规则的使用python通过调用有道翻译api实现翻译功能示python生成密码库功能示例用python给文本创立向量空间模型的教程
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved