Halide is a programming language designed to make it easier to write high-performance image and array processing code on modern machines.
halide有两个特性比较吸引人。一个是对于各种平台架构的支持。
- CPU architectures: X86, ARM, MIPS, Hexagon, PowerPC
- Operating systems: Linux, Windows, macOS, Android, iOS, Qualcomm QuRT
- GPU Compute APIs: CUDA, OpenCL, OpenGL, OpenGL Compute Shaders, Apple Metal, Microsoft Direct X 12
另一个是把计算什么和怎么计算(何时计算)分离开来。
可以直接参考tutorials 来学习
下面是一段将Halide Buffer转化成opencv Mat的代码,用于调试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
// Include some support code for loading pngs. // #include "halide_image_io.h" #include <iostream> #include "para_norm.h" #include "HalideBuffer.h" #include "clock.h" #include "halide_image_io.h" // for Halide::tools to load image. just for debug #include <opencv2/opencv.hpp> // to show image // #include "Halide.h" using namespace std; using namespace cv; using namespace Halide; using namespace Halide::Runtime; // using namespace Halide::Tools; void convertHalide2Mat(const Buffer<uint8_t> &src, cv::Mat &dest) { if (dest.empty()) dest.create(cv::Size(src.width(), src.height()), CV_MAKETYPE(CV_8U, src.channels())); const int ch = dest.channels(); if (ch == 1) { for (int j = 0; j < dest.rows; j++) { for (int i = 0; i < dest.cols; i++) { dest.at<uchar>(j, i) = src(i, j); } } } else if (ch == 3) { for (int j = 0; j < dest.rows; j++) { for (int i = 0; i < dest.cols; i++) { dest.at<uchar>(j, 3 * i + 0) = src(i, j, 2); dest.at<uchar>(j, 3 * i + 1) = src(i, j, 1); dest.at<uchar>(j, 3 * i + 2) = src(i, j, 0); } } } } int main(int argc, char **argv) { Halide::Runtime::Buffer<uint8_t> input = Halide::Tools::load_image("/data/github/learnhalide/png.png"); cv::Mat Img; convertHalide2Mat(input,Img); cv::imshow("debug", Img); cv::waitKey(0); return 0; } |