- 用
std::string来承接数据(图像数据),利用了string内存在堆上构建的特性
直接摘录一段将图像数据包装成string,然后从string取出数据的做法-
数据包装成
string,注意,提前reserve下内存
主要考察sting::append(char*, size)把char*指向的数据保存到string内void sendBufToRedis(sw::redis::Redis & redis, uint8_t * p_buf, uint64_t buf_size) { // prepare data std::string str_data; str_data.reserve(buf_size); uint64_t str_capacity = str_data.capacity(); printf("str_capacity: %d \n", str_capacity); str_data.append((char*)p_buf, buf_size); // set redis.set("img", str_data); } -
从
string取数据#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui_c.h> #include <stdint.h> #include <sw/redis++/redis++.h> #include <unordered_map> #include <unordered_set> #include <iostream> const uint64_t DATA_SIZE{1024*1024*3}; const uint64_t rows{1464}; const uint64_t cols{1936}; const std::string URL{R"(tcp://192.168.0.41:6379)"}; void ctr(cv::Mat& mat_in, std::string& str_data_in) { if(mat_in.empty()) mat_in.create(rows, cols, CV_8UC1); else mat_in.resize(rows, cols); memcpy(mat_in.data, str_data_in.c_str(), rows*cols); } int main() { sw::redis::Redis redis(URL); // init str_data std::string str_data; str_data.reserve(DATA_SIZE); cv::Mat img; cv::namedWindow("Wnd", CV_WINDOW_NORMAL); // while in loop while(1) { // get from redis-server str_data = *redis.get("img"); // convert raw data to mat ctr(img, str_data); // show it cv::imshow("Wnd", img); cv::waitKey(10); } return 0; }
-