这是一个非常简单的例子Redis将图像从 C++ 服务器发送到 Python 或命令行客户端。
所以,服务器(使用hiredis)看起来像这样:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <cstdio>
#include <hiredis.h>
int
main(int argc,char*argv[])
{
const int width = 640;
const int height= 480;
cv::Mat img(width,height, CV_8UC3, cvScalar(0,255,255));
// Redis setup
redisContext *c;
redisReply *reply;
const char *hostname = "localhost";
int port = 6379;
struct timeval timeout = { 2, 0 }; // 2 seconds
c = redisConnectWithTimeout(hostname, port, timeout);
if (c == NULL || c->err) {
std::cerr << "Something bad happened" << std::endl;
exit(1);
}
// Store Mat in Redis
reply = (redisReply*)redisCommand(c,"SET image %b",(char*)img.data,height*width*3);
freeReplyObject(reply);
}
不,这不是生产质量的代码,是的,我可以传输宽度和高度以及通道数和字节数,但我想让它保持良好、简单和明显。
A Python读取该图像并显示它的客户端如下所示:
#!/usr/bin/env python3
import cv2
import redis
import numpy as np
if __name__ == '__main__':
# Redis connection
r = redis.Redis(host='localhost', port=6379)
data = r.get('image')
img = np.frombuffer(data, dtype=np.uint8).reshape(480,640,3)
print(f'Received image')
cv2.imshow('image', img)
key = cv2.waitKey(0)
如果你想从中获取图像Redis在终端中,您可以执行以下操作:
redis-cli get image > image.raw
或者您可以抓取它并转换为 PNG 并使用以下命令轻松显示它图像魔术师:
redis-cli get image | convert -depth 8 -size 640x480 bgr:- result.png
当然,所有这些也可以跨网络运行,因此您只需指定 IP 地址,就可以向网络上任何位置的 Redis 实例发送和接收数据。在终端中将是:
redis-cli -h x.x.x.x get image
您还可以在发送之前对图像进行 JPEG 编码或 PNG 编码,以节省网络带宽和 Redis 内存。
您还可以设置图像的过期时间或生存时间,以便它们在特定时间后被删除。
您还可以保留最新的列表N
例如,视频的图像。
您还可以使用 Ruby、swift、C#、Java、PHP、Perl 实现客户端和/或服务器...请参阅 Redisbindings.