如何在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
相关产品推荐
相关产品推荐

