0%

一、连接Redis

这里我们用到StrictRedis库和ConnectionPool库。

1
2
3
from redis import StrictRedis

redis = StrictRedis(host='localhost', port=6379, db=0, password=******)

这里我们传入了Redis的地址、运行端口、使用的数据库和密码信息。在默认不传的情况下,这4个参数分别为localhost63790None。redis是一个StrictRedis对象,用于操作redis的各种命令。

当然,我们还可以使用ConnectionPool来连接,示例如下:

1
2
3
4
from redis import StrictRedis, ConnectionPool

pool = ConnectionPool(host='localhost', port=6379, db=0, password='foobared')
redis = StrictRedis(connection_pool=pool)

这样的连接效果是一样的。观察源码可以发现,StrictRedis内其实就是用hostport等参数又构造了一个ConnectionPool,所以直接将ConnectionPool当作参数传给StrictRedis也一样。

另外,ConnectionPool还支持通过URL来构建。URL的格式支持有如下3种:

1
2
3
redis://[:password]@host:port/db
rediss://[:password]@host:port/db
unix://[:password]@/path/to/socket.sock?db=db

这3种URL分别表示创建Redis TCP连接、Redis TCP+SSL连接、Redis UNIX socket连接。我们只需要构造上面任意一种URL即可,其中password部分如果有则可以写,没有则可以省略。下面再用URL连接演示一下:

1
2
3
url = 'redis://:123456@localhost:6379/0'
pool = ConnectionPool.from_url(url)
redis = StrictRedis(connection_pool=pool)

首先,声明一个Redis连接字符串,然后调用from_url()方法创建ConnectionPool,接着将其传给StrictRedis即可完成连接,所以使用URL的连接方式还是比较方便的。

阅读全文 »

Redis命令

Redis客户端的基本语法为:

1
redis-cli

我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。

1
2
3
4
5
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING

PONG

表示服务已启动。

关闭连接用以下命令:

1
quit
在远程服务上执行命令

如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令。

1
redis-cli -h host -p port -a password

注意:有时候会有中文乱码。要在 redis-cli 后面加上 –raw:

1
redis-cli --raw

就可以避免中文乱码了。

阅读全文 »

String(字符串)

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

1
2
3
4
redis 127.0.0.1:6379> SET name 'Silence'
OK
redis 127.0.0.1:6379> GET name
"silence"

以上实例中我们使用了 Redis 的 SETGET 命令,其中,name为键,Silence为值。


Hash(哈希)

Redis hash 是一个键值(key=>value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

阅读全文 »

Redis简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

redis有以下特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。
  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis安装

Windows 系统

Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我选择64位zip压缩包,解压到Redis文件夹中。

打开一个 cmd 窗口 使用 cd 命令切换目录到 C:\redis 运行(如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了):

阅读全文 »

cookie详解

1、cookie简介

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。

Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie:

内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。

硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。

2、工作原理

1、创建cookie

当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作:

  • 该用户生成一个唯一的识别码(Cookie id),创建一个Cookie对象;
  • 默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie);
  • 将Cookie放入到HTTP响应报头,将Cookie插入到一个 Set-Cookie HTTP请求报头中;
  • 发送该HTTP响应报文。
阅读全文 »

列表

1、将列表中的字符型数字转换为数值类型
1
2
3
4
5
6
7
lis = ['1', '2', '3', '8', '6', '12']

num_lis = [int(x) for x in lis]
#或者
num_lis = list(map(int, lis))

输出结果为:[1, 2, 3, 8, 6, 12]
2、将列表中的数字转换为字符(同上)
1
2
3
4
5
6
7
lis = [1, 2, 3, 8, 6, 12]

char_lis = [str(x) for x in lis]
#或者
char_lis = list(map(str, lis))

输出结果为:['1', '2', '3', '8', '6', '12']
3、对列表中的元素进行排序
  • 如果列表中是数字,那么直接进行排序:
1
2
3
4
5
6
lis = [1, 2, 3, 8, 6, 12]

lis.sort()
print(lis)

输出结果为:[1, 2, 3, 6, 8, 12]
  • 如果列表中是字母型字符,那么也直接进行排序(根据ASCII):
1
2
3
4
5
6
lis = ['a', 'd', 'e', 'b']

lis.sort()
print(lis)

输出结果为:['a', 'b', 'd', 'e']
  • 如果列表中是数字型字符,想要使其中的数字升序或者降序排列,需要对其进行一些操作:
