Python爬虫新手进阶版:怎样读取非结构化、图像、视频、语音数据

通过open读取之后会返回一个图像文件对象,后续所有的图像处理都基于该对象进行。上述代码执行后,通过 img.show() 会调用系统默认的图像浏览器查看打开图像进行查看。如图所示。

该对象包含了很多方法可以用来打印输出文件的属性,例如尺寸、格式、色彩模式等。


print (‘img format: ‘, img.format) # 打印图像格式

print (‘img size: ‘, img.size) # 打印图像尺寸

print (‘img mode: ‘, img.mode) # 打印图像色彩模式

上述代码执行后返回的结果如下:

  • RGB:自然界中所有的颜色都几乎可以用红、绿、蓝这三种颜色波长的不同强度组合得到,这种颜色模式在数字显示领域非常流行。
  • CMYK:这是一种工业四色印刷的亚兰瑟标准,四个字母分别指代青(Cyan)、洋红(Magenta)、黄(Yellow)、黑(Black)。
  • HSB:这种模式使用色泽(Hue)、饱和度(Saturation)和亮度(Brightness)来表达颜色的要素,这种模式更多基于人类心理的认识和感觉。
  • 其他模式:其他模式还包括灰度模式、索引模式、位图模式等,也在一定场景下较为常见。

除此以外,基于该文件对象也可以进行其他操作,例如图像格式转换、旋转、裁剪、合并、滤波处理、色彩处理、缩略图处理等。限于篇幅,在此不作过多介绍。

2. 使用OpenCV读取图像

OpenCV读取和展示图像主要有两类方法,第一种是使用cv库,第二种是使用cv2库。

第一种:使用cv读取图像

语法


cv2.imread(filename[, flags])

描述

读取图像内容,如果图像无法读取则返回空信息,支持图像格式几乎包括了日常所有场景下的格式,具体包括:

  • Windows bitmaps文件:*.bmp、*.dib
  • JPEG文件:*.jpeg、*.jpg、*.jpe
  • JPEG 2000文件:*.jp2
  • PNG文件:*.png
  • WebP文件:*.webp
  • 移动图像格式:*.pbm、*.pgm、*.ppm *.pxm、*.pnm
  • Sun rasters文件:*.sr、*.ras
  • TIFF 文件:*.tiff、*.tif
  • OpenEXR文件:*.exr
  • Radiance HDR文件:*.hdr、*.pic

参数

  • filename必填,字符串,图像地址。
  • flags可选,int型或对应字符串,颜色的读取模式。如果flag>0或者cv2.IMREAD_COLOR,读取具有R/G/B三通道的彩色图像;如果flag=0或cv2.IMREAD_GRAYSCALE,读取灰度图像;如果flag<0或cv2.IMREAD_UNCHANGED,读取包含Alpha通道的原始图像。

返回

图像内容,如果图像无法读取则返回NULL。

提示:除了使用OpenCV自带的图像展示方法外,OpenCV还经常和matplotlib配合展示图像,这种场景更加常用。组合使用时可借用Matplotlib的强大图像展示能力进行图像的对比和参照以及不同图像模式的输出。

03 读取视频数据

Python读取视频最常用的库也是Opencv。本文以名为Megamind.avi的视频为例进行说明,如下是一段读取视频内容的代码示例:


import cv2 # 导入库

cap = cv2.VideoCapture("tree.avi") # 获得视频对象

status = cap.isOpened() # 判断文件知否正确打开

if status: # 如果正确打开,则获得视频的属性信息

frame_width = cap.get(3) # 获得帧宽度

frame_height = cap.get(4) # 获得帧高度

frame_count = cap.get(7) # 获得总帧数

frame_fps = cap.get(5) # 获得帧速率

print (‘frame width: ‘, frame_width) # 打印输出

print (‘frame height: ‘, frame_height) # 打印输出

print (‘frame count: ‘, frame_count) # 打印输出

print (‘frame fps: ‘, frame_fps) # 打印输出

success, frame = cap.read() # 读取视频第一帧

while success: # 如果读取状态为True

cv2.imshow(‘vidoe frame‘, frame) # 展示帧图像

success, frame = cap.read() # 获取下一帧

k = cv2.waitKey(1000 / int(frame_fps)) # 每次帧播放延迟一定时间,同时等待输入指令

if k == 27: # 如果等待期间检测到按键ESC

break # 退出循环

cv2.destroyAllWindows() # 关闭所有窗口

cap.release() # 释放视频文件对象

上述代码分为4个部分,以空行分隔。

第一部分为前3行,先导入库,然后读取视频文件并获得视频对象,再获得视频读取状态。其中的关键方法是VideoCapture,用来读取图像。

语法


cv2.VideoCapture(VideoCapture ID|filename|apiPreference)

描述

读取视频设备或文件,并创建一个视频对象实例

参数

必填,VideoCapture ID|filename

VideoCapture ID:int型,系统分配的设备对象的ID,默认的设备对象的ID为0。

Filename:

  • 视频文件的名称,字符串,例如abc.avi。目前版本下只支持avi格式。
  • 序列图像,字符串,例如img_%2d.jpg(图像序列包括img_00.jpg, img_01.jpg, img_02.jpg, ...)
  • 视频URL地址,字符串,例如protocol://host:port/script_name?script_params|auth
  • apiPreference:int型,后台使用的API

返回

一个视频对象实例

第二部分为if循环体内的9行代码,该代码主要用来在判断文件被正确读取的情况下,输出视频文件的整体信息。除了代码中get方法使用的参数值外,OpenCV还支持更多图像属性,如下表所示。



属性


描述


0


CV_CAP_PROP_POS_MSEC


当前位置(单位:ms)


1


CV_CAP_PROP_POS_FRAMES


当前位置(单位:帧数,从0开始计)


2


CV_CAP_PROP_POS_AVI_RATIO


当前位置(单位:比率, 0表示开始,1表示结尾)


3


CV_CAP_PROP_FRAME_WIDTH


帧宽度


4


CV_CAP_PROP_FRAME_HEIGHT


帧高度


5


CV_CAP_PROP_FPS


帧速率


6


CV_CAP_PROP_FOURCC


4-字符表示的视频编码(如:’M‘, ’J‘, ’P‘,’G‘)


7


CV_CAP_PROP_FRAME_COUNT


总帧数


8


CV_CAP_PROP_FORMAT


retrieve().调用返回的矩阵格式


9


CV_CAP_PROP_MODE


后端变量指示的当前捕获的模式


10


CV_CAP_PROP_BRIGHTNESS


明亮度(仅用于摄像头)


11


CV_CAP_PROP_CONTRAST


对比度(仅用于摄像头)


12


CV_CAP_PROP_SATURATION


饱和度(仅用于摄像头)


13


CV_CAP_PROP_HUE


色调(仅用于摄像头)


14


CV_CAP_PROP_GAIN


增益(仅用于摄像头)


15


CV_CAP_PROP_EXPOSURE


曝光度 (仅用于摄像头)


16


CV_CAP_PROP_CONVERT_RGB


是否应该将图像转化为RGB图像(布尔值)


17


CV_CAP_PROP_WHITE_BALANCE


白平衡(暂不支持 v2.4.3)

▲get方法支持的图像属性

第三部分为具体读取和展示视频的每一帧内容。首先读取视频的第一帧,如果状态为True,则展示图像并读取下一帧,期间通过cv2.waitKey参数做图像延迟控制,同时延迟期间等待系统输入指定,如果有输入ESC则退出循环读取帧内容。

第四部分为当所有操作结束后,删除所有由OpenCv创建的窗体,释放视频文件对象。

有关OpenCV的更多信息,具体查阅opencv.org

04 读取语音数据

对于语音文件的读取,可以使用Python的audioop、aifc、wav等库实现。但针对语音处理这一细分领域,当前市场上已经具备非常成熟的解决方案,例如科大讯飞、百度语音等,大多数情况下,我们会通过调用其API实现语音分析处理的功能,或者作为分析处理前的预处理功能。

在具体实现过程中,既可以直接下载SDK做离线应用,也可以使用在线的服务。

本文将以百度语音API服务应用为例,说明如何通过请求百度语音的API,将语音数据转换为文字信息。

在正式应用百度语音API之前,请先建立百度账户以及注册成为百度开发者。

基于该条件下,我们继续开通语音识别服务。具体方法如下:

进入http://yuyin.baidu.com/app,在弹出的界面中点击要针对哪个应用开通语音识别服务。我们默认使用在之前建立的API_For_Python应用中。因此,点击该应用的“开通服务”。

