【opencv-python】的cv2.imdecode()与cv2.imencode()
cv2.imencode()函数与cv2.imdecode()函数通常用于图片的编码与解码。也可以用于带中文路径的图片读取,网络传输中的解码中。
文章目录
- 1、图片路径带中文的读取和写入
- 1.1 读取
- 1.2 写入
- 2、在网络中传输图片
1、图片路径带中文的读取和写入
1.1 读取
- 用cv2.imread()函数读取带中文路径的图片时,会报错:
import cv2
img_path = "/home/dataset/狗/101.jpg"
img = cv2.imread(img_path)
运行这个代码会报错,可使用numpy的fromfile函数将图片加载成array,然后通过cv2.imdecode解码:
import numpy as np
import cv2
from PIL import Image
img_path = "/home/dataset/狗/101.jpg"
arr_img = np.fromfile(img_path, dtype=np.uint8) # 将文本或二进制文件中数据构造成数组
img = cv2.imdecode(arr_img, cv2.IMREAD_COLOR) # BGR通道,和cv2.imread()读图片一样
# 转成Image对象
# rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# pil_img = Image.fromarray(rgb_img)
# 用opencv自带的显示函数显示图像
cv2.imshow("opencv imgshow", img)
cv2.waitKey()
# 用matplotlib.pyplot显示图像
from matplotlib import pyplot as plt
plt.figure("pylot imgshow") # 图像窗口名称
plt.imshow(img)
plt.axis('off') # 关掉坐标轴为 off
plt.title('pylot imgshow') # 图像题目
plt.show()
1.2 写入
- 用cv2.imwrite()函数将图片写入带中文路径用于保存图片时,也会报错:
import cv2
save_path = "/home/dataset/狗/101.jpg"
cv2.imwrite(save_path, img)
我们可以利用cv2.imencode将图片编码到内存缓冲区中,然后利用numpy.tofile方法来写入文件。
import cv2
import numpy as np
img_path = "/home/dataset/狗/101.jpg"
arr_img = np.fromfile(img_path, dtype=np.uint8) # 将文本或二进制文件中数据构造成数组
img = cv2.imdecode(arr_img, cv2.IMREAD_COLOR) # BGR通道,和cv2.imread()读图片一样
arr_buffer = cv2.imencode('.jpg', img)[1]
# 保存为图片
save_path = "/home/dataset/狗/101_copy.jpg"
arr_buffer.tofile(save_path) # 保存到文件
# 保存为txt
data_encode = np.array(arr_buffer)
str_encode = data_encode.tostring()
# 缓存数据保存到本地
with open('./img_encode.txt', 'w') as f:
f.write(str_encode)
f.flush
2、在网络中传输图片
用flask写接口接收图片,服务端app.py的接收函数如下:
from flask import Flask, request, jsonify
import numpy as np
import cv2
app = Flask(__name__)
@app.route("/upload_img", methods=['POST'])
def upload_img():
f_obj = request.files.get('file', None)
if f_obj is None:
return jsonify("没有接收到图片")
else:
img_data = f_obj.read()
#nparr = np.fromstring(img_data, np.uint8)
nparr = np.frombuffer(img_data, np.uint8) # 两者均可,建议使用np.frombuffer
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
cv2.imwrite("./received_img.jpg", img)
return jsonify("接收图片成功")
if __name__ == "__main__":
app.run(host='0.0.0.0', port=9000)
模拟客户端向upload_img接口发送图片:
import requests
import time
upload_img_url = "http://localhost:9000/upload_img"
imgfile = {'file':open('/home/dataset/狗/101.jpg','rb')}
start = time.time()
r = requests.post(upload_img_url, files=imgfile)
end = time.time()
running_time = end - start
print(f"时间消耗: {running_time:.5f} 秒")
print(f"响应内容:{r.text}")