【发布时间】:2016-06-30 14:46:04
【问题描述】:
是否可以从字节流初始化dlib 中的array2d 对象?
问题是我从外部源接收到包含 png 文件的字节流,我不想创建临时文件然后将图像从该文件读取到数组中。是否可以跳过写入文件部分?
换一种说法,是否可以从内存中保存的文件构建array2d对象?
谢谢
【问题讨论】:
是否可以从字节流初始化dlib 中的array2d 对象?
问题是我从外部源接收到包含 png 文件的字节流,我不想创建临时文件然后将图像从该文件读取到数组中。是否可以跳过写入文件部分?
换一种说法,是否可以从内存中保存的文件构建array2d对象?
谢谢
【问题讨论】:
制作它的唯一方法 - 使用 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 的某些未来版本可以在其中包含此功能
【讨论】:
在 dlib 中搜索 array2d 并找到了这个辅助函数。
template <
typename T,
typename mem_manager
>
void deserialize (
array2d<T,mem_manager>& item,
std::istream& in
);
/*!
provides deserialization support
!*/
我不确定将其写入文件然后读回会得到什么。
【讨论】: