python中cv2.imdecode()与cv2.imencode()的使用小结

 更新时间:2025年01月05日 09:19:48   作者: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中的TfidfVectorizer参数使用解析

    Python中的TfidfVectorizer参数使用解析

    这篇文章主要介绍了Python中的TfidfVectorizer参数使用解析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Python机器学习之逻辑回归

    Python机器学习之逻辑回归

    这篇文章主要介绍了Python机器学习之逻辑回归,文中有非常详细的代码示例,对正在学习Python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • pytorch之inception_v3的实现案例

    pytorch之inception_v3的实现案例

    今天小编就为大家分享一篇pytorch之inception_v3的实现案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python如何对图像补全并分割成多块补丁

    Python如何对图像补全并分割成多块补丁

    这篇文章主要介绍了Python如何对图像补全并分割成多块补丁,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 关于python中readlines函数的参数hint的相关知识总结

    关于python中readlines函数的参数hint的相关知识总结

    今天给大家带来的是关于Python函数的相关知识,文章围绕着python中readlines函数的参数hint展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Python-pip配置国内镜像源的安装方式

    Python-pip配置国内镜像源的安装方式

    本文给大家分享Python-pip配置国内镜像源的安装方式,分为windows平台安装方式和linux平台安装方式,本文给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11
  • 举例讲解Python面向对象编程中类的继承

    举例讲解Python面向对象编程中类的继承

    类是面向对象语言中的标配,同样类的继承也是体现面向对象的重要特性,这里我们就来举例讲解Python面向对象编程中类的继承,需要的朋友可以参考下
    2016-06-06
  • Python strip lstrip rstrip使用方法

    Python strip lstrip rstrip使用方法

    Python中的strip用于去除字符串的首位字符,同理,lstrip用于去除左边的字符,rstrip用于去除右边的字符。这三个函数都可传入一个参数,指定要去除的首尾字符。
    2008-09-09
  • Python基于Socket实现简易多人聊天室的示例代码

    Python基于Socket实现简易多人聊天室的示例代码

    这篇文章主要介绍了Python基于Socket实现简易多人聊天室的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Python实现打包成库供别的模块调用

    Python实现打包成库供别的模块调用

    这篇文章主要介绍了Python实现打包成库供别的模块调用,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论