▲开通服务

在弹出的窗口中,点击选择“语音识别”并确定。

▲选择开通语音识别服务

开通成功后系统会提示“服务已开通”,然后点击右侧的“查看key”,会弹出如下信息:

▲图2-32 应用key信息

上述弹出中的API Key和Secret Key为在后续语音识别中要使用的信息。

以下为完整代码:


# 导入库

import json # 用来转换JSON字符串

import base64 # 用来做语音文件的Base64编码

import requests # 用来发送服务器请求

# 获得token

API_Key = ‘DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr‘ # 从申请应用的key信息中获得

Secret_Key = ‘oiIboc5uLLUmUMPws3m0LUwb00HQidPx‘ # 从申请应用的key信息中获得

token_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" # 获得token的地址

res = requests.get(token_url % (API_Key, Secret_Key)) # 发送请求

res_text = res.text # 获得请求中的文字信息

token = json.loads(res_text)[‘access_token‘] # 提取token信息

# 定义要发送的语音

voice_file = ‘baidu_voice_test.pcm‘ # 要识别的语音文件

voice_fn = open(voice_file, ‘rb‘) # 以二进制的方式打开文件

org_voice_data = voice_fn.read() # 读取文件内容

org_voice_len = len(org_voice_data) # 获得文件长度

base64_voice_data = base64.b64encode(org_voice_data) # 将语音内容转换为base64编码格式

# 发送信息

# 定义要发送的数据主体信息

headers = {‘content-type‘: ‘application/json‘} # 定义header信息

payload = {

"format": "pcm", # 以具体要识别的语音扩展名为准

"rate": 8000, # 支持8000或16000两种采样率

"channel": 1, # 固定值,单声道

"token": token, # 上述获取的token

"cuid": "B8-76-3F-41-3E-2B", # 本机的MAC地址或设备唯一识别标志

"len": org_voice_len, # 上述获取的原始文件内容长度

"speech": base64_voice_data # 转码后的语音数据

}

data = json.dumps(payload) # 将数据转换为JSON格式

vop_url = ‘http://vop.baidu.com/server_api‘ # 语音识别的API

voice_res = requests.post(vop_url, data=data, headers=headers) # 发送语音识别请求

api_data = voice_res.text # 获得语音识别文字返回结果

text_data = json.loads(api_data)[‘result‘]

print (api_data) # 打印输出整体返回结果

print (text_data) # 打印输出语音识别的文字

代码以空行作为分隔,包括4个部分:

第一部分为导入需要的库信息,具体用途见代码注解。

第二部分为获得要使用百度语音识别API的token信息。其中的API_Key和Secret_Key从“应用key信息”获得。token_url通过占位符定义出完整字符串,并在请求时发送具体变量数据,从返回的信息中直接读取token便于下面应用中使用。有关获取token的更多信息,具体查阅http://yuyin.baidu.com/docs/asr/56。

提示:在请求获取token时,可使用get或post(推荐使用)两种方法,Token的有效期默认为1个月,如果过期需要重新申请。

第三部分主要用于获取和处理语音文件数据。通过最常见的open方法以二进制的方式读取语音数据,然后从获得的语音数据中获取原始数据长度并将原始数据转换为base64编码格式。

注意:百度语音识别API对于要识别的音频源是有要求的:原始 PCM 的录音参数必须符合 8k/16k 采样率、16bit 位深、单声道,支持的压缩格式有:pcm(不压缩)、wav、opus、amr、x-flac。

第四部分为本节内容的主体,发送请求获取语音识别结果。本段落中先定义了发送头信息;然后定义了一个字典,用于存储要发送的key-value字符串并将其转换为json格式;接着通过post方法以隐示发送的方式进行上传并获得返回结果,最后输出返回结果和其中的语音转文字的信息。该部分内容的细节比较多,具体参见百度语音API开发说明http://yuyin.baidu.com/docs/asr/57。

关于cuid的获取,由于笔者是在本地电脑上测试的,因此使用的是MAC地址。获取MAC地址的方法是:打开系统终端命令行窗口(Win+R,输入cmd并回车),在命令行中输入命令ipconfig/all,在列出的所有连接中找到其中媒体状态不是“媒体已断开”并且属于当前连接的物理地址信息,如下图为笔者电脑MAC信息:

