您的位置:首页 > 科技 > 能源 > 创建外卖平台_网页搜索快捷方式_天津seo托管_seo云优化平台

创建外卖平台_网页搜索快捷方式_天津seo托管_seo云优化平台

2024/9/29 16:03:12 来源:https://blog.csdn.net/qq_55871320/article/details/142380527  浏览:    关键词:创建外卖平台_网页搜索快捷方式_天津seo托管_seo云优化平台
创建外卖平台_网页搜索快捷方式_天津seo托管_seo云优化平台

目录

  • OpenCV的Python接口
  • OpenCV基础知识
    • 读取和写入图像
    • 颜色空间
    • 显示图像及结果
  • 处理视频
    • 视频输入
    • 将视频读取到NumPy数组中
  • 跟踪
    • 光流
    • Lucas-Kanade算法

OpenCV的Python接口

目前,OpenCV 的Python 接口仍在发展,不过并不是所有的OpenCV组件都提供了相应的Python 接口。
OpenCV 2.3.1 版本实际上提供了两个Python 接口。旧的cv 模块使用OpenCV 内部数据类型,并且从NumPy 使用起来可能需要一些技巧。新的cv2 模块用到了NumPy 数组,并且使用起来更加直观1,可以通过以下方式导入新的cv2 模块:

import cv2

OpenCV基础知识

OpenCV 自带读取、写入图像函数以及矩阵操作和数学库。我们现在来看一些基本的组件及其使用方法

读取和写入图像

import cv2
# 读取图像
im = cv2.imread('empire.jpg')
h,w = im.shape[:2]
print h,w
# 保存图像
cv2.imwrite('result.png',im)

函数imread() 返回图像为一个标准的NumPy 数组,并且该函数能够处理很多不同格式的图像。如果你愿意,可以将该函数作为PIL 模块读取图像的备选方案。函数imwrite() 会根据文件后缀自动转换图像

颜色空间

在OpenCV 中,图像不是按传统的RGB 颜色通道,而是按BGR 顺序(即RGB 的倒序)存储的。读取图像时默认的是BGR,但是还有一些可用的转换函数。颜色空间的转换可以用函数cvColor() 来实现。例如,可以通过下面的方式将原图像转换成灰度图像:

im = cv2.imread('empire.jpg')
# 创建灰度图像
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

显示图像及结果

这个例子是从文件中读取一幅图像,并创建一个整数图像表示

import cv2
# 读取图像
im = cv2.imread('fisherman.jpg')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
# 计算积分图像
intim = cv2.integral(gray)
# 归一化并保存
intim = (255.0*intim) / intim.max()
cv2.imwrite('result.jpg',intim

这个例子从一个种子像素进行泛洪填充

import cv2
# 读取图像
filename = 'fisherman.jpg'
im = cv2.imread(filename)
h,w = im.shape[:2]
# 泛洪填充
diff = (6,6,6)
mask = zeros((h+2,w+2),uint8)
cv2.floodfill(im,mask,(10,10), (255,255,0),diff,diff)
# 在OpenCV 窗口中显示结果
cv2.imshow('flood fill',im)
cv2.waitKey()
# 保存结果
cv2.imwrite('result.jpg',im

结果如下所示
在这里插入图片描述
在该例中,对图像应用泛洪填充并在OpenCV 窗口中显示结果。waitKey() 函数一直处于暂停状态,直到有按键按下,此时窗口才会自动关闭。这里的floodfill() 函数获取(灰度或彩色)图像、一个掩膜(非零像素区域表明该区域不会被填充)、一个种子像素以及新的颜色值来代替下限和上限阈值差的泛洪像素。泛洪填充以种子像素为起始,只要能在阈值的差异范围内添加新的像素,泛洪填充就会持续扩展。

处理视频

单纯使用Python 来处理视频有些困难,因为需要考虑速度、编解码器、摄像机、操作系统和文件格式。目前还没有针对Python 的视频库,使用OpenCV 的Python 接口是唯一不错的选择。下面介绍几个基本示例

视频输入

OpenCV 能够很好地支持从摄像头读取视频。下面给出了一个捕获视频帧并在OpenCV 窗口中显示这些视频帧的完整例子:

import cv2
# 设置视频捕获
cap = cv2.VideoCapture(0)
while True:ret,im = cap.read()cv2.imshow('video test',im)key = cv2.waitKey(10)if key == 27:breakif key == ord(' '):cv2.imwrite('vid_result.jpg',im)

拓展上面的例子,将摄像头捕获的数据作为输入,并在OpenCV 窗口中实时显示经模糊的(彩色)图像

import cv2
# 设置视频捕获
cap = cv2.VideoCapture(0)
# 获取视频帧,应用高斯平滑,显示结果
while True:ret,im = cap.read()blur = cv2.GaussianBlur(im,(0,0),5)cv2.imshow('camera blur',blur)if cv2.waitKey(10) == 27:break

如果仅有一个摄像头与计算机相连接,那么该摄像头的id为0。read() 方法解码并返回下一视频帧,第一个变量ret 是一个判断视频帧是否成功读入的标志,第二个变量则是实际读入的图像数组。函数waitKey() 等待用户按键:如果按下的是Esc 键(ASCII 码是27)键,则退出应用;如果按下的是空格键,就保存该视频帧。
在这里插入图片描述
会得到本人在镜头前的画面。

将视频读取到NumPy数组中

使用OpenCV 可以从一个文件读取视频帧,并将其转换成NumPy 数组。下面是一个从摄像头捕获视频并将视频帧存储在一个NumPy 数组中的例子

import cv2
# 设置视频捕获
cap = cv2.VideoCapture(0)
frames = [ ]
# 获取帧,存储到数组中
while True:ret,im = cap.read()cv2.imshow('video',im)frames.append(im)if cv2.waitKey(10) == 27:break
frames = array(frames)
# 检查尺寸
print im.shape
print frames.shap

会得到一幅作者在镜头前的画面(这里不展示),上述代码将每一视频帧数组添加到列表末,直到捕获结束。最终得到的数组会有帧数、帧高、帧宽及颜色通道数(3 个),打印出的结果如下
在这里插入图片描述

跟踪

跟踪是在图像序列或视频里对其中的目标进行跟踪的过程。

光流

光流是目标、场景或摄像机在连续两帧图像间运动时造成的目标的运动。它是图像在平移过程中的二维矢量场。作为一种经典并深入研究了的方法,它在诸如视频压缩、运动估计、目标跟踪和图像分割等计算机视觉中得到了广泛的应用。
光流法主要依赖于三个假设。
(1) 亮度恒定: 图像中目标的像素强度在连续帧之间不会发生变化。
(2) 时间规律 :相邻帧之间的时间足够短,以至于在考虑运行变化时可以忽略它们之间的差异。该假 设用于导出下面的核心方程。
(3) 空间一致性 :相邻像素具有相似的运动。

import cv2
def draw_flow(im,flow,step=16):""" 在间隔分开的像素采样点处绘制光流"""h,w = im.shape[:2]y,x = mgrid[step/2:h:step,step/2:w:step].reshape(2,-1)fx,fy = flow[y,x].T# 创建线的终点lines = vstack([x,y,x+fx,y+fy]).T.reshape(-1,2,2)lines = int32(lines)# 创建图像并绘制vis = cv2.cvtColor(im,cv2.COLOR_GRAY2BGR)for (x1,y1),(x2,y2) in lines:cv2.line(vis,(x1,y1),(x2,y2),(0,255,0),1)cv2.circle(vis,(x1,y1),1,(0,255,0), -1)return vis
# 设置视频捕获
cap = cv2.VideoCapture(0)
ret,im = cap.read()
prev_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
while True:# 获取灰度图像ret,im = cap.read()gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)# 计算流flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,None,0.5,3,15,3,5,1.2,0)prev_gray = gray# 画出流矢量cv2.imshow('Optical flow',draw_flow(gray,flow))if cv2.waitKey(10) == 27:break

结果如下图所示,圆环网格表示流样本的位置,带有线条的流矢量显示了每个样本点是怎样运动的。
在这里插入图片描述

Lucas-Kanade算法

跟踪最基本的形式是跟随感兴趣点,比如角点。对此,一次流行的算法是Lucas-Kanade 跟踪算法,它利用了稀疏光流算法。Lucas-Kanade 跟踪算法可以应用于任何一种特征,不过通常使用一些角点,比如Harris 角点,角点是结构张量(Harris 矩阵)中有两个较大特征值的那些点,且更小的特征值要大于某个阈值。下面介绍一个利用相关函数建立一个Python跟踪类的过程:

import cv2
# 一些常数及默认参数
lk_params = dict(winSize=(15,15),maxLevel=2,criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT,10,0.03))
subpix_params = dict(zeroZone=(-1,-1),winSize=(10,10),criteria = (cv2.TERM_CRITERIA_COUNT | cv2.TERM_CRITERIA_EPS,20,0.03))
feature_params = dict(maxCorners=500,qualityLevel=0.01,minDistance=10)
class LKTracker(object):"""  用金字塔光流Lucas-Kanade 跟踪类"""
def __init__(self,imnames):""" 使用图像名称列表初始化"""self.imnames = imnamesself.features = []self.tracks = []self.current_frame = 0def detect_points(self):""" 利用子像素精确度在当前帧中检测“利于跟踪的好的特征”( 角点) """# 载入图像并创建灰度图像self.image = cv2.imread(self.imnames[self.current_frame])self.gray = cv2.cvtColor(self.image,cv2.COLOR_BGR2GRAY)# 搜索好的特征点features = cv2.goodFeaturesToTrack(self.gray, **feature_params)# 提炼角点位置cv2.cornerSubPix(self.gray,features, **subpix_params)self.features = featuresself.tracks = [[p] for p in features.reshape((-1,2))]self.prev_gray = self.gradef track_points(self):""" 跟踪检测到的特征""" if self.features != []:self.step() # 移到下一帧# 载入图像并创建灰度图像self.image = cv2.imread(self.imnames[self.current_frame])self.gray = cv2.cvtColor(self.image,cv2.COLOR_BGR2GRAY)#reshape() 操作,以适应输入格式tmp = float32(self.features).reshape(-1, 1, 2)# 计算光流features,status,track_error = cv2.calcOpticalFlowPyrLK(self.prev_gray,self.gray,tmp,None,**lk_params)# 去除丢失的点self.features = [p for (st,p) in zip(status,features) if st]# 从丢失的点清楚跟踪轨迹features = array(features).reshape((-1,2))for i,f in enumerate(features):self.tracks[i].append(f)ndx = [i for (i,st) in enumerate(status) if not st]ndx.reverse()# 从后面移除for i in ndx:self.tracks.pop(i) self.prev_gray = self.graydef step(self,framenbr=None):""" 移到下一帧。如果没有给定参数,直接移到下一帧"""if framenbr is None:self.current_frame = (self.current_frame + 1) % len(self.imnames)else:self.current_frame = framenbr % len(self.imnames)def draw(self):""" 用OpenCV 自带的画图函数画出当前图像及跟踪点,按任意键关闭窗口""" # 用绿色圆圈画出跟踪点for point in self.features:cv2.circle(self.image,(int(point[0][0]),int(point[0][1])),3,(0,255,0),-1)cv2.imshow('LKtrack',self.image)cv2.waitKey()

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com