python中cv2.imdecode()与cv2.imencode()的使用小结
作者:lishanlu136
本文介绍了cv2.imencode()和cv2.imdecode()函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
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()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- python-opencv中的cv2.inRange函数用法说明
- python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
- python opencv检测直线 cv2.HoughLinesP的实现
- Python实现Opencv cv2.Canny()边缘检测
- python opencv鼠标画矩形框之cv2.rectangle()函数
- Python中cv2.Canny() 函数使用方法
- Python图片缩放cv2.resize()图文详解
- python中cv2.projectPoints的用法小结
- python cv2.waitKey()函数的使用
- python中cv2.imread()和Image.open()的区别和联系详解