cv2.imencode()函数与cv2.imdecode()函数通常用于图片的编码与解码。也可以用于带中文路径的图片读取,网络传输中的解码中。
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}")
到此这篇关于python中cv2.imdecode()与cv2.imencode()的使用小结的文章就介绍到这了,更多相关python cv2.imdecode()与cv2.imencode()内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论