mirror of https://github.com/alibaba/MNN.git
				
				
				
			
		
			
				
	
	
		
			98 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| //
 | |
| //  CPUImageProcess.hpp
 | |
| //  MNN
 | |
| //
 | |
| //  Created by MNN on 2021/10/27.
 | |
| //  Copyright © 2018 Alibaba. All rights reserved.
 | |
| //
 | |
| 
 | |
| #ifndef CPUImageProcess_hpp
 | |
| #define CPUImageProcess_hpp
 | |
| 
 | |
| #include <MNN/ImageProcess.hpp>
 | |
| #include "backend/cpu/CPUBackend.hpp"
 | |
| #include "compute/CommonOptFunction.h"
 | |
| 
 | |
| namespace MNN {
 | |
| 
 | |
| typedef void (*BLITTER)(const unsigned char* source, unsigned char* dest, size_t count);
 | |
| typedef void (*BLIT_FLOAT)(const unsigned char* source, float* dest, const float* mean, const float* normal, size_t count);
 | |
| typedef void (*SAMPLER)(const unsigned char* source, unsigned char* dest, CV::Point* points, size_t sta, size_t count,
 | |
|                         size_t capacity, size_t iw, size_t ih, size_t yStride);
 | |
| 
 | |
| class CPUImageProcess : public Execution {
 | |
| public:
 | |
|     CPUImageProcess(CV::ImageProcess::Config config, const CoreFunctions* coreFunctions) : Execution(nullptr), coreFunctions(coreFunctions) {
 | |
|         filterType = (FilterType)config.filterType;
 | |
|         wrap = (WrapType)config.wrap;
 | |
|         sourceFormat = (ImageFormatType)config.sourceFormat;
 | |
|         destFormat = (ImageFormatType)config.destFormat;
 | |
|         for (int i = 0; i < 4; i++) {
 | |
|             mean[i] = config.mean[i];
 | |
|             normal[i] = config.normal[i];
 | |
|         }
 | |
|     }
 | |
|     void setMatrix(CV::Matrix m) {
 | |
|         transform = m;
 | |
|         transform.invert(&transformInvert);
 | |
|     }
 | |
|     void setPadVal(uint8_t val) {
 | |
|         paddingValue = val;
 | |
|     }
 | |
|     void setDraw() {
 | |
|         draw = true;
 | |
|     }
 | |
|     void setStride(int stride) {
 | |
|         mStride = stride;
 | |
|     }
 | |
|     CPUImageProcess(Backend *bn, const ImageProcessParam* process) : Execution(bn) {
 | |
|         coreFunctions = static_cast<CPUBackend*>(backend())->functions();
 | |
|         draw = process->draw();
 | |
|         if (draw) {
 | |
|             return;
 | |
|         }
 | |
|         filterType = process->filterType();
 | |
|         wrap = process->wrap();
 | |
|         sourceFormat = process->sourceFormat();
 | |
|         destFormat = process->destFormat();
 | |
|         paddingValue = process->paddingValue();
 | |
|         for (int i = 0; i < 4; i++) {
 | |
|             mean[i] = process->mean()->Get(i);
 | |
|             normal[i] = process->normal()->Get(i);
 | |
|         }
 | |
|         for (int i = 0; i < process->transform()->size(); i++) {
 | |
|             transform.set(i, process->transform()->Get(i));
 | |
|         }
 | |
|         transform.invert(&transformInvert);
 | |
|     }
 | |
|     virtual ErrorCode onResize(const std::vector<Tensor *> &inputs, const std::vector<Tensor *> &outputs) override;
 | |
|     virtual ErrorCode onExecute(const std::vector<Tensor *> &inputs, const std::vector<Tensor *> &outputs) override;
 | |
| private:
 | |
|     BLITTER choose(ImageFormatType source, ImageFormatType dest);
 | |
|     BLITTER choose(int channelByteSize);
 | |
|     BLIT_FLOAT choose(ImageFormatType format, int dstBpp = 0);
 | |
|     SAMPLER choose(ImageFormatType format, FilterType type, bool identity);
 | |
| private:
 | |
|     FilterType filterType;
 | |
|     WrapType wrap;
 | |
|     ImageFormatType sourceFormat, destFormat;
 | |
|     float mean[4]   = {0.0f, 0.0f, 0.0f, 0.0f};
 | |
|     float normal[4] = {1.0f, 1.0f, 1.0f, 1.0f};
 | |
|     uint8_t paddingValue = 0;
 | |
|     int ih, iw, ic, oh, ow, oc;
 | |
|     halide_type_t dtype;
 | |
|     CV::Matrix transform, transformInvert;
 | |
|     SAMPLER sampler;
 | |
|     BLITTER blitter = nullptr;
 | |
|     BLIT_FLOAT blitFloat = nullptr;
 | |
|     std::shared_ptr<Tensor> cacheBuffer, cacheBufferRGBA;
 | |
|     std::unique_ptr<uint8_t[]> samplerBuffer, blitBuffer;
 | |
|     uint8_t* samplerDest = nullptr, *blitDest = nullptr;
 | |
|     const CoreFunctions* coreFunctions = nullptr;
 | |
|     bool draw = false;
 | |
|     int mStride = 0;
 | |
| };
 | |
| }; // namespace MNN
 | |
| 
 | |
| #endif /* CPUImageProcess_hpp */
 |