▲获取MAC地址信息

有关语音服务的更多信息,具体查阅http://www.xfyun.cn/。

上述代码执行后返回如下结果:


{"corpus_no":"6409809149574448654","err_msg":"success.","err_no":0,"result":["百度语音提供技术支持,"],"sn":"83327679891492399988"}

[u‘\u767e\u5ea6\u8bed\u97f3\u63d0\u4f9b\u6280\u672f\u652f\u6301\uff0c‘]

系统成功返回是识别结果,录音的内容是“百度语音提供技术支持”,第二端的编码是unicode编码格式的中文。

总结:上述语音识别仅提供了关于语音转文字的方法,其实语音本身包括非常多的信息,除了相对浅层的生理和物理特征,例如语速、音调、音长、音色、音强等外;还包括更深层次的社会属性,这部分内容需要自然语音理解的深层次应用。目前的语音数据读取后主要应用方向包括:

  • 语音转文字。这也是广义上语音识别的一种,直接将语音信息转为文字信息,例如微信中就有这个小功能。
  • 语音识别。语音识别指的是对说话者通过选取语音识别单元、提取语音特征参数、模型训练、模型匹配等阶段实现其角色识别和个体识别的过程,例如通过某段语音识别出是哪个人说的话。
  • 语音语义理解。在语音识别的基础上,需要对语义特征进行分析,目的是通过计算得到语音对应的潜在知识或意图,然后提供对应的响应内容或方法。语音识别和语音理解的差异之处在于,语音识别重在确定语音表达的字面含义,属于表层意义;而语音理解重在挖掘语音的背后含义,属于深层意义。
  • 语音合成。语音合成就是让计算机能够“开口说话”,这是一种拟人的技术方法。语音合成,又称文本转语音(Text to Speech)技术,它通过机械的、电子的方法将文字信息转变为人类可以听得懂的语音。
  • 应用集成。经过分析、识别后的信息可以与硬件集成,直接通过语音发送指令。例如通过跟Siri的“沟通”,除了可以进行日常沟通,它还可以告诉你天气情况、帮你设置系统日程、介绍餐厅等。这是智能机器人在模式识别方面的典型应用。

基于上述的复杂应用场景,通常语音后续分析、处理和建模等过程都无法由数据工程师单独完成,还需要大量的语料库素材、社会学、信号工程、语言语法、语音学、自然语音处理、机器学习、知识搜索、知识处理等交叉学科和相关领域才有可能解开其中的密码。

也欢迎大家关注我的博客:https://home.cnblogs.com/u/sm123456/

欢迎大家加入千人交流答疑群:125240963

原文地址:https://www.cnblogs.com/sm123456/p/9061300.html

时间: 2024-11-06 19:10:08

Python爬虫新手进阶版:怎样读取非结构化、图像、视频、语音数据的相关文章

MaxCompute读取分析OSS非结构化数据的实践经验总结

摘要: 本文背景 很多行业的信息系统中,例如金融行业的信息系统,相当多的数据交互工作是通过传统的文本文件进行交互的.此外,很多系统的业务日志和系统日志由于各种原因并没有进入ELK之类的日志分析系统,也是以文本文件的形式存在的. 1. 本文背景 很多行业的信息系统中,例如金融行业的信息系统,相当多的数据交互工作是通过传统的文本文件进行交互的.此外,很多系统的业务日志和系统日志由于各种原因并没有进入ELK之类的日志分析系统,也是以文本文件的形式存在的.随着数据量的指数级增长,对超大文本文件的分析越来

MySQL 5.7:非结构化数据存储的新选择

本文转载自:http://www.innomysql.net/article/23959.html (只作转载, 不代表本站和博主同意文中观点或证实文中信息) 工作10余年,没有一个版本能像MySQL 5.7那样令我激动与期盼,10月MySQL 5.7 GA版本的发布,意味着MySQL数据库终于有能力在传统企业中向商业数据库发起挑战,开源的Linux操作系统干掉了封闭的Unix系统,MySQL会不会再一次逆袭商业产品?目前来看,或许很难,但是机会已经掌握在自己上手,后面的发展就看MySQL团队能

非结构化数据

