You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python+MySQL中存入OpenCV cv2.imshow窗口图片并重新加载?

实现OpenCV图片与MySQL的互转方案

当然有可行方案啦!我来一步步给你讲清楚怎么实现,从存图到读回OpenCV都给你安排明白~

一、先准备数据库表

首先你得在MySQL里创建一个用来存图片的表,核心是用LONGBLOB类型的字段来存储二进制图片数据。比如创建这样一个表:

CREATE TABLE IF NOT EXISTS opencv_images (
    id INT AUTO_INCREMENT PRIMARY KEY,
    image_name VARCHAR(100) NOT NULL,
    image_data LONGBLOB NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • image_data用LONGBLOB是因为它支持存储最大4GB的二进制数据,足够应付绝大多数图片需求;
  • image_name可以用来标记图片的名称,方便后续查询。

二、将OpenCV图片存入MySQL

OpenCV的图片是以numpy数组形式存在的,我们需要先把它编码成字节流,再存入数据库的LONGBLOB字段。

完整代码示例

import cv2
import pymysql
import numpy as np

def save_image_to_mysql(img, image_name, db_config):
    # 1. 将OpenCV图片编码为字节流(这里用JPG格式,也可以换成PNG)
    # cv2.imencode返回的是(是否成功, 编码后的字节数组)
    _, img_encoded = cv2.imencode('.jpg', img)
    img_bytes = img_encoded.tobytes()

    # 2. 连接数据库并插入数据
    conn = None
    try:
        conn = pymysql.connect(**db_config)
        cursor = conn.cursor()
        # 使用参数化查询,避免SQL注入
        sql = "INSERT INTO opencv_images (image_name, image_data) VALUES (%s, %s)"
        cursor.execute(sql, (image_name, img_bytes))
        conn.commit()
        print(f"图片 {image_name} 成功存入数据库!")
    except Exception as e:
        print(f"存图出错: {e}")
        if conn:
            conn.rollback()
    finally:
        if conn:
            conn.close()

# 测试用例:读取本地图片并存入数据库
if __name__ == "__main__":
    # 数据库配置,换成你自己的
    db_config = {
        'host': 'localhost',
        'user': 'your_username',
        'password': 'your_password',
        'database': 'your_database',
        'charset': 'utf8mb4'
    }

    # 读取一张本地图片到OpenCV
    img = cv2.imread("test.jpg")
    if img is not None:
        # 先显示一下图片(就是你说的cv2.imshow窗口)
        cv2.imshow("Original Image", img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        # 存入数据库
        save_image_to_mysql(img, "test_image", db_config)
    else:
        print("无法读取图片!")

三、从MySQL加载图片到OpenCV

读取的时候,我们需要把数据库里的二进制数据取出来,转成numpy数组,再用OpenCV解码成图片格式。

完整代码示例

import cv2
import pymysql
import numpy as np

def load_image_from_mysql(image_name, db_config):
    conn = None
    img = None
    try:
        conn = pymysql.connect(**db_config)
        cursor = conn.cursor()
        sql = "SELECT image_data FROM opencv_images WHERE image_name = %s"
        cursor.execute(sql, (image_name,))
        result = cursor.fetchone()
        if result:
            # 1. 把二进制数据转成numpy数组
            img_bytes = result[0]
            img_np = np.frombuffer(img_bytes, dtype=np.uint8)
            # 2. 解码成OpenCV图片
            img = cv2.imdecode(img_np, cv2.IMREAD_COLOR)
            print(f"成功从数据库加载图片 {image_name}!")
        else:
            print(f"未找到名为 {image_name} 的图片!")
    except Exception as e:
        print(f"读图出错: {e}")
    finally:
        if conn:
            conn.close()
    return img

# 测试用例:从数据库加载图片并显示
if __name__ == "__main__":
    db_config = {
        'host': 'localhost',
        'user': 'your_username',
        'password': 'your_password',
        'database': 'your_database',
        'charset': 'utf8mb4'
    }

    # 加载图片
    loaded_img = load_image_from_mysql("test_image", db_config)
    if loaded_img is not None:
        # 用cv2.imshow展示图片
        cv2.imshow("Loaded from MySQL", loaded_img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

一些注意事项

  • 图片格式选择:如果需要无损存储,把cv2.imencode的.jpg换成.png即可;JPG是有损压缩,优点是体积小;
  • 参数化查询:一定要用%s占位符的参数化查询,不要直接拼接SQL语句,防止SQL注入;
  • 异常处理:代码里加了try-except-finally,确保数据库连接能正常关闭,避免资源泄漏;
  • PyQt5结合:如果你需要在PyQt5的界面里显示图片,也可以把加载后的OpenCV图片转成QImage再显示,不过这部分你没问,就不多展开啦~

内容的提问来源于stack exchange,提问作者Denuka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:47:05