1
2
3
4
5
6
7
#若直接进行排序
lis = ['1', '2', '3', '8', '6', '12']

lis.sort()
print(lis)

输出结果为:['1', '12', '2', '3', '6', '8']

注意:上述排序是按元素的第一个字符进行排序的。

1
2
3
4
5
6
lis = ['1', '2', '3', '8', '6', '12']

lis.sort(key=lambda x:int(x))
print(lis)

输出结果为:['1', '2', '3', '6', '8', '12']
阅读全文 »

获取视频

1、cv2.VideoCapture()

1
cap = cv2.VideoCapture(camera_idx)

用于获取视频。其中,camera_idx是o,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频。

2、cv2.namedWindow()

1
cv2.namedWindow(window_name)

为窗口命名。参数为窗口标题,字符串。

3、cap.read()

1
ret, frame = cap.read()

读取一帧的数据。第一个返回值是布尔类型,判断是否读取到图片,第二个返回值是读取到的图片。

4、cv2.imshow()

1
cv2.imshow(window_name, frame)

显示每一帧图片。第一个参数是窗口名称,第二个参数是图片对象。

5、cv2.waitKey()

1
cv2.waitKey(parameter)

parameter = NONE & 0表示一直显示,除此之外表示显示的毫秒数。

  • 参数为0,表示图片显示着,直到你按下任意一个键,才被关掉。

  • ```python
    if cv2.waitKey(1) & 0xFF == ord(‘q’):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37

    运行代码,会显示一张图片,当你按下`q`键时,显示图片的窗口被关掉。

    <!--more-->



    **完整代码如下:**

    ```python
    import cv2

    def CatchUsbVideo(window_name, camera_idx):
    #cv2.namedWindow('窗口标题',默认参数)
    cv2.namedWindow(window_name)

    #视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
    #camera_idx是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频
    cap = cv2.VideoCapture(camera_idx)

    while cap.isOpened():
    ok, frame = cap.read() #读取一帧数据
    if not ok:
    break

    #显示图像并等待10毫秒按键输入,输入‘q’退出程序
    cv2.imshow(window_name, frame)
    c = cv2.waitKey(10)
    if c & 0xFF == ord('q'):
    break

    #释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()

    if __name__ == '__main__':
    CatchUsbVideo("截取视频流", 0)

保存/读取视频

1、存取图片
1
cv2.imwrite(path, frame)

第一个参数是保存路径,第二个参数是要保存的图片的对象。

1
cv2.imread(path)

参数为图片路径。

注意:读取出来的图片的像素可能与原图片的像素不同,这是图片格式不同导致的。.jpeg后缀的图像,其由于jpeg图像本身的编解码问题,写入时的编码与读取时的解码所得不能完美互为逆操作,从而导致的每次写入之后,读取的值都不同。而.png格式就不会出现问题。

2、存取视频

保存视频或摄像头视频到本地磁盘,需要使用Opencv中的VideoWriter,以及其中的write()函数。

1
VideoWriter(const string& filename, int fourcc, double fps,Size frameSize, bool isColor=true);
  • 第一个参数为保存的路径名,并且同时为视频命名。
  • 第二个参数为编码器。也可以用cv2.VideoWriter_fourcc()代替,常用的有 “DIVX”、”MJPG”、“XVID”、“X264”。
  • fps为被创建视频的帧率。
  • frameSize是视频的宽和高,是一个二元组。
  • 最后一个是参数默认彩色保存。

示例如下:

首先用电脑上的摄像头拍摄一段视频保存到同级目录下,然后再将其读出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2

cap = cv2.VideoCapture(0)

filename = "1.avi"
fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
fps = 20
frameSize = (640,480)
out = cv2.VideoWriter(filename,fourcc,fps,frameSize)

