Merge pull request #19284 from Ziachnix:feature/js-qr-code-detector
Add QRCodeDetector to JavaScript Build * ADD: js support for qrCodeDetector - cherry picked commit to solve rebase error * CHG. Revert haarcascade path * FIX: Tests without images * ADD: decodeCurved * js(docs): don't require OPENCV_TEST_DATA_PATH Co-authored-by: Alexander Alekhin <alexander.a.alekhin@gmail.com>
This commit is contained in:
parent
7a8e171691
commit
960f501cc1
@ -138,6 +138,7 @@ Building OpenCV.js from Source
|
|||||||
python ./platforms/js/build_js.py build_js --cmake_option="-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules"
|
python ./platforms/js/build_js.py build_js --cmake_option="-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules"
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
|
||||||
Running OpenCV.js Tests
|
Running OpenCV.js Tests
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
@ -303,6 +304,12 @@ The example uses latest version of emscripten. If the build fails you should try
|
|||||||
docker run --rm -v $(pwd):/src -u $(id -u):$(id -g) emscripten/emsdk:2.0.10 emcmake python3 ./platforms/js/build_js.py build_js
|
docker run --rm -v $(pwd):/src -u $(id -u):$(id -g) emscripten/emsdk:2.0.10 emcmake python3 ./platforms/js/build_js.py build_js
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
In Windows use the following PowerShell command:
|
||||||
|
|
||||||
|
@code{.bash}
|
||||||
|
docker run --rm --workdir /src -v "$(get-location):/src" "emscripten/emsdk:2.0.10" emcmake python3 ./platforms/js/build_js.py build_js
|
||||||
|
@endcode
|
||||||
|
|
||||||
### Building the documentation with Docker
|
### Building the documentation with Docker
|
||||||
|
|
||||||
To build the documentation `doxygen` needs to be installed. Create a file named `Dockerfile` with the following content:
|
To build the documentation `doxygen` needs to be installed. Create a file named `Dockerfile` with the following content:
|
||||||
|
|||||||
@ -119,6 +119,7 @@ type_dict = {
|
|||||||
'InputOutputArray': 'cv::Mat&',
|
'InputOutputArray': 'cv::Mat&',
|
||||||
'InputArrayOfArrays': 'const std::vector<cv::Mat>&',
|
'InputArrayOfArrays': 'const std::vector<cv::Mat>&',
|
||||||
'OutputArrayOfArrays': 'std::vector<cv::Mat>&',
|
'OutputArrayOfArrays': 'std::vector<cv::Mat>&',
|
||||||
|
'string': 'std::string',
|
||||||
'String': 'std::string',
|
'String': 'std::string',
|
||||||
'const String&':'const std::string&'
|
'const String&':'const std::string&'
|
||||||
}
|
}
|
||||||
@ -462,8 +463,7 @@ class JSWrapperGenerator(object):
|
|||||||
ret_type = type_dict[ptr_type]
|
ret_type = type_dict[ptr_type]
|
||||||
for key in type_dict:
|
for key in type_dict:
|
||||||
if key in ret_type:
|
if key in ret_type:
|
||||||
ret_type = ret_type.replace(key, type_dict[key])
|
ret_type = re.sub('(^|[^\w])' + key + '($|[^\w])', type_dict[key], ret_type)
|
||||||
|
|
||||||
arg_types = []
|
arg_types = []
|
||||||
unwrapped_arg_types = []
|
unwrapped_arg_types = []
|
||||||
for arg in variant.args:
|
for arg in variant.args:
|
||||||
@ -567,7 +567,7 @@ class JSWrapperGenerator(object):
|
|||||||
# consider the default parameter variants
|
# consider the default parameter variants
|
||||||
args_num = len(variant.args) - j
|
args_num = len(variant.args) - j
|
||||||
if args_num in class_info.constructor_arg_num:
|
if args_num in class_info.constructor_arg_num:
|
||||||
# FIXME: workaournd for constructor overload with same args number
|
# FIXME: workaround for constructor overload with same args number
|
||||||
# e.g. DescriptorMatcher
|
# e.g. DescriptorMatcher
|
||||||
continue
|
continue
|
||||||
class_info.constructor_arg_num.add(args_num)
|
class_info.constructor_arg_num.add(args_num)
|
||||||
@ -627,7 +627,6 @@ class JSWrapperGenerator(object):
|
|||||||
ret_type = 'void' if variant.rettype.strip() == '' else variant.rettype
|
ret_type = 'void' if variant.rettype.strip() == '' else variant.rettype
|
||||||
|
|
||||||
ret_type = ret_type.strip()
|
ret_type = ret_type.strip()
|
||||||
|
|
||||||
if ret_type.startswith('Ptr'): #smart pointer
|
if ret_type.startswith('Ptr'): #smart pointer
|
||||||
ptr_type = ret_type.replace('Ptr<', '').replace('>', '')
|
ptr_type = ret_type.replace('Ptr<', '').replace('>', '')
|
||||||
if ptr_type in type_dict:
|
if ptr_type in type_dict:
|
||||||
|
|||||||
@ -159,3 +159,44 @@ QUnit.test('Cascade classification', function(assert) {
|
|||||||
locations.delete();
|
locations.delete();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
QUnit.test('QR code detect and decode', function (assert) {
|
||||||
|
{
|
||||||
|
const detector = new cv.QRCodeDetector();
|
||||||
|
let mat = cv.Mat.ones(800, 600, cv.CV_8U);
|
||||||
|
assert.ok(mat);
|
||||||
|
|
||||||
|
// test detect
|
||||||
|
let points = new cv.Mat();
|
||||||
|
let qrCodeFound = detector.detect(mat, points);
|
||||||
|
assert.equal(points.rows, 0)
|
||||||
|
assert.equal(points.cols, 0)
|
||||||
|
assert.equal(qrCodeFound, false);
|
||||||
|
|
||||||
|
// test detectMult
|
||||||
|
qrCodeFound = detector.detectMulti(mat, points);
|
||||||
|
assert.equal(points.rows, 0)
|
||||||
|
assert.equal(points.cols, 0)
|
||||||
|
assert.equal(qrCodeFound, false);
|
||||||
|
|
||||||
|
// test decode (with random numbers)
|
||||||
|
let decodeTestPoints = cv.matFromArray(1, 4, cv.CV_32FC2, [10, 20, 30, 40, 60, 80, 90, 100]);
|
||||||
|
let qrCodeContent = detector.decode(mat, decodeTestPoints);
|
||||||
|
assert.equal(typeof qrCodeContent, 'string');
|
||||||
|
assert.equal(qrCodeContent, '');
|
||||||
|
|
||||||
|
//test detectAndDecode
|
||||||
|
qrCodeContent = detector.detectAndDecode(mat);
|
||||||
|
assert.equal(typeof qrCodeContent, 'string');
|
||||||
|
assert.equal(qrCodeContent, '');
|
||||||
|
|
||||||
|
// test decodeCurved
|
||||||
|
qrCodeContent = detector.decodeCurved(mat, decodeTestPoints);
|
||||||
|
assert.equal(typeof qrCodeContent, 'string');
|
||||||
|
assert.equal(qrCodeContent, '');
|
||||||
|
|
||||||
|
decodeTestPoints.delete();
|
||||||
|
points.delete();
|
||||||
|
mat.delete();
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
@ -114,7 +114,7 @@ class Builder:
|
|||||||
"-DWITH_GPHOTO2=OFF",
|
"-DWITH_GPHOTO2=OFF",
|
||||||
"-DWITH_LAPACK=OFF",
|
"-DWITH_LAPACK=OFF",
|
||||||
"-DWITH_ITT=OFF",
|
"-DWITH_ITT=OFF",
|
||||||
"-DWITH_QUIRC=OFF",
|
"-DWITH_QUIRC=ON",
|
||||||
"-DBUILD_ZLIB=ON",
|
"-DBUILD_ZLIB=ON",
|
||||||
"-DBUILD_opencv_apps=OFF",
|
"-DBUILD_opencv_apps=OFF",
|
||||||
"-DBUILD_opencv_calib3d=ON",
|
"-DBUILD_opencv_calib3d=ON",
|
||||||
|
|||||||
@ -22,7 +22,8 @@ imgproc = {'': ['Canny', 'GaussianBlur', 'Laplacian', 'HoughLines', 'HoughLinesP
|
|||||||
|
|
||||||
objdetect = {'': ['groupRectangles'],
|
objdetect = {'': ['groupRectangles'],
|
||||||
'HOGDescriptor': ['load', 'HOGDescriptor', 'getDefaultPeopleDetector', 'getDaimlerPeopleDetector', 'setSVMDetector', 'detectMultiScale'],
|
'HOGDescriptor': ['load', 'HOGDescriptor', 'getDefaultPeopleDetector', 'getDaimlerPeopleDetector', 'setSVMDetector', 'detectMultiScale'],
|
||||||
'CascadeClassifier': ['load', 'detectMultiScale2', 'CascadeClassifier', 'detectMultiScale3', 'empty', 'detectMultiScale']}
|
'CascadeClassifier': ['load', 'detectMultiScale2', 'CascadeClassifier', 'detectMultiScale3', 'empty', 'detectMultiScale'],
|
||||||
|
'QRCodeDetector': ['QRCodeDetector', 'decode', 'decodeCurved', 'detect', 'detectAndDecode', 'detectMulti', 'setEpsX', 'setEpsY']}
|
||||||
|
|
||||||
video = {'': ['CamShift', 'calcOpticalFlowFarneback', 'calcOpticalFlowPyrLK', 'createBackgroundSubtractorMOG2', \
|
video = {'': ['CamShift', 'calcOpticalFlowFarneback', 'calcOpticalFlowPyrLK', 'createBackgroundSubtractorMOG2', \
|
||||||
'findTransformECC', 'meanShift'],
|
'findTransformECC', 'meanShift'],
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user