rlist扩展包 设计目标:更方便地在R中操作list对象 特性: 提供一系列高阶函数,可以方便地对list对象中的元素进行映射(mapping).筛选(filtering).分组(grouping).排序(sorting).合并(joining).更新(updating).搜索(searching)以及其他常用操作. 对管道操作(pipeline)友好,方便非结构化数据处理的流程化. 整合多种非结构化数据源的读写方法,方便接入数据源和输出数据. 合理利用R的元编程特性,简化使用. 基于表达式的

2015第27周一非结构化数据

非结构化数据包括以下几个类型: 文本:在掌握了元数据结构时,机器生成的数据,如传感器等就一定能够进行解译.当然,流数据中有一些字段需要更加高级的分析和发掘功能. 交互数据:这里指的是社交网络中的数据,大量的业务价值隐藏其中.人们表达对人.产品的看法和观点,并以文本字段的方式存储.为了自动分析这部分数据,我们需要借助实体识别以及语义分析等技术.你需要将文本数据以实体集合的形式展现,并结合其中的关系属性. 图像:图像识别算法已经逐渐成为了主流.此外,这些技术也会产生实体,尽管获取关系以及舆情分析更加

hbase非结构化数据库与结构化数据库比较

目的:了解hbase与支持海量数据查询的特性以及实现方式 传统关系型数据库特点及局限 传统数据库事务性特别强,要求数据完整性及安全性,造成系统可用性以及伸缩性大打折扣.对于高并发的访问量,数据库性能不是很好,类似于互联网这样的访问量容易造成宕机. hbase hbase是基于列存储的数据库与传统的基于行存储的关系型数据库相比,可扩展性好.Hbase是一个面向列存储的分布式存储系统,它的优点在于可以实现高性能的并发读写操作,同时Hbase还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性

结构化数据(structured),半结构化数据(semi-structured),非结构化数据(unstructured)

概念 结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据. 半结构化数据:介于完全结构化数据(如关系型数据库.面向对象数据库中的数据)和完全无结构的数据(如声音.图像文件等)之间的数据,HTML文档就属于半结构化数据.它一般是自描述的,数据的结构和内容混在一起,没有明显的区分. 非结构化数据:不方便用数据库二维逻辑表来表现的数据即称为非结构化数据,包括所有格式的办公文档.文本.图片.XML.HTML.各类报表.图像和音频/视频信息等等. 数据模型 结构化数据:二维表(关系

数据无边界:非结构化数据在MaxCompute上的处理

这是DT(Data Technology)时代,每天有海量数据的加速产生,而每天产生的海量数据80%+是非结构化的,如何把握数据资源服务大众,激发生产力是每个互联网企业需要掌握的核心竞争力.我们的理想是MaxCompute在SQL线上实现与其它云数据(OSS, TableStore等) 的互联互通,用OSS(阿里云对外提供的海量.安全和高可靠的云存储服务)几种非结构化数据处理为范例,未来我们可以期待对各种非结构化数据的分布式处理成为可能,甚至开启气象数据.基因数据等多种大数据,建立与各种分布式系

非结构化数据的存储与查询

当今信息化时代充斥着大量的数据.海量数据存储是一个必然的趋势.然而数据如何的存储和查询,尤其是当今非结构化数据的快速增长,对其数据的存储,处理,查询.使得如今的 关系数据库存储带来了巨大的挑战.分布存储技术是云计算的基础,主要研究如何存储.组织和管理数据中心上的大规模海量数据.由于面临的数据规模和用户规模更加庞大,在可扩展性.容错性以及成本控制方面面临着更加严峻的挑战[1]. 对于大量的半结构化数据(semi-structure data)和非结构化数据,对其存储和并发计算以及扩展能力而设计出了

结构化、半结构化和非结构化数据

在实际应用中,我们会遇到各式各样的数据库如nosql非关系数据库(memcached,redis.mangodb).RDBMS关系数据库(oracle,mysql等),另一些其他的数据库如hbase,在这些数据库中.又会出现结构化数据.非结构化数据.半结构化数据,以下列出各种数据类型: 结构化数据: 可以用数据或统一的结构加以表示,我们称之为结构化数据,如数字.符号.传统的关系数据模型.行数据,存储于数据库,可用二维表结构表示. 半结构化数据: 所谓半结构化数据.就是介于全然结构化数据(如关系型