来自字节流的array2d,无需将文件写入磁盘

时间:2016-06-29 22:18:29

标签: c++ dlib

是否可以从字节流初始化array2d中的dlib对象?

问题是我从外部源接收包含png文件的字节流,我不想创建临时文件,然后将该文件中的图像读入数组。是否可以跳过写入文件部分?

另一方面,是否可以从保存在内存中的文件构建array2d对象?

由于

2 个答案:

答案 0 :(得分:4)

唯一的方法 - 使用OpenCV或其他一些可以从内存中读取PNG文件的外部库:

size_t png_buffer_size = 1000;// example value
void* png_buffer; // your PNG image
cv::Mat buffer(1, png_buffer_size, CV_8UC1, png_buffer);
cv::Mat decoded = cv::imdecode(buffer, 1); // should be RGBA32 for PNG
dlib::cv_image<rgb_alpha_pixel> img(decoded); // this image can be used inside dlib
....
auto detections = detector(img);  // this image can be used to detect faces for example or inside any other algorithm
...
// if you need array2d - use assign_image
dlib::array2d<rgb_alpha_pixel> arr;
dlib::assign_image(arr, img);

使用dlib :: cv_image在性能方面是免费的 - 它不会制作cv :: Mat数据的深层副本,因此你应该使cv :: Mat存在并且在cv_image被销毁之前不会改变(它保持指针内侧)

如果您需要一些小的PNG阅读库 - 您可以尝试lodepng

我认为dlib的未来版本可以在

中使用此功能

答案 1 :(得分:-3)

在dlib中使用Google搜索了array2d并找到了这个辅助函数。

   template <
        typename T,
        typename mem_manager
        >
    void deserialize (
        array2d<T,mem_manager>& item, 
        std::istream& in
    );   
    /*!
        provides deserialization support 
    !*/

我不确定将它写入文件然后将其读回来会得到你。