从网络读取图像数据并展示
-
需要使用
cv2.imdecode()
函数,从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像。
# -*- coding: utf-8 -*-
import
numpy
as
np
from
urllib
import
request
import
cv2
url
=
'https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png?where=super'
resp
=
request
.
urlopen
(
url
)
image
=
np
.
asarray
(
bytearray
(
resp
.
read
(
)
)
,
dtype
=
"uint8"
)
image
=
cv2
.
imdecode
(
image
,
cv2
.
IMREAD_COLOR
)
cv2
.
imshow
(
'url_image_show'
,
image
)
if
cv2
.
waitKey
(
10000
)
&
0xFF
==
ord
(
'q'
)
:
cv2
.
destroyAllWindows
(
)
图片编码保存到本地,读取本地文件解码恢复成图片格式并展示
-
需要使用
cv2.imencode()
函数,将图片格式转换(编码)成流数据,赋值到内存缓存;主要用于图像数据格式的压缩,方便网络传输。
# -*- coding: utf-8 -*-
import
numpy
as
np
import
cv2
img
=
cv2
.
imread
(
'cat.jpg'
)
'''
cv2.imencode()函数是将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输
'.jpg'表示把当前图片img按照jpg格式编码,按照不同格式编码的结果不一样
'''
img_encode
=
cv2
.
imencode
(
'.jpg'
,
img
)
[
1
]
# imgg = cv2.imencode('.png', img)
data_encode
=
np
.
array
(
img_encode
)
str_encode
=
data_encode
.
tostring
(
)
# 缓存数据保存到本地,以txt格式保存
with
open
(
'img_encode.txt'
,
'wb'
)
as
f
:
f
.
write
(
str_encode
)
f
.
flush
with
open
(
'img_encode.txt'
,
'rb'
)
as
f
:
str_encode
=
f
.
read
(
)
nparr
=
np
.
fromstring
(
str_encode
,
np
.
uint8
)
img_decode
=
cv2
.
imdecode
(
nparr
,
cv2
.
IMREAD_COLOR
)
'''
# 或
nparr = np.asarray(bytearray(str_encode), dtype="uint8")
img_decode = cv2.imdecode(image, cv2.IMREAD_COLOR)
'''
cv2
.
imshow
(
"img_decode"
,
img_decode
)
if
cv2
.
waitKey
(
10000
)
&
0xFF
==
ord
(
'q'
)
:
cv2
.
destroyAllWindows
(
)
将np图片(imread后的图片)转码为base64格式
def
image_to_base64
(
image_np
)
:
image
=
cv2
.
imencode
(
'.jpg'
,
image_np
)
[
1
]
image_code
=
str
(
base64
.
b64encode
(
image
)
)
[
2
:
-
1
]
return
image_code
将base64编码解析成opencv可用图片
def
base64_to_image
(
base64_code
)
:
# base64解码
img_data
=
base64
.
b64decode
(
base64_code
)
# 转换为np数组
img_array
=
np
.
fromstring
(
img_data
,
np
.
uint8
)
# 转换成opencv可用格式
img
=
cv2
.
imdecode
(
img_array
,
cv2
.
COLOR_RGB2BGR
)
return
img