本文主要是介绍python中cv2.imdecode()与cv2.imencode()的使用小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《python中cv2.imdecode()与cv2.imencode()的使用小结》本文介绍了cv2.imencode()和cv2.imdecode()函数的使用,文中通过示例代码介绍的非常详细,对...
cv2.imencode()函数与cv2.imdecode()函数通常用于图片的编码与解码。也可以用于带中文路径的图片读取,网络传输中的解码中。
1、图片路径带中文的读取和写入
1.1 读取
- 用cv2.imread()函数编程读取带中文路径的图片时,会报错:
import cv2 img_path = "/home/dataset/狗/101.jpg" iandroidmg = 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 =php cv2.imencode('.jpg', img)[1] # 保存为图片 save_path = "/home/dataset/狗/101_copy.jpg" arr_buffer.tofile(save_pandroidath) # 保存到文件 # 保存为txt data_eChina编程ncode = 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()内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于python中cv2.imdecode()与cv2.imencode()的使用小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!