【问题标题】:array2d from bytestream without writing file to disk来自字节流的array2d而不将文件写入磁盘
【发布时间】:2016-06-30 14:46:04
【问题描述】:

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

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

换一种说法,是否可以从内存中保存的文件构建array2d对象?

谢谢

【问题讨论】:

    标签: c++ dlib


    【解决方案1】:

    制作它的唯一方法 - 使用 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 的某些未来版本可以在其中包含此功能

    【讨论】:

    • 嗨@Evgeniy 感谢您的回复。这回答了我的问题,即使我不想相信这是事实。只是一个简单的问题:这个 lodepng 库不会以所需的 array2d 格式读取 png 流,对吧?
    • array2d 是一个带有一些附加功能的简单内存缓冲区。构造 array2d 后,您可以使用 dlib::image_data() 访问内存指针。我无法回答有关 lodepng 的详细信息 - 几年前我使用它,但现在我切换到静态链接的 opencv
    【解决方案2】:

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

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

    我不确定将其写入文件然后读回会得到什么。

    【讨论】:

    • 反序列化可用于将array2d加载/保存到磁盘/内存,但它不会对PNG(或任何其他)格式进行编码/解码
    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多