Category: C/C++

Header-only JPEG Save/Load

部署项目的时候偶尔会遇到这类需求,不能使用OpenCV之类的库来读写图片,比如需要部署到嵌入式环境之类的。网上找了一阵,发现对于jpeg的读写,这两个库很方便。

一个是NanoJPEG,有人做了一个C++版本。用来读jpeg文件。另一个是TinyJPEG,用来输出到文件。

都是header-only,只需要include头文件就可以用了。也没有标准库以外的依赖。

写了一个例子放在这里: Example-HeaderOnly-JPEG

  vector<uint8_t> image;
  int width, height;
  if (load_jpg_data(argv[1], image, width, height)) {
    cout << "size " << width << " x " << height << endl;

    vector<uint8_t> rotated_image(height*width*3);
    for (int y = 0; y < height; y++) {
      for (int x = 0; x < width; x++) {
        rotated_image[x*height*3+y*3+0] = image[y*width*3+x*3+0];
        rotated_image[x*height*3+y*3+1] = image[y*width*3+x*3+1];
        rotated_image[x*height*3+y*3+2] = image[y*width*3+x*3+2];
      }
    }
    tje_encode_to_file(argv[2], height, width, 3, rotated_image.data());
  } else {
    cout << "Failed to open file " << argv[1] << endl;
  }

MXNet C++ Deployment

iOS上的Deployment的sample code, https://github.com/pppoe/WhatsThis-iOS, 介绍: http://haoxiang.org/2016/01/ios-mxnet-demo/

MXNet训练得到的模型有两个文件,XX.json描述网络,XX.params存网络参数。部署的时候最方便的方式是用Amalgamation: https://github.com/apache/incubator-mxnet/tree/master/amalgamation
Amalgamation可以把整个MXNet里Prediction相关的代码写到一个很大的C源文件,部署的时候只需要这个C源文件和对应的一个头文件就可以了。

Sample code 在这里 https://github.com/pppoe/mxnet-Cpp-Deployment-Wrapper-Demo