在进行目标跟踪研究中,有时候需要直接读取网上的图片和视频,这时候利用 OpenCV 再加上 urllibpafynumpy 等就可以直接获取互联网上的各种图片和视频资源.

从网上读取图片

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
import cv2
import numpy as np
import urllib
import matplotlib.pyplot as plt

# 读取网上图片
url_img = 'https://c-ssl.dtstatic.com/uploads/blog/202105/27/20210527174258_991e1.thumb.1000_0.jpg'
res = urllib.request.urlopen(url_img)
i = np.asarray(bytearray(res.read()), dtype="uint8")
img = cv2.imdecode(i, cv2.IMREAD_COLOR)
# 或者如下(先读取图片为PIL图片,然后转化为OPENCV图片。对于彩色图片,注意通道顺序,对应从RGB转为BGR)
import requests
from PIL import Image
response = requests.get(url_img, stream=True)
img = Image.open(response.raw)
img = cv.cvtColor(np.array(img), cv.COLOR_RGB2BGR)
# 或者如下
from imageio import imread
img = imread(url_img)
img = cv.cvtColor(np.array(img), cv.COLOR_RGB2BGR)

# 彩色图像
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# plt.imshow(img[:, :, ::-1])
# plt.imshow(img[:, :, [2, 1, 0]])

# 灰度图像
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(imgray, cmap='gray')

# 同时画多幅图
plt.imshow(np.hstack((imgray, imgray)), cmap='gray')

# 不显示坐标轴
plt.xticks([]), plt.yticks([])

plt.show()

彩色图片显示如下:

1
2
3
# h, w, c 分别是高、宽、通道
img.shape
# (360, 450, 3)

从网上读取视频

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
import pafy
import cv2

# The YouTube url or 11 character video id of the video
url_video = 'https://youtu.be/2kS0T7fwxJo'
# Preferred type, set to mp4, webm, flv, 3gp or any
# 把分享的视频地址,转化为 .mp4 地址,如何 cv2.VideoCapture() 直接读取
v = pafy.new(url_video).getbestvideo(preftype='mp4')
# 如果地址是"*.mp4"的,可以直接读取
vc = cv2.VideoCapture(v.url)

if vc.isOpened():
open = True
else:
open = False
flag = 0
while open:
ret, frame = vc.read()
if frame is None:
break
if ret:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
flag += 1
vc.release()
"total frame is ", flag

参考链接

1.Pafy Documentation