while True:
ret, frame = cap.read()
if ret:
out.write(frame)
cv2.imshow("video", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break

cap.release()
cv2.destroyAllWindows()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2

cap = cv2.VideoCapture("1.avi")

while True:
ret, frame = cap.read()
if ret:
cv2.imshow("video", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()

opencv获取RTSP流媒体视频

1、rtsp简介

RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容。

2、rtsp的url格式

“rtsp”和“rtspu”表示要通过 RTSP 协议来定位网络资源。 RTSP URL 的语法和语义如下所示:

1
"rtsp:" | "rtspu:" ) "//" host [ ":" port ] [ abs_path]

这里我们以萤石摄像头为例:

萤石摄像头的rtsp协议的url格式为:

1
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
  • username: 用户名。例如admin。
  • password: 密码。例如12345。一般为摄像头的验证码。
  • ip: 为设备IP。例如 192.0.0.64。
  • port: 端口号默认为554,若为默认可不填写。
  • codec:有h264、MPEG-4、mpeg4这几种。
  • channel: 通道号,起始为1。例如通道1,则为ch1。
  • subtype: 码流类型,主码流为main,辅码流为sub。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2

url = "rtsp://admin:UJMIPO@192.168.137.250:554/h264/ch1/main/av_stream"
cap = cv2.VideoCapture(url)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("video", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

知识拓展:

视频文件格式,即视频文件的后缀,如mp4,avi等等,主要为帮助系统的程序知道应该使用何种程序打开该文件;这就是说如果你把一个视频格式的文件后缀从avi改成mp4,并不意味该文件就变成了mp4格式。
视频封装格式则是一种视频封装容器。什么意思呢?在视频文件中同时含有视频部分、音频部分等等;那么视频封装容器则一种可以把多种视频数据放在一起的一个大盒子。这个盒子就是我们常说的视频格式,例如AVI(后缀.avi)格式、MPEG(后缀.mpg .mpeg .mpe .dat .vob .asf .3gp .mp4)格式、REAL Video(后缀.rmvb)格式、Flash Video(后缀.flv)格式等等。

视频文件格式,即视频文件的后缀,如mp4,avi等等,主要为帮助系统的程序知道应该使用何种程序打开该文件;这就是说如果你把一个视频格式的文件后缀从avi改成mp4,并不意味该文件就变成了mp4格式。
视频封装格式则是一种视频封装容器。什么意思呢?在视频文件中同时含有视频部分、音频部分等等;那么视频封装容器则一种可以把多种视频数据放在一起的一个大盒子。这个盒子就是我们常说的视频格式,例如AVI(后缀.avi)格式、MPEG(后缀.mpg .mpeg .mpe .dat .vob .asf .3gp .mp4)格式、REAL Video(后缀.rmvb)格式、Flash Video(后缀.flv)格式等等。

那么视频编码器又是什么呢?视频编码器是指能够对数字视频进行压缩存储和解压缩的程序或设备。目前场景的编码器有H.26X系列(目前最流行的是H.264和H.265)和MPEG系列(目前最流行的是MPEG-4第十部分,即H.264)。上文代码中提到的XVID(旧称为DIVX)是一个开放源代码的MPEG-4视频编解码器。

颜色空间转换

目标:

  • 你将学习如何对图像进行颜色空间转换,比如从 BGR 到灰度图,或者从BGR 到 HSV 等。

  • 我没还要创建一个程序用来从一幅图像中获取某个特定颜色的物体。

  • 我们将要学习的函数有:cv2.cvtColor(),cv2.inRange() 等。

1、转换颜色空间

  在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会、发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。

我们要用到的函数是:cv2.cvtColor(input_image ,flag),其中 flag就是转换类型。
对于 BGR↔Gray 的转换,我们要使用的 flag 就是 cv2.COLOR_BGR2GRAY。
同样对于 BGR↔HSV 的转换,我们用的 flag 就是 cv2.COLOR_BGR2HSV。
你还可以通过下面的命令得到所有可用的 flag。

阅读全文 »

学习目标

  • 获取像素值并修改

  • 获取图像的属性

  • 图像的ROI

  • 图像通道的拆分及合并

    几乎所有这些操作与 Numpy 的关系都比与 OpenCV 的关系更加紧密,因此熟练 Numpy 可以帮助我们写出性能更好的代码。

    获取并修改像素值

    1、首先我们需要读入一幅图像:

    1
    2
    3
    import cv2
    import numpy as np
    img=cv2.imread('C:\\Users\\Administrator\\Pictures\\Camera Roll\\6.jpg')

    注:cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片,包括cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道。

    阅读全文 »

一、Django简介

Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模板T。

  1. 模型(数据存储层):处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
  2. 模板(表现层):处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
  3. 视图(业务逻辑层):存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

二、MVC与MTV模型

MVC(Model View Controller):是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

MTV: 有些WEB框架觉得MVC的字面意思很别扭,就给它改了一下。view不再是HTML相关,而是主业务逻辑了,相当于控制器。html被放在Templates中,称作模板,于是MVC就变成了MTV。这其实就是一个文字游戏,和MVC本质上是一样的,换了个名字和叫法而已,换汤不换药。

阅读全文 »