commit
100db1bc0b
108 changed files with 1245 additions and 650 deletions
@ -0,0 +1,21 @@ |
||||
{ |
||||
"whitelist": |
||||
{ |
||||
"": [ |
||||
"findHomography", |
||||
"calibrateCameraExtended", |
||||
"drawFrameAxes", |
||||
"estimateAffine2D", |
||||
"getDefaultNewCameraMatrix", |
||||
"initUndistortRectifyMap", |
||||
"Rodrigues", |
||||
"solvePnP", |
||||
"solvePnPRansac", |
||||
"solvePnPRefineLM", |
||||
"projectPoints", |
||||
"undistort", |
||||
"fisheye_initUndistortRectifyMap", |
||||
"fisheye_projectPoints" |
||||
] |
||||
} |
||||
} |
@ -0,0 +1,15 @@ |
||||
{ |
||||
"whitelist": |
||||
{ |
||||
"": [ |
||||
"absdiff", "add", "addWeighted", "bitwise_and", "bitwise_not", "bitwise_or", "bitwise_xor", "cartToPolar", |
||||
"compare", "convertScaleAbs", "copyMakeBorder", "countNonZero", "determinant", "dft", "divide", "eigen", |
||||
"exp", "flip", "getOptimalDFTSize","gemm", "hconcat", "inRange", "invert", "kmeans", "log", "magnitude", |
||||
"max", "mean", "meanStdDev", "merge", "min", "minMaxLoc", "mixChannels", "multiply", "norm", "normalize", |
||||
"perspectiveTransform", "polarToCart", "pow", "randn", "randu", "reduce", "repeat", "rotate", "setIdentity", "setRNGSeed", |
||||
"solve", "solvePoly", "split", "sqrt", "subtract", "trace", "transform", "transpose", "vconcat", |
||||
"setLogLevel", "getLogLevel", "LUT" |
||||
], |
||||
"Algorithm": [] |
||||
} |
||||
} |
@ -0,0 +1,12 @@ |
||||
{ |
||||
"whitelist": |
||||
{ |
||||
"dnn_Net": ["setInput", "forward", "setPreferableBackend","getUnconnectedOutLayersNames"], |
||||
"": ["readNetFromCaffe", "readNetFromTensorflow", "readNetFromTorch", "readNetFromDarknet", |
||||
"readNetFromONNX", "readNetFromTFLite", "readNet", "blobFromImage"] |
||||
}, |
||||
"namespace_prefix_override": |
||||
{ |
||||
"dnn": "" |
||||
} |
||||
} |
@ -0,0 +1,228 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
|
||||
#include "../precomp.hpp" |
||||
#include "layers_common.hpp" |
||||
|
||||
#include <opencv2/dnn/shape_utils.hpp> |
||||
|
||||
namespace cv { namespace dnn { |
||||
|
||||
namespace { |
||||
|
||||
template<typename T> |
||||
class ComparatorGreater { |
||||
public: |
||||
ComparatorGreater(const T* data, size_t step) |
||||
: data_(data), step_(step) {} |
||||
|
||||
void addOffset(size_t offset) { |
||||
data_ += offset; |
||||
} |
||||
|
||||
void minusOffset(size_t offset) { |
||||
data_ -= offset; |
||||
} |
||||
|
||||
bool operator()(const size_t lhs_idx, const size_t rhs_idx) { |
||||
T lhs = *(data_ + lhs_idx * step_), |
||||
rhs = *(data_ + rhs_idx * step_); |
||||
return (lhs > rhs || (lhs == rhs && lhs_idx < rhs_idx)); |
||||
} |
||||
|
||||
private: |
||||
const T* data_; |
||||
size_t step_; |
||||
}; |
||||
|
||||
template<typename T> |
||||
class ComparatorLess { |
||||
public: |
||||
ComparatorLess(const T* data, size_t step) |
||||
: data_(data), step_(step) {} |
||||
|
||||
void addOffset(size_t offset) { |
||||
data_ += offset; |
||||
} |
||||
|
||||
void minusOffset(size_t offset) { |
||||
data_ -= offset; |
||||
} |
||||
|
||||
bool operator()(const size_t lhs_idx, const size_t rhs_idx) { |
||||
T lhs = *(data_ + lhs_idx * step_), |
||||
rhs = *(data_ + rhs_idx * step_); |
||||
return (lhs < rhs || (lhs == rhs && lhs_idx < rhs_idx)); |
||||
} |
||||
|
||||
private: |
||||
const T* data_; |
||||
size_t step_; |
||||
}; |
||||
} |
||||
|
||||
class TopKLayerImpl CV_FINAL : public TopKLayer |
||||
{ |
||||
public: |
||||
TopKLayerImpl(const LayerParams& params) |
||||
{ |
||||
setParamsFrom(params); |
||||
|
||||
axis = params.get<int>("axis", -1); |
||||
largest = params.get<int>("largest", 1) == 1; |
||||
sorted = params.get<int>("sorted", 1) == 1; |
||||
CV_CheckTrue(sorted, "TopK: sorted == false is not supported"); // TODO: support sorted
|
||||
|
||||
CV_CheckTrue(params.has("k"), "TopK: parameter k is required but missing"); |
||||
K = params.get<int>("k"); |
||||
} |
||||
|
||||
virtual bool supportBackend(int backendId) CV_OVERRIDE |
||||
{ |
||||
return backendId == DNN_BACKEND_OPENCV; |
||||
} |
||||
|
||||
virtual bool getMemoryShapes(const std::vector<MatShape> &inputs, |
||||
const int requiredOutputs, |
||||
std::vector<MatShape> &outputs, |
||||
std::vector<MatShape> &internals) const CV_OVERRIDE |
||||
{ |
||||
const auto &input_shape = inputs.front(); |
||||
int input_dims = input_shape.size(); |
||||
|
||||
// Check if axis is valid
|
||||
CV_CheckGE(axis, -input_dims, "TopK: axis is out of range"); |
||||
CV_CheckLT(axis, input_dims, "TopK: axis is out of range"); |
||||
// Normalize axis
|
||||
int axis_normalized = normalize_axis(axis, input_shape.size()); |
||||
|
||||
// Check if K is in range (0, input_shape[axis])
|
||||
CV_CheckGT(K, 0, "TopK: K needs to be a positive integer"); |
||||
CV_CheckLT(K, input_shape[axis_normalized], "TopK: K is out of range"); |
||||
|
||||
// Assign output shape
|
||||
auto output_shape = input_shape; |
||||
output_shape[axis_normalized] = K; |
||||
outputs.assign(1, output_shape); |
||||
outputs.assign(2, output_shape); // TODO: support indices of type CV_32S on 5.x
|
||||
|
||||
return false; |
||||
} |
||||
|
||||
virtual void finalize(InputArrayOfArrays inputs_arr, OutputArrayOfArrays outputs_arr) CV_OVERRIDE { |
||||
std::vector<Mat> inputs; |
||||
inputs_arr.getMatVector(inputs); |
||||
|
||||
// Normalize axis
|
||||
auto input_shape = shape(inputs.front()); |
||||
axis = normalize_axis(axis, input_shape.size()); |
||||
} |
||||
|
||||
template<class Comparator> |
||||
void FindTopK(const Mat &input, Mat &output_value, Mat &output_index) { |
||||
const auto input_shape = shape(input); |
||||
size_t loops = std::accumulate(input_shape.begin(), input_shape.begin() + axis, 1, std::multiplies<int>()); |
||||
size_t step = std::accumulate(input_shape.begin() + axis + 1, input_shape.end(), 1, std::multiplies<int>()); |
||||
int dim_axis = input_shape[axis]; |
||||
if (loops == 1) { |
||||
auto worker = [&](const Range &r) { |
||||
const auto *input_ptr = input.ptr<const float>(); // TODO: support other input type
|
||||
auto *output_value_ptr = output_value.ptr<float>(); |
||||
auto *output_index_ptr = output_index.ptr<float>(); // TODO: use CV_32S on 5.x
|
||||
|
||||
Comparator cmp(input_ptr, step); |
||||
|
||||
AutoBuffer<int> buffer_index(dim_axis); |
||||
auto *buffer_index_ptr = buffer_index.data(); |
||||
for (int offset = r.start; offset < r.end; offset++) { |
||||
const auto *input_offset_ptr = input_ptr + offset; |
||||
cmp.addOffset(offset); |
||||
|
||||
std::iota(buffer_index_ptr, buffer_index_ptr + dim_axis, 0); |
||||
std::stable_sort(buffer_index_ptr, buffer_index_ptr + dim_axis, cmp); |
||||
|
||||
auto *output_value_offset_ptr = output_value_ptr + offset; |
||||
auto *output_index_offset_ptr = output_index_ptr + offset; |
||||
for (int i = 0; i < K; i++) { |
||||
int source_index = buffer_index_ptr[i]; |
||||
output_value_offset_ptr[i * step] = *(input_offset_ptr + source_index * step); |
||||
output_index_offset_ptr[i * step] = source_index; |
||||
} |
||||
cmp.minusOffset(offset); |
||||
} |
||||
}; |
||||
parallel_for_(Range(0, step), worker); |
||||
} else { |
||||
auto worker = [&](const Range &r) { |
||||
const auto *input_ptr = input.ptr<const float>(); |
||||
auto *output_value_ptr = output_value.ptr<float>(); |
||||
auto *output_index_ptr = output_index.ptr<float>(); |
||||
|
||||
Comparator cmp(input_ptr, step); |
||||
|
||||
AutoBuffer<int> buffer_index(dim_axis); |
||||
auto *buffer_index_ptr = buffer_index.data(); |
||||
for (int batch_index = r.start; batch_index < r.end; batch_index++) { |
||||
for (size_t offset = 0; offset < step; offset++) { |
||||
const auto *input_offset_ptr = input_ptr + batch_index * dim_axis * step + offset; |
||||
cmp.addOffset(batch_index * dim_axis * step + offset); |
||||
|
||||
std::iota(buffer_index_ptr, buffer_index_ptr + dim_axis, 0); |
||||
std::stable_sort(buffer_index_ptr, buffer_index_ptr + dim_axis, cmp); |
||||
|
||||
auto *output_value_offset_ptr = output_value_ptr + batch_index * K * step + offset; |
||||
auto *output_index_offset_ptr = output_index_ptr + batch_index * K * step + offset; |
||||
for (int i = 0; i < K; i++) { |
||||
int source_index = buffer_index_ptr[i]; |
||||
output_value_offset_ptr[i * step] = *(input_offset_ptr + source_index * step); |
||||
output_index_offset_ptr[i * step] = source_index; |
||||
} |
||||
cmp.minusOffset(batch_index * dim_axis * step + offset); |
||||
} |
||||
} |
||||
}; |
||||
parallel_for_(Range(0, loops), worker); |
||||
} |
||||
} |
||||
|
||||
void forward(InputArrayOfArrays inputs_arr, OutputArrayOfArrays outputs_arr, OutputArrayOfArrays internals_arr) CV_OVERRIDE |
||||
{ |
||||
CV_TRACE_FUNCTION(); |
||||
CV_TRACE_ARG_VALUE(name, "name", name.c_str()); |
||||
|
||||
if (inputs_arr.depth() == CV_16F) |
||||
{ |
||||
forward_fallback(inputs_arr, outputs_arr, internals_arr); |
||||
return; |
||||
} |
||||
|
||||
std::vector<Mat> inputs, outputs; |
||||
inputs_arr.getMatVector(inputs); |
||||
outputs_arr.getMatVector(outputs); |
||||
|
||||
const auto &input = inputs.front(); |
||||
auto &output_value = outputs.front(); |
||||
auto &output_index = outputs.back(); |
||||
|
||||
if (largest) { |
||||
FindTopK<ComparatorGreater<float>>(input, output_value, output_index); |
||||
} else { |
||||
FindTopK<ComparatorLess<float>>(input, output_value, output_index); |
||||
} |
||||
} |
||||
|
||||
private: |
||||
int axis; |
||||
bool largest; |
||||
bool sorted; |
||||
|
||||
int K; // FIXIT: make it layer input once dynamic shape is supported
|
||||
}; |
||||
|
||||
Ptr<TopKLayer> TopKLayer::create(const LayerParams& params) |
||||
{ |
||||
return makePtr<TopKLayerImpl>(params); |
||||
} |
||||
|
||||
}} // namespace cv::dnn
|
@ -0,0 +1,19 @@ |
||||
{ |
||||
"whitelist": |
||||
{ |
||||
"Feature2D": ["detect", "compute", "detectAndCompute", "descriptorSize", "descriptorType", "defaultNorm", "empty", "getDefaultName"], |
||||
"BRISK": ["create", "getDefaultName"], |
||||
"ORB": ["create", "setMaxFeatures", "setScaleFactor", "setNLevels", "setEdgeThreshold", "setFastThreshold", "setFirstLevel", "setWTA_K", "setScoreType", "setPatchSize", "getFastThreshold", "getDefaultName"], |
||||
"MSER": ["create", "detectRegions", "setDelta", "getDelta", "setMinArea", "getMinArea", "setMaxArea", "getMaxArea", "setPass2Only", "getPass2Only", "getDefaultName"], |
||||
"FastFeatureDetector": ["create", "setThreshold", "getThreshold", "setNonmaxSuppression", "getNonmaxSuppression", "setType", "getType", "getDefaultName"], |
||||
"AgastFeatureDetector": ["create", "setThreshold", "getThreshold", "setNonmaxSuppression", "getNonmaxSuppression", "setType", "getType", "getDefaultName"], |
||||
"GFTTDetector": ["create", "setMaxFeatures", "getMaxFeatures", "setQualityLevel", "getQualityLevel", "setMinDistance", "getMinDistance", "setBlockSize", "getBlockSize", "setHarrisDetector", "getHarrisDetector", "setK", "getK", "getDefaultName"], |
||||
"SimpleBlobDetector": ["create", "setParams", "getParams", "getDefaultName"], |
||||
"SimpleBlobDetector_Params": [], |
||||
"KAZE": ["create", "setExtended", "getExtended", "setUpright", "getUpright", "setThreshold", "getThreshold", "setNOctaves", "getNOctaves", "setNOctaveLayers", "getNOctaveLayers", "setDiffusivity", "getDiffusivity", "getDefaultName"], |
||||
"AKAZE": ["create", "setDescriptorType", "getDescriptorType", "setDescriptorSize", "getDescriptorSize", "setDescriptorChannels", "getDescriptorChannels", "setThreshold", "getThreshold", "setNOctaves", "getNOctaves", "setNOctaveLayers", "getNOctaveLayers", "setDiffusivity", "getDiffusivity", "getDefaultName"], |
||||
"DescriptorMatcher": ["add", "clear", "empty", "isMaskSupported", "train", "match", "knnMatch", "radiusMatch", "clone", "create"], |
||||
"BFMatcher": ["isMaskSupported", "create"], |
||||
"": ["drawKeypoints", "drawMatches", "drawMatchesKnn"] |
||||
} |
||||
} |
@ -0,0 +1,95 @@ |
||||
{ |
||||
"whitelist": |
||||
{ |
||||
"": [ |
||||
"Canny", |
||||
"GaussianBlur", |
||||
"Laplacian", |
||||
"HoughLines", |
||||
"HoughLinesP", |
||||
"HoughCircles", |
||||
"Scharr", |
||||
"Sobel", |
||||
"adaptiveThreshold", |
||||
"approxPolyDP", |
||||
"arcLength", |
||||
"bilateralFilter", |
||||
"blur", |
||||
"boundingRect", |
||||
"boxFilter", |
||||
"calcBackProject", |
||||
"calcHist", |
||||
"circle", |
||||
"compareHist", |
||||
"connectedComponents", |
||||
"connectedComponentsWithStats", |
||||
"contourArea", |
||||
"convexHull", |
||||
"convexityDefects", |
||||
"cornerHarris", |
||||
"cornerMinEigenVal", |
||||
"createCLAHE", |
||||
"createLineSegmentDetector", |
||||
"cvtColor", |
||||
"demosaicing", |
||||
"dilate", |
||||
"distanceTransform", |
||||
"distanceTransformWithLabels", |
||||
"drawContours", |
||||
"ellipse", |
||||
"ellipse2Poly", |
||||
"equalizeHist", |
||||
"erode", |
||||
"filter2D", |
||||
"findContours", |
||||
"fitEllipse", |
||||
"fitLine", |
||||
"floodFill", |
||||
"getAffineTransform", |
||||
"getPerspectiveTransform", |
||||
"getRotationMatrix2D", |
||||
"getStructuringElement", |
||||
"goodFeaturesToTrack", |
||||
"grabCut", |
||||
"integral", |
||||
"integral2", |
||||
"isContourConvex", |
||||
"line", |
||||
"matchShapes", |
||||
"matchTemplate", |
||||
"medianBlur", |
||||
"minAreaRect", |
||||
"minEnclosingCircle", |
||||
"moments", |
||||
"morphologyEx", |
||||
"pointPolygonTest", |
||||
"putText", |
||||
"pyrDown", |
||||
"pyrUp", |
||||
"rectangle", |
||||
"remap", |
||||
"resize", |
||||
"sepFilter2D", |
||||
"threshold", |
||||
"warpAffine", |
||||
"warpPerspective", |
||||
"warpPolar", |
||||
"watershed", |
||||
"fillPoly", |
||||
"fillConvexPoly", |
||||
"polylines" |
||||
], |
||||
"CLAHE": ["apply", "collectGarbage", "getClipLimit", "getTilesGridSize", "setClipLimit", "setTilesGridSize"], |
||||
"segmentation_IntelligentScissorsMB": [ |
||||
"IntelligentScissorsMB", |
||||
"setWeights", |
||||
"setGradientMagnitudeMaxLimit", |
||||
"setEdgeFeatureZeroCrossingParameters", |
||||
"setEdgeFeatureCannyParameters", |
||||
"applyImage", |
||||
"applyImageFeatures", |
||||
"buildMap", |
||||
"getContour" |
||||
] |
||||
} |
||||
} |
@ -1,58 +0,0 @@ |
||||
apply plugin: 'com.android.library' |
||||
@KOTLIN_PLUGIN_DECLARATION@ |
||||
|
||||
def openCVersionName = "@OPENCV_VERSION@" |
||||
def openCVersionCode = ((@OPENCV_VERSION_MAJOR@ * 100 + @OPENCV_VERSION_MINOR@) * 100 + @OPENCV_VERSION_PATCH@) * 10 + 0 |
||||
|
||||
android { |
||||
@OPENCV_ANDROID_NAMESPACE_DECLARATION@ |
||||
compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ |
||||
|
||||
defaultConfig { |
||||
minSdkVersion @ANDROID_MIN_SDK_VERSION@ |
||||
targetSdkVersion @ANDROID_TARGET_SDK_VERSION@ |
||||
|
||||
versionCode openCVersionCode |
||||
versionName openCVersionName |
||||
|
||||
externalNativeBuild { |
||||
cmake { |
||||
arguments "-DANDROID_STL=@ANDROID_STL@" |
||||
targets "opencv_jni_shared" |
||||
} |
||||
} |
||||
} |
||||
|
||||
buildTypes { |
||||
debug { |
||||
packagingOptions { |
||||
doNotStrip '**/*.so' // controlled by OpenCV CMake scripts |
||||
} |
||||
} |
||||
release { |
||||
packagingOptions { |
||||
doNotStrip '**/*.so' // controlled by OpenCV CMake scripts |
||||
} |
||||
minifyEnabled false |
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' |
||||
} |
||||
} |
||||
|
||||
sourceSets { |
||||
main { |
||||
jniLibs.srcDirs = ['../../jni'] |
||||
java.srcDirs = ['src'] // TODO Use original files instead of copied into build directory |
||||
res.srcDirs = ['@OpenCV_SOURCE_DIR@/modules/java/android_sdk/android_gradle_lib/res'] |
||||
manifest.srcFile 'AndroidManifest.xml' |
||||
} |
||||
} |
||||
|
||||
externalNativeBuild { |
||||
cmake { |
||||
path (project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt') |
||||
} |
||||
} |
||||
} |
||||
|
||||
dependencies { |
||||
} |
@ -0,0 +1,28 @@ |
||||
{ |
||||
"whitelist": |
||||
{ |
||||
"": ["groupRectangles", "getPredefinedDictionary", "extendDictionary", "drawDetectedMarkers", "generateImageMarker", "drawDetectedCornersCharuco", "drawDetectedDiamonds"], |
||||
"HOGDescriptor": ["load", "HOGDescriptor", "getDefaultPeopleDetector", "getDaimlerPeopleDetector", "setSVMDetector", "detectMultiScale"], |
||||
"CascadeClassifier": ["load", "detectMultiScale2", "CascadeClassifier", "detectMultiScale3", "empty", "detectMultiScale"], |
||||
"GraphicalCodeDetector": ["decode", "detect", "detectAndDecode", "detectMulti", "decodeMulti", "detectAndDecodeMulti"], |
||||
"QRCodeDetector": ["QRCodeDetector", "decode", "detect", "detectAndDecode", "detectMulti", "decodeMulti", "detectAndDecodeMulti", "decodeCurved", "detectAndDecodeCurved", "setEpsX", "setEpsY"], |
||||
"aruco_PredefinedDictionaryType": [], |
||||
"aruco_Dictionary": ["Dictionary", "getDistanceToId", "generateImageMarker", "getByteListFromBits", "getBitsFromByteList"], |
||||
"aruco_Board": ["Board", "matchImagePoints", "generateImage"], |
||||
"aruco_GridBoard": ["GridBoard", "generateImage", "getGridSize", "getMarkerLength", "getMarkerSeparation", "matchImagePoints"], |
||||
"aruco_CharucoParameters": ["CharucoParameters"], |
||||
"aruco_CharucoBoard": ["CharucoBoard", "generateImage", "getChessboardCorners", "getNearestMarkerCorners", "checkCharucoCornersCollinear", "matchImagePoints", "getLegacyPattern", "setLegacyPattern"], |
||||
"aruco_DetectorParameters": ["DetectorParameters"], |
||||
"aruco_RefineParameters": ["RefineParameters"], |
||||
"aruco_ArucoDetector": ["ArucoDetector", "detectMarkers", "refineDetectedMarkers", "setDictionary", "setDetectorParameters", "setRefineParameters"], |
||||
"aruco_CharucoDetector": ["CharucoDetector", "setBoard", "setCharucoParameters", "setDetectorParameters", "setRefineParameters", "detectBoard", "detectDiamonds"], |
||||
"QRCodeDetectorAruco_Params": ["Params"], |
||||
"QRCodeDetectorAruco": ["QRCodeDetectorAruco", "decode", "detect", "detectAndDecode", "detectMulti", "decodeMulti", "detectAndDecodeMulti", "setDetectorParameters", "setArucoParameters"], |
||||
"barcode_BarcodeDetector": ["BarcodeDetector", "decode", "detect", "detectAndDecode", "detectMulti", "decodeMulti", "detectAndDecodeMulti", "decodeWithType", "detectAndDecodeWithType"], |
||||
"FaceDetectorYN": ["setInputSize", "getInputSize", "setScoreThreshold", "getScoreThreshold", "setNMSThreshold", "getNMSThreshold", "setTopK", "getTopK", "detect", "create"] |
||||
}, |
||||
"namespace_prefix_override": |
||||
{ |
||||
"aruco": "" |
||||
} |
||||
} |
@ -0,0 +1,25 @@ |
||||
{ |
||||
"whitelist": |
||||
{ |
||||
"": [ |
||||
"createAlignMTB", "createCalibrateDebevec", "createCalibrateRobertson", |
||||
"createMergeDebevec", "createMergeMertens", "createMergeRobertson", |
||||
"createTonemapDrago", "createTonemapMantiuk", "createTonemapReinhard", "inpaint"], |
||||
"CalibrateCRF": ["process"], |
||||
"AlignMTB" : ["calculateShift", "shiftMat", "computeBitmaps", "getMaxBits", "setMaxBits", |
||||
"getExcludeRange", "setExcludeRange", "getCut", "setCut"], |
||||
"CalibrateDebevec" : ["getLambda", "setLambda", "getSamples", "setSamples", "getRandom", "setRandom"], |
||||
"CalibrateRobertson" : ["getMaxIter", "setMaxIter", "getThreshold", "setThreshold", "getRadiance"], |
||||
"MergeExposures" : ["process"], |
||||
"MergeDebevec" : ["process"], |
||||
"MergeMertens" : ["process", "getContrastWeight", "setContrastWeight", "getSaturationWeight", |
||||
"setSaturationWeight", "getExposureWeight", "setExposureWeight"], |
||||
"MergeRobertson" : ["process"], |
||||
"Tonemap" : ["process" , "getGamma", "setGamma"], |
||||
"TonemapDrago" : ["getSaturation", "setSaturation", "getBias", "setBias", |
||||
"getSigmaColor", "setSigmaColor", "getSigmaSpace","setSigmaSpace"], |
||||
"TonemapMantiuk" : ["getScale", "setScale", "getSaturation", "setSaturation"], |
||||
"TonemapReinhard" : ["getIntensity", "setIntensity", "getLightAdaptation", "setLightAdaptation", |
||||
"getColorAdaptation", "setColorAdaptation"] |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue