From cc73b64f21da10ce40b060e2c0d755cee7bb05ce Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 11 Oct 2024 00:02:34 +0800 Subject: [PATCH 01/30] finish android --- .gitmodules | 4 + CMakeLists.txt | 204 - android/build.gradle | 147 - bin/setup.dart | 13 - bin/setup_commands.dart | 215 - binary.version | 1 - conanfile.py | 215 - ffigen/ffigen_contrib.yaml | 60 - ios/Info.plist.in | 33 - ios/Makefile | 34 - linux/CMakeLists.txt | 75 - macos/Makefile | 51 - packages/dartcv/.gitignore | 7 + packages/dartcv/CHANGELOG.md | 3 + Makefile => packages/dartcv/Makefile | 9 +- packages/dartcv/README.md | 39 + .../dartcv/analysis_options.yaml | 0 opencv_dart.iml => packages/dartcv/dartcv.iml | 0 packages/dartcv/example/dartcv_example.dart | 7 + .../dartcv/ffigen}/ffigen_calib3d.yaml | 18 +- .../dartcv/ffigen}/ffigen_const.yaml | 6 +- packages/dartcv/ffigen/ffigen_contrib.yaml | 60 + .../dartcv/ffigen}/ffigen_core.yaml | 42 +- .../dartcv/ffigen}/ffigen_dnn.yaml | 22 +- .../dartcv/ffigen}/ffigen_features2d.yaml | 18 +- .../dartcv/ffigen}/ffigen_gapi.yaml | 14 +- .../dartcv/ffigen}/ffigen_highgui.yaml | 14 +- .../dartcv/ffigen}/ffigen_imgcodecs.yaml | 18 +- .../dartcv/ffigen}/ffigen_imgproc.yaml | 18 +- .../dartcv/ffigen}/ffigen_objdetect.yaml | 18 +- .../dartcv/ffigen}/ffigen_photo.yaml | 18 +- .../dartcv/ffigen}/ffigen_stitching.yaml | 18 +- .../dartcv/ffigen}/ffigen_types.yaml | 12 +- packages/dartcv/ffigen/ffigen_video.yaml | 41 + .../dartcv/ffigen/ffigen_videoio.yaml | 24 +- {lib => packages/dartcv/lib}/calib3d.dart | 2 +- {lib => packages/dartcv/lib}/contrib.dart | 2 +- {lib => packages/dartcv/lib}/core.dart | 2 +- .../dartcv/lib/dartcv.dart | 6 +- {lib => packages/dartcv/lib}/dnn.dart | 2 +- {lib => packages/dartcv/lib}/features2d.dart | 2 +- {lib => packages/dartcv/lib}/gapi.dart | 2 +- {lib => packages/dartcv/lib}/highgui.dart | 2 +- {lib => packages/dartcv/lib}/imgcodecs.dart | 2 +- {lib => packages/dartcv/lib}/imgproc.dart | 2 +- {lib => packages/dartcv/lib}/objdetect.dart | 2 +- {lib => packages/dartcv/lib}/photo.dart | 2 +- .../dartcv/lib}/src/calib3d/calib3d.dart | 2 +- .../lib}/src/calib3d/calib3d_async.dart | 0 .../dartcv/lib}/src/calib3d/fisheye.dart | 0 .../dartcv/lib}/src/contrib/aruco.dart | 0 .../dartcv/lib}/src/contrib/aruco_async.dart | 0 .../dartcv/lib}/src/contrib/aruco_dict.dart | 0 .../dartcv/lib}/src/contrib/img_hash.dart | 2 +- .../dartcv/lib}/src/contrib/quality.dart | 0 .../lib}/src/contrib/wechat_qrcode.dart | 0 .../lib}/src/contrib/wechat_qrcode_async.dart | 0 .../dartcv/lib}/src/contrib/ximgproc.dart | 12 +- .../dartcv/lib}/src/contrib/xobjdetect.dart | 0 .../dartcv/lib}/src/core/base.dart | 0 .../dartcv/lib}/src/core/contours.dart | 0 .../dartcv/lib}/src/core/core.dart | 6 +- .../dartcv/lib}/src/core/core_async.dart | 2 +- .../dartcv/lib}/src/core/cv_vec.dart | 0 .../dartcv/lib}/src/core/dmatch.dart | 0 .../dartcv/lib}/src/core/error_code.dart | 0 .../dartcv/lib}/src/core/exception.dart | 0 .../dartcv/lib}/src/core/float16.dart | 0 .../dartcv/lib}/src/core/keypoint.dart | 0 .../dartcv/lib}/src/core/mat.dart | 4 +- .../dartcv/lib}/src/core/mat_async.dart | 0 .../dartcv/lib}/src/core/mat_type.dart | 0 .../dartcv/lib}/src/core/moments.dart | 0 .../dartcv/lib}/src/core/point.dart | 48 +- .../dartcv/lib}/src/core/rect.dart | 34 +- .../dartcv/lib}/src/core/rng.dart | 0 .../dartcv/lib}/src/core/rng_async.dart | 0 .../dartcv/lib}/src/core/scalar.dart | 0 .../dartcv/lib}/src/core/size.dart | 23 +- .../dartcv/lib}/src/core/svd.dart | 0 .../dartcv/lib}/src/core/termcriteria.dart | 0 .../dartcv/lib}/src/core/vec.dart | 0 .../dartcv/lib}/src/dnn/asyncarray.dart | 0 {lib => packages/dartcv/lib}/src/dnn/dnn.dart | 0 .../dartcv/lib}/src/dnn/dnn_async.dart | 0 .../lib}/src/features2d/features2d.dart | 0 .../lib}/src/features2d/features2d_async.dart | 0 .../dartcv/lib}/src/g/calib3d.g.dart | 140 +- .../dartcv/lib}/src/g/calib3d.yaml | 10 +- .../dartcv/lib}/src/g/constants.g.dart | 0 .../dartcv/lib}/src/g/contrib.g.dart | 76 +- .../dartcv/lib}/src/g/contrib.yaml | 10 +- .../dartcv/lib}/src/g/core.g.dart | 80 +- {lib => packages/dartcv/lib}/src/g/core.yaml | 18 +- {lib => packages/dartcv/lib}/src/g/dnn.g.dart | 30 +- {lib => packages/dartcv/lib}/src/g/dnn.yaml | 8 +- .../dartcv/lib}/src/g/features2d.g.dart | 2 +- .../dartcv/lib}/src/g/features2d.yaml | 2 +- .../dartcv/lib}/src/g/gapi.g.dart | 146 +- {lib => packages/dartcv/lib}/src/g/gapi.yaml | 14 +- .../dartcv/lib}/src/g/highgui.g.dart | 10 +- .../dartcv/lib}/src/g/highgui.yaml | 6 +- .../dartcv/lib}/src/g/imgcodecs.g.dart | 2 +- .../dartcv/lib}/src/g/imgcodecs.yaml | 2 +- .../dartcv/lib}/src/g/imgproc.g.dart | 743 +-- .../dartcv/lib}/src/g/imgproc.yaml | 18 +- .../dartcv/lib}/src/g/objdetect.g.dart | 234 +- .../dartcv/lib}/src/g/objdetect.yaml | 6 +- .../dartcv/lib}/src/g/photo.g.dart | 16 +- {lib => packages/dartcv/lib}/src/g/photo.yaml | 6 +- .../dartcv/lib}/src/g/stitching.g.dart | 2 +- .../dartcv/lib}/src/g/stitching.yaml | 2 +- .../dartcv/lib}/src/g/types.g.dart | 178 +- {lib => packages/dartcv/lib}/src/g/types.yaml | 34 +- .../dartcv/lib/src/g/video.g.dart | 1010 +--- .../dartcv/lib/src/g/video.yaml | 108 +- packages/dartcv/lib/src/g/videoio.g.dart | 991 ++++ packages/dartcv/lib/src/g/videoio.yaml | 108 + .../dartcv/lib}/src/gapi/gapi.dart | 0 .../dartcv/lib}/src/gapi/gcomputation.dart | 0 .../dartcv/lib}/src/gapi/gmat.dart | 0 .../dartcv/lib}/src/gapi/gscalar.dart | 0 .../dartcv/lib}/src/highgui/highgui.dart | 2 +- .../dartcv/lib}/src/imgcodecs/imgcodecs.dart | 0 .../lib}/src/imgcodecs/imgcodecs_async.dart | 0 .../dartcv/lib}/src/imgproc/clahe.dart | 4 +- .../dartcv/lib}/src/imgproc/clahe_async.dart | 2 +- .../dartcv/lib}/src/imgproc/imgproc.dart | 10 +- .../lib}/src/imgproc/imgproc_async.dart | 6 +- .../dartcv/lib}/src/imgproc/subdiv2d.dart | 12 +- .../lib}/src/imgproc/subdiv2d_async.dart | 8 +- .../dartcv/lib}/src/native_lib.dart | 44 +- .../dartcv/lib}/src/objdetect/objdetect.dart | 4 +- .../lib}/src/objdetect/objdetect_async.dart | 8 +- .../dartcv/lib}/src/photo/photo.dart | 0 .../dartcv/lib}/src/photo/photo_async.dart | 0 .../dartcv/lib}/src/stitching/stitching.dart | 0 .../lib}/src/stitching/stitching_async.dart | 0 .../dartcv/lib}/src/video/video.dart | 4 +- .../dartcv/lib}/src/video/video_async.dart | 4 +- .../dartcv/lib/src/videoio}/videoio.dart | 56 +- .../lib/src/videoio}/videoio_async.dart | 34 +- {lib => packages/dartcv/lib}/stitching.dart | 2 +- {lib => packages/dartcv/lib}/video.dart | 4 +- packages/dartcv/lib/videoio.dart | 8 + packages/dartcv/pubspec.yaml | 20 + .../dartcv/test}/calib3d_test.dart | 2 +- .../test}/contrib/aruco_async_test.dart | 2 +- .../dartcv/test}/contrib/aruco_test.dart | 2 +- .../test}/contrib/img_hash_async_test.dart | 2 +- .../dartcv/test}/contrib/img_hash_test.dart | 2 +- .../dartcv/test}/contrib/quality_test.dart | 2 +- .../contrib/wechat_qrcode_async_test.dart | 2 +- .../test}/contrib/wechat_qrcode_test.dart | 2 +- .../dartcv/test}/contrib/ximgproc_test.dart | 2 +- .../dartcv/test}/core/core_async_test.dart | 2 +- .../dartcv/test}/core/core_test.dart | 2 +- .../dartcv/test}/core/mat_async_test.dart | 2 +- .../dartcv/test}/core/mat_test.dart | 2 +- .../dartcv/test}/core/others_test.dart | 2 +- .../dartcv/test}/core/point_test.dart | 2 +- .../dartcv/test}/core/rng_test.dart | 2 +- .../dartcv/test}/core/vec_matcher.dart | 2 +- .../dartcv/test}/core/vec_test.dart | 2 +- .../dartcv/test}/data/brisque_model_live.yml | 0 .../dartcv/test}/data/brisque_range_live.yml | 0 .../data/haarcascade_frontalface_default.xml | 0 {test => packages/dartcv/test}/data/hog.xml | 0 .../test}/data/hogcascade_pedestrians.xml | 0 .../dartcv/test}/dnn/dnn_async_test.dart | 2 +- .../dartcv/test}/dnn/dnn_test.dart | 2 +- .../features2d/features2d_async_test.dart | 2 +- .../test}/features2d/features2d_test.dart | 2 +- .../dartcv/test}/gapi/structs_test.dart | 4 +- .../dartcv/test}/highgui_test.dart | 2 +- .../dartcv/test}/images/MNIST_5.png | Bin .../dartcv/test}/images/MNIST_9.png | Bin .../dartcv/test}/images/aruco_6X6_250_1.png | Bin .../dartcv/test}/images/aruco_6X6_250_6.png | Bin .../test}/images/aruco_6X6_250_6_contour.png | Bin .../dartcv/test}/images/barcode1.png | Bin .../dartcv/test}/images/barcode2.png | Bin .../dartcv/test}/images/barcode_mask1.png | Bin .../dartcv/test}/images/barcode_mask2.png | Bin {test => packages/dartcv/test}/images/box.png | Bin .../dartcv/test}/images/box_in_scene.png | Bin .../dartcv/test}/images/chessboard_4x6.png | Bin .../test}/images/chessboard_4x6_distort.png | Bin .../images/chessboard_4x6_distort_correct.png | Bin .../dartcv/test}/images/circles.jpg | Bin .../dartcv/test}/images/contours.png | Bin .../test}/images/distortion-correct.jpg | Bin .../test}/images/distortion-correct.png | Bin .../dartcv/test}/images/distortion.jpg | Bin .../dartcv/test}/images/face-detect.jpg | Bin .../dartcv/test}/images/face.jpg | Bin .../dartcv/test}/images/fisheye_sample.jpg | Bin .../dartcv/test}/images/gocvlogo.jpg | Bin .../dartcv/test}/images/gocvlogo.png | Bin .../dartcv/test}/images/inpaint-mask.jpg | Bin .../dartcv/test}/images/inpaint-src.jpg | Bin .../dartcv/test}/images/lenna.png | Bin {test => packages/dartcv/test}/images/lut.png | Bin .../dartcv/test}/images/markers_6x6_250.png | Bin .../dartcv/test}/images/multi_qrcodes.png | Bin .../dartcv/test}/images/qrcode.png | Bin .../dartcv/test}/images/sample.webp | Bin .../dartcv/test}/images/sift_descriptor.png | Bin .../dartcv/test}/images/simple-translated.jpg | Bin .../dartcv/test}/images/simple.jpg | Bin .../dartcv/test}/images/small.mp4 | Bin .../dartcv/test}/images/space_shuttle.jpg | Bin {test => packages/dartcv/test}/images/toy.jpg | Bin .../dartcv/test}/images/xquartz.png | Bin .../test}/images_out/basic_drawings.png | Bin .../test}/images_out/circles_equalized.jpg | Bin .../dartcv/test}/images_out/cv.line.png | Bin .../images_out/markers_6x6_250_contours.png | Bin .../dartcv/test}/images_out/stitcher_test.jpg | Bin .../test}/images_out/stitcher_test_mask.jpg | Bin .../dartcv/test}/images_out/test_cvtcolor.png | Bin .../dartcv/test}/images_out/test_imencode.png | Bin .../dartcv/test}/images_out/test_imwrite.png | Bin .../dartcv/test}/imgcodecs_test.dart | 2 +- .../dartcv/test}/imgproc/clahe_test.dart | 2 +- .../test}/imgproc/imgproc_async_test.dart | 2 +- .../dartcv/test}/imgproc/imgproc_test.dart | 2 +- .../dartcv/test}/imgproc/subdiv2d_test.dart | 2 +- .../test}/objdetect/objdetect_async_test.dart | 4 +- .../test}/objdetect/objdetect_test.dart | 4 +- {test => packages/dartcv/test}/perf_mat.dart | 2 +- .../dartcv/test}/photo/photo_async_test.dart | 2 +- .../dartcv/test}/photo/photo_test.dart | 2 +- .../test}/stitching/stitching_async_test.dart | 2 +- .../test}/stitching/stitching_test.dart | 2 +- {test => packages/dartcv/test}/svd_test.dart | 2 +- .../dartcv/test}/video/video_async_test.dart | 2 +- .../dartcv/test}/video/video_test.dart | 2 +- packages/opencv_core/.gitignore | 29 + packages/opencv_core/.metadata | 42 + packages/opencv_core/CHANGELOG.md | 3 + packages/opencv_core/LICENSE | 1 + packages/opencv_core/README.md | 92 + packages/opencv_core/analysis_options.yaml | 232 + .../opencv_core/android}/.gitignore | 0 packages/opencv_core/android/build.gradle | 88 + packages/opencv_core/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../opencv_core/example}/.gitignore | 0 packages/opencv_core/example/README.md | 16 + .../example}/analysis_options.yaml | 0 .../opencv_core/example/android/.gitignore | 13 + .../example/android/app/build.gradle | 44 + .../android/app/src/debug/AndroidManifest.xml | 0 .../android/app/src/main/AndroidManifest.xml | 45 + .../opencv_core_example/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 0 .../main/res/drawable/launch_background.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values-night/styles.xml | 0 .../app/src/main/res/values/styles.xml | 0 .../app/src/profile/AndroidManifest.xml | 0 .../opencv_core/example/android/build.gradle | 18 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 25 + .../opencv_core/example}/images/lenna.png | Bin .../opencv_core/example}/ios/.gitignore | 0 .../ios/Flutter/AppFrameworkInfo.plist | 0 .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 616 +++ .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Runner/Base.lproj/LaunchScreen.storyboard | 0 .../ios/Runner/Base.lproj/Main.storyboard | 0 .../opencv_core/example/ios/Runner/Info.plist | 49 + .../ios/Runner/Runner-Bridging-Header.h | 0 .../ios/RunnerTests/RunnerTests.swift | 0 .../opencv_core/example}/lib/main.dart | 54 +- .../opencv_core/example}/linux/.gitignore | 0 .../opencv_core/example/linux/CMakeLists.txt | 145 + .../example}/linux/flutter/CMakeLists.txt | 0 .../flutter/generated_plugin_registrant.cc | 0 .../flutter/generated_plugin_registrant.h | 0 .../linux/flutter/generated_plugins.cmake | 25 + .../opencv_core/example}/linux/main.cc | 0 .../example/linux/my_application.cc | 124 + .../example}/linux/my_application.h | 0 .../opencv_core/example}/macos/.gitignore | 0 .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 0 .../macos/Runner.xcodeproj/project.pbxproj | 705 +++ .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../example/macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/app_icon_1024.png | Bin .../AppIcon.appiconset/app_icon_128.png | Bin .../AppIcon.appiconset/app_icon_16.png | Bin .../AppIcon.appiconset/app_icon_256.png | Bin .../AppIcon.appiconset/app_icon_32.png | Bin .../AppIcon.appiconset/app_icon_512.png | Bin .../AppIcon.appiconset/app_icon_64.png | Bin .../macos/Runner/Base.lproj/MainMenu.xib | 0 .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 0 .../macos/Runner/Configs/Release.xcconfig | 0 .../macos/Runner/Configs/Warnings.xcconfig | 0 .../macos/Runner/DebugProfile.entitlements | 0 .../example}/macos/Runner/Info.plist | 0 .../macos/Runner/MainFlutterWindow.swift | 0 .../macos/Runner/Release.entitlements | 0 .../macos/RunnerTests/RunnerTests.swift | 12 + packages/opencv_core/example/pubspec.yaml | 97 + .../opencv_core/example}/windows/.gitignore | 0 .../example/windows/CMakeLists.txt | 108 + .../example}/windows/flutter/CMakeLists.txt | 0 .../flutter/generated_plugin_registrant.cc | 0 .../flutter/generated_plugin_registrant.h | 0 .../windows/flutter/generated_plugins.cmake | 25 + .../example}/windows/runner/CMakeLists.txt | 0 .../example/windows/runner/Runner.rc | 121 + .../windows/runner/flutter_window.cpp | 0 .../example}/windows/runner/flutter_window.h | 0 .../example/windows/runner/main.cpp | 43 + .../example}/windows/runner/resource.h | 0 .../windows/runner/resources/app_icon.ico | Bin .../windows/runner/runner.exe.manifest | 14 + .../example/windows/runner/utils.cpp | 65 + .../example}/windows/runner/utils.h | 0 .../example}/windows/runner/win32_window.cpp | 0 .../example}/windows/runner/win32_window.h | 0 packages/opencv_core/ios/opencv_core.podspec | 28 + packages/opencv_core/lib/opencv.dart | 8 + packages/opencv_core/linux/CMakeLists.txt | 22 + .../opencv_core/macos/opencv_core.podspec | 27 + packages/opencv_core/pubspec.yaml | 34 + packages/opencv_core/src/CMakeLists.txt | 43 + .../opencv_core/windows}/.gitignore | 0 packages/opencv_core/windows/CMakeLists.txt | 23 + packages/opencv_dart/.gitignore | 29 + .metadata => packages/opencv_dart/.metadata | 0 .pubignore => packages/opencv_dart/.pubignore | 0 .../opencv_dart/CHANGELOG.md | 0 packages/opencv_dart/analysis_options.yaml | 232 + packages/opencv_dart/android/.gitignore | 9 + packages/opencv_dart/android/build.gradle | 85 + .../opencv_dart/android}/settings.gradle | 0 .../android}/src/main/AndroidManifest.xml | 0 packages/opencv_dart/example/.gitignore | 43 + .../opencv_dart/example}/.metadata | 0 .../opencv_dart/example}/README.md | 0 .../opencv_dart/example/analysis_options.yaml | 28 + .../opencv_dart/example}/android/.gitignore | 0 .../example}/android/app/build.gradle | 2 +- .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 0 .../opencv_dart_example/MainActivity.kt | 0 .../kotlin/net/rainyl/example/MainActivity.kt | 0 .../opencv_dart_example/MainActivity.kt | 0 .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../opencv_dart/example}/android/build.gradle | 0 .../example}/android/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../example}/android/settings.gradle | 0 packages/opencv_dart/example/images/lenna.png | Bin 0 -> 446298 bytes packages/opencv_dart/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example}/ios/Flutter/Debug.xcconfig | 0 .../example}/ios/Flutter/Release.xcconfig | 0 .../opencv_dart/example}/ios/Podfile | 0 .../opencv_dart/example}/ios/Podfile.lock | 0 .../ios/Runner.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 + .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example}/ios/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example}/ios/Runner/Info.plist | 0 .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/ios/RunnerTests/RunnerTests.swift | 12 + packages/opencv_dart/example/lib/main.dart | 120 + packages/opencv_dart/example/linux/.gitignore | 1 + .../opencv_dart/example}/linux/CMakeLists.txt | 0 .../example/linux/flutter/CMakeLists.txt | 88 + .../flutter/generated_plugin_registrant.cc | 15 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 0 packages/opencv_dart/example/linux/main.cc | 6 + .../example}/linux/my_application.cc | 0 .../example/linux/my_application.h | 18 + packages/opencv_dart/example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 0 .../macos/Flutter/Flutter-Release.xcconfig | 0 .../Flutter/GeneratedPluginRegistrant.swift | 12 + .../opencv_dart/example}/macos/Podfile | 0 .../opencv_dart/example}/macos/Podfile.lock | 0 .../macos/Runner.xcodeproj/project.pbxproj | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example}/macos/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 343 ++ .../macos/Runner/Configs/AppInfo.xcconfig | 0 .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../macos/RunnerTests/RunnerTests.swift | 0 .../opencv_dart/example}/pubspec.yaml | 0 .../example}/test/widget_test.dart | 0 .../opencv_dart/example/windows/.gitignore | 17 + .../example}/windows/CMakeLists.txt | 0 .../example/windows/flutter/CMakeLists.txt | 109 + .../flutter/generated_plugin_registrant.cc | 14 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 0 .../example/windows/runner/CMakeLists.txt | 40 + .../example}/windows/runner/Runner.rc | 0 .../example/windows/runner/flutter_window.cpp | 71 + .../example/windows/runner/flutter_window.h | 33 + .../example}/windows/runner/main.cpp | 0 .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 0 .../example}/windows/runner/utils.cpp | 0 .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 288 ++ .../example/windows/runner/win32_window.h | 102 + .../opencv_dart/ios}/opencv_dart.podspec | 11 +- packages/opencv_dart/lib/opencv.dart | 8 + packages/opencv_dart/lib/opencv_dart.dart | 10 + packages/opencv_dart/linux/CMakeLists.txt | 24 + .../opencv_dart/macos}/opencv_dart.podspec | 7 +- .../opencv_dart/pubspec.yaml | 15 +- packages/opencv_dart/src/CMakeLists.txt | 43 + packages/opencv_dart/windows/.gitignore | 17 + packages/opencv_dart/windows/CMakeLists.txt | 34 + profiles/android-armv7 | 13 - profiles/android-armv8 | 13 - profiles/android-x86_64 | 13 - profiles/ios-armv8 | 13 - profiles/ios-x86_64 | 13 - profiles/ios.toolchain.cmake | 1135 ----- scripts/test.ps1 | 8 - scripts/test.sh | 9 - src/calib3d/calib3d.cpp | 238 - src/calib3d/calib3d.h | 110 - src/calib3d/calib3d_async.cpp | 288 -- src/calib3d/calib3d_async.h | 227 - src/core/constants.h | 2023 -------- src/core/core.cpp | 1836 -------- src/core/core.h | 395 -- src/core/core_async.cpp | 1250 ----- src/core/core_async.h | 393 -- src/core/exception.cpp | 17 - src/core/exception.h | 27 - src/core/logging.cpp | 15 - src/core/logging.h | 20 - src/core/lut.hpp | 113 - src/core/svd.cpp | 27 - src/core/svd.h | 27 - src/core/svd_async.cpp | 17 - src/core/svd_async.h | 24 - src/core/types.h | 460 -- src/core/vec.hpp | 537 --- src/core/version.cpp | 35 - src/core/version.h | 29 - src/dart_api/BUILD.gn | 23 - src/dart_api/analyze_snapshot_api.h | 30 - src/dart_api/bin/dart_io_api.h | 69 - src/dart_api/bin/native_assets_api.h | 26 - src/dart_api/dart_api.h | 4154 ----------------- src/dart_api/dart_api_dl.c | 79 - src/dart_api/dart_api_dl.h | 172 - src/dart_api/dart_embedder_api.h | 105 - src/dart_api/dart_native_api.h | 207 - src/dart_api/dart_tools_api.h | 627 --- src/dart_api/dart_version.h | 16 - src/dart_api/internal/dart_api_dl_impl.h | 21 - src/dnn/asyncarray.cpp | 36 - src/dnn/asyncarray.h | 29 - src/dnn/dnn.cpp | 293 -- src/dnn/dnn.h | 83 - src/dnn/dnn_async.cpp | 321 -- src/dnn/dnn_async.h | 58 - src/extra/aruco.cpp | 442 -- src/extra/aruco.h | 132 - src/extra/aruco_async.cpp | 598 --- src/extra/aruco_async.h | 82 - src/extra/img_hash.cpp | 102 - src/extra/img_hash.h | 67 - src/extra/img_hash_async.cpp | 123 - src/extra/img_hash_async.h | 29 - src/extra/quality.cpp | 145 - src/extra/quality.h | 66 - src/extra/quality_async.cpp | 86 - src/extra/quality_async.h | 38 - src/extra/wechat_qrcode.cpp | 54 - src/extra/wechat_qrcode.h | 40 - src/extra/wechat_qrcode_async.cpp | 54 - src/extra/wechat_qrcode_async.h | 18 - src/extra/ximgproc.cpp | 396 -- src/extra/ximgproc.h | 182 - src/extra/ximgproc_async.cpp | 285 -- src/extra/ximgproc_async.h | 115 - src/extra/xobjdetect.cpp | 41 - src/extra/xobjdetect.h | 33 - src/features2d/features2d.cpp | 373 -- src/features2d/features2d.h | 141 - src/features2d/features2d_async.cpp | 450 -- src/features2d/features2d_async.h | 92 - src/features2d/utils.hpp | 61 - src/gapi/gapi.cpp | 137 - src/gapi/gapi.h | 282 -- src/highgui/highgui.cpp | 119 - src/highgui/highgui.h | 45 - src/imgcodecs/imgcodecs.cpp | 57 - src/imgcodecs/imgcodecs.h | 33 - src/imgcodecs/imgcodecs_async.cpp | 51 - src/imgcodecs/imgcodecs_async.h | 30 - src/imgproc/imgproc.cpp | 1217 ----- src/imgproc/imgproc.h | 771 --- src/imgproc/imgproc_async.cpp | 1587 ------- src/imgproc/imgproc_async.h | 470 -- src/objdetect/objdetect.cpp | 608 --- src/objdetect/objdetect.h | 148 - src/objdetect/objdetect_async.cpp | 637 --- src/objdetect/objdetect_async.h | 81 - src/opencv_dart.cpp | 6 - src/opencv_dart.h | 29 - src/photo/photo.cpp | 171 - src/photo/photo.h | 73 - src/photo/photo_async.cpp | 234 - src/photo/photo_async.h | 67 - src/stitching/stitching.cpp | 134 - src/stitching/stitching.h | 76 - src/stitching/stitching_async.cpp | 158 - src/stitching/stitching_async.h | 47 - src/t.h | 13 - src/test/calib3d.cc | 15 - src/test/core.cc | 403 -- src/test/dnn.cc | 48 - src/test/imgcodecs.cc | 14 - src/test/imgproc.cc | 25 - src/test/vec.cc | 850 ---- src/test/video.cc | 29 - src/video/video.cpp | 357 -- src/video/video.h | 139 - src/video/video_async.cpp | 378 -- src/video/video_async.h | 130 - src/video/videoio.cpp | 167 - src/video/videoio.h | 90 - src/video/videoio_async.cpp | 131 - src/video/videoio_async.h | 60 - windows/CMakeLists.txt | 77 - 638 files changed, 8363 insertions(+), 33533 deletions(-) delete mode 100644 CMakeLists.txt delete mode 100644 android/build.gradle delete mode 100644 bin/setup.dart delete mode 100644 bin/setup_commands.dart delete mode 100644 binary.version delete mode 100644 conanfile.py delete mode 100644 ffigen/ffigen_contrib.yaml delete mode 100644 ios/Info.plist.in delete mode 100644 ios/Makefile delete mode 100644 linux/CMakeLists.txt delete mode 100644 macos/Makefile create mode 100644 packages/dartcv/.gitignore create mode 100644 packages/dartcv/CHANGELOG.md rename Makefile => packages/dartcv/Makefile (89%) create mode 100644 packages/dartcv/README.md rename analysis_options.yaml => packages/dartcv/analysis_options.yaml (100%) rename opencv_dart.iml => packages/dartcv/dartcv.iml (100%) create mode 100644 packages/dartcv/example/dartcv_example.dart rename {ffigen => packages/dartcv/ffigen}/ffigen_calib3d.yaml (68%) rename {ffigen => packages/dartcv/ffigen}/ffigen_const.yaml (81%) create mode 100644 packages/dartcv/ffigen/ffigen_contrib.yaml rename {ffigen => packages/dartcv/ffigen}/ffigen_core.yaml (62%) rename {ffigen => packages/dartcv/ffigen}/ffigen_dnn.yaml (66%) rename {ffigen => packages/dartcv/ffigen}/ffigen_features2d.yaml (64%) rename {ffigen => packages/dartcv/ffigen}/ffigen_gapi.yaml (72%) rename {ffigen => packages/dartcv/ffigen}/ffigen_highgui.yaml (71%) rename {ffigen => packages/dartcv/ffigen}/ffigen_imgcodecs.yaml (65%) rename {ffigen => packages/dartcv/ffigen}/ffigen_imgproc.yaml (66%) rename {ffigen => packages/dartcv/ffigen}/ffigen_objdetect.yaml (65%) rename {ffigen => packages/dartcv/ffigen}/ffigen_photo.yaml (67%) rename {ffigen => packages/dartcv/ffigen}/ffigen_stitching.yaml (65%) rename {ffigen => packages/dartcv/ffigen}/ffigen_types.yaml (82%) create mode 100644 packages/dartcv/ffigen/ffigen_video.yaml rename ffigen/ffigen_video_io.yaml => packages/dartcv/ffigen/ffigen_videoio.yaml (57%) rename {lib => packages/dartcv/lib}/calib3d.dart (92%) rename {lib => packages/dartcv/lib}/contrib.dart (95%) rename {lib => packages/dartcv/lib}/core.dart (97%) rename lib/opencv_dart.dart => packages/dartcv/lib/dartcv.dart (74%) rename {lib => packages/dartcv/lib}/dnn.dart (93%) rename {lib => packages/dartcv/lib}/features2d.dart (90%) rename {lib => packages/dartcv/lib}/gapi.dart (93%) rename {lib => packages/dartcv/lib}/highgui.dart (89%) rename {lib => packages/dartcv/lib}/imgcodecs.dart (91%) rename {lib => packages/dartcv/lib}/imgproc.dart (94%) rename {lib => packages/dartcv/lib}/objdetect.dart (91%) rename {lib => packages/dartcv/lib}/photo.dart (91%) rename {lib => packages/dartcv/lib}/src/calib3d/calib3d.dart (99%) rename {lib => packages/dartcv/lib}/src/calib3d/calib3d_async.dart (100%) rename {lib => packages/dartcv/lib}/src/calib3d/fisheye.dart (100%) rename {lib => packages/dartcv/lib}/src/contrib/aruco.dart (100%) rename {lib => packages/dartcv/lib}/src/contrib/aruco_async.dart (100%) rename {lib => packages/dartcv/lib}/src/contrib/aruco_dict.dart (100%) rename {lib => packages/dartcv/lib}/src/contrib/img_hash.dart (99%) rename {lib => packages/dartcv/lib}/src/contrib/quality.dart (100%) rename {lib => packages/dartcv/lib}/src/contrib/wechat_qrcode.dart (100%) rename {lib => packages/dartcv/lib}/src/contrib/wechat_qrcode_async.dart (100%) rename {lib => packages/dartcv/lib}/src/contrib/ximgproc.dart (99%) rename {lib => packages/dartcv/lib}/src/contrib/xobjdetect.dart (100%) rename {lib => packages/dartcv/lib}/src/core/base.dart (100%) rename {lib => packages/dartcv/lib}/src/core/contours.dart (100%) rename {lib => packages/dartcv/lib}/src/core/core.dart (99%) rename {lib => packages/dartcv/lib}/src/core/core_async.dart (99%) rename {lib => packages/dartcv/lib}/src/core/cv_vec.dart (100%) rename {lib => packages/dartcv/lib}/src/core/dmatch.dart (100%) rename {lib => packages/dartcv/lib}/src/core/error_code.dart (100%) rename {lib => packages/dartcv/lib}/src/core/exception.dart (100%) rename {lib => packages/dartcv/lib}/src/core/float16.dart (100%) rename {lib => packages/dartcv/lib}/src/core/keypoint.dart (100%) rename {lib => packages/dartcv/lib}/src/core/mat.dart (99%) rename {lib => packages/dartcv/lib}/src/core/mat_async.dart (100%) rename {lib => packages/dartcv/lib}/src/core/mat_type.dart (100%) rename {lib => packages/dartcv/lib}/src/core/moments.dart (100%) rename {lib => packages/dartcv/lib}/src/core/point.dart (93%) rename {lib => packages/dartcv/lib}/src/core/rect.dart (86%) rename {lib => packages/dartcv/lib}/src/core/rng.dart (100%) rename {lib => packages/dartcv/lib}/src/core/rng_async.dart (100%) rename {lib => packages/dartcv/lib}/src/core/scalar.dart (100%) rename {lib => packages/dartcv/lib}/src/core/size.dart (83%) rename {lib => packages/dartcv/lib}/src/core/svd.dart (100%) rename {lib => packages/dartcv/lib}/src/core/termcriteria.dart (100%) rename {lib => packages/dartcv/lib}/src/core/vec.dart (100%) rename {lib => packages/dartcv/lib}/src/dnn/asyncarray.dart (100%) rename {lib => packages/dartcv/lib}/src/dnn/dnn.dart (100%) rename {lib => packages/dartcv/lib}/src/dnn/dnn_async.dart (100%) rename {lib => packages/dartcv/lib}/src/features2d/features2d.dart (100%) rename {lib => packages/dartcv/lib}/src/features2d/features2d_async.dart (100%) rename {lib => packages/dartcv/lib}/src/g/calib3d.g.dart (88%) rename {lib => packages/dartcv/lib}/src/g/calib3d.yaml (96%) rename {lib => packages/dartcv/lib}/src/g/constants.g.dart (100%) rename {lib => packages/dartcv/lib}/src/g/contrib.g.dart (99%) rename {lib => packages/dartcv/lib}/src/g/contrib.yaml (99%) rename {lib => packages/dartcv/lib}/src/g/core.g.dart (99%) rename {lib => packages/dartcv/lib}/src/g/core.yaml (99%) rename {lib => packages/dartcv/lib}/src/g/dnn.g.dart (98%) rename {lib => packages/dartcv/lib}/src/g/dnn.yaml (98%) rename {lib => packages/dartcv/lib}/src/g/features2d.g.dart (99%) rename {lib => packages/dartcv/lib}/src/g/features2d.yaml (99%) rename {lib => packages/dartcv/lib}/src/g/gapi.g.dart (95%) rename {lib => packages/dartcv/lib}/src/g/gapi.yaml (98%) rename {lib => packages/dartcv/lib}/src/g/highgui.g.dart (97%) rename {lib => packages/dartcv/lib}/src/g/highgui.yaml (93%) rename {lib => packages/dartcv/lib}/src/g/imgcodecs.g.dart (99%) rename {lib => packages/dartcv/lib}/src/g/imgcodecs.yaml (95%) rename {lib => packages/dartcv/lib}/src/g/imgproc.g.dart (89%) rename {lib => packages/dartcv/lib}/src/g/imgproc.yaml (98%) rename {lib => packages/dartcv/lib}/src/g/objdetect.g.dart (95%) rename {lib => packages/dartcv/lib}/src/g/objdetect.yaml (99%) rename {lib => packages/dartcv/lib}/src/g/photo.g.dart (98%) rename {lib => packages/dartcv/lib}/src/g/photo.yaml (97%) rename {lib => packages/dartcv/lib}/src/g/stitching.g.dart (99%) rename {lib => packages/dartcv/lib}/src/g/stitching.yaml (99%) rename {lib => packages/dartcv/lib}/src/g/types.g.dart (96%) rename {lib => packages/dartcv/lib}/src/g/types.yaml (94%) rename lib/src/g/video_io.g.dart => packages/dartcv/lib/src/g/video.g.dart (67%) rename lib/src/g/video_io.yaml => packages/dartcv/lib/src/g/video.yaml (70%) create mode 100644 packages/dartcv/lib/src/g/videoio.g.dart create mode 100644 packages/dartcv/lib/src/g/videoio.yaml rename {lib => packages/dartcv/lib}/src/gapi/gapi.dart (100%) rename {lib => packages/dartcv/lib}/src/gapi/gcomputation.dart (100%) rename {lib => packages/dartcv/lib}/src/gapi/gmat.dart (100%) rename {lib => packages/dartcv/lib}/src/gapi/gscalar.dart (100%) rename {lib => packages/dartcv/lib}/src/highgui/highgui.dart (99%) rename {lib => packages/dartcv/lib}/src/imgcodecs/imgcodecs.dart (100%) rename {lib => packages/dartcv/lib}/src/imgcodecs/imgcodecs_async.dart (100%) rename {lib => packages/dartcv/lib}/src/imgproc/clahe.dart (97%) rename {lib => packages/dartcv/lib}/src/imgproc/clahe_async.dart (95%) rename {lib => packages/dartcv/lib}/src/imgproc/imgproc.dart (99%) rename {lib => packages/dartcv/lib}/src/imgproc/imgproc_async.dart (99%) rename {lib => packages/dartcv/lib}/src/imgproc/subdiv2d.dart (97%) rename {lib => packages/dartcv/lib}/src/imgproc/subdiv2d_async.dart (98%) rename {lib => packages/dartcv/lib}/src/native_lib.dart (52%) rename {lib => packages/dartcv/lib}/src/objdetect/objdetect.dart (99%) rename {lib => packages/dartcv/lib}/src/objdetect/objdetect_async.dart (99%) rename {lib => packages/dartcv/lib}/src/photo/photo.dart (100%) rename {lib => packages/dartcv/lib}/src/photo/photo_async.dart (100%) rename {lib => packages/dartcv/lib}/src/stitching/stitching.dart (100%) rename {lib => packages/dartcv/lib}/src/stitching/stitching_async.dart (100%) rename {lib => packages/dartcv/lib}/src/video/video.dart (99%) rename {lib => packages/dartcv/lib}/src/video/video_async.dart (99%) rename {lib/src/video => packages/dartcv/lib/src/videoio}/videoio.dart (81%) rename {lib/src/video => packages/dartcv/lib/src/videoio}/videoio_async.dart (76%) rename {lib => packages/dartcv/lib}/stitching.dart (91%) rename {lib => packages/dartcv/lib}/video.dart (73%) create mode 100644 packages/dartcv/lib/videoio.dart create mode 100644 packages/dartcv/pubspec.yaml rename {test => packages/dartcv/test}/calib3d_test.dart (99%) rename {test => packages/dartcv/test}/contrib/aruco_async_test.dart (97%) rename {test => packages/dartcv/test}/contrib/aruco_test.dart (99%) rename {test => packages/dartcv/test}/contrib/img_hash_async_test.dart (97%) rename {test => packages/dartcv/test}/contrib/img_hash_test.dart (97%) rename {test => packages/dartcv/test}/contrib/quality_test.dart (98%) rename {test => packages/dartcv/test}/contrib/wechat_qrcode_async_test.dart (95%) rename {test => packages/dartcv/test}/contrib/wechat_qrcode_test.dart (95%) rename {test => packages/dartcv/test}/contrib/ximgproc_test.dart (99%) rename {test => packages/dartcv/test}/core/core_async_test.dart (99%) rename {test => packages/dartcv/test}/core/core_test.dart (99%) rename {test => packages/dartcv/test}/core/mat_async_test.dart (98%) rename {test => packages/dartcv/test}/core/mat_test.dart (99%) rename {test => packages/dartcv/test}/core/others_test.dart (99%) rename {test => packages/dartcv/test}/core/point_test.dart (99%) rename {test => packages/dartcv/test}/core/rng_test.dart (95%) rename {test => packages/dartcv/test}/core/vec_matcher.dart (91%) rename {test => packages/dartcv/test}/core/vec_test.dart (99%) rename {test => packages/dartcv/test}/data/brisque_model_live.yml (100%) rename {test => packages/dartcv/test}/data/brisque_range_live.yml (100%) rename {test => packages/dartcv/test}/data/haarcascade_frontalface_default.xml (100%) rename {test => packages/dartcv/test}/data/hog.xml (100%) rename {test => packages/dartcv/test}/data/hogcascade_pedestrians.xml (100%) rename {test => packages/dartcv/test}/dnn/dnn_async_test.dart (99%) rename {test => packages/dartcv/test}/dnn/dnn_test.dart (99%) rename {test => packages/dartcv/test}/features2d/features2d_async_test.dart (99%) rename {test => packages/dartcv/test}/features2d/features2d_test.dart (99%) rename {test => packages/dartcv/test}/gapi/structs_test.dart (92%) rename {test => packages/dartcv/test}/highgui_test.dart (96%) rename {test => packages/dartcv/test}/images/MNIST_5.png (100%) rename {test => packages/dartcv/test}/images/MNIST_9.png (100%) rename {test => packages/dartcv/test}/images/aruco_6X6_250_1.png (100%) rename {test => packages/dartcv/test}/images/aruco_6X6_250_6.png (100%) rename {test => packages/dartcv/test}/images/aruco_6X6_250_6_contour.png (100%) rename {test => packages/dartcv/test}/images/barcode1.png (100%) rename {test => packages/dartcv/test}/images/barcode2.png (100%) rename {test => packages/dartcv/test}/images/barcode_mask1.png (100%) rename {test => packages/dartcv/test}/images/barcode_mask2.png (100%) rename {test => packages/dartcv/test}/images/box.png (100%) rename {test => packages/dartcv/test}/images/box_in_scene.png (100%) rename {test => packages/dartcv/test}/images/chessboard_4x6.png (100%) rename {test => packages/dartcv/test}/images/chessboard_4x6_distort.png (100%) rename {test => packages/dartcv/test}/images/chessboard_4x6_distort_correct.png (100%) rename {test => packages/dartcv/test}/images/circles.jpg (100%) rename {test => packages/dartcv/test}/images/contours.png (100%) rename {test => packages/dartcv/test}/images/distortion-correct.jpg (100%) rename {test => packages/dartcv/test}/images/distortion-correct.png (100%) rename {test => packages/dartcv/test}/images/distortion.jpg (100%) rename {test => packages/dartcv/test}/images/face-detect.jpg (100%) rename {test => packages/dartcv/test}/images/face.jpg (100%) rename {test => packages/dartcv/test}/images/fisheye_sample.jpg (100%) rename {test => packages/dartcv/test}/images/gocvlogo.jpg (100%) rename {test => packages/dartcv/test}/images/gocvlogo.png (100%) rename {test => packages/dartcv/test}/images/inpaint-mask.jpg (100%) rename {test => packages/dartcv/test}/images/inpaint-src.jpg (100%) rename {example => packages/dartcv/test}/images/lenna.png (100%) rename {test => packages/dartcv/test}/images/lut.png (100%) rename {test => packages/dartcv/test}/images/markers_6x6_250.png (100%) rename {test => packages/dartcv/test}/images/multi_qrcodes.png (100%) rename {test => packages/dartcv/test}/images/qrcode.png (100%) rename {test => packages/dartcv/test}/images/sample.webp (100%) rename {test => packages/dartcv/test}/images/sift_descriptor.png (100%) rename {test => packages/dartcv/test}/images/simple-translated.jpg (100%) rename {test => packages/dartcv/test}/images/simple.jpg (100%) rename {test => packages/dartcv/test}/images/small.mp4 (100%) rename {test => packages/dartcv/test}/images/space_shuttle.jpg (100%) rename {test => packages/dartcv/test}/images/toy.jpg (100%) rename {test => packages/dartcv/test}/images/xquartz.png (100%) rename {test => packages/dartcv/test}/images_out/basic_drawings.png (100%) rename {test => packages/dartcv/test}/images_out/circles_equalized.jpg (100%) rename {test => packages/dartcv/test}/images_out/cv.line.png (100%) rename {test => packages/dartcv/test}/images_out/markers_6x6_250_contours.png (100%) rename {test => packages/dartcv/test}/images_out/stitcher_test.jpg (100%) rename {test => packages/dartcv/test}/images_out/stitcher_test_mask.jpg (100%) rename {test => packages/dartcv/test}/images_out/test_cvtcolor.png (100%) rename {test => packages/dartcv/test}/images_out/test_imencode.png (100%) rename {test => packages/dartcv/test}/images_out/test_imwrite.png (100%) rename {test => packages/dartcv/test}/imgcodecs_test.dart (98%) rename {test => packages/dartcv/test}/imgproc/clahe_test.dart (92%) rename {test => packages/dartcv/test}/imgproc/imgproc_async_test.dart (99%) rename {test => packages/dartcv/test}/imgproc/imgproc_test.dart (99%) rename {test => packages/dartcv/test}/imgproc/subdiv2d_test.dart (98%) rename {test => packages/dartcv/test}/objdetect/objdetect_async_test.dart (99%) rename {test => packages/dartcv/test}/objdetect/objdetect_test.dart (98%) rename {test => packages/dartcv/test}/perf_mat.dart (95%) rename {test => packages/dartcv/test}/photo/photo_async_test.dart (98%) rename {test => packages/dartcv/test}/photo/photo_test.dart (98%) rename {test => packages/dartcv/test}/stitching/stitching_async_test.dart (98%) rename {test => packages/dartcv/test}/stitching/stitching_test.dart (98%) rename {test => packages/dartcv/test}/svd_test.dart (97%) rename {test => packages/dartcv/test}/video/video_async_test.dart (99%) rename {test => packages/dartcv/test}/video/video_test.dart (99%) create mode 100644 packages/opencv_core/.gitignore create mode 100644 packages/opencv_core/.metadata create mode 100644 packages/opencv_core/CHANGELOG.md create mode 100644 packages/opencv_core/LICENSE create mode 100644 packages/opencv_core/README.md create mode 100644 packages/opencv_core/analysis_options.yaml rename {android => packages/opencv_core/android}/.gitignore (100%) create mode 100644 packages/opencv_core/android/build.gradle create mode 100644 packages/opencv_core/android/settings.gradle create mode 100644 packages/opencv_core/android/src/main/AndroidManifest.xml rename {example => packages/opencv_core/example}/.gitignore (100%) create mode 100644 packages/opencv_core/example/README.md rename {example => packages/opencv_core/example}/analysis_options.yaml (100%) create mode 100644 packages/opencv_core/example/android/.gitignore create mode 100644 packages/opencv_core/example/android/app/build.gradle rename {example => packages/opencv_core/example}/android/app/src/debug/AndroidManifest.xml (100%) create mode 100644 packages/opencv_core/example/android/app/src/main/AndroidManifest.xml create mode 100644 packages/opencv_core/example/android/app/src/main/kotlin/dev/rainyl/opencv_core_example/MainActivity.kt rename {example => packages/opencv_core/example}/android/app/src/main/res/drawable-v21/launch_background.xml (100%) rename {example => packages/opencv_core/example}/android/app/src/main/res/drawable/launch_background.xml (100%) rename {example => packages/opencv_core/example}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {example => packages/opencv_core/example}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {example => packages/opencv_core/example}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {example => packages/opencv_core/example}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {example => packages/opencv_core/example}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {example => packages/opencv_core/example}/android/app/src/main/res/values-night/styles.xml (100%) rename {example => packages/opencv_core/example}/android/app/src/main/res/values/styles.xml (100%) rename {example => packages/opencv_core/example}/android/app/src/profile/AndroidManifest.xml (100%) create mode 100644 packages/opencv_core/example/android/build.gradle create mode 100644 packages/opencv_core/example/android/gradle.properties create mode 100644 packages/opencv_core/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 packages/opencv_core/example/android/settings.gradle rename {test => packages/opencv_core/example}/images/lenna.png (100%) rename {example => packages/opencv_core/example}/ios/.gitignore (100%) rename {example => packages/opencv_core/example}/ios/Flutter/AppFrameworkInfo.plist (100%) create mode 100644 packages/opencv_core/example/ios/Flutter/Debug.xcconfig create mode 100644 packages/opencv_core/example/ios/Flutter/Release.xcconfig create mode 100644 packages/opencv_core/example/ios/Runner.xcodeproj/project.pbxproj rename {example => packages/opencv_core/example}/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename {example => packages/opencv_core/example}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {example => packages/opencv_core/example}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename {example => packages/opencv_core/example}/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) create mode 100644 packages/opencv_core/example/ios/Runner.xcworkspace/contents.xcworkspacedata rename {example => packages/opencv_core/example}/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {example => packages/opencv_core/example}/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) create mode 100644 packages/opencv_core/example/ios/Runner/AppDelegate.swift rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename {example => packages/opencv_core/example}/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename {example => packages/opencv_core/example}/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename {example => packages/opencv_core/example}/ios/Runner/Base.lproj/Main.storyboard (100%) create mode 100644 packages/opencv_core/example/ios/Runner/Info.plist rename {example => packages/opencv_core/example}/ios/Runner/Runner-Bridging-Header.h (100%) rename {example => packages/opencv_core/example}/ios/RunnerTests/RunnerTests.swift (100%) rename {example => packages/opencv_core/example}/lib/main.dart (63%) rename {example => packages/opencv_core/example}/linux/.gitignore (100%) create mode 100644 packages/opencv_core/example/linux/CMakeLists.txt rename {example => packages/opencv_core/example}/linux/flutter/CMakeLists.txt (100%) rename {example => packages/opencv_core/example}/linux/flutter/generated_plugin_registrant.cc (100%) rename {example => packages/opencv_core/example}/linux/flutter/generated_plugin_registrant.h (100%) create mode 100644 packages/opencv_core/example/linux/flutter/generated_plugins.cmake rename {example => packages/opencv_core/example}/linux/main.cc (100%) create mode 100644 packages/opencv_core/example/linux/my_application.cc rename {example => packages/opencv_core/example}/linux/my_application.h (100%) rename {example => packages/opencv_core/example}/macos/.gitignore (100%) create mode 100644 packages/opencv_core/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 packages/opencv_core/example/macos/Flutter/Flutter-Release.xcconfig rename {example => packages/opencv_core/example}/macos/Flutter/GeneratedPluginRegistrant.swift (100%) create mode 100644 packages/opencv_core/example/macos/Runner.xcodeproj/project.pbxproj rename {example => packages/opencv_core/example}/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 packages/opencv_core/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/opencv_core/example/macos/Runner.xcworkspace/contents.xcworkspacedata rename {example => packages/opencv_core/example}/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 packages/opencv_core/example/macos/Runner/AppDelegate.swift rename {example => packages/opencv_core/example}/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {example => packages/opencv_core/example}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png (100%) rename {example => packages/opencv_core/example}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png (100%) rename {example => packages/opencv_core/example}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png (100%) rename {example => packages/opencv_core/example}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png (100%) rename {example => packages/opencv_core/example}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png (100%) rename {example => packages/opencv_core/example}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png (100%) rename {example => packages/opencv_core/example}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png (100%) rename {example => packages/opencv_core/example}/macos/Runner/Base.lproj/MainMenu.xib (100%) create mode 100644 packages/opencv_core/example/macos/Runner/Configs/AppInfo.xcconfig rename {example => packages/opencv_core/example}/macos/Runner/Configs/Debug.xcconfig (100%) rename {example => packages/opencv_core/example}/macos/Runner/Configs/Release.xcconfig (100%) rename {example => packages/opencv_core/example}/macos/Runner/Configs/Warnings.xcconfig (100%) rename {example => packages/opencv_core/example}/macos/Runner/DebugProfile.entitlements (100%) rename {example => packages/opencv_core/example}/macos/Runner/Info.plist (100%) rename {example => packages/opencv_core/example}/macos/Runner/MainFlutterWindow.swift (100%) rename {example => packages/opencv_core/example}/macos/Runner/Release.entitlements (100%) create mode 100644 packages/opencv_core/example/macos/RunnerTests/RunnerTests.swift create mode 100644 packages/opencv_core/example/pubspec.yaml rename {example => packages/opencv_core/example}/windows/.gitignore (100%) create mode 100644 packages/opencv_core/example/windows/CMakeLists.txt rename {example => packages/opencv_core/example}/windows/flutter/CMakeLists.txt (100%) rename {example => packages/opencv_core/example}/windows/flutter/generated_plugin_registrant.cc (100%) rename {example => packages/opencv_core/example}/windows/flutter/generated_plugin_registrant.h (100%) create mode 100644 packages/opencv_core/example/windows/flutter/generated_plugins.cmake rename {example => packages/opencv_core/example}/windows/runner/CMakeLists.txt (100%) create mode 100644 packages/opencv_core/example/windows/runner/Runner.rc rename {example => packages/opencv_core/example}/windows/runner/flutter_window.cpp (100%) rename {example => packages/opencv_core/example}/windows/runner/flutter_window.h (100%) create mode 100644 packages/opencv_core/example/windows/runner/main.cpp rename {example => packages/opencv_core/example}/windows/runner/resource.h (100%) rename {example => packages/opencv_core/example}/windows/runner/resources/app_icon.ico (100%) create mode 100644 packages/opencv_core/example/windows/runner/runner.exe.manifest create mode 100644 packages/opencv_core/example/windows/runner/utils.cpp rename {example => packages/opencv_core/example}/windows/runner/utils.h (100%) rename {example => packages/opencv_core/example}/windows/runner/win32_window.cpp (100%) rename {example => packages/opencv_core/example}/windows/runner/win32_window.h (100%) create mode 100644 packages/opencv_core/ios/opencv_core.podspec create mode 100644 packages/opencv_core/lib/opencv.dart create mode 100644 packages/opencv_core/linux/CMakeLists.txt create mode 100644 packages/opencv_core/macos/opencv_core.podspec create mode 100644 packages/opencv_core/pubspec.yaml create mode 100644 packages/opencv_core/src/CMakeLists.txt rename {windows => packages/opencv_core/windows}/.gitignore (100%) create mode 100644 packages/opencv_core/windows/CMakeLists.txt create mode 100644 packages/opencv_dart/.gitignore rename .metadata => packages/opencv_dart/.metadata (100%) rename .pubignore => packages/opencv_dart/.pubignore (100%) rename CHANGELOG.md => packages/opencv_dart/CHANGELOG.md (100%) create mode 100644 packages/opencv_dart/analysis_options.yaml create mode 100644 packages/opencv_dart/android/.gitignore create mode 100644 packages/opencv_dart/android/build.gradle rename {android => packages/opencv_dart/android}/settings.gradle (100%) rename {android => packages/opencv_dart/android}/src/main/AndroidManifest.xml (100%) create mode 100644 packages/opencv_dart/example/.gitignore rename {example => packages/opencv_dart/example}/.metadata (100%) rename {example => packages/opencv_dart/example}/README.md (100%) create mode 100644 packages/opencv_dart/example/analysis_options.yaml rename {example => packages/opencv_dart/example}/android/.gitignore (100%) rename {example => packages/opencv_dart/example}/android/app/build.gradle (98%) create mode 100644 packages/opencv_dart/example/android/app/src/debug/AndroidManifest.xml rename {example => packages/opencv_dart/example}/android/app/src/main/AndroidManifest.xml (100%) rename {example => packages/opencv_dart/example}/android/app/src/main/kotlin/dev/rainyl/opencv_dart_example/MainActivity.kt (100%) rename {example => packages/opencv_dart/example}/android/app/src/main/kotlin/net/rainyl/example/MainActivity.kt (100%) rename {example => packages/opencv_dart/example}/android/app/src/main/kotlin/net/rainyl/opencv_dart_example/MainActivity.kt (100%) create mode 100644 packages/opencv_dart/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 packages/opencv_dart/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 packages/opencv_dart/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 packages/opencv_dart/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 packages/opencv_dart/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/opencv_dart/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/opencv_dart/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/opencv_dart/example/android/app/src/main/res/values-night/styles.xml create mode 100644 packages/opencv_dart/example/android/app/src/main/res/values/styles.xml create mode 100644 packages/opencv_dart/example/android/app/src/profile/AndroidManifest.xml rename {example => packages/opencv_dart/example}/android/build.gradle (100%) rename {example => packages/opencv_dart/example}/android/gradle.properties (100%) rename {example => packages/opencv_dart/example}/android/gradle/wrapper/gradle-wrapper.properties (100%) rename {example => packages/opencv_dart/example}/android/settings.gradle (100%) create mode 100644 packages/opencv_dart/example/images/lenna.png create mode 100644 packages/opencv_dart/example/ios/.gitignore create mode 100644 packages/opencv_dart/example/ios/Flutter/AppFrameworkInfo.plist rename {example => packages/opencv_dart/example}/ios/Flutter/Debug.xcconfig (100%) rename {example => packages/opencv_dart/example}/ios/Flutter/Release.xcconfig (100%) rename {example => packages/opencv_dart/example}/ios/Podfile (100%) rename {example => packages/opencv_dart/example}/ios/Podfile.lock (100%) rename {example => packages/opencv_dart/example}/ios/Runner.xcodeproj/project.pbxproj (100%) create mode 100644 packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/opencv_dart/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename {example => packages/opencv_dart/example}/ios/Runner.xcworkspace/contents.xcworkspacedata (100%) create mode 100644 packages/opencv_dart/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/opencv_dart/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename {example => packages/opencv_dart/example}/ios/Runner/AppDelegate.swift (100%) create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/opencv_dart/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/opencv_dart/example/ios/Runner/Base.lproj/Main.storyboard rename {example => packages/opencv_dart/example}/ios/Runner/Info.plist (100%) create mode 100644 packages/opencv_dart/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 packages/opencv_dart/example/ios/RunnerTests/RunnerTests.swift create mode 100644 packages/opencv_dart/example/lib/main.dart create mode 100644 packages/opencv_dart/example/linux/.gitignore rename {example => packages/opencv_dart/example}/linux/CMakeLists.txt (100%) create mode 100644 packages/opencv_dart/example/linux/flutter/CMakeLists.txt create mode 100644 packages/opencv_dart/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 packages/opencv_dart/example/linux/flutter/generated_plugin_registrant.h rename {example => packages/opencv_dart/example}/linux/flutter/generated_plugins.cmake (100%) create mode 100644 packages/opencv_dart/example/linux/main.cc rename {example => packages/opencv_dart/example}/linux/my_application.cc (100%) create mode 100644 packages/opencv_dart/example/linux/my_application.h create mode 100644 packages/opencv_dart/example/macos/.gitignore rename {example => packages/opencv_dart/example}/macos/Flutter/Flutter-Debug.xcconfig (100%) rename {example => packages/opencv_dart/example}/macos/Flutter/Flutter-Release.xcconfig (100%) create mode 100644 packages/opencv_dart/example/macos/Flutter/GeneratedPluginRegistrant.swift rename {example => packages/opencv_dart/example}/macos/Podfile (100%) rename {example => packages/opencv_dart/example}/macos/Podfile.lock (100%) rename {example => packages/opencv_dart/example}/macos/Runner.xcodeproj/project.pbxproj (100%) create mode 100644 packages/opencv_dart/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename {example => packages/opencv_dart/example}/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename {example => packages/opencv_dart/example}/macos/Runner.xcworkspace/contents.xcworkspacedata (100%) create mode 100644 packages/opencv_dart/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename {example => packages/opencv_dart/example}/macos/Runner/AppDelegate.swift (100%) create mode 100644 packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 packages/opencv_dart/example/macos/Runner/Base.lproj/MainMenu.xib rename {example => packages/opencv_dart/example}/macos/Runner/Configs/AppInfo.xcconfig (100%) create mode 100644 packages/opencv_dart/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 packages/opencv_dart/example/macos/Runner/Configs/Release.xcconfig create mode 100644 packages/opencv_dart/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 packages/opencv_dart/example/macos/Runner/DebugProfile.entitlements create mode 100644 packages/opencv_dart/example/macos/Runner/Info.plist create mode 100644 packages/opencv_dart/example/macos/Runner/MainFlutterWindow.swift create mode 100644 packages/opencv_dart/example/macos/Runner/Release.entitlements rename {example => packages/opencv_dart/example}/macos/RunnerTests/RunnerTests.swift (100%) rename {example => packages/opencv_dart/example}/pubspec.yaml (100%) rename {example => packages/opencv_dart/example}/test/widget_test.dart (100%) create mode 100644 packages/opencv_dart/example/windows/.gitignore rename {example => packages/opencv_dart/example}/windows/CMakeLists.txt (100%) create mode 100644 packages/opencv_dart/example/windows/flutter/CMakeLists.txt create mode 100644 packages/opencv_dart/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 packages/opencv_dart/example/windows/flutter/generated_plugin_registrant.h rename {example => packages/opencv_dart/example}/windows/flutter/generated_plugins.cmake (100%) create mode 100644 packages/opencv_dart/example/windows/runner/CMakeLists.txt rename {example => packages/opencv_dart/example}/windows/runner/Runner.rc (100%) create mode 100644 packages/opencv_dart/example/windows/runner/flutter_window.cpp create mode 100644 packages/opencv_dart/example/windows/runner/flutter_window.h rename {example => packages/opencv_dart/example}/windows/runner/main.cpp (100%) create mode 100644 packages/opencv_dart/example/windows/runner/resource.h create mode 100644 packages/opencv_dart/example/windows/runner/resources/app_icon.ico rename {example => packages/opencv_dart/example}/windows/runner/runner.exe.manifest (100%) rename {example => packages/opencv_dart/example}/windows/runner/utils.cpp (100%) create mode 100644 packages/opencv_dart/example/windows/runner/utils.h create mode 100644 packages/opencv_dart/example/windows/runner/win32_window.cpp create mode 100644 packages/opencv_dart/example/windows/runner/win32_window.h rename {ios => packages/opencv_dart/ios}/opencv_dart.podspec (74%) create mode 100644 packages/opencv_dart/lib/opencv.dart create mode 100644 packages/opencv_dart/lib/opencv_dart.dart create mode 100644 packages/opencv_dart/linux/CMakeLists.txt rename {macos => packages/opencv_dart/macos}/opencv_dart.podspec (89%) rename pubspec.yaml => packages/opencv_dart/pubspec.yaml (64%) create mode 100644 packages/opencv_dart/src/CMakeLists.txt create mode 100644 packages/opencv_dart/windows/.gitignore create mode 100644 packages/opencv_dart/windows/CMakeLists.txt delete mode 100644 profiles/android-armv7 delete mode 100644 profiles/android-armv8 delete mode 100644 profiles/android-x86_64 delete mode 100644 profiles/ios-armv8 delete mode 100644 profiles/ios-x86_64 delete mode 100644 profiles/ios.toolchain.cmake delete mode 100644 scripts/test.ps1 delete mode 100644 scripts/test.sh delete mode 100644 src/calib3d/calib3d.cpp delete mode 100644 src/calib3d/calib3d.h delete mode 100644 src/calib3d/calib3d_async.cpp delete mode 100644 src/calib3d/calib3d_async.h delete mode 100644 src/core/constants.h delete mode 100644 src/core/core.cpp delete mode 100644 src/core/core.h delete mode 100644 src/core/core_async.cpp delete mode 100644 src/core/core_async.h delete mode 100644 src/core/exception.cpp delete mode 100644 src/core/exception.h delete mode 100644 src/core/logging.cpp delete mode 100644 src/core/logging.h delete mode 100644 src/core/lut.hpp delete mode 100644 src/core/svd.cpp delete mode 100644 src/core/svd.h delete mode 100644 src/core/svd_async.cpp delete mode 100644 src/core/svd_async.h delete mode 100644 src/core/types.h delete mode 100644 src/core/vec.hpp delete mode 100644 src/core/version.cpp delete mode 100644 src/core/version.h delete mode 100644 src/dart_api/BUILD.gn delete mode 100644 src/dart_api/analyze_snapshot_api.h delete mode 100644 src/dart_api/bin/dart_io_api.h delete mode 100644 src/dart_api/bin/native_assets_api.h delete mode 100644 src/dart_api/dart_api.h delete mode 100644 src/dart_api/dart_api_dl.c delete mode 100644 src/dart_api/dart_api_dl.h delete mode 100644 src/dart_api/dart_embedder_api.h delete mode 100644 src/dart_api/dart_native_api.h delete mode 100644 src/dart_api/dart_tools_api.h delete mode 100644 src/dart_api/dart_version.h delete mode 100644 src/dart_api/internal/dart_api_dl_impl.h delete mode 100644 src/dnn/asyncarray.cpp delete mode 100644 src/dnn/asyncarray.h delete mode 100644 src/dnn/dnn.cpp delete mode 100644 src/dnn/dnn.h delete mode 100644 src/dnn/dnn_async.cpp delete mode 100644 src/dnn/dnn_async.h delete mode 100644 src/extra/aruco.cpp delete mode 100644 src/extra/aruco.h delete mode 100644 src/extra/aruco_async.cpp delete mode 100644 src/extra/aruco_async.h delete mode 100644 src/extra/img_hash.cpp delete mode 100644 src/extra/img_hash.h delete mode 100644 src/extra/img_hash_async.cpp delete mode 100644 src/extra/img_hash_async.h delete mode 100644 src/extra/quality.cpp delete mode 100644 src/extra/quality.h delete mode 100644 src/extra/quality_async.cpp delete mode 100644 src/extra/quality_async.h delete mode 100644 src/extra/wechat_qrcode.cpp delete mode 100644 src/extra/wechat_qrcode.h delete mode 100644 src/extra/wechat_qrcode_async.cpp delete mode 100644 src/extra/wechat_qrcode_async.h delete mode 100644 src/extra/ximgproc.cpp delete mode 100644 src/extra/ximgproc.h delete mode 100644 src/extra/ximgproc_async.cpp delete mode 100644 src/extra/ximgproc_async.h delete mode 100644 src/extra/xobjdetect.cpp delete mode 100644 src/extra/xobjdetect.h delete mode 100644 src/features2d/features2d.cpp delete mode 100644 src/features2d/features2d.h delete mode 100644 src/features2d/features2d_async.cpp delete mode 100644 src/features2d/features2d_async.h delete mode 100644 src/features2d/utils.hpp delete mode 100644 src/gapi/gapi.cpp delete mode 100644 src/gapi/gapi.h delete mode 100644 src/highgui/highgui.cpp delete mode 100644 src/highgui/highgui.h delete mode 100644 src/imgcodecs/imgcodecs.cpp delete mode 100644 src/imgcodecs/imgcodecs.h delete mode 100644 src/imgcodecs/imgcodecs_async.cpp delete mode 100644 src/imgcodecs/imgcodecs_async.h delete mode 100644 src/imgproc/imgproc.cpp delete mode 100644 src/imgproc/imgproc.h delete mode 100644 src/imgproc/imgproc_async.cpp delete mode 100644 src/imgproc/imgproc_async.h delete mode 100644 src/objdetect/objdetect.cpp delete mode 100644 src/objdetect/objdetect.h delete mode 100644 src/objdetect/objdetect_async.cpp delete mode 100644 src/objdetect/objdetect_async.h delete mode 100644 src/opencv_dart.cpp delete mode 100644 src/opencv_dart.h delete mode 100644 src/photo/photo.cpp delete mode 100644 src/photo/photo.h delete mode 100644 src/photo/photo_async.cpp delete mode 100644 src/photo/photo_async.h delete mode 100644 src/stitching/stitching.cpp delete mode 100644 src/stitching/stitching.h delete mode 100644 src/stitching/stitching_async.cpp delete mode 100644 src/stitching/stitching_async.h delete mode 100644 src/t.h delete mode 100644 src/test/calib3d.cc delete mode 100644 src/test/core.cc delete mode 100644 src/test/dnn.cc delete mode 100644 src/test/imgcodecs.cc delete mode 100644 src/test/imgproc.cc delete mode 100644 src/test/vec.cc delete mode 100644 src/test/video.cc delete mode 100644 src/video/video.cpp delete mode 100644 src/video/video.h delete mode 100644 src/video/video_async.cpp delete mode 100644 src/video/video_async.h delete mode 100644 src/video/videoio.cpp delete mode 100644 src/video/videoio.h delete mode 100644 src/video/videoio_async.cpp delete mode 100644 src/video/videoio_async.h delete mode 100644 windows/CMakeLists.txt diff --git a/.gitmodules b/.gitmodules index e69de29b..eedf714e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "packages/dartcv/src"] + path = packages/dartcv/src + url = https://github.com/rainyl/dartcv.git + branch = main diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 9182eee2..00000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,204 +0,0 @@ -cmake_minimum_required(VERSION 3.15) - -project(opencv_dart_library VERSION 1.0.0 LANGUAGES C CXX) -set(LIBRARY_NAME "opencv_dart") - -file(READ ${CMAKE_SOURCE_DIR}/binary.version PROJECT_VERSION) - -set(CMAKE_CXX_STANDARD 20) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) -cmake_policy(SET CMP0135 NEW) - -set(OpenCV_STATIC ON) - -if(LINUX OR APPLE) - find_package(Iconv REQUIRED) -endif() -find_package(OpenCV REQUIRED) - -set(OpenCV_LIBS - opencv_aruco opencv_core opencv_calib3d opencv_dnn opencv_highgui - opencv_features2d opencv_gapi opencv_photo opencv_imgproc - opencv_objdetect opencv_video opencv_videoio opencv_stitching - opencv_img_hash opencv_wechat_qrcode opencv_ximgproc opencv_xobjdetect - opencv_quality -) - -if(ANDROID) - list(APPEND OpenCV_LIBS camera2ndk mediandk -landroid) -endif(ANDROID) - -if(IOS) - list(APPEND OpenCV_LIBS - "-framework CoreFoundation" - "-framework CoreImage" - "-framework Foundation" - ) -endif(IOS) - -message(STATUS "OpenCV library status:") -message(STATUS " config: ${OpenCV_DIR}") -message(STATUS " version: ${OpenCV_VERSION}") -message(STATUS " libraries: ${OpenCV_LIBS}") -message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") -message(STATUS "Project version: ${PROJECT_VERSION}") - -file(GLOB_RECURSE CPP_FILES - "${CMAKE_CURRENT_SOURCE_DIR}/src/**/*.cpp" - - # "${CMAKE_CURRENT_SOURCE_DIR}/src/calib3d/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/core/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/dnn/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/extra/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/highgui/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/imgcodecs/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/imgproc/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/objdetect/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/photo/*.cpp" - # "${CMAKE_CURRENT_SOURCE_DIR}/src/stitching/*.cpp" -) -file(GLOB_RECURSE HEADER_FILES - "${CMAKE_CURRENT_SOURCE_DIR}/src/**/*.h" -) - -add_library(${LIBRARY_NAME} SHARED - ${CPP_FILES} -) -target_include_directories(${LIBRARY_NAME} SYSTEM PUBLIC - "${CMAKE_CURRENT_SOURCE_DIR}/src" - ${OpenCV_INCLUDE_DIRS} -) -target_link_libraries(${LIBRARY_NAME} PRIVATE ${OpenCV_LIBS}) - -set_target_properties(${LIBRARY_NAME} PROPERTIES - # PUBLIC_HEADER ${HEADER_FILES} - OUTPUT_NAME ${LIBRARY_NAME} - CXX_VISIBILITY_PRESET default - C_VISIBILITY_PRESET default - LINK_FLAGS_RELEASE -s -) - -if(IOS) - # PLATFORM will be defined using ios.toolchain.cmake - if(DEFINED PLATFORM) - if(PLATFORM STREQUAL "SIMULATOR64") - set(IOS_SUPPORTED_PLATFORM "iPhoneSimulator") - elseif(PLATFORM STREQUAL "OS64") - set(IOS_SUPPORTED_PLATFORM "iPhoneOS") - else() - message(FATAL_ERROR "For IOS, only OS64 and SIMULATOR64 are supported now.") - endif() - else() - message(FATAL_ERROR "For IOS, you must define PLATFORM") - endif() - set_target_properties(${LIBRARY_NAME} PROPERTIES - FRAMEWORK TRUE - FRAMEWORK_VERSION CXX - MACOSX_FRAMEWORK_INFO_PLIST ${CMAKE_SOURCE_DIR}/ios/Info.plist.in - ) -endif(IOS) - -if(APPLE) - target_link_options(${LIBRARY_NAME} PRIVATE "LINKER:-ld_classic") -endif(APPLE) - -if(WIN32) - set_target_properties(${LIBRARY_NAME} PROPERTIES - WINDOWS_EXPORT_ALL_SYMBOLS ON - COMPILE_FLAGS "/EHsc" - ) -endif(WIN32) - -target_compile_definitions(${LIBRARY_NAME} PUBLIC DART_SHARED_LIB) - -if(CVD_ENABLE_TEST) - set_target_properties(${LIBRARY_NAME} PROPERTIES COMPILE_DEFINITIONS "CVD_ENABLE_TEST") -endif() - -### install -if(WIN32) - file(GLOB_RECURSE FFMPEG_DLL "${OpenCV_DIR}/**/*ffmpeg*.dll") - file(TO_CMAKE_PATH ${FFMPEG_DLL} FFMPEG_DLL) - file(GLOB CV_DEPENDENCIES "${CMAKE_BINARY_DIR}/*.dll" ${FFMPEG_DLL}) -elseif(APPLE) - file(GLOB CV_DEPENDENCIES "${CMAKE_BINARY_DIR}/*.dylib") -elseif(LINUX) - file(GLOB CV_DEPENDENCIES "${CMAKE_BINARY_DIR}/*.so") -endif() - -install(TARGETS ${LIBRARY_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}) -install(FILES ${CV_DEPENDENCIES} DESTINATION ${CMAKE_INSTALL_PREFIX}) - -if(CVD_PLATFORM_INSTALL_DIR) - # also install to platform specific directories - install(TARGETS ${LIBRARY_NAME} DESTINATION ${CVD_PLATFORM_INSTALL_DIR}) - install(FILES ${CV_DEPENDENCIES} DESTINATION ${CVD_PLATFORM_INSTALL_DIR}) -endif() - -if(CVD_ENABLE_TEST) - ### test - include(FetchContent) - FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/refs/heads/main.zip - ) - # For Windows: Prevent overriding the parent project's compiler/linker settings - if(WIN32) - set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - endif(WIN32) - FetchContent_MakeAvailable(googletest) - # copy test images - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/test) - file(COPY - "${CMAKE_CURRENT_SOURCE_DIR}/test/images" - DESTINATION ${CMAKE_BINARY_DIR}/test - ) - # model files for DNN test - if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/models") - file(COPY - "${CMAKE_CURRENT_SOURCE_DIR}/test/models" - DESTINATION ${CMAKE_BINARY_DIR}/test - ) - endif() - - enable_testing() - - macro(add_ocv_dart_test executable_name source_file) - add_executable( - ${executable_name} - "${source_file}" - ) - - target_link_libraries( - ${executable_name} - PUBLIC - ${OpenCV_LIBS} - ${LIBRARY_NAME} - GTest::gtest_main - ) - - if(WIN32) - set_target_properties(${executable_name} PROPERTIES - COMPILE_FLAGS "/EHsc" - ) - endif(WIN32) - endmacro() - - add_ocv_dart_test(ocv_dart_test_vec "src/test/vec.cc") - add_ocv_dart_test(ocv_dart_test_core "src/test/core.cc") - add_ocv_dart_test(ocv_dart_test_calib3d "src/test/calib3d.cc") - add_ocv_dart_test(ocv_dart_test_dnn "src/test/dnn.cc") - add_ocv_dart_test(ocv_dart_test_imgcodecs "src/test/imgcodecs.cc") - add_ocv_dart_test(ocv_dart_test_imgproc "src/test/imgproc.cc") - add_ocv_dart_test(ocv_dart_test_video "src/test/video.cc") - - include(GoogleTest) - gtest_discover_tests(ocv_dart_test_vec) - gtest_discover_tests(ocv_dart_test_core) - gtest_discover_tests(ocv_dart_test_calib3d) - gtest_discover_tests(ocv_dart_test_dnn) - gtest_discover_tests(ocv_dart_test_imgcodecs) - gtest_discover_tests(ocv_dart_test_imgproc) - gtest_discover_tests(ocv_dart_test_video) -endif() diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index 2c8ad49c..00000000 --- a/android/build.gradle +++ /dev/null @@ -1,147 +0,0 @@ -group 'dev.rainyl.opencv_dart' -version '1.0' - -buildscript { - repositories { - google() - mavenCentral() - maven { - url "https://plugins.gradle.org/m2/" - } - } - - dependencies { - // The Android Gradle Plugin knows how to build native code with the NDK. - classpath 'com.android.tools.build:gradle:7.3.0' - classpath "de.undercouch:gradle-download-task:5.6.0" - } -} - -apply plugin: "de.undercouch.download" - -rootProject.allprojects { - repositories { - google() - mavenCentral() - } -} - -apply plugin: 'com.android.library' - -android { - if (project.android.hasProperty("namespace")) { - namespace 'dev.rainyl.opencv_dart' - } - - // Bumping the plugin compileSdk version requires all clients of this plugin - // to bump the version in their app. - compileSdk 33 - - // Use the NDK version declared in /android/app/build.gradle file of the Flutter project. - // Replace it with a version number if this plugin requires a specific NDK version. - // (e.g. ndkVersion "23.1.7779620") - ndkVersion android.ndkVersion - - // Invoke the shared CMake build with the Android Gradle Plugin. - // externalNativeBuild { - // cmake { - // path "../src/CMakeLists.txt" - - // // The default CMake version for the Android Gradle Plugin is 3.10.2. - // // https://developer.android.com/studio/projects/install-ndk#vanilla_cmake - // // - // // The Flutter tooling requires that developers have CMake 3.10 or later - // // installed. You should not increase this version, as doing so will cause - // // the plugin to fail to compile for some customers of the plugin. - // // version "3.10.2" - // } - // } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - defaultConfig { - minSdkVersion 19 - } -} - -def SOURCE_DIR = project.buildscript.sourceFile.parentFile -def ROOT_DIR = SOURCE_DIR.parentFile -def CACHE_DIR = new File("${ROOT_DIR}/.dart_tool/.cache") -def CVD_VERSION = new File("${ROOT_DIR}/binary.version").text -def CVD_LIB_URL_BASE = "https://github.com/rainyl/opencv_dart/releases/download" -def ABI_ALL = ['x86_64', 'arm64-v8a', 'armeabi-v7a'] -def ABI_ACCEPTED = ['x86_64', 'arm64-v8a', 'armeabi-v7a'] - -def OPENCV_DART_ANDROID_ENABLED_ABI = System.env.OPENCV_DART_ANDROID_ENABLED_ABI ?: null -if(OPENCV_DART_ANDROID_ENABLED_ABI != null){ - println "[opencv_dart] detected OPENCV_DART_ANDROID_ENABLED_ABI: $OPENCV_DART_ANDROID_ENABLED_ABI" - def enabledABI = OPENCV_DART_ANDROID_ENABLED_ABI.split(",") - def acceptedABI = [] - enabledABI.each { abi -> - if(ABI_ALL.contains(abi)){ - println "[opencv_dart] add abi: ${abi}" - acceptedABI.add(abi) - } else { - println "[opencv_dart] invalid abi: ${abi}, ignored" - } - } - println "[opencv_dart] accepted abi: $acceptedABI" - if (acceptedABI){ - ABI_ACCEPTED = acceptedABI - } else { - println "[opencv_dart] invalid OPENCV_DART_ANDROID_ENABLED_ABI: $OPENCV_DART_ANDROID_ENABLED_ABI" - println "[opencv_dart] will enable all supported ABI: $ABI_ACCEPTED" - } -} - -ABI_ALL.each { arch -> - def extractTaskName = "opencv_dart_extract_libs_${arch}" - def targetDir = new File("${SOURCE_DIR}/src/main/jniLibs/${arch}") - if (targetDir.exists() && !ABI_ACCEPTED.contains(arch)) { - println "[opencv_dart] Deleting libraries for ${arch}..." - delete targetDir - } - task(extractTaskName, type: Copy) { - mustRunAfter "downloadLibs" - onlyIf { - ABI_ACCEPTED.contains(arch) && !file("${targetDir}/libopencv_dart.so").exists() - } - doFirst { - println "[opencv_dart] Extracting libraries for ${arch}..." - } - from tarTree(resources.gzip("${CACHE_DIR}/libopencv_dart-android-${arch}.tar.gz")) - into targetDir - } -} - -task downloadLibs(type: Download) { - println "[opencv_dart] Downloading libraries..." - def SRC_URLS = ABI_ACCEPTED.collect { ARCH -> - "${CVD_LIB_URL_BASE}/v${CVD_VERSION}/libopencv_dart-android-${ARCH}.tar.gz" - } - src(SRC_URLS) - dest CACHE_DIR - overwrite false -} - -task extractLibs(dependsOn: downloadLibs) { - println "[opencv_dart] Extracting libraries..." - ABI_ALL.each { arch -> - dependsOn "opencv_dart_extract_libs_${arch}" - } - - doLast { - println "[opencv_dart] Extract finished." - } -} - -def OPENCV_DART_DISABLE_AUTO_BUILD = System.env.OPENCV_DART_DISABLE_AUTO_BUILD ?: null -if (OPENCV_DART_DISABLE_AUTO_BUILD != null) { - println "[opencv_dart] Found OPENCV_DART_DISABLE_AUTO_BUILD, skip auto build" -} else { - println "[opencv_dart] OPENCV_DART_DISABLE_AUTO_BUILD is not set, running setup" - preBuild.dependsOn extractLibs -} diff --git a/bin/setup.dart b/bin/setup.dart deleted file mode 100644 index a69f7eae..00000000 --- a/bin/setup.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:args/command_runner.dart'; - -import 'setup_commands.dart'; - -void main(List args) async { - final cmd = CommandRunner("setup", "Setup for opencv_dart") - ..addCommand(WindowsSetupCommand()) - ..addCommand(LinuxSetupCommand()) - ..addCommand(MacOsSetupCommand()) - ..addCommand(AndroidSetupCommand()) - ..addCommand(IosSetupCommand()); - await cmd.run(args); -} diff --git a/bin/setup_commands.dart b/bin/setup_commands.dart deleted file mode 100644 index 1a61987d..00000000 --- a/bin/setup_commands.dart +++ /dev/null @@ -1,215 +0,0 @@ -// ignore_for_file: avoid_print, constant_identifier_names - -import 'dart:io'; - -import 'package:archive/archive_io.dart'; -import 'package:args/command_runner.dart'; -import 'package:path/path.dart' as p; -import 'package:stack_trace/stack_trace.dart'; - -const setupPkgName = "opencv_dart"; -const baseUrl = "https://github.com/rainyl/opencv_dart/releases/download"; - -abstract class BaseSetupCommand extends Command { - @override - String get description => "Setup"; - - @override - String get name => "base"; - - String get arch { - final arch_ = argResults?["arch"] as String; - return ARCH_MAP[os]?[arch_] as String? ?? arch_; - } - - String get pkgRoot => Frame.caller().uri.resolve("..").toFilePath(); - - bool get force => argResults?.flag("force") ?? false; - String get os => name; - - Future downloadAndExtract(String downArch, [String? extractPath]) async { - final opencvRoot = pkgRoot; - print(asInfo('Using package:$setupPkgName from $opencvRoot')); - - final String version = File(p.join(opencvRoot, "binary.version")).readAsStringSync(); - final libTarName = "libopencv_dart-$os-$downArch.tar.gz"; - - extractPath ??= switch (os) { - OS.windows => p.join(opencvRoot, "windows"), - OS.linux => p.join(opencvRoot, "linux"), - OS.android => p.join(opencvRoot, "android", "src", "main", "jniLibs", downArch), - OS.macos => p.join(opencvRoot, "macos"), - OS.ios => p.join(opencvRoot, "ios"), - _ => throw UnsupportedError(asError("Platform $os not supported")) - }; - - if (!Directory(extractPath).existsSync()) { - Directory(extractPath).createSync(recursive: true); - } - - final cacheTarPath = p.join(opencvRoot, ".dart_tool", ".cache", libTarName); - final saveFile = File(cacheTarPath); - - if (force || !saveFile.existsSync()) { - if (!saveFile.parent.existsSync()) saveFile.parent.createSync(recursive: true); - - final String url = "$baseUrl/v$version/$libTarName"; - print(asInfo("Downloading $url")); - try { - final request = await HttpClient().getUrl(Uri.parse(url)); - final response = await request.close(); - if (response.statusCode == 200) { - await response.pipe(saveFile.openWrite()); - print(asWarning("Cached to $cacheTarPath")); - } else { - print(asError("Download Failed with status: ${response.statusCode}")); - exit(1); - } - } catch (e) { - print(asError(e.toString())); - exit(1); - } - } else { - print(asWarning("Using cached $cacheTarPath")); - // Check if libs already existed, avoid double-extract - if (Directory(extractPath) - .listSync() - .map( - (e) => - e.path.endsWith(".so") || - e.path.endsWith(".dll") || - e.path.endsWith(".dylib") || - e.path.endsWith(".xcframework"), - ) - .any((e) => e)) { - print(asWarning("Libs already exists in $extractPath, Skipping...")); - return; - } - } - - print(asInfo("Extracting to $extractPath")); - final tarBytes = GZipDecoder().decodeBytes(saveFile.readAsBytesSync()); - final archive = TarDecoder().decodeBytes(tarBytes); - await extractArchiveToDisk(archive, extractPath, bufferSize: 1024 * 1024 * 10); // 10MB - } - - @override - Future run() async { - print(asInfo("opencv_dart: working for $os $arch")); - await downloadAndExtract(arch); - print(asInfo("Finished")); - exit(0); - } -} - -class MacOsSetupCommand extends BaseSetupCommand { - @override - String get description => "Setup for macOS"; - - @override - String get name => "macos"; - - MacOsSetupCommand() { - argParser.addOption( - "arch", - abbr: "a", - allowed: ["x86_64", "x64", "arm64", "os64"], - mandatory: true, - ); - argParser.addFlag("force", abbr: "f", help: "Force download and extract"); - } -} - -class WindowsSetupCommand extends BaseSetupCommand { - @override - String get description => "Setup for Windows"; - - @override - String get name => "windows"; - - WindowsSetupCommand() { - argParser.addOption("arch", abbr: "a", allowed: ["x86_64", "x64"], mandatory: true); - argParser.addFlag("force", abbr: "f", help: "Force download and extract"); - } -} - -class LinuxSetupCommand extends BaseSetupCommand { - @override - String get description => "Setup for Linux"; - - @override - String get name => "linux"; - - LinuxSetupCommand() { - argParser.addOption("arch", abbr: "a", allowed: ["x86_64", "x64"], mandatory: true); - argParser.addFlag("force", abbr: "f", help: "Force download and extract"); - } -} - -class AndroidSetupCommand extends BaseSetupCommand { - @override - String get description => "Setup for Android"; - - @override - String get name => "android"; - - AndroidSetupCommand() { - argParser.addOption( - "arch", - abbr: "a", - allowed: ["x86_64", "arm64-v8a", "armeabi-v7a"], - mandatory: true, - ); - argParser.addFlag("force", abbr: "f", help: "Force download and extract"); - } -} - -class IosSetupCommand extends BaseSetupCommand { - @override - String get description => "Setup for IOS"; - - @override - String get name => "ios"; - - IosSetupCommand() { - argParser.addOption( - "arch", - abbr: "a", - allowed: ["os64"], - mandatory: false, - defaultsTo: "os64", - ); - argParser.addFlag("force", abbr: "f", help: "Force download and extract"); - } -} - -const ARCH_MAP = { - OS.windows: { - "x86_64": "x64", - }, - OS.linux: { - "x86_64": "x64", - }, - OS.macos: { - "x86_64": "x64", - }, - OS.ios: { - "x86_64": "x64", - }, - OS.android: {}, -}; - -class OS { - static const windows = "windows"; - static const linux = "linux"; - static const android = "android"; - static const fuchsia = "fuchsia"; - static const ios = "ios"; - static const macos = "macos"; -} - -String asInfo(String text) => '✅\x1B[32m$text\x1B[0m'; - -String asWarning(String text) => '💡\x1B[33m$text\x1B[0m'; - -String asError(String text) => '⛔\x1B[31m$text\x1B[0m'; diff --git a/binary.version b/binary.version deleted file mode 100644 index 3a1f10ea..00000000 --- a/binary.version +++ /dev/null @@ -1 +0,0 @@ -1.2.5 \ No newline at end of file diff --git a/conanfile.py b/conanfile.py deleted file mode 100644 index 4ddbabe7..00000000 --- a/conanfile.py +++ /dev/null @@ -1,215 +0,0 @@ -import os -from conan import ConanFile -from conan.errors import ConanInvalidConfiguration -from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps -import conan.tools.files as cfiles -import tarfile -from pathlib import Path - -OPENCV_VERSION = "4.10.0+5" -OPENCV_FILES_URL = ( - f"https://github.com/rainyl/opencv.full/releases/download/{OPENCV_VERSION}" -) - -# for compatibility -arch_map = { - "windows": { - "x86_64": "x64", - }, - "linux": { - "x86_64": "x64", - }, - "android": { - "x86_64": "x86_64", - "armv8": "arm64-v8a", - "armv7": "armeabi-v7a", - }, - "macos": { - "x86_64": "x64", - "armv8": "arm64", - }, - "ios": { - "x86_64": "x64", - "armv8": "arm64", - }, -} - - -class OcvDartDesktop(ConanFile): - name = "opencv_dart" - settings = "os", "compiler", "build_type", "arch" - # generators = "CMakeToolchain", "CMakeDeps" - options = { - "package_root": ["ANY"], - "output_dir": ["ANY"], - "opencv_overwrite": [True, False], - "opencv_dir": ["ANY"], - "publish": [True, False], - "post_build": [True, False], - } - default_options = { - "package_root": ".", - "output_dir": "build", - "opencv_overwrite": False, - "opencv_dir": "", - "publish": True, - "post_build": True, - } - - opencv_full: Path - - def __init__(self, display_name=""): - super().__init__(display_name) - version_file = Path(str(self.options.get_safe("package_root", "."))) / "binary.version" - with open(version_file, "r") as f: - binary_version = f.read() - self.version = binary_version - - def requirements(self): - out_dir = os.path.abspath(str(self.options.get_safe("output_dir"))) - if not os.path.exists(out_dir): - Path(out_dir).mkdir(parents=True) - p0 = str(self.options.get_safe("opencv_dir", "")) or os.environ.get( - "OpenCV_DIR", "" - ) - if p0: - assert os.path.exists( - p0 - ), f"explicitly configured opencv_dir/OpenCV_DIR {p0} not exists, check your command or environment variables" - self.opencv_full = Path(p0) - return - platform = str(self.settings.os).lower() - arch = arch_map[platform][str(self.settings.arch)] - filename = f"libopencv-{platform}-{arch}.tar.gz" - self.opencv_full = Path(out_dir) / "opencv" / filename.replace(".tar.gz", "") - if not self.opencv_full.exists() or self.options.get_safe( - "opencv_overwrite", False - ): - cfiles.get( - self, - f"{OPENCV_FILES_URL}/{filename}", - destination=str(self.opencv_full.absolute()), - filename=filename, - verify=False, # TODO: add verify - ) - - def build_requirements(self): - self.tool_requires("cmake/3.28.1") - if self.settings.os != "Windows": - self.tool_requires("ninja/1.11.1") - # if self.settings.os == "Linux": - # self.tool_requires("ffmpeg/6.1") - if self.settings.os == "Android": - ndk_path = os.environ.get("ANDROID_NDK_HOME", None) - ndk_path = ndk_path or os.environ.get("ANDROID_NDK_ROOT", None) - if ndk_path is None: - self.tool_requires("android-ndk/r26d") - else: - self.conf.define("tools.android:ndk_path", ndk_path) - - def layout(self): - # self.build_folder: build/{os}/{arch}/opencv - # base = Path(self.build_folder).parent # build/{os}/{arch} - out_dir = Path(os.path.abspath(str(self.options.get_safe("output_dir")))) - pkg_dir = Path(os.path.abspath(str(self.options.get_safe("package_root")))) - self.folders.generators = str((out_dir / "generators").absolute()) - self.folders.build = str(out_dir.absolute()) - self.folders.source = str(pkg_dir.absolute()) - self.folders.set_base_package(str(pkg_dir.absolute())) - - def generate(self): - tc: CMakeToolchain = CMakeToolchain(self) - if self.settings.os == "iOS": - platform_map = { - "armv8": "OS64", - "x86_64": "SIMULATOR64", - # TODO: maybe need a conf var to support "SIMULATORARM64" and more - } - platform = platform_map[str(self.settings.arch)] - block = tc.blocks["user_toolchain"] - block.template = ( - f"set(PLATFORM {platform})\n" - "set(ENABLE_ARC FALSE)\n" - "set(ENABLE_BITCODE FALSE)\n" - f"{block.template}" - ) - # tc.variables["CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM"] = "rainyl" - # tc.variables["CODE_SIGNING_ALLOWED"] = "NO" - tc.generate() - CMakeDeps(self).generate() - - def build(self): - cmake = CMake(self) - - # build opencv_dart - cmake.configure( - variables={ - "CMAKE_INSTALL_PREFIX": str(self.install_folder), - "OpenCV_DIR": self.opencv_dir, - "CMAKE_VISIBILITY_INLINES_HIDDEN": "hidden", - "CMAKE_C_VISIBILITY_PRESET": "hidden", - "CMAKE_CXX_VISIBILITY_PRESET": "hidden", - "INSTALL_GTEST": False, - }, - ) - tool_args = ["CODE_SIGNING_ALLOWED=NO"] if self.settings.os == "iOS" else None - cmake.build(build_tool_args=tool_args) - # cmake.test() - cmake.install(cli_args=["--strip"]) - - if self.get_bool("post_build", True): - self.post_build() - - def post_build(self): - # archive - install_dir = Path(self.install_folder) - _os = str(self.settings.os).lower() - arch = arch_map[_os][str(self.settings.arch)] - # Copy to platform dir - dst = Path(self.package_folder).absolute() / _os - - if _os == "android": - dst = dst / "src" / "main" / "jniLibs" / arch - print(f"Copying to {dst}") - cfiles.copy(self, "*", self.install_folder, dst) - - # Publish to tar.gz - if self.get_bool("publish", True): - new_name = f"lib{self.name}-{_os}-{arch}.tar.gz" - fname = self.publish_folder / new_name - print(fname) - if not fname.parent.exists(): - fname.parent.mkdir(parents=True) - with tarfile.open(fname, mode="w:gz") as tar: - for file in install_dir.glob("*"): - print(f"Adding {file}...") - tar.add(file, arcname=file.name) - print(f"published: {fname}") - - @property - def install_folder(self) -> Path: - return Path(f"{os.path.join(self.build_folder, 'install')}") - - @property - def publish_folder(self) -> Path: - return Path(self.package_folder).absolute() / "build" / "publish" - - @property - def opencv_dir(self) -> str: - if self.settings.os == "Windows": - return str(self.opencv_full) - elif self.settings.os in ["Linux", "Macos", "iOS"]: - return str(self.opencv_full / "lib" / "cmake" / "opencv4") - elif self.settings.os == "Android": - return str(self.opencv_full / "sdk" / "native" / "jni") - else: - raise ConanInvalidConfiguration - - def get_bool(self, name: str, default=False): - value = str(self.options.get_safe(name, default)) - if isinstance(value, str): - return value == "True" - elif isinstance(value, bool): - return value - else: - raise ValueError(f"value: {value=} of {name=} error") diff --git a/ffigen/ffigen_contrib.yaml b/ffigen/ffigen_contrib.yaml deleted file mode 100644 index 7a02691b..00000000 --- a/ffigen/ffigen_contrib.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: CvNativeContrib -description: | - Native bindings for OpenCV - Contrib -output: - bindings: ../lib/src/g/contrib.g.dart - symbol-file: - output: "package:opencv_dart/src/g/contrib.yaml" - import-path: "package:opencv_dart/src/g/contrib.g.dart" -# ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. -import: - symbol-files: - - "package:opencv_dart/src/g/types.yaml" -compiler-opts: "-Isrc" -sort: true -include-unused-typedefs: true -headers: - entry-points: - - ../src/extra/aruco.h - - ../src/extra/aruco_async.h - - ../src/extra/img_hash.h - - ../src/extra/img_hash_async.h - - ../src/extra/quality.h - - ../src/extra/quality_async.h - - ../src/extra/wechat_qrcode.h - - ../src/extra/ximgproc.h - - ../src/extra/ximgproc_async.h - - ../src/extra/xobjdetect.h - - ../src/extra/wechat_qrcode_async.h - include-directives: - - ../src/extra/aruco.h - - ../src/extra/aruco_async.h - - ../src/extra/img_hash.h - - ../src/extra/img_hash_async.h - - ../src/extra/quality.h - - ../src/extra/quality_async.h - - ../src/extra/wechat_qrcode.h - - ../src/extra/ximgproc.h - - ../src/extra/ximgproc_async.h - - ../src/extra/xobjdetect.h - - ../src/extra/wechat_qrcode_async.h - -functions: - symbol-address: - include: - - ".*_Close.*" - - ".*_close.*" - -preamble: | - // coverage:ignore-file - // opencv_dart - OpenCV bindings for Dart language - // some c wrappers were from gocv: https://github.com/hybridgroup/gocv - // License: Apache-2.0 https://github.com/hybridgroup/gocv/blob/release/LICENSE.txt - // Author: Rainyl - // License: Apache-2.0 - // Date: 2024/01/28 - -comments: - style: doxygen # Options - doxygen(default) / any. - length: full # Options - brief / full(default). diff --git a/ios/Info.plist.in b/ios/Info.plist.in deleted file mode 100644 index 3a0f4f29..00000000 --- a/ios/Info.plist.in +++ /dev/null @@ -1,33 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${LIBRARY_NAME} - CFBundleName - ${LIBRARY_NAME} - CFBundleIdentifier - dev.rainyl.OpenCvDart - CFBundleVersion - ${PROJECT_VERSION} - CFBundleShortVersionString - ${PROJECT_VERSION} - CFBundleSignature - ???? - CFBundlePackageType - FMWK - CFBundleSupportedPlatforms - - ${IOS_SUPPORTED_PLATFORM} - - MinimumOSVersion - 100.0 - UIDeviceFamily - - 1 - 2 - - - diff --git a/ios/Makefile b/ios/Makefile deleted file mode 100644 index b8fc8f2a..00000000 --- a/ios/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# Define the platform and architecture -PLATFORM := $(shell uname) - -# Get the parent directory of the current makefile -WORK_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -VERSION := $(shell cat $(WORK_DIR)/../binary.version) -LIB_NAME := "libopencv_dart-ios-os64.tar.gz" -CVD_LIB_URL := "https://github.com/rainyl/opencv_dart/releases/download/v${VERSION}/$(LIB_NAME)" - -.PHONY: setup - -ifdef OPENCV_DART_DISABLE_AUTO_BUILD -setup: - @echo "OPENCV_DART_DISABLE_AUTO_BUILD detected, skipping setup..." -else -setup: -ifeq ($(PLATFORM),Darwin) - @echo "Detected macOS platform" -ifeq ($(shell test -s $(WORK_DIR)/opencv_dart.xcframework/Info.plist && echo true),true) - @echo "Found $(WORK_DIR)/opencv_dart.xcframework/Info.plist, skipping..." -else -ifeq ($(shell test -s $(WORK_DIR)/$(LIB_NAME) && echo true),true) - @echo "Found $(WORK_DIR)/$(LIB_NAME), extracting..." - @cd $(WORK_DIR) && tar -xzf $(LIB_NAME) -else - @echo "Running setup for iOS with architecture: $(OPENCV_DART_ARCH)" - @cd $(WORK_DIR) && wget -O $(LIB_NAME) $(CVD_LIB_URL) && tar -xzf $(LIB_NAME) -endif -endif -else - @echo "This setup only runs on macOS" - @exit 1 -endif -endif diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt deleted file mode 100644 index 38aa4f3b..00000000 --- a/linux/CMakeLists.txt +++ /dev/null @@ -1,75 +0,0 @@ -# The Flutter tooling requires that developers have CMake 3.10 or later -# installed. You should not increase this version, as doing so will cause -# the plugin to fail to compile for some customers of the plugin. -cmake_minimum_required(VERSION 3.18) - -# Project-level configuration. -set(PROJECT_NAME "opencv_dart") - -project(${PROJECT_NAME} LANGUAGES CXX VERSION 1.0.0) - -file(READ "${CMAKE_CURRENT_SOURCE_DIR}/../binary.version" PROJECT_VERSION) -set(CVD_LIB_URL_BASE "https://github.com/rainyl/opencv_dart/releases/download") -# check whether the auto build is disabled -set(OPENCV_DART_DISABLE_AUTO_BUILD $ENV{OPENCV_DART_DISABLE_AUTO_BUILD}) - -macro(download_and_extract _url _dst_dir) - file(GLOB _libs "${_dst_dir}/*.so") - if(NOT _libs) - get_filename_component(_dst_file "${_url}" NAME) - set(_dst_file "${_dst_dir}/${_dst_file}") - if(NOT EXISTS ${_dst_file}) - # download if not exist - message(STATUS "Downloading ${_url} -> ${_dst_file}") - file(DOWNLOAD "${_url}" ${_dst_file} - SHOW_PROGRESS STATUS _rtn TLS_VERIFY OFF TIMEOUT 300 - ) - list(GET _rtn 0 _rtncode) - if(NOT 0 EQUAL _rtncode) - message(FATAL_ERROR ${_rtn}) - endif() - endif(NOT EXISTS ${_dst_file}) - - # extract - message(STATUS "Extracting ${_dst_file}") - file(ARCHIVE_EXTRACT INPUT "${_dst_file}" DESTINATION ${_dst_dir}) - else() - message(STATUS "${_libs} exists, no need to download or extract!") - endif() -endmacro() - -if(NOT OPENCV_DART_DISABLE_AUTO_BUILD) - # Define default architecture - set(OPENCV_DART_ARCH $ENV{OPENCV_DART_ARCH}) - if(NOT OPENCV_DART_ARCH) - set(OPENCV_DART_ARCH "x64") - endif() - - # Print messages - message(STATUS "Auto-selected architecture: ${OPENCV_DART_ARCH}") - message(STATUS "Running setup with architecture: ${OPENCV_DART_ARCH}") - - set(LIB_FILENAME "libopencv_dart-linux-${OPENCV_DART_ARCH}.tar.gz") - set(LIB_URL "${CVD_LIB_URL_BASE}/v${PROJECT_VERSION}/${LIB_FILENAME}") - download_and_extract(${LIB_URL} ${CMAKE_CURRENT_SOURCE_DIR}) -endif() - -# Invoke the build for native code shared with the other target platforms. -# This can be changed to accommodate different builds. -# add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") - -file(GLOB opencv_dart_libs "${CMAKE_CURRENT_SOURCE_DIR}/*.so") -if(NOT opencv_dart_libs) - message(FATAL_ERROR "${PROJECT_NAME} setup failed: not found any .so in ${CMAKE_CURRENT_SOURCE_DIR}") -endif() - -# List of absolute paths to libraries that should be bundled with the plugin. -# This list could contain prebuilt libraries, or libraries created by an -# external build triggered from this build file. -set(opencv_dart_bundled_libraries - # Defined in ../src/CMakeLists.txt. - # This can be changed to accommodate different builds. - # $ - ${opencv_dart_libs} - PARENT_SCOPE -) diff --git a/macos/Makefile b/macos/Makefile deleted file mode 100644 index 6a166332..00000000 --- a/macos/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# Define the platform and architecture -PLATFORM := $(shell uname) -OPENCV_DART_ARCH ?= $(shell uname -m) - -# Check and redirect x86_64 to x64 -ifeq ($(OPENCV_DART_ARCH),x86_64) - OPENCV_DART_ARCH := x64 -endif - -# MacOS specific architectures -MACOS_ARCHS := x64 arm64 - -# Function to check if a value is in a list -check_in_list = $(filter $(1),$(2)) - -# Get the parent directory of the current makefile -WORK_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -VERSION := $(shell cat $(WORK_DIR)/../binary.version) -LIB_NAME := "libopencv_dart-macos-$(OPENCV_DART_ARCH).tar.gz" -CVD_LIB_URL := "https://github.com/rainyl/opencv_dart/releases/download/v${VERSION}/$(LIB_NAME)" - -.PHONY: setup - -ifdef OPENCV_DART_DISABLE_AUTO_BUILD -setup: - @echo "OPENCV_DART_DISABLE_AUTO_BUILD detected, skipping setup..." -else -setup: -ifeq ($(PLATFORM),Darwin) - @echo "Detected macOS platform" -ifeq ($(call check_in_list,$(OPENCV_DART_ARCH),$(MACOS_ARCHS)),) - @echo "Unsupported architecture for macOS: $(OPENCV_DART_ARCH)" - @exit 1 -else -ifeq ($(shell test -s $(WORK_DIR)/libopencv_dart.dylib && echo true),true) - @echo "Found $(WORK_DIR)/libopencv_dart.dylib, skipping..." -else -ifeq ($(shell test -s $(WORK_DIR)/$(LIB_NAME) && echo true),true) - @echo "Found $(WORK_DIR)/$(LIB_NAME), extracting..." - @cd $(WORK_DIR) && tar -xzf $(LIB_NAME) -else - @echo "Running setup for macOS with architecture: $(OPENCV_DART_ARCH)" - @cd $(WORK_DIR) && wget -O $(LIB_NAME) $(CVD_LIB_URL) && tar -xzf $(LIB_NAME) -endif -endif -endif -else - @echo "This setup only runs on macOS" - @exit 1 -endif -endif diff --git a/packages/dartcv/.gitignore b/packages/dartcv/.gitignore new file mode 100644 index 00000000..3cceda55 --- /dev/null +++ b/packages/dartcv/.gitignore @@ -0,0 +1,7 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ + +# Avoid committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock diff --git a/packages/dartcv/CHANGELOG.md b/packages/dartcv/CHANGELOG.md new file mode 100644 index 00000000..effe43c8 --- /dev/null +++ b/packages/dartcv/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version. diff --git a/Makefile b/packages/dartcv/Makefile similarity index 89% rename from Makefile rename to packages/dartcv/Makefile index 06893dbc..7239c42c 100644 --- a/Makefile +++ b/packages/dartcv/Makefile @@ -1,9 +1,11 @@ .PHONY: ffigen ffigen_test ffigen: + dart run ffigen --config ffigen/ffigen_const.yaml + dart run ffigen --config ffigen/ffigen_types.yaml + dart run ffigen --config ffigen/ffigen_core.yaml dart run ffigen --config ffigen/ffigen_calib3d.yaml dart run ffigen --config ffigen/ffigen_contrib.yaml - dart run ffigen --config ffigen/ffigen_core.yaml dart run ffigen --config ffigen/ffigen_dnn.yaml dart run ffigen --config ffigen/ffigen_features2d.yaml dart run ffigen --config ffigen/ffigen_gapi.yaml @@ -13,9 +15,8 @@ ffigen: dart run ffigen --config ffigen/ffigen_objdetect.yaml dart run ffigen --config ffigen/ffigen_photo.yaml dart run ffigen --config ffigen/ffigen_stitching.yaml - dart run ffigen --config ffigen/ffigen_types.yaml - dart run ffigen --config ffigen/ffigen_video_io.yaml - dart run ffigen --config ffigen/ffigen_const.yaml + dart run ffigen --config ffigen/ffigen_video.yaml + dart run ffigen --config ffigen/ffigen_videoio.yaml ffigen_test: dart run ffigen --config ffigen/ffigen_types.yaml diff --git a/packages/dartcv/README.md b/packages/dartcv/README.md new file mode 100644 index 00000000..8831761b --- /dev/null +++ b/packages/dartcv/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/analysis_options.yaml b/packages/dartcv/analysis_options.yaml similarity index 100% rename from analysis_options.yaml rename to packages/dartcv/analysis_options.yaml diff --git a/opencv_dart.iml b/packages/dartcv/dartcv.iml similarity index 100% rename from opencv_dart.iml rename to packages/dartcv/dartcv.iml diff --git a/packages/dartcv/example/dartcv_example.dart b/packages/dartcv/example/dartcv_example.dart new file mode 100644 index 00000000..cae55e6d --- /dev/null +++ b/packages/dartcv/example/dartcv_example.dart @@ -0,0 +1,7 @@ +import 'package:dartcv/dartcv.dart' as cv; + +void main() { + final image = cv.Mat.zeros(3, 3, cv.MatType.CV_8UC3); + cv.randu(image, cv.Scalar.all(0.0), cv.Scalar(255.0)); + print(image); +} diff --git a/ffigen/ffigen_calib3d.yaml b/packages/dartcv/ffigen/ffigen_calib3d.yaml similarity index 68% rename from ffigen/ffigen_calib3d.yaml rename to packages/dartcv/ffigen/ffigen_calib3d.yaml index 1eb2e96a..6f906fda 100644 --- a/ffigen/ffigen_calib3d.yaml +++ b/packages/dartcv/ffigen/ffigen_calib3d.yaml @@ -4,23 +4,23 @@ description: | output: bindings: ../lib/src/g/calib3d.g.dart symbol-file: - output: 'package:opencv_dart/src/g/calib3d.yaml' - import-path: 'package:opencv_dart/src/g/calib3d.g.dart' + output: 'package:dartcv/src/g/calib3d.yaml' + import-path: 'package:dartcv/src/g/calib3d.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/calib3d/calib3d.h - - ../src/calib3d/calib3d_async.h + - ../src/dartcv/calib3d/calib3d.h + - ../src/dartcv/calib3d/calib3d_async.h include-directives: - - ../src/calib3d/calib3d.h - - ../src/calib3d/calib3d_async.h + - ../src/dartcv/calib3d/calib3d.h + - ../src/dartcv/calib3d/calib3d_async.h functions: symbol-address: diff --git a/ffigen/ffigen_const.yaml b/packages/dartcv/ffigen/ffigen_const.yaml similarity index 81% rename from ffigen/ffigen_const.yaml rename to packages/dartcv/ffigen/ffigen_const.yaml index 59c27207..9d67521f 100644 --- a/ffigen/ffigen_const.yaml +++ b/packages/dartcv/ffigen/ffigen_const.yaml @@ -4,15 +4,15 @@ description: | output: bindings: ../lib/src/g/constants.g.dart # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. compiler-opts: "" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/core/constants.h + - ../src/dartcv/core/constants.h include-directives: - - ../src/core/constants.h + - ../src/dartcv/core/constants.h preamble: | // opencv_dart - OpenCV bindings for Dart language diff --git a/packages/dartcv/ffigen/ffigen_contrib.yaml b/packages/dartcv/ffigen/ffigen_contrib.yaml new file mode 100644 index 00000000..361a62e4 --- /dev/null +++ b/packages/dartcv/ffigen/ffigen_contrib.yaml @@ -0,0 +1,60 @@ +name: CvNativeContrib +description: | + Native bindings for OpenCV - Contrib +output: + bindings: ../lib/src/g/contrib.g.dart + symbol-file: + output: "package:dartcv/src/g/contrib.yaml" + import-path: "package:dartcv/src/g/contrib.g.dart" +# ffi-native: +# assetId: 'package:dartcv/dartcv.dart' # Optional. +import: + symbol-files: + - "package:dartcv/src/g/types.yaml" +compiler-opts: "-Isrc -Idartcv" +sort: true +include-unused-typedefs: true +headers: + entry-points: + - ../src/dartcv/contrib/aruco.h + - ../src/dartcv/contrib/aruco_async.h + - ../src/dartcv/contrib/img_hash.h + - ../src/dartcv/contrib/img_hash_async.h + - ../src/dartcv/contrib/quality.h + - ../src/dartcv/contrib/quality_async.h + - ../src/dartcv/contrib/wechat_qrcode.h + - ../src/dartcv/contrib/ximgproc.h + - ../src/dartcv/contrib/ximgproc_async.h + - ../src/dartcv/contrib/xobjdetect.h + - ../src/dartcv/contrib/wechat_qrcode_async.h + include-directives: + - ../src/dartcv/contrib/aruco.h + - ../src/dartcv/contrib/aruco_async.h + - ../src/dartcv/contrib/img_hash.h + - ../src/dartcv/contrib/img_hash_async.h + - ../src/dartcv/contrib/quality.h + - ../src/dartcv/contrib/quality_async.h + - ../src/dartcv/contrib/wechat_qrcode.h + - ../src/dartcv/contrib/ximgproc.h + - ../src/dartcv/contrib/ximgproc_async.h + - ../src/dartcv/contrib/xobjdetect.h + - ../src/dartcv/contrib/wechat_qrcode_async.h + +functions: + symbol-address: + include: + - ".*_Close.*" + - ".*_close.*" + +preamble: | + // coverage:ignore-file + // opencv_dart - OpenCV bindings for Dart language + // some c wrappers were from gocv: https://github.com/hybridgroup/gocv + // License: Apache-2.0 https://github.com/hybridgroup/gocv/blob/release/LICENSE.txt + // Author: Rainyl + // License: Apache-2.0 + // Date: 2024/01/28 + +comments: + style: doxygen # Options - doxygen(default) / any. + length: full # Options - brief / full(default). diff --git a/ffigen/ffigen_core.yaml b/packages/dartcv/ffigen/ffigen_core.yaml similarity index 62% rename from ffigen/ffigen_core.yaml rename to packages/dartcv/ffigen/ffigen_core.yaml index 5c32f03b..89878c15 100644 --- a/ffigen/ffigen_core.yaml +++ b/packages/dartcv/ffigen/ffigen_core.yaml @@ -4,35 +4,35 @@ description: | output: bindings: ../lib/src/g/core.g.dart symbol-file: - output: 'package:opencv_dart/src/g/core.yaml' - import-path: 'package:opencv_dart/src/g/core.g.dart' + output: 'package:dartcv/src/g/core.yaml' + import-path: 'package:dartcv/src/g/core.g.dart' import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' + - 'package:dartcv/src/g/types.yaml' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. -compiler-opts: "-Isrc" +# assetId: 'package:dartcv/dartcv.dart' # Optional. +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/core/core.h - - ../src/core/core_async.h - - ../src/core/exception.h - - ../src/core/svd.h - - ../src/core/svd_async.h - - ../src/core/vec.h - - ../src/core/version.h - - ../src/core/logging.h + - ../src/dartcv/core/core.h + - ../src/dartcv/core/core_async.h + - ../src/dartcv/core/exception.h + - ../src/dartcv/core/svd.h + - ../src/dartcv/core/svd_async.h + - ../src/dartcv/core/vec.h + - ../src/dartcv/core/version.h + - ../src/dartcv/core/logging.h include-directives: - - ../src/core/core.h - - ../src/core/core_async.h - - ../src/core/exception.h - - ../src/core/svd.h - - ../src/core/svd_async.h - - ../src/core/vec.h - - ../src/core/version.h - - ../src/core/logging.h + - ../src/dartcv/core/core.h + - ../src/dartcv/core/core_async.h + - ../src/dartcv/core/exception.h + - ../src/dartcv/core/svd.h + - ../src/dartcv/core/svd_async.h + - ../src/dartcv/core/vec.h + - ../src/dartcv/core/version.h + - ../src/dartcv/core/logging.h functions: leaf: include: diff --git a/ffigen/ffigen_dnn.yaml b/packages/dartcv/ffigen/ffigen_dnn.yaml similarity index 66% rename from ffigen/ffigen_dnn.yaml rename to packages/dartcv/ffigen/ffigen_dnn.yaml index e1eb2714..8a5f05fb 100644 --- a/ffigen/ffigen_dnn.yaml +++ b/packages/dartcv/ffigen/ffigen_dnn.yaml @@ -4,25 +4,25 @@ description: | output: bindings: ../lib/src/g/dnn.g.dart symbol-file: - output: 'package:opencv_dart/src/g/dnn.yaml' - import-path: 'package:opencv_dart/src/g/dnn.g.dart' + output: 'package:dartcv/src/g/dnn.yaml' + import-path: 'package:dartcv/src/g/dnn.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/dnn/asyncarray.h - - ../src/dnn/dnn.h - - ../src/dnn/dnn_async.h + - ../src/dartcv/dnn/asyncarray.h + - ../src/dartcv/dnn/dnn.h + - ../src/dartcv/dnn/dnn_async.h include-directives: - - ../src/dnn/asyncarray.h - - ../src/dnn/dnn.h - - ../src/dnn/dnn_async.h + - ../src/dartcv/dnn/asyncarray.h + - ../src/dartcv/dnn/dnn.h + - ../src/dartcv/dnn/dnn_async.h functions: symbol-address: diff --git a/ffigen/ffigen_features2d.yaml b/packages/dartcv/ffigen/ffigen_features2d.yaml similarity index 64% rename from ffigen/ffigen_features2d.yaml rename to packages/dartcv/ffigen/ffigen_features2d.yaml index dc13dfbc..8ca5185d 100644 --- a/ffigen/ffigen_features2d.yaml +++ b/packages/dartcv/ffigen/ffigen_features2d.yaml @@ -4,23 +4,23 @@ description: | output: bindings: ../lib/src/g/features2d.g.dart symbol-file: - output: 'package:opencv_dart/src/g/features2d.yaml' - import-path: 'package:opencv_dart/src/g/features2d.g.dart' + output: 'package:dartcv/src/g/features2d.yaml' + import-path: 'package:dartcv/src/g/features2d.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/features2d/features2d.h - - ../src/features2d/features2d_async.h + - ../src/dartcv/features2d/features2d.h + - ../src/dartcv/features2d/features2d_async.h include-directives: - - ../src/features2d/features2d.h - - ../src/features2d/features2d_async.h + - ../src/dartcv/features2d/features2d.h + - ../src/dartcv/features2d/features2d_async.h functions: symbol-address: diff --git a/ffigen/ffigen_gapi.yaml b/packages/dartcv/ffigen/ffigen_gapi.yaml similarity index 72% rename from ffigen/ffigen_gapi.yaml rename to packages/dartcv/ffigen/ffigen_gapi.yaml index 2de3d075..5e63cf40 100644 --- a/ffigen/ffigen_gapi.yaml +++ b/packages/dartcv/ffigen/ffigen_gapi.yaml @@ -4,21 +4,21 @@ description: | output: bindings: ../lib/src/g/gapi.g.dart symbol-file: - output: 'package:opencv_dart/src/g/gapi.yaml' - import-path: 'package:opencv_dart/src/g/gapi.g.dart' + output: 'package:dartcv/src/g/gapi.yaml' + import-path: 'package:dartcv/src/g/gapi.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/gapi/gapi.h + - ../src/dartcv/gapi/gapi.h include-directives: - - ../src/gapi/gapi.h + - ../src/dartcv/gapi/gapi.h functions: symbol-address: diff --git a/ffigen/ffigen_highgui.yaml b/packages/dartcv/ffigen/ffigen_highgui.yaml similarity index 71% rename from ffigen/ffigen_highgui.yaml rename to packages/dartcv/ffigen/ffigen_highgui.yaml index f1b0c30b..3b6d42db 100644 --- a/ffigen/ffigen_highgui.yaml +++ b/packages/dartcv/ffigen/ffigen_highgui.yaml @@ -4,21 +4,21 @@ description: | output: bindings: ../lib/src/g/highgui.g.dart symbol-file: - output: 'package:opencv_dart/src/g/highgui.yaml' - import-path: 'package:opencv_dart/src/g/highgui.g.dart' + output: 'package:dartcv/src/g/highgui.yaml' + import-path: 'package:dartcv/src/g/highgui.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/highgui/highgui.h + - ../src/dartcv/highgui/highgui.h include-directives: - - ../src/highgui/highgui.h + - ../src/dartcv/highgui/highgui.h functions: symbol-address: diff --git a/ffigen/ffigen_imgcodecs.yaml b/packages/dartcv/ffigen/ffigen_imgcodecs.yaml similarity index 65% rename from ffigen/ffigen_imgcodecs.yaml rename to packages/dartcv/ffigen/ffigen_imgcodecs.yaml index 264d54ad..9a20db99 100644 --- a/ffigen/ffigen_imgcodecs.yaml +++ b/packages/dartcv/ffigen/ffigen_imgcodecs.yaml @@ -4,23 +4,23 @@ description: | output: bindings: ../lib/src/g/imgcodecs.g.dart symbol-file: - output: 'package:opencv_dart/src/g/imgcodecs.yaml' - import-path: 'package:opencv_dart/src/g/imgcodecs.g.dart' + output: 'package:dartcv/src/g/imgcodecs.yaml' + import-path: 'package:dartcv/src/g/imgcodecs.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/imgcodecs/imgcodecs.h - - ../src/imgcodecs/imgcodecs_async.h + - ../src/dartcv/imgcodecs/imgcodecs.h + - ../src/dartcv/imgcodecs/imgcodecs_async.h include-directives: - - ../src/imgcodecs/imgcodecs.h - - ../src/imgcodecs/imgcodecs_async.h + - ../src/dartcv/imgcodecs/imgcodecs.h + - ../src/dartcv/imgcodecs/imgcodecs_async.h functions: symbol-address: diff --git a/ffigen/ffigen_imgproc.yaml b/packages/dartcv/ffigen/ffigen_imgproc.yaml similarity index 66% rename from ffigen/ffigen_imgproc.yaml rename to packages/dartcv/ffigen/ffigen_imgproc.yaml index 7962c3c0..17d4e13d 100644 --- a/ffigen/ffigen_imgproc.yaml +++ b/packages/dartcv/ffigen/ffigen_imgproc.yaml @@ -4,23 +4,23 @@ description: | output: bindings: ../lib/src/g/imgproc.g.dart symbol-file: - output: 'package:opencv_dart/src/g/imgproc.yaml' - import-path: 'package:opencv_dart/src/g/imgproc.g.dart' + output: 'package:dartcv/src/g/imgproc.yaml' + import-path: 'package:dartcv/src/g/imgproc.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/imgproc/imgproc.h - - ../src/imgproc/imgproc_async.h + - ../src/dartcv/imgproc/imgproc.h + - ../src/dartcv/imgproc/imgproc_async.h include-directives: - - ../src/imgproc/imgproc.h - - ../src/imgproc/imgproc_async.h + - ../src/dartcv/imgproc/imgproc.h + - ../src/dartcv/imgproc/imgproc_async.h functions: symbol-address: diff --git a/ffigen/ffigen_objdetect.yaml b/packages/dartcv/ffigen/ffigen_objdetect.yaml similarity index 65% rename from ffigen/ffigen_objdetect.yaml rename to packages/dartcv/ffigen/ffigen_objdetect.yaml index beeaea20..30fa5fd0 100644 --- a/ffigen/ffigen_objdetect.yaml +++ b/packages/dartcv/ffigen/ffigen_objdetect.yaml @@ -4,23 +4,23 @@ description: | output: bindings: ../lib/src/g/objdetect.g.dart symbol-file: - output: 'package:opencv_dart/src/g/objdetect.yaml' - import-path: 'package:opencv_dart/src/g/objdetect.g.dart' + output: 'package:dartcv/src/g/objdetect.yaml' + import-path: 'package:dartcv/src/g/objdetect.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/objdetect/objdetect.h - - ../src/objdetect/objdetect_async.h + - ../src/dartcv/objdetect/objdetect.h + - ../src/dartcv/objdetect/objdetect_async.h include-directives: - - ../src/objdetect/objdetect.h - - ../src/objdetect/objdetect_async.h + - ../src/dartcv/objdetect/objdetect.h + - ../src/dartcv/objdetect/objdetect_async.h functions: symbol-address: diff --git a/ffigen/ffigen_photo.yaml b/packages/dartcv/ffigen/ffigen_photo.yaml similarity index 67% rename from ffigen/ffigen_photo.yaml rename to packages/dartcv/ffigen/ffigen_photo.yaml index 988b79bc..c6f9573d 100644 --- a/ffigen/ffigen_photo.yaml +++ b/packages/dartcv/ffigen/ffigen_photo.yaml @@ -4,23 +4,23 @@ description: | output: bindings: ../lib/src/g/photo.g.dart symbol-file: - output: 'package:opencv_dart/src/g/photo.yaml' - import-path: 'package:opencv_dart/src/g/photo.g.dart' + output: 'package:dartcv/src/g/photo.yaml' + import-path: 'package:dartcv/src/g/photo.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/photo/photo.h - - ../src/photo/photo_async.h + - ../src/dartcv/photo/photo.h + - ../src/dartcv/photo/photo_async.h include-directives: - - ../src/photo/photo.h - - ../src/photo/photo_async.h + - ../src/dartcv/photo/photo.h + - ../src/dartcv/photo/photo_async.h functions: symbol-address: diff --git a/ffigen/ffigen_stitching.yaml b/packages/dartcv/ffigen/ffigen_stitching.yaml similarity index 65% rename from ffigen/ffigen_stitching.yaml rename to packages/dartcv/ffigen/ffigen_stitching.yaml index 8d4cd91a..6002c1a3 100644 --- a/ffigen/ffigen_stitching.yaml +++ b/packages/dartcv/ffigen/ffigen_stitching.yaml @@ -4,23 +4,23 @@ description: | output: bindings: ../lib/src/g/stitching.g.dart symbol-file: - output: 'package:opencv_dart/src/g/stitching.yaml' - import-path: 'package:opencv_dart/src/g/stitching.g.dart' + output: 'package:dartcv/src/g/stitching.yaml' + import-path: 'package:dartcv/src/g/stitching.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/stitching/stitching.h - - ../src/stitching/stitching_async.h + - ../src/dartcv/stitching/stitching.h + - ../src/dartcv/stitching/stitching_async.h include-directives: - - ../src/stitching/stitching.h - - ../src/stitching/stitching_async.h + - ../src/dartcv/stitching/stitching.h + - ../src/dartcv/stitching/stitching_async.h functions: symbol-address: diff --git a/ffigen/ffigen_types.yaml b/packages/dartcv/ffigen/ffigen_types.yaml similarity index 82% rename from ffigen/ffigen_types.yaml rename to packages/dartcv/ffigen/ffigen_types.yaml index 6493e84a..ed8bba0f 100644 --- a/ffigen/ffigen_types.yaml +++ b/packages/dartcv/ffigen/ffigen_types.yaml @@ -4,18 +4,18 @@ description: | output: bindings: ../lib/src/g/types.g.dart symbol-file: - output: 'package:opencv_dart/src/g/types.yaml' - import-path: 'package:opencv_dart/src/g/types.g.dart' + output: 'package:dartcv/src/g/types.yaml' + import-path: 'package:dartcv/src/g/types.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. -compiler-opts: "-Isrc" +# assetId: 'package:dartcv/dartcv.dart' # Optional. +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/core/types.h + - ../src/dartcv/core/types.h include-directives: - - ../src/core/types.h + - ../src/dartcv/core/types.h functions: symbol-address: diff --git a/packages/dartcv/ffigen/ffigen_video.yaml b/packages/dartcv/ffigen/ffigen_video.yaml new file mode 100644 index 00000000..137656a4 --- /dev/null +++ b/packages/dartcv/ffigen/ffigen_video.yaml @@ -0,0 +1,41 @@ +name: CvNativeVideo +description: | + Native bindings for OpenCV - Video +output: + bindings: ../lib/src/g/video.g.dart + symbol-file: + output: 'package:dartcv/src/g/video.yaml' + import-path: 'package:dartcv/src/g/video.g.dart' +# ffi-native: +# assetId: 'package:dartcv/dartcv.dart' # Optional. +import: + symbol-files: + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" +sort: true +include-unused-typedefs: true +headers: + entry-points: + - ../src/dartcv/video/video.h + - ../src/dartcv/video/video_async.h + include-directives: + - ../src/dartcv/video/video.h + - ../src/dartcv/video/video_async.h + +functions: + symbol-address: + include: + - ".*_Close.*" + +preamble: | + // coverage:ignore-file + // opencv_dart - OpenCV bindings for Dart language + // some c wrappers were from gocv: https://github.com/hybridgroup/gocv + // License: Apache-2.0 https://github.com/hybridgroup/gocv/blob/release/LICENSE.txt + // Author: Rainyl + // License: Apache-2.0 + // Date: 2024/01/28 + +comments: + style: doxygen # Options - doxygen(default) / any. + length: full # Options - brief / full(default). diff --git a/ffigen/ffigen_video_io.yaml b/packages/dartcv/ffigen/ffigen_videoio.yaml similarity index 57% rename from ffigen/ffigen_video_io.yaml rename to packages/dartcv/ffigen/ffigen_videoio.yaml index 23dff762..8a72ee44 100644 --- a/ffigen/ffigen_video_io.yaml +++ b/packages/dartcv/ffigen/ffigen_videoio.yaml @@ -2,29 +2,25 @@ name: CvNativeVideoIO description: | Native bindings for OpenCV - VideoIO output: - bindings: ../lib/src/g/video_io.g.dart + bindings: ../lib/src/g/videoio.g.dart symbol-file: - output: 'package:opencv_dart/src/g/video_io.yaml' - import-path: 'package:opencv_dart/src/g/video_io.g.dart' + output: 'package:dartcv/src/g/videoio.yaml' + import-path: 'package:dartcv/src/g/videoio.g.dart' # ffi-native: -# assetId: 'package:opencv_dart/opencv_dart.dart' # Optional. +# assetId: 'package:dartcv/dartcv.dart' # Optional. import: symbol-files: - - 'package:opencv_dart/src/g/types.yaml' -compiler-opts: "-Isrc" + - 'package:dartcv/src/g/types.yaml' +compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/video/video.h - - ../src/video/video_async.h - - ../src/video/videoio.h - - ../src/video/videoio_async.h + - ../src/dartcv/videoio/videoio.h + - ../src/dartcv/videoio/videoio_async.h include-directives: - - ../src/video/video.h - - ../src/video/video_async.h - - ../src/video/videoio.h - - ../src/video/videoio_async.h + - ../src/dartcv/videoio/videoio.h + - ../src/dartcv/videoio/videoio_async.h functions: symbol-address: diff --git a/lib/calib3d.dart b/packages/dartcv/lib/calib3d.dart similarity index 92% rename from lib/calib3d.dart rename to packages/dartcv/lib/calib3d.dart index de36c6d8..a741b7bf 100644 --- a/lib/calib3d.dart +++ b/packages/dartcv/lib/calib3d.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.calib3d; +library dartcv.calib3d; export 'src/calib3d/calib3d.dart'; export 'src/calib3d/calib3d_async.dart'; diff --git a/lib/contrib.dart b/packages/dartcv/lib/contrib.dart similarity index 95% rename from lib/contrib.dart rename to packages/dartcv/lib/contrib.dart index cc3b131a..dd2fc249 100644 --- a/lib/contrib.dart +++ b/packages/dartcv/lib/contrib.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.contrib; +library dartcv.contrib; export 'src/contrib/aruco.dart'; export 'src/contrib/aruco_async.dart'; diff --git a/lib/core.dart b/packages/dartcv/lib/core.dart similarity index 97% rename from lib/core.dart rename to packages/dartcv/lib/core.dart index 85cd0b85..a9c4523f 100644 --- a/lib/core.dart +++ b/packages/dartcv/lib/core.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.core; +library dartcv.core; export 'src/core/base.dart'; export 'src/core/contours.dart'; diff --git a/lib/opencv_dart.dart b/packages/dartcv/lib/dartcv.dart similarity index 74% rename from lib/opencv_dart.dart rename to packages/dartcv/lib/dartcv.dart index e528de09..3706e9c1 100644 --- a/lib/opencv_dart.dart +++ b/packages/dartcv/lib/dartcv.dart @@ -2,7 +2,10 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv; +/// OpenCV bindings for Dart. +/// +/// dartcv is for pure dart only, for flutter, use [opencv_dart](https://pub.dev/packages/opencv_dart) +library dartcv; export 'calib3d.dart'; export 'contrib.dart'; @@ -18,3 +21,4 @@ export 'photo.dart'; export "src/g/constants.g.dart"; export 'stitching.dart'; export 'video.dart'; +export 'videoio.dart'; diff --git a/lib/dnn.dart b/packages/dartcv/lib/dnn.dart similarity index 93% rename from lib/dnn.dart rename to packages/dartcv/lib/dnn.dart index d852bb7e..f6a4f896 100644 --- a/lib/dnn.dart +++ b/packages/dartcv/lib/dnn.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.dnn; +library dartcv.dnn; export 'src/dnn/asyncarray.dart'; export 'src/dnn/dnn.dart'; diff --git a/lib/features2d.dart b/packages/dartcv/lib/features2d.dart similarity index 90% rename from lib/features2d.dart rename to packages/dartcv/lib/features2d.dart index def4aa2e..71f414fb 100644 --- a/lib/features2d.dart +++ b/packages/dartcv/lib/features2d.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.features2d; +library dartcv.features2d; export 'src/features2d/features2d.dart'; export 'src/features2d/features2d_async.dart'; diff --git a/lib/gapi.dart b/packages/dartcv/lib/gapi.dart similarity index 93% rename from lib/gapi.dart rename to packages/dartcv/lib/gapi.dart index ae7c640d..6cd1a9b8 100644 --- a/lib/gapi.dart +++ b/packages/dartcv/lib/gapi.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.gapi; +library dartcv.gapi; export 'src/gapi/gapi.dart'; export 'src/gapi/gcomputation.dart'; diff --git a/lib/highgui.dart b/packages/dartcv/lib/highgui.dart similarity index 89% rename from lib/highgui.dart rename to packages/dartcv/lib/highgui.dart index 65b1e1b5..81611fca 100644 --- a/lib/highgui.dart +++ b/packages/dartcv/lib/highgui.dart @@ -2,6 +2,6 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.highgui; +library dartcv.highgui; export 'src/highgui/highgui.dart'; diff --git a/lib/imgcodecs.dart b/packages/dartcv/lib/imgcodecs.dart similarity index 91% rename from lib/imgcodecs.dart rename to packages/dartcv/lib/imgcodecs.dart index 8c3b3bfb..89c0b631 100644 --- a/lib/imgcodecs.dart +++ b/packages/dartcv/lib/imgcodecs.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.imgcodecs; +library dartcv.imgcodecs; export 'src/imgcodecs/imgcodecs.dart'; export 'src/imgcodecs/imgcodecs_async.dart'; diff --git a/lib/imgproc.dart b/packages/dartcv/lib/imgproc.dart similarity index 94% rename from lib/imgproc.dart rename to packages/dartcv/lib/imgproc.dart index 61785343..16e30311 100644 --- a/lib/imgproc.dart +++ b/packages/dartcv/lib/imgproc.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.imgproc; +library dartcv.imgproc; export 'src/imgproc/clahe.dart'; export 'src/imgproc/clahe_async.dart'; diff --git a/lib/objdetect.dart b/packages/dartcv/lib/objdetect.dart similarity index 91% rename from lib/objdetect.dart rename to packages/dartcv/lib/objdetect.dart index cfa10275..71a8562a 100644 --- a/lib/objdetect.dart +++ b/packages/dartcv/lib/objdetect.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.objdetect; +library dartcv.objdetect; export 'src/objdetect/objdetect.dart'; export 'src/objdetect/objdetect_async.dart'; diff --git a/lib/photo.dart b/packages/dartcv/lib/photo.dart similarity index 91% rename from lib/photo.dart rename to packages/dartcv/lib/photo.dart index 862c5c33..38b472c7 100644 --- a/lib/photo.dart +++ b/packages/dartcv/lib/photo.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.photo; +library dartcv.photo; export 'src/photo/photo.dart'; export 'src/photo/photo_async.dart'; diff --git a/lib/src/calib3d/calib3d.dart b/packages/dartcv/lib/src/calib3d/calib3d.dart similarity index 99% rename from lib/src/calib3d/calib3d.dart rename to packages/dartcv/lib/src/calib3d/calib3d.dart index 76d7899c..cee17595 100644 --- a/lib/src/calib3d/calib3d.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d.dart @@ -62,7 +62,7 @@ import '../native_lib.dart' show ccalib3d; (int, int) newImgSize = (0, 0), bool centerPrincipalPoint = false, }) { - final validPixROI = calloc(); + final validPixROI = calloc(); final matPtr = calloc(); cvRun( () => ccalib3d.GetOptimalNewCameraMatrixWithParams( diff --git a/lib/src/calib3d/calib3d_async.dart b/packages/dartcv/lib/src/calib3d/calib3d_async.dart similarity index 100% rename from lib/src/calib3d/calib3d_async.dart rename to packages/dartcv/lib/src/calib3d/calib3d_async.dart diff --git a/lib/src/calib3d/fisheye.dart b/packages/dartcv/lib/src/calib3d/fisheye.dart similarity index 100% rename from lib/src/calib3d/fisheye.dart rename to packages/dartcv/lib/src/calib3d/fisheye.dart diff --git a/lib/src/contrib/aruco.dart b/packages/dartcv/lib/src/contrib/aruco.dart similarity index 100% rename from lib/src/contrib/aruco.dart rename to packages/dartcv/lib/src/contrib/aruco.dart diff --git a/lib/src/contrib/aruco_async.dart b/packages/dartcv/lib/src/contrib/aruco_async.dart similarity index 100% rename from lib/src/contrib/aruco_async.dart rename to packages/dartcv/lib/src/contrib/aruco_async.dart diff --git a/lib/src/contrib/aruco_dict.dart b/packages/dartcv/lib/src/contrib/aruco_dict.dart similarity index 100% rename from lib/src/contrib/aruco_dict.dart rename to packages/dartcv/lib/src/contrib/aruco_dict.dart diff --git a/lib/src/contrib/img_hash.dart b/packages/dartcv/lib/src/contrib/img_hash.dart similarity index 99% rename from lib/src/contrib/img_hash.dart rename to packages/dartcv/lib/src/contrib/img_hash.dart index deb9b086..88182ea9 100644 --- a/lib/src/contrib/img_hash.dart +++ b/packages/dartcv/lib/src/contrib/img_hash.dart @@ -169,7 +169,7 @@ class BlockMeanHash extends CvStruct implements ImgHashBase { List getMean() { return using>((arena) { final ret = arena>(); - final length = arena(); + final length = arena(); cvRun(() => ccontrib.BlockMeanHash_GetMean(ref, ret, length)); if (length.value == 0) return List.empty(); return List.generate(length.value, (i) => ret.value[i]); diff --git a/lib/src/contrib/quality.dart b/packages/dartcv/lib/src/contrib/quality.dart similarity index 100% rename from lib/src/contrib/quality.dart rename to packages/dartcv/lib/src/contrib/quality.dart diff --git a/lib/src/contrib/wechat_qrcode.dart b/packages/dartcv/lib/src/contrib/wechat_qrcode.dart similarity index 100% rename from lib/src/contrib/wechat_qrcode.dart rename to packages/dartcv/lib/src/contrib/wechat_qrcode.dart diff --git a/lib/src/contrib/wechat_qrcode_async.dart b/packages/dartcv/lib/src/contrib/wechat_qrcode_async.dart similarity index 100% rename from lib/src/contrib/wechat_qrcode_async.dart rename to packages/dartcv/lib/src/contrib/wechat_qrcode_async.dart diff --git a/lib/src/contrib/ximgproc.dart b/packages/dartcv/lib/src/contrib/ximgproc.dart similarity index 99% rename from lib/src/contrib/ximgproc.dart rename to packages/dartcv/lib/src/contrib/ximgproc.dart index 30138bdd..e01fc677 100644 --- a/lib/src/contrib/ximgproc.dart +++ b/packages/dartcv/lib/src/contrib/ximgproc.dart @@ -738,7 +738,7 @@ class ximgproc_rl { /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#gac3de990089892266fa30189edcb6da3c static Mat dilate(InputArray rlSrc, InputArray rlKernel, {(int, int) anchor = (0, 0)}) { final p = calloc(); - cvRun(() => ccontrib.ximgproc_rl_dilate(rlSrc.ref, p, rlKernel.ref, anchor.asPoint.ref)); + cvRun(() => ccontrib.ximgproc_rl_dilate(rlSrc.ref, p, rlKernel.ref, anchor.toPoint().ref)); return Mat.fromPointer(p); } @@ -748,7 +748,7 @@ class ximgproc_rl { static Future dilateAsync(InputArray rlSrc, InputArray rlKernel, {(int, int) anchor = (0, 0)}) async => cvRunAsync( (callback) => - ccontrib.ximgproc_rl_dilate_Async(rlSrc.ref, rlKernel.ref, anchor.asPoint.ref, callback), + ccontrib.ximgproc_rl_dilate_Async(rlSrc.ref, rlKernel.ref, anchor.toPoint().ref, callback), matCompleter, ); @@ -762,7 +762,7 @@ class ximgproc_rl { (int, int) anchor = (0, 0), }) { final p = calloc(); - cvRun(() => ccontrib.ximgproc_rl_erode(rlSrc.ref, p, rlKernel.ref, bBoundaryOn, anchor.asPoint.ref)); + cvRun(() => ccontrib.ximgproc_rl_erode(rlSrc.ref, p, rlKernel.ref, bBoundaryOn, anchor.toPoint().ref)); return Mat.fromPointer(p); } @@ -780,7 +780,7 @@ class ximgproc_rl { rlSrc.ref, rlKernel.ref, bBoundaryOn, - anchor.asPoint.ref, + anchor.toPoint().ref, callback, ), matCompleter, @@ -842,7 +842,7 @@ class ximgproc_rl { op, rlKernel.ref, bBoundaryOnForErosion, - anchor.asPoint.ref, + anchor.toPoint().ref, ), ); return Mat.fromPointer(p); @@ -864,7 +864,7 @@ class ximgproc_rl { op, rlKernel.ref, bBoundaryOnForErosion, - anchor.asPoint.ref, + anchor.toPoint().ref, callback, ), matCompleter, diff --git a/lib/src/contrib/xobjdetect.dart b/packages/dartcv/lib/src/contrib/xobjdetect.dart similarity index 100% rename from lib/src/contrib/xobjdetect.dart rename to packages/dartcv/lib/src/contrib/xobjdetect.dart diff --git a/lib/src/core/base.dart b/packages/dartcv/lib/src/core/base.dart similarity index 100% rename from lib/src/core/base.dart rename to packages/dartcv/lib/src/core/base.dart diff --git a/lib/src/core/contours.dart b/packages/dartcv/lib/src/core/contours.dart similarity index 100% rename from lib/src/core/contours.dart rename to packages/dartcv/lib/src/core/contours.dart diff --git a/lib/src/core/core.dart b/packages/dartcv/lib/src/core/core.dart similarity index 99% rename from lib/src/core/core.dart rename to packages/dartcv/lib/src/core/core.dart index 0005ef32..4a1a560a 100644 --- a/lib/src/core/core.dart +++ b/packages/dartcv/lib/src/core/core.dart @@ -272,7 +272,7 @@ int borderInterpolate(int p, int len, int borderType) { double maxVal = CV_F64_MAX, }) { return cvRunArena<(bool, Point)>((arena) { - final pos = calloc(); + final pos = calloc(); final rval = arena(); cvRun(() => ccore.Mat_CheckRange(a.ref, quiet, pos, minVal, maxVal, rval)); return (rval.value, Point.fromPointer(pos)); @@ -821,8 +821,8 @@ Mat min(InputArray src1, InputArray src2, {OutputArray? dst}) { return using<(double, double, Point, Point)>((arena) { final minValP = arena(); final maxValP = arena(); - final minLocP = calloc(); - final maxLocP = calloc(); + final minLocP = calloc(); + final maxLocP = calloc(); cvRun(() => ccore.Mat_MinMaxLoc(src.ref, minValP, maxValP, minLocP, maxLocP)); return (minValP.value, maxValP.value, Point.fromPointer(minLocP), Point.fromPointer(maxLocP)); }); diff --git a/lib/src/core/core_async.dart b/packages/dartcv/lib/src/core/core_async.dart similarity index 99% rename from lib/src/core/core_async.dart rename to packages/dartcv/lib/src/core/core_async.dart index 92a39831..1470df8b 100644 --- a/lib/src/core/core_async.dart +++ b/packages/dartcv/lib/src/core/core_async.dart @@ -203,7 +203,7 @@ Future<(bool, Point)> checkRangeAsync( (completer, p, p1) { final rval = p.cast().value; calloc.free(p); - completer.complete((rval, Point.fromPointer(p1.cast()))); + completer.complete((rval, Point.fromPointer(p1.cast()))); }); /// Compare performs the per-element comparison of two arrays diff --git a/lib/src/core/cv_vec.dart b/packages/dartcv/lib/src/core/cv_vec.dart similarity index 100% rename from lib/src/core/cv_vec.dart rename to packages/dartcv/lib/src/core/cv_vec.dart diff --git a/lib/src/core/dmatch.dart b/packages/dartcv/lib/src/core/dmatch.dart similarity index 100% rename from lib/src/core/dmatch.dart rename to packages/dartcv/lib/src/core/dmatch.dart diff --git a/lib/src/core/error_code.dart b/packages/dartcv/lib/src/core/error_code.dart similarity index 100% rename from lib/src/core/error_code.dart rename to packages/dartcv/lib/src/core/error_code.dart diff --git a/lib/src/core/exception.dart b/packages/dartcv/lib/src/core/exception.dart similarity index 100% rename from lib/src/core/exception.dart rename to packages/dartcv/lib/src/core/exception.dart diff --git a/lib/src/core/float16.dart b/packages/dartcv/lib/src/core/float16.dart similarity index 100% rename from lib/src/core/float16.dart rename to packages/dartcv/lib/src/core/float16.dart diff --git a/lib/src/core/keypoint.dart b/packages/dartcv/lib/src/core/keypoint.dart similarity index 100% rename from lib/src/core/keypoint.dart rename to packages/dartcv/lib/src/core/keypoint.dart diff --git a/lib/src/core/mat.dart b/packages/dartcv/lib/src/core/mat.dart similarity index 99% rename from lib/src/core/mat.dart rename to packages/dartcv/lib/src/core/mat.dart index c64b06db..633db710 100644 --- a/lib/src/core/mat.dart +++ b/packages/dartcv/lib/src/core/mat.dart @@ -1051,8 +1051,8 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a40b5b3371a9c2a4b2b8ce0c8068d7c96 (Size wholeSize, Point ofs) locateROI() { - final pWholeSize = calloc(); - final pOfs = calloc(); + final pWholeSize = calloc(); + final pOfs = calloc(); cvRun(() => ccore.Mat_LocateROI(ref, pWholeSize, pOfs)); return (Size.fromPointer(pWholeSize), Point.fromPointer(pOfs)); } diff --git a/lib/src/core/mat_async.dart b/packages/dartcv/lib/src/core/mat_async.dart similarity index 100% rename from lib/src/core/mat_async.dart rename to packages/dartcv/lib/src/core/mat_async.dart diff --git a/lib/src/core/mat_type.dart b/packages/dartcv/lib/src/core/mat_type.dart similarity index 100% rename from lib/src/core/mat_type.dart rename to packages/dartcv/lib/src/core/mat_type.dart diff --git a/lib/src/core/moments.dart b/packages/dartcv/lib/src/core/moments.dart similarity index 100% rename from lib/src/core/moments.dart rename to packages/dartcv/lib/src/core/moments.dart diff --git a/lib/src/core/point.dart b/packages/dartcv/lib/src/core/point.dart similarity index 93% rename from lib/src/core/point.dart rename to packages/dartcv/lib/src/core/point.dart index 3b358d90..44991443 100644 --- a/lib/src/core/point.dart +++ b/packages/dartcv/lib/src/core/point.dart @@ -13,19 +13,19 @@ import 'base.dart'; import 'mat.dart'; import 'vec.dart'; -class Point extends CvStruct { - Point.fromPointer(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { +class Point extends CvStruct { + Point.fromPointer(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { if (attach) { finalizer.attach(this, ptr.cast(), detach: this); } } factory Point(int x, int y) { - final ptr = calloc() + final ptr = calloc() ..ref.x = x ..ref.y = y; return Point.fromPointer(ptr); } - factory Point.fromNative(cvg.Point p) => Point(p.x, p.y); + factory Point.fromNative(cvg.CvPoint p) => Point(p.x, p.y); static final finalizer = ffi.NativeFinalizer(calloc.nativeFree); @@ -41,26 +41,26 @@ class Point extends CvStruct { set y(int value) => ref.y = value; @override - cvg.Point get ref => ptr.ref; + cvg.CvPoint get ref => ptr.ref; @override String toString() => 'Point($x, $y)'; @override List get props => [x, y]; } -class Point2f extends CvStruct { - Point2f.fromPointer(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { +class Point2f extends CvStruct { + Point2f.fromPointer(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { if (attach) { finalizer.attach(this, ptr.cast(), detach: this); } } factory Point2f(double x, double y) { - final ptr = calloc() + final ptr = calloc() ..ref.x = x ..ref.y = y; return Point2f.fromPointer(ptr); } - factory Point2f.fromNative(cvg.Point2f p) => Point2f(p.x, p.y); + factory Point2f.fromNative(cvg.CvPoint2f p) => Point2f(p.x, p.y); static final finalizer = ffi.NativeFinalizer(calloc.nativeFree); @@ -76,27 +76,27 @@ class Point2f extends CvStruct { set y(double value) => ref.y = value; @override - cvg.Point2f get ref => ptr.ref; + cvg.CvPoint2f get ref => ptr.ref; @override String toString() => 'Point2f(${x.toStringAsFixed(3)}, ${y.toStringAsFixed(3)})'; @override List get props => [x, y]; } -class Point3f extends CvStruct { - Point3f.fromPointer(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { +class Point3f extends CvStruct { + Point3f.fromPointer(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { if (attach) { finalizer.attach(this, ptr.cast(), detach: this); } } factory Point3f(double x, double y, double z) { - final ptr = calloc() + final ptr = calloc() ..ref.x = x ..ref.y = y ..ref.z = z; return Point3f.fromPointer(ptr); } - factory Point3f.fromNative(cvg.Point3f p) => Point3f(p.x, p.y, p.z); + factory Point3f.fromNative(cvg.CvPoint3f p) => Point3f(p.x, p.y, p.z); static final finalizer = ffi.NativeFinalizer(calloc.nativeFree); @@ -115,27 +115,27 @@ class Point3f extends CvStruct { set z(double value) => ref.z = value; @override - cvg.Point3f get ref => ptr.ref; + cvg.CvPoint3f get ref => ptr.ref; @override String toString() => 'Point3f(${x.toStringAsFixed(3)}, ${y.toStringAsFixed(3)}, ${z.toStringAsFixed(3)})'; @override List get props => [x, y, z]; } -class Point3i extends CvStruct { - Point3i.fromPointer(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { +class Point3i extends CvStruct { + Point3i.fromPointer(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { if (attach) { finalizer.attach(this, ptr.cast(), detach: this); } } factory Point3i(int x, int y, int z) { - final ptr = calloc() + final ptr = calloc() ..ref.x = x ..ref.y = y ..ref.z = z; return Point3i.fromPointer(ptr); } - factory Point3i.fromNative(cvg.Point3i p) => Point3i(p.x, p.y, p.z); + factory Point3i.fromNative(cvg.CvPoint3i p) => Point3i(p.x, p.y, p.z); static final finalizer = ffi.NativeFinalizer(calloc.nativeFree); @@ -154,7 +154,7 @@ class Point3i extends CvStruct { set z(int value) => ref.z = value; @override - cvg.Point3i get ref => ptr.ref; + cvg.CvPoint3i get ref => ptr.ref; @override String toString() => 'Point3i($x, $y, $z)'; @override @@ -175,7 +175,7 @@ class VecPoint extends Vec { factory VecPoint.generate(int length, Point Function(int i) generator, {bool dispose = true}) { final pp = calloc()..ref.length = length; - pp.ref.ptr = calloc(length); + pp.ref.ptr = calloc(length); for (var i = 0; i < length; i++) { final v = generator(i); pp.ref.ptr[i] = v.ref; @@ -255,7 +255,7 @@ class VecPoint2f extends Vec { factory VecPoint2f.generate(int length, Point2f Function(int i) generator, {bool dispose = true}) { final pp = calloc()..ref.length = length; - pp.ref.ptr = calloc(length); + pp.ref.ptr = calloc(length); for (var i = 0; i < length; i++) { final v = generator(i); pp.ref.ptr[i] = v.ref; @@ -335,7 +335,7 @@ class VecPoint3f extends Vec { factory VecPoint3f.generate(int length, Point3f Function(int i) generator, {bool dispose = true}) { final pp = calloc()..ref.length = length; - pp.ref.ptr = calloc(length); + pp.ref.ptr = calloc(length); for (var i = 0; i < length; i++) { final v = generator(i); pp.ref.ptr[i] = v.ref; @@ -416,7 +416,7 @@ class VecPoint3i extends Vec { factory VecPoint3i.generate(int length, Point3i Function(int i) generator, {bool dispose = true}) { final pp = calloc()..ref.length = length; - pp.ref.ptr = calloc(length); + pp.ref.ptr = calloc(length); for (var i = 0; i < length; i++) { final v = generator(i); pp.ref.ptr[i] = v.ref; diff --git a/lib/src/core/rect.dart b/packages/dartcv/lib/src/core/rect.dart similarity index 86% rename from lib/src/core/rect.dart rename to packages/dartcv/lib/src/core/rect.dart index 2ba0a106..0ca07f1e 100644 --- a/lib/src/core/rect.dart +++ b/packages/dartcv/lib/src/core/rect.dart @@ -14,22 +14,22 @@ import 'point.dart'; import 'size.dart'; import 'vec.dart'; -class Rect extends CvStruct { - Rect._(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { +class Rect extends CvStruct { + Rect._(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { if (attach) { finalizer.attach(this, ptr.cast(), detach: this); } } factory Rect(int x, int y, int width, int height) { - final ptr = calloc() + final ptr = calloc() ..ref.x = x ..ref.y = y ..ref.width = width ..ref.height = height; return Rect._(ptr); } - factory Rect.fromNative(cvg.Rect p) => Rect(p.x, p.y, p.width, p.height); - factory Rect.fromPointer(ffi.Pointer ptr, [bool attach = true]) => Rect._(ptr, attach); + factory Rect.fromNative(cvg.CvRect p) => Rect(p.x, p.y, p.width, p.height); + factory Rect.fromPointer(ffi.Pointer ptr, [bool attach = true]) => Rect._(ptr, attach); static final finalizer = ffi.NativeFinalizer(calloc.nativeFree); @@ -54,29 +54,29 @@ class Rect extends CvStruct { int get bottom => y + height; @override - cvg.Rect get ref => ptr.ref; + cvg.CvRect get ref => ptr.ref; @override String toString() => "Rect($x, $y, $width, $height)"; @override List get props => [x, y, width, height]; } -class Rect2f extends CvStruct { - Rect2f._(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { +class Rect2f extends CvStruct { + Rect2f._(ffi.Pointer ptr, [bool attach = true]) : super.fromPointer(ptr) { if (attach) { finalizer.attach(this, ptr.cast(), detach: this); } } factory Rect2f(double x, double y, double width, double height) { - final ptr = calloc() + final ptr = calloc() ..ref.x = x ..ref.y = y ..ref.width = width ..ref.height = height; return Rect2f._(ptr); } - factory Rect2f.fromNative(cvg.Rect2f p) => Rect2f(p.x, p.y, p.width, p.height); - factory Rect2f.fromPointer(ffi.Pointer ptr, [bool attach = true]) => Rect2f._(ptr, attach); + factory Rect2f.fromNative(cvg.CvRect2f p) => Rect2f(p.x, p.y, p.width, p.height); + factory Rect2f.fromPointer(ffi.Pointer ptr, [bool attach = true]) => Rect2f._(ptr, attach); static final finalizer = ffi.NativeFinalizer(calloc.nativeFree); @@ -101,7 +101,7 @@ class Rect2f extends CvStruct { double get bottom => y + height; @override - cvg.Rect2f get ref => ptr.ref; + cvg.CvRect2f get ref => ptr.ref; @override String toString() => "Rect2f(${x.toStringAsFixed(3)}, ${y.toStringAsFixed(3)}, ${width.toStringAsFixed(3)}, ${height.toStringAsFixed(3)})"; @@ -116,7 +116,7 @@ class RotatedRect extends CvStruct { } } factory RotatedRect(Point2f center, (double, double) size, double angle) { - final sz = calloc() + final sz = calloc() ..ref.width = size.$1 ..ref.height = size.$2; final ptr = calloc() @@ -146,13 +146,13 @@ class RotatedRect extends CvStruct { } Rect get boundingRect { - final rect = calloc(); + final rect = calloc(); cvRun(() => ccore.RotatedRect_BoundingRect(ptr.ref, rect)); return Rect.fromPointer(rect); } Rect2f get boundingRect2f { - final rect = calloc(); + final rect = calloc(); cvRun(() => ccore.RotatedRect_BoundingRect2f(ptr.ref, rect)); return Rect2f.fromPointer(rect); } @@ -189,7 +189,7 @@ class VecRect extends Vec { factory VecRect.generate(int length, Rect Function(int i) generator, {bool dispose = true}) { final pp = calloc()..ref.length = length; - pp.ref.ptr = calloc(length); + pp.ref.ptr = calloc(length); for (var i = 0; i < length; i++) { final v = generator(i); pp.ref.ptr[i] = v.ref; @@ -256,7 +256,7 @@ extension ListRectExtension on List { // Completers for async void rectCompleter(Completer completer, VoidPtr p) => - completer.complete(Rect.fromPointer(p.cast())); + completer.complete(Rect.fromPointer(p.cast())); void rotatedRectCompleter(Completer completer, VoidPtr p) => completer.complete(RotatedRect.fromPointer(p.cast())); diff --git a/lib/src/core/rng.dart b/packages/dartcv/lib/src/core/rng.dart similarity index 100% rename from lib/src/core/rng.dart rename to packages/dartcv/lib/src/core/rng.dart diff --git a/lib/src/core/rng_async.dart b/packages/dartcv/lib/src/core/rng_async.dart similarity index 100% rename from lib/src/core/rng_async.dart rename to packages/dartcv/lib/src/core/rng_async.dart diff --git a/lib/src/core/scalar.dart b/packages/dartcv/lib/src/core/scalar.dart similarity index 100% rename from lib/src/core/scalar.dart rename to packages/dartcv/lib/src/core/scalar.dart diff --git a/lib/src/core/size.dart b/packages/dartcv/lib/src/core/size.dart similarity index 83% rename from lib/src/core/size.dart rename to packages/dartcv/lib/src/core/size.dart index bbe86ac3..c3d2d85a 100644 --- a/lib/src/core/size.dart +++ b/packages/dartcv/lib/src/core/size.dart @@ -5,12 +5,11 @@ import 'dart:ffi' as ffi; import 'package:ffi/ffi.dart'; -import 'package:opencv_dart/opencv_dart.dart'; import '../g/types.g.dart' as cvg; import 'base.dart'; -class Size extends CvStruct { +class Size extends CvStruct { Size.fromPointer(super.ptr, [bool attach = true]) : super.fromPointer() { if (attach) { finalizer.attach(this, ptr.cast(), detach: this); @@ -18,16 +17,16 @@ class Size extends CvStruct { } factory Size(int width, int height) { - final p = calloc() + final p = calloc() ..ref.height = height ..ref.width = width; return Size.fromPointer(p); } - factory Size.fromNative(cvg.Size sz) => Size(sz.width, sz.height); + factory Size.fromNative(cvg.CvSize sz) => Size(sz.width, sz.height); factory Size.fromRecord((int, int) record) { - final p = calloc() + final p = calloc() ..ref.height = record.$2 ..ref.width = record.$1; return Size.fromPointer(p); @@ -50,7 +49,7 @@ class Size extends CvStruct { List get props => [width, height]; @override - cvg.Size get ref => ptr.ref; + cvg.CvSize get ref => ptr.ref; @override String toString() { @@ -58,7 +57,7 @@ class Size extends CvStruct { } } -class Size2f extends CvStruct { +class Size2f extends CvStruct { Size2f.fromPointer(super.ptr, [bool attach = true]) : super.fromPointer() { if (attach) { finalizer.attach(this, ptr.cast(), detach: this); @@ -66,23 +65,23 @@ class Size2f extends CvStruct { } factory Size2f(double width, double height) { - final p = calloc() + final p = calloc() ..ref.height = height ..ref.width = width; return Size2f.fromPointer(p); } - factory Size2f.fromNative(cvg.Size2f sz) => Size2f(sz.width, sz.height); + factory Size2f.fromNative(cvg.CvSize2f sz) => Size2f(sz.width, sz.height); factory Size2f.fromRecord((double, double) record) { - final p = calloc() + final p = calloc() ..ref.height = record.$2 ..ref.width = record.$1; return Size2f.fromPointer(p); } factory Size2f.fromSize(Size size) { - final p = calloc() + final p = calloc() ..ref.height = size.height.toDouble() ..ref.width = size.width.toDouble(); return Size2f.fromPointer(p); @@ -105,7 +104,7 @@ class Size2f extends CvStruct { List get props => [width, height]; @override - cvg.Size2f get ref => ptr.ref; + cvg.CvSize2f get ref => ptr.ref; @override String toString() { diff --git a/lib/src/core/svd.dart b/packages/dartcv/lib/src/core/svd.dart similarity index 100% rename from lib/src/core/svd.dart rename to packages/dartcv/lib/src/core/svd.dart diff --git a/lib/src/core/termcriteria.dart b/packages/dartcv/lib/src/core/termcriteria.dart similarity index 100% rename from lib/src/core/termcriteria.dart rename to packages/dartcv/lib/src/core/termcriteria.dart diff --git a/lib/src/core/vec.dart b/packages/dartcv/lib/src/core/vec.dart similarity index 100% rename from lib/src/core/vec.dart rename to packages/dartcv/lib/src/core/vec.dart diff --git a/lib/src/dnn/asyncarray.dart b/packages/dartcv/lib/src/dnn/asyncarray.dart similarity index 100% rename from lib/src/dnn/asyncarray.dart rename to packages/dartcv/lib/src/dnn/asyncarray.dart diff --git a/lib/src/dnn/dnn.dart b/packages/dartcv/lib/src/dnn/dnn.dart similarity index 100% rename from lib/src/dnn/dnn.dart rename to packages/dartcv/lib/src/dnn/dnn.dart diff --git a/lib/src/dnn/dnn_async.dart b/packages/dartcv/lib/src/dnn/dnn_async.dart similarity index 100% rename from lib/src/dnn/dnn_async.dart rename to packages/dartcv/lib/src/dnn/dnn_async.dart diff --git a/lib/src/features2d/features2d.dart b/packages/dartcv/lib/src/features2d/features2d.dart similarity index 100% rename from lib/src/features2d/features2d.dart rename to packages/dartcv/lib/src/features2d/features2d.dart diff --git a/lib/src/features2d/features2d_async.dart b/packages/dartcv/lib/src/features2d/features2d_async.dart similarity index 100% rename from lib/src/features2d/features2d_async.dart rename to packages/dartcv/lib/src/features2d/features2d_async.dart diff --git a/lib/src/g/calib3d.g.dart b/packages/dartcv/lib/src/g/calib3d.g.dart similarity index 88% rename from lib/src/g/calib3d.g.dart rename to packages/dartcv/lib/src/g/calib3d.g.dart index 62e82b2c..ff54cbbe 100644 --- a/lib/src/g/calib3d.g.dart +++ b/packages/dartcv/lib/src/g/calib3d.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Calib3d /// @@ -33,7 +33,7 @@ class CvNativeCalib3d { ffi.Pointer CalibrateCamera( VecVecPoint3f objectPoints, VecVecPoint2f imagePoints, - Size imageSize, + CvSize imageSize, Mat cameraMatrix, Mat distCoeffs, Mat rvecs, @@ -61,7 +61,7 @@ class CvNativeCalib3d { ffi.Pointer Function( VecVecPoint3f, VecVecPoint2f, - Size, + CvSize, Mat, Mat, Mat, @@ -70,12 +70,12 @@ class CvNativeCalib3d { TermCriteria, ffi.Pointer)>>('CalibrateCamera'); late final _CalibrateCamera = _CalibrateCameraPtr.asFunction< - ffi.Pointer Function(VecVecPoint3f, VecVecPoint2f, Size, Mat, + ffi.Pointer Function(VecVecPoint3f, VecVecPoint2f, CvSize, Mat, Mat, Mat, Mat, int, TermCriteria, ffi.Pointer)>(); ffi.Pointer DrawChessboardCorners( Mat image, - Size patternSize, + CvSize patternSize, Mat corners, bool patternWasFound, ) { @@ -90,9 +90,9 @@ class CvNativeCalib3d { late final _DrawChessboardCornersPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Size, Mat, ffi.Bool)>>('DrawChessboardCorners'); + Mat, CvSize, Mat, ffi.Bool)>>('DrawChessboardCorners'); late final _DrawChessboardCorners = _DrawChessboardCornersPtr.asFunction< - ffi.Pointer Function(Mat, Size, Mat, bool)>(); + ffi.Pointer Function(Mat, CvSize, Mat, bool)>(); ffi.Pointer EstimateAffine2D( VecPoint2f from, @@ -218,7 +218,7 @@ class CvNativeCalib3d { ffi.Pointer FindChessboardCorners( Mat image, - Size patternSize, + CvSize patternSize, Mat corners, int flags, ffi.Pointer rval, @@ -234,15 +234,15 @@ class CvNativeCalib3d { late final _FindChessboardCornersPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, Mat, ffi.Int, + ffi.Pointer Function(Mat, CvSize, Mat, ffi.Int, ffi.Pointer)>>('FindChessboardCorners'); late final _FindChessboardCorners = _FindChessboardCornersPtr.asFunction< ffi.Pointer Function( - Mat, Size, Mat, int, ffi.Pointer)>(); + Mat, CvSize, Mat, int, ffi.Pointer)>(); ffi.Pointer FindChessboardCornersSB( Mat image, - Size patternSize, + CvSize patternSize, Mat corners, int flags, ffi.Pointer rval, @@ -258,15 +258,15 @@ class CvNativeCalib3d { late final _FindChessboardCornersSBPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, Mat, ffi.Int, + ffi.Pointer Function(Mat, CvSize, Mat, ffi.Int, ffi.Pointer)>>('FindChessboardCornersSB'); late final _FindChessboardCornersSB = _FindChessboardCornersSBPtr.asFunction< ffi.Pointer Function( - Mat, Size, Mat, int, ffi.Pointer)>(); + Mat, CvSize, Mat, int, ffi.Pointer)>(); ffi.Pointer FindChessboardCornersSBWithMeta( Mat image, - Size patternSize, + CvSize patternSize, Mat corners, int flags, Mat meta, @@ -284,12 +284,12 @@ class CvNativeCalib3d { late final _FindChessboardCornersSBWithMetaPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, Mat, ffi.Int, Mat, + ffi.Pointer Function(Mat, CvSize, Mat, ffi.Int, Mat, ffi.Pointer)>>('FindChessboardCornersSBWithMeta'); late final _FindChessboardCornersSBWithMeta = _FindChessboardCornersSBWithMetaPtr.asFunction< ffi.Pointer Function( - Mat, Size, Mat, int, Mat, ffi.Pointer)>(); + Mat, CvSize, Mat, int, Mat, ffi.Pointer)>(); ffi.Pointer FindHomography( Mat src, @@ -352,11 +352,11 @@ class CvNativeCalib3d { ffi.Pointer Fisheye_EstimateNewCameraMatrixForUndistortRectify( Mat k, Mat d, - Size imgSize, + CvSize imgSize, Mat r, Mat p, double balance, - Size newSize, + CvSize newSize, double fovScale, ) { return _Fisheye_EstimateNewCameraMatrixForUndistortRectify( @@ -374,12 +374,12 @@ class CvNativeCalib3d { late final _Fisheye_EstimateNewCameraMatrixForUndistortRectifyPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Size, Mat, Mat, ffi.Double, Size, ffi.Double)>>( + Mat, Mat, CvSize, Mat, Mat, ffi.Double, CvSize, ffi.Double)>>( 'Fisheye_EstimateNewCameraMatrixForUndistortRectify'); late final _Fisheye_EstimateNewCameraMatrixForUndistortRectify = _Fisheye_EstimateNewCameraMatrixForUndistortRectifyPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Size, Mat, Mat, double, Size, double)>(); + Mat, Mat, CvSize, Mat, Mat, double, CvSize, double)>(); ffi.Pointer Fisheye_UndistortImage( Mat distorted, @@ -408,7 +408,7 @@ class CvNativeCalib3d { Mat k, Mat d, Mat knew, - Size size, + CvSize size, ) { return _Fisheye_UndistortImageWithParams( distorted, @@ -423,11 +423,11 @@ class CvNativeCalib3d { late final _Fisheye_UndistortImageWithParamsPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, ffi.Pointer, Mat, Mat, Mat, - Size)>>('Fisheye_UndistortImageWithParams'); + CvSize)>>('Fisheye_UndistortImageWithParams'); late final _Fisheye_UndistortImageWithParams = _Fisheye_UndistortImageWithParamsPtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, Mat, Mat, Mat, Size)>(); + Mat, ffi.Pointer, Mat, Mat, Mat, CvSize)>(); ffi.Pointer Fisheye_UndistortPoints( Mat distorted, @@ -457,10 +457,10 @@ class CvNativeCalib3d { ffi.Pointer GetOptimalNewCameraMatrixWithParams( Mat cameraMatrix, Mat distCoeffs, - Size size, + CvSize size, double alpha, - Size newImgSize, - ffi.Pointer validPixROI, + CvSize newImgSize, + ffi.Pointer validPixROI, bool centerPrincipalPoint, ffi.Pointer rval, ) { @@ -481,23 +481,23 @@ class CvNativeCalib3d { ffi.Pointer Function( Mat, Mat, - Size, + CvSize, ffi.Double, - Size, - ffi.Pointer, + CvSize, + ffi.Pointer, ffi.Bool, ffi.Pointer)>>('GetOptimalNewCameraMatrixWithParams'); late final _GetOptimalNewCameraMatrixWithParams = _GetOptimalNewCameraMatrixWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Size, double, Size, - ffi.Pointer, bool, ffi.Pointer)>(); + ffi.Pointer Function(Mat, Mat, CvSize, double, CvSize, + ffi.Pointer, bool, ffi.Pointer)>(); ffi.Pointer InitUndistortRectifyMap( Mat cameraMatrix, Mat distCoeffs, Mat r, Mat newCameraMatrix, - Size size, + CvSize size, int m1type, ffi.Pointer map1, ffi.Pointer map2, @@ -516,11 +516,11 @@ class CvNativeCalib3d { late final _InitUndistortRectifyMapPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, Size, ffi.Int, + ffi.Pointer Function(Mat, Mat, Mat, Mat, CvSize, ffi.Int, ffi.Pointer, ffi.Pointer)>>('InitUndistortRectifyMap'); late final _InitUndistortRectifyMap = _InitUndistortRectifyMapPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, Size, int, ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer Function(Mat, Mat, Mat, Mat, CvSize, int, + ffi.Pointer, ffi.Pointer)>(); ffi.Pointer Undistort( Mat src, @@ -576,7 +576,7 @@ class CvNativeCalib3d { ffi.Pointer calibrateCamera_Async( VecVecPoint3f objectPoints, VecVecPoint2f imagePoints, - Size imageSize, + CvSize imageSize, Mat cameraMatrix, Mat distCoeffs, int flag, @@ -600,19 +600,19 @@ class CvNativeCalib3d { ffi.Pointer Function( VecVecPoint3f, VecVecPoint2f, - Size, + CvSize, Mat, Mat, ffi.Int, TermCriteria, imp1.CvCallback_3)>>('calibrateCamera_Async'); late final _calibrateCamera_Async = _calibrateCamera_AsyncPtr.asFunction< - ffi.Pointer Function(VecVecPoint3f, VecVecPoint2f, Size, Mat, + ffi.Pointer Function(VecVecPoint3f, VecVecPoint2f, CvSize, Mat, Mat, int, TermCriteria, imp1.CvCallback_3)>(); ffi.Pointer drawChessboardCorners_Async( Mat image, - Size patternSize, + CvSize patternSize, bool patternWasFound, imp1.CvCallback_0 callback, ) { @@ -626,11 +626,12 @@ class CvNativeCalib3d { late final _drawChessboardCorners_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, ffi.Bool, + ffi.Pointer Function(Mat, CvSize, ffi.Bool, imp1.CvCallback_0)>>('drawChessboardCorners_Async'); late final _drawChessboardCorners_Async = _drawChessboardCorners_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Size, bool, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, CvSize, bool, imp1.CvCallback_0)>(); ffi.Pointer estimateAffine2DWithParams_Async( VecPoint2f from, @@ -751,7 +752,7 @@ class CvNativeCalib3d { ffi.Pointer findChessboardCornersSBWithMeta_Async( Mat image, - Size patternSize, + CvSize patternSize, int flags, imp1.CvCallback_3 callback, ) { @@ -765,15 +766,16 @@ class CvNativeCalib3d { late final _findChessboardCornersSBWithMeta_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, ffi.Int, + ffi.Pointer Function(Mat, CvSize, ffi.Int, imp1.CvCallback_3)>>('findChessboardCornersSBWithMeta_Async'); late final _findChessboardCornersSBWithMeta_Async = _findChessboardCornersSBWithMeta_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Size, int, imp1.CvCallback_3)>(); + ffi.Pointer Function( + Mat, CvSize, int, imp1.CvCallback_3)>(); ffi.Pointer findChessboardCornersSB_Async( Mat image, - Size patternSize, + CvSize patternSize, int flags, imp1.CvCallback_2 callback, ) { @@ -787,15 +789,16 @@ class CvNativeCalib3d { late final _findChessboardCornersSB_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, ffi.Int, + ffi.Pointer Function(Mat, CvSize, ffi.Int, imp1.CvCallback_2)>>('findChessboardCornersSB_Async'); late final _findChessboardCornersSB_Async = _findChessboardCornersSB_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Size, int, imp1.CvCallback_2)>(); + ffi.Pointer Function( + Mat, CvSize, int, imp1.CvCallback_2)>(); ffi.Pointer findChessboardCorners_Async( Mat image, - Size patternSize, + CvSize patternSize, int flags, imp1.CvCallback_2 callback, ) { @@ -809,20 +812,21 @@ class CvNativeCalib3d { late final _findChessboardCorners_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, ffi.Int, + ffi.Pointer Function(Mat, CvSize, ffi.Int, imp1.CvCallback_2)>>('findChessboardCorners_Async'); late final _findChessboardCorners_Async = _findChessboardCorners_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Size, int, imp1.CvCallback_2)>(); + ffi.Pointer Function( + Mat, CvSize, int, imp1.CvCallback_2)>(); ffi.Pointer fisheye_estimateNewCameraMatrixForUndistortRectify_Async( Mat k, Mat d, - Size imgSize, + CvSize imgSize, Mat r, double balance, - Size newSize, + CvSize newSize, double fovScale, imp1.CvCallback_1 p, ) { @@ -841,20 +845,20 @@ class CvNativeCalib3d { late final _fisheye_estimateNewCameraMatrixForUndistortRectify_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Size, Mat, - ffi.Double, Size, ffi.Double, imp1.CvCallback_1)>>( + ffi.Pointer Function(Mat, Mat, CvSize, Mat, + ffi.Double, CvSize, ffi.Double, imp1.CvCallback_1)>>( 'fisheye_estimateNewCameraMatrixForUndistortRectify_Async'); late final _fisheye_estimateNewCameraMatrixForUndistortRectify_Async = _fisheye_estimateNewCameraMatrixForUndistortRectify_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Size, Mat, double, Size, double, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, CvSize, Mat, double, CvSize, + double, imp1.CvCallback_1)>(); ffi.Pointer fisheye_undistortImageWithParams_Async( Mat distorted, Mat k, Mat d, Mat knew, - Size size, + CvSize size, imp1.CvCallback_1 callback, ) { return _fisheye_undistortImageWithParams_Async( @@ -869,12 +873,12 @@ class CvNativeCalib3d { late final _fisheye_undistortImageWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, Size, + ffi.Pointer Function(Mat, Mat, Mat, Mat, CvSize, imp1.CvCallback_1)>>('fisheye_undistortImageWithParams_Async'); late final _fisheye_undistortImageWithParams_Async = _fisheye_undistortImageWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, Mat, Size, imp1.CvCallback_1)>(); + Mat, Mat, Mat, Mat, CvSize, imp1.CvCallback_1)>(); ffi.Pointer fisheye_undistortImage_Async( Mat distorted, @@ -928,9 +932,9 @@ class CvNativeCalib3d { ffi.Pointer getOptimalNewCameraMatrix_Async( Mat cameraMatrix, Mat distCoeffs, - Size size, + CvSize size, double alpha, - Size newImgSize, + CvSize newImgSize, bool centerPrincipalPoint, imp1.CvCallback_2 callback, ) { @@ -947,19 +951,19 @@ class CvNativeCalib3d { late final _getOptimalNewCameraMatrix_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Size, ffi.Double, Size, + ffi.Pointer Function(Mat, Mat, CvSize, ffi.Double, CvSize, ffi.Bool, imp1.CvCallback_2)>>('getOptimalNewCameraMatrix_Async'); late final _getOptimalNewCameraMatrix_Async = _getOptimalNewCameraMatrix_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Size, double, Size, bool, imp1.CvCallback_2)>(); + Mat, Mat, CvSize, double, CvSize, bool, imp1.CvCallback_2)>(); ffi.Pointer initUndistortRectifyMap_Async( Mat cameraMatrix, Mat distCoeffs, Mat r, Mat newCameraMatrix, - Size size, + CvSize size, int m1type, imp1.CvCallback_2 callback, ) { @@ -976,12 +980,12 @@ class CvNativeCalib3d { late final _initUndistortRectifyMap_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, Size, ffi.Int, + ffi.Pointer Function(Mat, Mat, Mat, Mat, CvSize, ffi.Int, imp1.CvCallback_2)>>('initUndistortRectifyMap_Async'); late final _initUndistortRectifyMap_Async = _initUndistortRectifyMap_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, Mat, Size, int, imp1.CvCallback_2)>(); + Mat, Mat, Mat, Mat, CvSize, int, imp1.CvCallback_2)>(); ffi.Pointer undistortPoints_Async( Mat distorted, @@ -1035,10 +1039,10 @@ class CvNativeCalib3d { ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_1)>(); } +typedef CvRect = imp1.CvRect; +typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; typedef Mat = imp1.Mat; -typedef Rect = imp1.Rect; -typedef Size = imp1.Size; typedef TermCriteria = imp1.TermCriteria; typedef VecPoint2f = imp1.VecPoint2f; typedef VecVecPoint2f = imp1.VecVecPoint2f; diff --git a/lib/src/g/calib3d.yaml b/packages/dartcv/lib/src/g/calib3d.yaml similarity index 96% rename from lib/src/g/calib3d.yaml rename to packages/dartcv/lib/src/g/calib3d.yaml index 0d3aee99..6eaa2f2a 100644 --- a/lib/src/g/calib3d.yaml +++ b/packages/dartcv/lib/src/g/calib3d.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/calib3d.g.dart: + package:dartcv/src/g/calib3d.g.dart: used-config: ffi-native: false symbols: @@ -76,14 +76,14 @@ files: name: undistortPoints_Async c:@F@undistort_Async: name: undistort_Async + c:types.h@T@CvRect: + name: CvRect + c:types.h@T@CvSize: + name: CvSize c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat - c:types.h@T@Rect: - name: Rect - c:types.h@T@Size: - name: Size c:types.h@T@TermCriteria: name: TermCriteria c:types.h@T@VecPoint2f: diff --git a/lib/src/g/constants.g.dart b/packages/dartcv/lib/src/g/constants.g.dart similarity index 100% rename from lib/src/g/constants.g.dart rename to packages/dartcv/lib/src/g/constants.g.dart diff --git a/lib/src/g/contrib.g.dart b/packages/dartcv/lib/src/g/contrib.g.dart similarity index 99% rename from lib/src/g/contrib.g.dart rename to packages/dartcv/lib/src/g/contrib.g.dart index c134e2e1..fae26b57 100644 --- a/lib/src/g/contrib.g.dart +++ b/packages/dartcv/lib/src/g/contrib.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Contrib /// @@ -2899,7 +2899,7 @@ class CvNativeContrib { ffi.Pointer BlockMeanHash_GetMean( BlockMeanHash self, ffi.Pointer> rval, - ffi.Pointer length, + ffi.Pointer length, ) { return _BlockMeanHash_GetMean( self, @@ -2913,10 +2913,10 @@ class CvNativeContrib { ffi.Pointer Function( BlockMeanHash, ffi.Pointer>, - ffi.Pointer)>>('BlockMeanHash_GetMean'); + ffi.Pointer)>>('BlockMeanHash_GetMean'); late final _BlockMeanHash_GetMean = _BlockMeanHash_GetMeanPtr.asFunction< ffi.Pointer Function(BlockMeanHash, - ffi.Pointer>, ffi.Pointer)>(); + ffi.Pointer>, ffi.Pointer)>(); ffi.Pointer BlockMeanHash_GetMean_Async( BlockMeanHash self, @@ -5652,7 +5652,7 @@ class CvNativeContrib { ffi.Pointer ximgproc_rl_createRLEImage( VecPoint3i runs, ffi.Pointer res, - Size size, + CvSize size, ) { return _ximgproc_rl_createRLEImage( runs, @@ -5664,14 +5664,15 @@ class CvNativeContrib { late final _ximgproc_rl_createRLEImagePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(VecPoint3i, ffi.Pointer, - Size)>>('ximgproc_rl_createRLEImage'); + CvSize)>>('ximgproc_rl_createRLEImage'); late final _ximgproc_rl_createRLEImage = _ximgproc_rl_createRLEImagePtr.asFunction< - ffi.Pointer Function(VecPoint3i, ffi.Pointer, Size)>(); + ffi.Pointer Function( + VecPoint3i, ffi.Pointer, CvSize)>(); ffi.Pointer ximgproc_rl_createRLEImage_Async( VecPoint3i runs, - Size size, + CvSize size, imp1.CvCallback_1 callback, ) { return _ximgproc_rl_createRLEImage_Async( @@ -5683,18 +5684,18 @@ class CvNativeContrib { late final _ximgproc_rl_createRLEImage_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint3i, Size, + ffi.Pointer Function(VecPoint3i, CvSize, imp1.CvCallback_1)>>('ximgproc_rl_createRLEImage_Async'); late final _ximgproc_rl_createRLEImage_Async = _ximgproc_rl_createRLEImage_AsyncPtr.asFunction< ffi.Pointer Function( - VecPoint3i, Size, imp1.CvCallback_1)>(); + VecPoint3i, CvSize, imp1.CvCallback_1)>(); ffi.Pointer ximgproc_rl_dilate( Mat rlSrc, ffi.Pointer rlDest, Mat rlKernel, - Point anchor, + CvPoint anchor, ) { return _ximgproc_rl_dilate( rlSrc, @@ -5707,14 +5708,14 @@ class CvNativeContrib { late final _ximgproc_rl_dilatePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Pointer, Mat, Point)>>('ximgproc_rl_dilate'); + Mat, ffi.Pointer, Mat, CvPoint)>>('ximgproc_rl_dilate'); late final _ximgproc_rl_dilate = _ximgproc_rl_dilatePtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, Mat, Point)>(); + ffi.Pointer Function(Mat, ffi.Pointer, Mat, CvPoint)>(); ffi.Pointer ximgproc_rl_dilate_Async( Mat rlSrc, Mat rlKernel, - Point anchor, + CvPoint anchor, imp1.CvCallback_1 callback, ) { return _ximgproc_rl_dilate_Async( @@ -5727,18 +5728,19 @@ class CvNativeContrib { late final _ximgproc_rl_dilate_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Point, imp1.CvCallback_1)>>('ximgproc_rl_dilate_Async'); + ffi.Pointer Function(Mat, Mat, CvPoint, + imp1.CvCallback_1)>>('ximgproc_rl_dilate_Async'); late final _ximgproc_rl_dilate_Async = _ximgproc_rl_dilate_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Point, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, Mat, CvPoint, imp1.CvCallback_1)>(); ffi.Pointer ximgproc_rl_erode( Mat rlSrc, ffi.Pointer rlDest, Mat rlKernel, bool bBoundaryOn, - Point anchor, + CvPoint anchor, ) { return _ximgproc_rl_erode( rlSrc, @@ -5752,16 +5754,16 @@ class CvNativeContrib { late final _ximgproc_rl_erodePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, ffi.Pointer, Mat, ffi.Bool, - Point)>>('ximgproc_rl_erode'); + CvPoint)>>('ximgproc_rl_erode'); late final _ximgproc_rl_erode = _ximgproc_rl_erodePtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, Mat, bool, Point)>(); + Mat, ffi.Pointer, Mat, bool, CvPoint)>(); ffi.Pointer ximgproc_rl_erode_Async( Mat rlSrc, Mat rlKernel, bool bBoundaryOn, - Point anchor, + CvPoint anchor, imp1.CvCallback_1 callback, ) { return _ximgproc_rl_erode_Async( @@ -5775,15 +5777,15 @@ class CvNativeContrib { late final _ximgproc_rl_erode_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Bool, Point, + ffi.Pointer Function(Mat, Mat, ffi.Bool, CvPoint, imp1.CvCallback_1)>>('ximgproc_rl_erode_Async'); late final _ximgproc_rl_erode_Async = _ximgproc_rl_erode_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, bool, Point, imp1.CvCallback_1)>(); + Mat, Mat, bool, CvPoint, imp1.CvCallback_1)>(); ffi.Pointer ximgproc_rl_getStructuringElement( int shape, - Size ksize, + CvSize ksize, ffi.Pointer rval, ) { return _ximgproc_rl_getStructuringElement( @@ -5795,15 +5797,15 @@ class CvNativeContrib { late final _ximgproc_rl_getStructuringElementPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, Size, + ffi.Pointer Function(ffi.Int, CvSize, ffi.Pointer)>>('ximgproc_rl_getStructuringElement'); late final _ximgproc_rl_getStructuringElement = _ximgproc_rl_getStructuringElementPtr.asFunction< - ffi.Pointer Function(int, Size, ffi.Pointer)>(); + ffi.Pointer Function(int, CvSize, ffi.Pointer)>(); ffi.Pointer ximgproc_rl_getStructuringElement_Async( int shape, - Size ksize, + CvSize ksize, imp1.CvCallback_1 callback, ) { return _ximgproc_rl_getStructuringElement_Async( @@ -5815,11 +5817,11 @@ class CvNativeContrib { late final _ximgproc_rl_getStructuringElement_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, Size, + ffi.Pointer Function(ffi.Int, CvSize, imp1.CvCallback_1)>>('ximgproc_rl_getStructuringElement_Async'); late final _ximgproc_rl_getStructuringElement_Async = _ximgproc_rl_getStructuringElement_AsyncPtr.asFunction< - ffi.Pointer Function(int, Size, imp1.CvCallback_1)>(); + ffi.Pointer Function(int, CvSize, imp1.CvCallback_1)>(); ffi.Pointer ximgproc_rl_isRLMorphologyPossible( Mat rlStructuringElement, @@ -5863,7 +5865,7 @@ class CvNativeContrib { int op, Mat rlKernel, bool bBoundaryOnForErosion, - Point anchor, + CvPoint anchor, ) { return _ximgproc_rl_morphologyEx( rlSrc, @@ -5878,18 +5880,18 @@ class CvNativeContrib { late final _ximgproc_rl_morphologyExPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, ffi.Pointer, ffi.Int, Mat, - ffi.Bool, Point)>>('ximgproc_rl_morphologyEx'); + ffi.Bool, CvPoint)>>('ximgproc_rl_morphologyEx'); late final _ximgproc_rl_morphologyEx = _ximgproc_rl_morphologyExPtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, int, Mat, bool, Point)>(); + Mat, ffi.Pointer, int, Mat, bool, CvPoint)>(); ffi.Pointer ximgproc_rl_morphologyEx_Async( Mat rlSrc, int op, Mat rlKernel, bool bBoundaryOnForErosion, - Point anchor, + CvPoint anchor, imp1.CvCallback_1 callback, ) { return _ximgproc_rl_morphologyEx_Async( @@ -5904,12 +5906,12 @@ class CvNativeContrib { late final _ximgproc_rl_morphologyEx_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, Mat, ffi.Bool, Point, + ffi.Pointer Function(Mat, ffi.Int, Mat, ffi.Bool, CvPoint, imp1.CvCallback_1)>>('ximgproc_rl_morphologyEx_Async'); late final _ximgproc_rl_morphologyEx_Async = _ximgproc_rl_morphologyEx_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, int, Mat, bool, Point, imp1.CvCallback_1)>(); + Mat, int, Mat, bool, CvPoint, imp1.CvCallback_1)>(); ffi.Pointer ximgproc_rl_paint( Mat image, @@ -6118,6 +6120,8 @@ final class Box extends ffi.Struct { external int y; } +typedef CvPoint = imp1.CvPoint; +typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; final class EdgeBoxes extends ffi.Struct { @@ -6211,7 +6215,6 @@ final class GraphSegmentation extends ffi.Struct { typedef GraphSegmentationPtr = ffi.Pointer; typedef Mat = imp1.Mat; -typedef Point = imp1.Point; final class PtrWBDetector extends ffi.Struct { external ffi.Pointer> ptr; @@ -6255,7 +6258,6 @@ final class RFFeatureGetter extends ffi.Struct { typedef RFFeatureGetterPtr = ffi.Pointer; typedef Scalar = imp1.Scalar; -typedef Size = imp1.Size; final class StructuredEdgeDetection extends ffi.Struct { external ffi.Pointer> ptr; diff --git a/lib/src/g/contrib.yaml b/packages/dartcv/lib/src/g/contrib.yaml similarity index 99% rename from lib/src/g/contrib.yaml rename to packages/dartcv/lib/src/g/contrib.yaml index 5ff39617..d81927ab 100644 --- a/lib/src/g/contrib.yaml +++ b/packages/dartcv/lib/src/g/contrib.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/contrib.g.dart: + package:dartcv/src/g/contrib.g.dart: used-config: ffi-native: false symbols: @@ -644,16 +644,16 @@ files: name: QualityPSNRPtr c:quality.h@T@QualitySSIMPtr: name: QualitySSIMPtr + c:types.h@T@CvPoint: + name: CvPoint + c:types.h@T@CvSize: + name: CvSize c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat - c:types.h@T@Point: - name: Point c:types.h@T@Scalar: name: Scalar - c:types.h@T@Size: - name: Size c:types.h@T@VecF32: name: VecF32 c:types.h@T@VecF64: diff --git a/lib/src/g/core.g.dart b/packages/dartcv/lib/src/g/core.g.dart similarity index 99% rename from lib/src/g/core.g.dart rename to packages/dartcv/lib/src/g/core.g.dart index f4f4d1e6..7443d1a0 100644 --- a/lib/src/g/core.g.dart +++ b/packages/dartcv/lib/src/g/core.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Core /// @@ -678,7 +678,7 @@ class CvNativeCore { ffi.Pointer Mat_CheckRange( Mat m, bool quiet, - ffi.Pointer pos, + ffi.Pointer pos, double minVal, double maxVal, ffi.Pointer rval, @@ -698,12 +698,12 @@ class CvNativeCore { ffi.Pointer Function( Mat, ffi.Bool, - ffi.Pointer, + ffi.Pointer, ffi.Double, ffi.Double, ffi.Pointer)>>('Mat_CheckRange'); late final _Mat_CheckRange = _Mat_CheckRangePtr.asFunction< - ffi.Pointer Function(Mat, bool, ffi.Pointer, double, + ffi.Pointer Function(Mat, bool, ffi.Pointer, double, double, ffi.Pointer)>(); ffi.Pointer Mat_Clone( @@ -1359,7 +1359,7 @@ class CvNativeCore { } late final _Mat_ElemSizePtr = - _lookup>('Mat_ElemSize'); + _lookup>('Mat_ElemSize'); late final _Mat_ElemSize = _Mat_ElemSizePtr.asFunction(isLeaf: true); @@ -1372,7 +1372,7 @@ class CvNativeCore { } late final _Mat_ElemSize1Ptr = - _lookup>('Mat_ElemSize1'); + _lookup>('Mat_ElemSize1'); late final _Mat_ElemSize1 = _Mat_ElemSize1Ptr.asFunction(isLeaf: true); @@ -2513,8 +2513,8 @@ class CvNativeCore { ffi.Pointer Mat_LocateROI( Mat m, - ffi.Pointer wholeSize, - ffi.Pointer ofs, + ffi.Pointer wholeSize, + ffi.Pointer ofs, ) { return _Mat_LocateROI( m, @@ -2525,11 +2525,11 @@ class CvNativeCore { late final _Mat_LocateROIPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, ffi.Pointer)>>('Mat_LocateROI'); + ffi.Pointer Function(Mat, ffi.Pointer, + ffi.Pointer)>>('Mat_LocateROI'); late final _Mat_LocateROI = _Mat_LocateROIPtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, ffi.Pointer)>(); + Mat, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer Mat_Log( Mat src, @@ -2732,8 +2732,8 @@ class CvNativeCore { Mat m, ffi.Pointer minVal, ffi.Pointer maxVal, - ffi.Pointer minLoc, - ffi.Pointer maxLoc, + ffi.Pointer minLoc, + ffi.Pointer maxLoc, ) { return _Mat_MinMaxLoc( m, @@ -2750,11 +2750,15 @@ class CvNativeCore { Mat, ffi.Pointer, ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('Mat_MinMaxLoc'); + ffi.Pointer, + ffi.Pointer)>>('Mat_MinMaxLoc'); late final _Mat_MinMaxLoc = _Mat_MinMaxLocPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, - ffi.Pointer, ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer Function( + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); ffi.Pointer Mat_MixChannels( VecMat src, @@ -3303,7 +3307,7 @@ class CvNativeCore { ffi.Pointer Mat_NewWithSizesFromBytes( VecI32 sizes, int type, - VecChar buf, + ffi.Pointer buf, ffi.Pointer rval, ) { return _Mat_NewWithSizesFromBytes( @@ -3316,12 +3320,12 @@ class CvNativeCore { late final _Mat_NewWithSizesFromBytesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecI32, ffi.Int, VecChar, + ffi.Pointer Function(VecI32, ffi.Int, ffi.Pointer, ffi.Pointer)>>('Mat_NewWithSizesFromBytes'); late final _Mat_NewWithSizesFromBytes = _Mat_NewWithSizesFromBytesPtr.asFunction< ffi.Pointer Function( - VecI32, int, VecChar, ffi.Pointer)>(); + VecI32, int, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer Mat_NewWithSizesFromBytes_Async( VecI32 sizes, @@ -3716,7 +3720,7 @@ class CvNativeCore { ffi.Pointer Mat_Region( Mat m, - Rect r, + CvRect r, ffi.Pointer rval, ) { return _Mat_Region( @@ -3729,13 +3733,13 @@ class CvNativeCore { late final _Mat_RegionPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Rect, ffi.Pointer)>>('Mat_Region'); + Mat, CvRect, ffi.Pointer)>>('Mat_Region'); late final _Mat_Region = _Mat_RegionPtr.asFunction< - ffi.Pointer Function(Mat, Rect, ffi.Pointer)>(); + ffi.Pointer Function(Mat, CvRect, ffi.Pointer)>(); ffi.Pointer Mat_Region_Async( Mat self, - Rect r, + CvRect r, imp1.CvCallback_1 callback, ) { return _Mat_Region_Async( @@ -3748,9 +3752,9 @@ class CvNativeCore { late final _Mat_Region_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Rect, imp1.CvCallback_1)>>('Mat_Region_Async'); + Mat, CvRect, imp1.CvCallback_1)>>('Mat_Region_Async'); late final _Mat_Region_Async = _Mat_Region_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Rect, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, CvRect, imp1.CvCallback_1)>(); ffi.Pointer Mat_Release( ffi.Pointer m, @@ -5127,7 +5131,7 @@ class CvNativeCore { } late final _Mat_TotalPtr = - _lookup>('Mat_Total'); + _lookup>('Mat_Total'); late final _Mat_Total = _Mat_TotalPtr.asFunction(isLeaf: true); @@ -5900,7 +5904,7 @@ class CvNativeCore { ffi.Pointer RotatedRect_BoundingRect( RotatedRect rect, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _RotatedRect_BoundingRect( rect, @@ -5911,14 +5915,14 @@ class CvNativeCore { late final _RotatedRect_BoundingRectPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - RotatedRect, ffi.Pointer)>>('RotatedRect_BoundingRect'); + RotatedRect, ffi.Pointer)>>('RotatedRect_BoundingRect'); late final _RotatedRect_BoundingRect = _RotatedRect_BoundingRectPtr.asFunction< - ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); + ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); ffi.Pointer RotatedRect_BoundingRect2f( RotatedRect rect, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _RotatedRect_BoundingRect2f( rect, @@ -5928,11 +5932,11 @@ class CvNativeCore { late final _RotatedRect_BoundingRect2fPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - RotatedRect, ffi.Pointer)>>('RotatedRect_BoundingRect2f'); + ffi.Pointer Function(RotatedRect, + ffi.Pointer)>>('RotatedRect_BoundingRect2f'); late final _RotatedRect_BoundingRect2f = _RotatedRect_BoundingRect2fPtr.asFunction< - ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); + ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); ffi.Pointer RotatedRect_Points( RotatedRect rect, @@ -8293,6 +8297,10 @@ class _SymbolAddresses { get Rng_Close => _library._Rng_ClosePtr; } +typedef CvPoint = imp1.CvPoint; +typedef CvRect = imp1.CvRect; +typedef CvRect2f = imp1.CvRect2f; +typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; typedef ErrorCallback = ffi.Pointer>; typedef ErrorCallbackFunction = ffi.Void Function( @@ -8311,13 +8319,9 @@ typedef DartErrorCallbackFunction = void Function( ffi.Pointer userdata); typedef Mat = imp1.Mat; typedef MatStep = imp1.MatStep; -typedef Point = imp1.Point; typedef RNG = imp1.RNG; -typedef Rect = imp1.Rect; -typedef Rect2f = imp1.Rect2f; typedef RotatedRect = imp1.RotatedRect; typedef Scalar = imp1.Scalar; -typedef Size = imp1.Size; typedef TermCriteria = imp1.TermCriteria; typedef Vec2b = imp1.Vec2b; typedef Vec2d = imp1.Vec2d; diff --git a/lib/src/g/core.yaml b/packages/dartcv/lib/src/g/core.yaml similarity index 99% rename from lib/src/g/core.yaml rename to packages/dartcv/lib/src/g/core.yaml index b68930ef..cd4ea791 100644 --- a/lib/src/g/core.yaml +++ b/packages/dartcv/lib/src/g/core.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/core.g.dart: + package:dartcv/src/g/core.g.dart: used-config: ffi-native: false symbols: @@ -850,26 +850,26 @@ files: name: float_t c:exception.h@T@ErrorCallback: name: ErrorCallback + c:types.h@T@CvPoint: + name: CvPoint + c:types.h@T@CvRect: + name: CvRect + c:types.h@T@CvRect2f: + name: CvRect2f + c:types.h@T@CvSize: + name: CvSize c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat c:types.h@T@MatStep: name: MatStep - c:types.h@T@Point: - name: Point c:types.h@T@RNG: name: RNG - c:types.h@T@Rect: - name: Rect - c:types.h@T@Rect2f: - name: Rect2f c:types.h@T@RotatedRect: name: RotatedRect c:types.h@T@Scalar: name: Scalar - c:types.h@T@Size: - name: Size c:types.h@T@TermCriteria: name: TermCriteria c:types.h@T@Vec2b: diff --git a/lib/src/g/dnn.g.dart b/packages/dartcv/lib/src/g/dnn.g.dart similarity index 98% rename from lib/src/g/dnn.g.dart rename to packages/dartcv/lib/src/g/dnn.g.dart index d98662fa..0b17a040 100644 --- a/lib/src/g/dnn.g.dart +++ b/packages/dartcv/lib/src/g/dnn.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Dnn /// @@ -371,7 +371,7 @@ class CvNativeDnn { Mat image, Mat blob, double scalefactor, - Size size, + CvSize size, Scalar mean, bool swapRB, bool crop, @@ -391,16 +391,16 @@ class CvNativeDnn { late final _Net_BlobFromImagePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, Size, Scalar, + ffi.Pointer Function(Mat, Mat, ffi.Double, CvSize, Scalar, ffi.Bool, ffi.Bool, ffi.Int)>>('Net_BlobFromImage'); late final _Net_BlobFromImage = _Net_BlobFromImagePtr.asFunction< ffi.Pointer Function( - Mat, Mat, double, Size, Scalar, bool, bool, int)>(); + Mat, Mat, double, CvSize, Scalar, bool, bool, int)>(); ffi.Pointer Net_BlobFromImage_Async( Mat image, double scalefactor, - Size size, + CvSize size, Scalar mean, bool swapRB, bool crop, @@ -424,7 +424,7 @@ class CvNativeDnn { ffi.Pointer Function( Mat, ffi.Double, - Size, + CvSize, Scalar, ffi.Bool, ffi.Bool, @@ -432,13 +432,13 @@ class CvNativeDnn { imp1.CvCallback_1)>>('Net_BlobFromImage_Async'); late final _Net_BlobFromImage_Async = _Net_BlobFromImage_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, double, Size, Scalar, bool, bool, int, imp1.CvCallback_1)>(); + Mat, double, CvSize, Scalar, bool, bool, int, imp1.CvCallback_1)>(); ffi.Pointer Net_BlobFromImages( VecMat images, Mat blob, double scalefactor, - Size size, + CvSize size, Scalar mean, bool swapRB, bool crop, @@ -458,16 +458,16 @@ class CvNativeDnn { late final _Net_BlobFromImagesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecMat, Mat, ffi.Double, Size, Scalar, - ffi.Bool, ffi.Bool, ffi.Int)>>('Net_BlobFromImages'); + ffi.Pointer Function(VecMat, Mat, ffi.Double, CvSize, + Scalar, ffi.Bool, ffi.Bool, ffi.Int)>>('Net_BlobFromImages'); late final _Net_BlobFromImages = _Net_BlobFromImagesPtr.asFunction< ffi.Pointer Function( - VecMat, Mat, double, Size, Scalar, bool, bool, int)>(); + VecMat, Mat, double, CvSize, Scalar, bool, bool, int)>(); ffi.Pointer Net_BlobFromImages_Async( VecMat images, double scalefactor, - Size size, + CvSize size, Scalar mean, bool swapRB, bool crop, @@ -491,7 +491,7 @@ class CvNativeDnn { ffi.Pointer Function( VecMat, ffi.Double, - Size, + CvSize, Scalar, ffi.Bool, ffi.Bool, @@ -499,7 +499,7 @@ class CvNativeDnn { imp1.CvCallback_1)>>('Net_BlobFromImages_Async'); late final _Net_BlobFromImages_Async = _Net_BlobFromImages_AsyncPtr.asFunction< - ffi.Pointer Function(VecMat, double, Size, Scalar, bool, + ffi.Pointer Function(VecMat, double, CvSize, Scalar, bool, bool, int, imp1.CvCallback_1)>(); void Net_Close( @@ -1644,6 +1644,7 @@ final class AsyncArray extends ffi.Struct { } typedef AsyncArrayPtr = ffi.Pointer; +typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; final class Layer extends ffi.Struct { @@ -1659,7 +1660,6 @@ final class Net extends ffi.Struct { typedef NetPtr = ffi.Pointer; typedef Scalar = imp1.Scalar; -typedef Size = imp1.Size; typedef VecF32 = imp1.VecF32; typedef VecI32 = imp1.VecI32; typedef VecMat = imp1.VecMat; diff --git a/lib/src/g/dnn.yaml b/packages/dartcv/lib/src/g/dnn.yaml similarity index 98% rename from lib/src/g/dnn.yaml rename to packages/dartcv/lib/src/g/dnn.yaml index 22470818..63f25858 100644 --- a/lib/src/g/dnn.yaml +++ b/packages/dartcv/lib/src/g/dnn.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/dnn.g.dart: + package:dartcv/src/g/dnn.g.dart: used-config: ffi-native: false symbols: @@ -170,20 +170,20 @@ files: name: Layer c:@S@Net: name: Net - c:asyncarray.h@T@AsyncArrayPtr: + c:dnn.h@T@AsyncArrayPtr: name: AsyncArrayPtr c:dnn.h@T@LayerPtr: name: LayerPtr c:dnn.h@T@NetPtr: name: NetPtr + c:types.h@T@CvSize: + name: CvSize c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat c:types.h@T@Scalar: name: Scalar - c:types.h@T@Size: - name: Size c:types.h@T@VecF32: name: VecF32 c:types.h@T@VecI32: diff --git a/lib/src/g/features2d.g.dart b/packages/dartcv/lib/src/g/features2d.g.dart similarity index 99% rename from lib/src/g/features2d.g.dart rename to packages/dartcv/lib/src/g/features2d.g.dart index 99c43496..9e5b9765 100644 --- a/lib/src/g/features2d.g.dart +++ b/packages/dartcv/lib/src/g/features2d.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - features2d /// diff --git a/lib/src/g/features2d.yaml b/packages/dartcv/lib/src/g/features2d.yaml similarity index 99% rename from lib/src/g/features2d.yaml rename to packages/dartcv/lib/src/g/features2d.yaml index c888730f..ce206ced 100644 --- a/lib/src/g/features2d.yaml +++ b/packages/dartcv/lib/src/g/features2d.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/features2d.g.dart: + package:dartcv/src/g/features2d.g.dart: used-config: ffi-native: false symbols: diff --git a/lib/src/g/gapi.g.dart b/packages/dartcv/lib/src/g/gapi.g.dart similarity index 95% rename from lib/src/g/gapi.g.dart rename to packages/dartcv/lib/src/g/gapi.g.dart index 5b6b315f..5be595ff 100644 --- a/lib/src/g/gapi.g.dart +++ b/packages/dartcv/lib/src/g/gapi.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Gapi /// @@ -203,7 +203,7 @@ class CvNativeGapi { ffi.Pointer Function(VecVec4i, ffi.Pointer)>(); ffi.Pointer Prim_from_Circle( - Point center, + CvPoint center, Scalar color, int lt, int radius, @@ -224,16 +224,16 @@ class CvNativeGapi { late final _Prim_from_CirclePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Point, Scalar, ffi.Int, ffi.Int, + ffi.Pointer Function(CvPoint, Scalar, ffi.Int, ffi.Int, ffi.Int, ffi.Int, ffi.Pointer)>>('Prim_from_Circle'); late final _Prim_from_Circle = _Prim_from_CirclePtr.asFunction< ffi.Pointer Function( - Point, Scalar, int, int, int, int, ffi.Pointer)>(); + CvPoint, Scalar, int, int, int, int, ffi.Pointer)>(); ffi.Pointer Prim_from_FText( ffi.Pointer text, int text_len, - Point org, + CvPoint org, int fh, Scalar color, ffi.Pointer rval, @@ -250,14 +250,14 @@ class CvNativeGapi { late final _Prim_from_FTextPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, Point, - ffi.Int, Scalar, ffi.Pointer)>>('Prim_from_FText'); + ffi.Pointer Function(ffi.Pointer, ffi.Int, + CvPoint, ffi.Int, Scalar, ffi.Pointer)>>('Prim_from_FText'); late final _Prim_from_FText = _Prim_from_FTextPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, int, Point, int, Scalar, ffi.Pointer)>(); + ffi.Pointer Function(ffi.Pointer, int, CvPoint, int, + Scalar, ffi.Pointer)>(); ffi.Pointer Prim_from_Image( - Point org, + CvPoint org, Mat img, Mat alpha, ffi.Pointer rval, @@ -273,15 +273,15 @@ class CvNativeGapi { late final _Prim_from_ImagePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Point, Mat, Mat, ffi.Pointer)>>('Prim_from_Image'); + CvPoint, Mat, Mat, ffi.Pointer)>>('Prim_from_Image'); late final _Prim_from_Image = _Prim_from_ImagePtr.asFunction< - ffi.Pointer Function(Point, Mat, Mat, ffi.Pointer)>(); + ffi.Pointer Function(CvPoint, Mat, Mat, ffi.Pointer)>(); ffi.Pointer Prim_from_Line( Scalar color, int lt, - Point pt1, - Point pt2, + CvPoint pt1, + CvPoint pt2, int shift, int thick, ffi.Pointer rval, @@ -299,16 +299,16 @@ class CvNativeGapi { late final _Prim_from_LinePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Scalar, ffi.Int, Point, Point, ffi.Int, - ffi.Int, ffi.Pointer)>>('Prim_from_Line'); + ffi.Pointer Function(Scalar, ffi.Int, CvPoint, CvPoint, + ffi.Int, ffi.Int, ffi.Pointer)>>('Prim_from_Line'); late final _Prim_from_Line = _Prim_from_LinePtr.asFunction< ffi.Pointer Function( - Scalar, int, Point, Point, int, int, ffi.Pointer)>(); + Scalar, int, CvPoint, CvPoint, int, int, ffi.Pointer)>(); ffi.Pointer Prim_from_Mosaic( int cellSz, int decim, - Rect mos, + CvRect mos, ffi.Pointer rval, ) { return _Prim_from_Mosaic( @@ -321,10 +321,10 @@ class CvNativeGapi { late final _Prim_from_MosaicPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Int, Rect, ffi.Pointer)>>('Prim_from_Mosaic'); + ffi.Pointer Function(ffi.Int, ffi.Int, CvRect, + ffi.Pointer)>>('Prim_from_Mosaic'); late final _Prim_from_Mosaic = _Prim_from_MosaicPtr.asFunction< - ffi.Pointer Function(int, int, Rect, ffi.Pointer)>(); + ffi.Pointer Function(int, int, CvRect, ffi.Pointer)>(); ffi.Pointer Prim_from_Poly( VecPoint points, @@ -355,7 +355,7 @@ class CvNativeGapi { ffi.Pointer Prim_from_Rect( Scalar color, int lt, - Rect rect, + CvRect rect, int shift, int thick, ffi.Pointer rval, @@ -372,11 +372,11 @@ class CvNativeGapi { late final _Prim_from_RectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Scalar, ffi.Int, Rect, ffi.Int, + ffi.Pointer Function(Scalar, ffi.Int, CvRect, ffi.Int, ffi.Int, ffi.Pointer)>>('Prim_from_Rect'); late final _Prim_from_Rect = _Prim_from_RectPtr.asFunction< ffi.Pointer Function( - Scalar, int, Rect, int, int, ffi.Pointer)>(); + Scalar, int, CvRect, int, int, ffi.Pointer)>(); ffi.Pointer Prim_from_Text( bool bottom_left_origin, @@ -384,7 +384,7 @@ class CvNativeGapi { int ff, double fs, int lt, - Point org, + CvPoint org, ffi.Pointer text, int text_len, int thick, @@ -412,13 +412,13 @@ class CvNativeGapi { ffi.Int, ffi.Double, ffi.Int, - Point, + CvPoint, ffi.Pointer, ffi.Int, ffi.Int, ffi.Pointer)>>('Prim_from_Text'); late final _Prim_from_Text = _Prim_from_TextPtr.asFunction< - ffi.Pointer Function(bool, Scalar, int, double, int, Point, + ffi.Pointer Function(bool, Scalar, int, double, int, CvPoint, ffi.Pointer, int, int, ffi.Pointer)>(); ffi.Pointer VecPrim_Append( @@ -1490,8 +1490,8 @@ class CvNativeGapi { ffi.Pointer gapi_blur( GMat src, - Size ksize, - Point anchor, + CvSize ksize, + CvPoint anchor, int borderType, Scalar borderValue, ffi.Pointer rval, @@ -1508,11 +1508,11 @@ class CvNativeGapi { late final _gapi_blurPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, Size, Point, ffi.Int, Scalar, + ffi.Pointer Function(GMat, CvSize, CvPoint, ffi.Int, Scalar, ffi.Pointer)>>('gapi_blur'); late final _gapi_blur = _gapi_blurPtr.asFunction< ffi.Pointer Function( - GMat, Size, Point, int, Scalar, ffi.Pointer)>(); + GMat, CvSize, CvPoint, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_boundingRect( GArrayPoint2f src, @@ -1570,8 +1570,8 @@ class CvNativeGapi { ffi.Pointer gapi_boxFilter( GMat src, int dtype, - Size ksize, - Point anchor, + CvSize ksize, + CvPoint anchor, bool normalize, int borderType, Scalar borderValue, @@ -1591,11 +1591,11 @@ class CvNativeGapi { late final _gapi_boxFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, ffi.Int, Size, Point, ffi.Bool, - ffi.Int, Scalar, ffi.Pointer)>>('gapi_boxFilter'); + ffi.Pointer Function(GMat, ffi.Int, CvSize, CvPoint, + ffi.Bool, ffi.Int, Scalar, ffi.Pointer)>>('gapi_boxFilter'); late final _gapi_boxFilter = _gapi_boxFilterPtr.asFunction< ffi.Pointer Function( - GMat, int, Size, Point, bool, int, Scalar, ffi.Pointer)>(); + GMat, int, CvSize, CvPoint, bool, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_cartToPolar( GMat x, @@ -1702,7 +1702,7 @@ class CvNativeGapi { ffi.Pointer gapi_crop( GMat src, - Rect rect, + CvRect rect, ffi.Pointer rval, ) { return _gapi_crop( @@ -1715,14 +1715,14 @@ class CvNativeGapi { late final _gapi_cropPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - GMat, Rect, ffi.Pointer)>>('gapi_crop'); + GMat, CvRect, ffi.Pointer)>>('gapi_crop'); late final _gapi_crop = _gapi_cropPtr.asFunction< - ffi.Pointer Function(GMat, Rect, ffi.Pointer)>(); + ffi.Pointer Function(GMat, CvRect, ffi.Pointer)>(); ffi.Pointer gapi_dilate( GMat src, Mat kernel, - Point anchor, + CvPoint anchor, int iterations, int borderType, Scalar borderValue, @@ -1741,11 +1741,11 @@ class CvNativeGapi { late final _gapi_dilatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, Mat, Point, ffi.Int, ffi.Int, + ffi.Pointer Function(GMat, Mat, CvPoint, ffi.Int, ffi.Int, Scalar, ffi.Pointer)>>('gapi_dilate'); late final _gapi_dilate = _gapi_dilatePtr.asFunction< ffi.Pointer Function( - GMat, Mat, Point, int, int, Scalar, ffi.Pointer)>(); + GMat, Mat, CvPoint, int, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_dilate3x3( GMat src, @@ -1846,7 +1846,7 @@ class CvNativeGapi { ffi.Pointer gapi_erode( GMat src, Mat kernel, - Point anchor, + CvPoint anchor, int iterations, int borderType, Scalar borderValue, @@ -1865,11 +1865,11 @@ class CvNativeGapi { late final _gapi_erodePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, Mat, Point, ffi.Int, ffi.Int, + ffi.Pointer Function(GMat, Mat, CvPoint, ffi.Int, ffi.Int, Scalar, ffi.Pointer)>>('gapi_erode'); late final _gapi_erode = _gapi_erodePtr.asFunction< ffi.Pointer Function( - GMat, Mat, Point, int, int, Scalar, ffi.Pointer)>(); + GMat, Mat, CvPoint, int, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_erode3x3( GMat src, @@ -1899,7 +1899,7 @@ class CvNativeGapi { GMat src, int ddepth, Mat kernel, - Point anchor, + CvPoint anchor, Scalar delta, int borderType, Scalar borderValue, @@ -1919,11 +1919,11 @@ class CvNativeGapi { late final _gapi_filter2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, ffi.Int, Mat, Point, Scalar, + ffi.Pointer Function(GMat, ffi.Int, Mat, CvPoint, Scalar, ffi.Int, Scalar, ffi.Pointer)>>('gapi_filter2D'); late final _gapi_filter2D = _gapi_filter2DPtr.asFunction< ffi.Pointer Function( - GMat, int, Mat, Point, Scalar, int, Scalar, ffi.Pointer)>(); + GMat, int, Mat, CvPoint, Scalar, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_findContours( GMat src, @@ -2289,7 +2289,7 @@ class CvNativeGapi { ffi.Pointer gapi_gaussianBlur( GMat src, - Size ksize, + CvSize ksize, double sigmaX, double sigmaY, int borderType, @@ -2309,11 +2309,11 @@ class CvNativeGapi { late final _gapi_gaussianBlurPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, Size, ffi.Double, ffi.Double, + ffi.Pointer Function(GMat, CvSize, ffi.Double, ffi.Double, ffi.Int, Scalar, ffi.Pointer)>>('gapi_gaussianBlur'); late final _gapi_gaussianBlur = _gapi_gaussianBlurPtr.asFunction< ffi.Pointer Function( - GMat, Size, double, double, int, Scalar, ffi.Pointer)>(); + GMat, CvSize, double, double, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_goodFeaturesToTrack( GMat image, @@ -2450,7 +2450,7 @@ class CvNativeGapi { GMat src, int op, Mat kernel, - Point anchor, + CvPoint anchor, int iterations, int borderType, Scalar borderValue, @@ -2470,11 +2470,11 @@ class CvNativeGapi { late final _gapi_morphologyExPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, ffi.Int, Mat, Point, ffi.Int, + ffi.Pointer Function(GMat, ffi.Int, Mat, CvPoint, ffi.Int, ffi.Int, Scalar, ffi.Pointer)>>('gapi_morphologyEx'); late final _gapi_morphologyEx = _gapi_morphologyExPtr.asFunction< ffi.Pointer Function( - GMat, int, Mat, Point, int, int, Scalar, ffi.Pointer)>(); + GMat, int, Mat, CvPoint, int, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_mul( GMat src1, @@ -2661,7 +2661,7 @@ class CvNativeGapi { ffi.Pointer gapi_resize( GMat src, - Size dsize, + CvSize dsize, double fx, double fy, int interpolation, @@ -2679,15 +2679,15 @@ class CvNativeGapi { late final _gapi_resizePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, Size, ffi.Double, ffi.Double, + ffi.Pointer Function(GMat, CvSize, ffi.Double, ffi.Double, ffi.Int, ffi.Pointer)>>('gapi_resize'); late final _gapi_resize = _gapi_resizePtr.asFunction< ffi.Pointer Function( - GMat, Size, double, double, int, ffi.Pointer)>(); + GMat, CvSize, double, double, int, ffi.Pointer)>(); ffi.Pointer gapi_resizeP( GMat src, - Size dsize, + CvSize dsize, int interpolation, ffi.Pointer rval, ) { @@ -2702,16 +2702,16 @@ class CvNativeGapi { late final _gapi_resizePPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - GMat, Size, ffi.Int, ffi.Pointer)>>('gapi_resizeP'); + GMat, CvSize, ffi.Int, ffi.Pointer)>>('gapi_resizeP'); late final _gapi_resizeP = _gapi_resizePPtr.asFunction< - ffi.Pointer Function(GMat, Size, int, ffi.Pointer)>(); + ffi.Pointer Function(GMat, CvSize, int, ffi.Pointer)>(); ffi.Pointer gapi_sepFilter( GMat src, int ddepth, Mat kernelX, Mat kernelY, - Point anchor, + CvPoint anchor, Scalar delta, int borderType, Scalar borderValue, @@ -2732,10 +2732,10 @@ class CvNativeGapi { late final _gapi_sepFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, ffi.Int, Mat, Mat, Point, Scalar, - ffi.Int, Scalar, ffi.Pointer)>>('gapi_sepFilter'); + ffi.Pointer Function(GMat, ffi.Int, Mat, Mat, CvPoint, + Scalar, ffi.Int, Scalar, ffi.Pointer)>>('gapi_sepFilter'); late final _gapi_sepFilter = _gapi_sepFilterPtr.asFunction< - ffi.Pointer Function(GMat, int, Mat, Mat, Point, Scalar, int, + ffi.Pointer Function(GMat, int, Mat, Mat, CvPoint, Scalar, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_split3( @@ -2871,7 +2871,7 @@ class CvNativeGapi { ffi.Pointer gapi_warpAffine( GMat src, Mat M, - Size dsize, + CvSize dsize, int flags, int borderMode, Scalar borderValue, @@ -2890,16 +2890,16 @@ class CvNativeGapi { late final _gapi_warpAffinePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, Mat, Size, ffi.Int, ffi.Int, + ffi.Pointer Function(GMat, Mat, CvSize, ffi.Int, ffi.Int, Scalar, ffi.Pointer)>>('gapi_warpAffine'); late final _gapi_warpAffine = _gapi_warpAffinePtr.asFunction< ffi.Pointer Function( - GMat, Mat, Size, int, int, Scalar, ffi.Pointer)>(); + GMat, Mat, CvSize, int, int, Scalar, ffi.Pointer)>(); ffi.Pointer gapi_warpPerspective( GMat src, Mat M, - Size dsize, + CvSize dsize, int flags, int borderMode, Scalar borderValue, @@ -2918,11 +2918,11 @@ class CvNativeGapi { late final _gapi_warpPerspectivePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GMat, Mat, Size, ffi.Int, ffi.Int, + ffi.Pointer Function(GMat, Mat, CvSize, ffi.Int, ffi.Int, Scalar, ffi.Pointer)>>('gapi_warpPerspective'); late final _gapi_warpPerspective = _gapi_warpPerspectivePtr.asFunction< ffi.Pointer Function( - GMat, Mat, Size, int, int, Scalar, ffi.Pointer)>(); + GMat, Mat, CvSize, int, int, Scalar, ffi.Pointer)>(); late final addresses = _SymbolAddresses(this); } @@ -2940,6 +2940,9 @@ class _SymbolAddresses { get gapi_GScalar_Close => _library._gapi_GScalar_ClosePtr; } +typedef CvPoint = imp1.CvPoint; +typedef CvRect = imp1.CvRect; +typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; final class GArrayGArrayPoint extends ffi.Struct { @@ -3049,7 +3052,6 @@ final class GScalar extends ffi.Struct { typedef GScalarPtr = ffi.Pointer; typedef Mat = imp1.Mat; -typedef Point = imp1.Point; final class Prim extends ffi.Struct { external ffi.Pointer ptr; @@ -3057,9 +3059,7 @@ final class Prim extends ffi.Struct { typedef PrimPtr = ffi.Pointer; typedef Prims = VecPrim; -typedef Rect = imp1.Rect; typedef Scalar = imp1.Scalar; -typedef Size = imp1.Size; final class VecGMat extends ffi.Struct { external ffi.Pointer ptr; diff --git a/lib/src/g/gapi.yaml b/packages/dartcv/lib/src/g/gapi.yaml similarity index 98% rename from lib/src/g/gapi.yaml rename to packages/dartcv/lib/src/g/gapi.yaml index f84b8d0c..9f6519e1 100644 --- a/lib/src/g/gapi.yaml +++ b/packages/dartcv/lib/src/g/gapi.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/gapi.g.dart: + package:dartcv/src/g/gapi.g.dart: used-config: ffi-native: false symbols: @@ -354,18 +354,18 @@ files: name: VecGMatPtr c:gapi.h@T@VecPrimPtr: name: VecPrimPtr + c:types.h@T@CvPoint: + name: CvPoint + c:types.h@T@CvRect: + name: CvRect + c:types.h@T@CvSize: + name: CvSize c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat - c:types.h@T@Point: - name: Point - c:types.h@T@Rect: - name: Rect c:types.h@T@Scalar: name: Scalar - c:types.h@T@Size: - name: Size c:types.h@T@VecPoint: name: VecPoint c:types.h@T@VecVec4i: diff --git a/lib/src/g/highgui.g.dart b/packages/dartcv/lib/src/g/highgui.g.dart similarity index 97% rename from lib/src/g/highgui.g.dart rename to packages/dartcv/lib/src/g/highgui.g.dart index b59cd732..8f369a20 100644 --- a/lib/src/g/highgui.g.dart +++ b/packages/dartcv/lib/src/g/highgui.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Highgui /// @@ -265,7 +265,7 @@ class CvNativeHighgui { ffi.Pointer Window_SelectROI( ffi.Pointer winname, Mat img, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _Window_SelectROI( winname, @@ -277,10 +277,10 @@ class CvNativeHighgui { late final _Window_SelectROIPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer)>>('Window_SelectROI'); + ffi.Pointer)>>('Window_SelectROI'); late final _Window_SelectROI = _Window_SelectROIPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, Mat, ffi.Pointer)>(); + ffi.Pointer, Mat, ffi.Pointer)>(); ffi.Pointer Window_SelectROIs( ffi.Pointer winname, @@ -376,7 +376,7 @@ class _SymbolAddresses { get Window_Close => _library._Window_ClosePtr; } +typedef CvRect = imp1.CvRect; typedef CvStatus = imp1.CvStatus; typedef Mat = imp1.Mat; -typedef Rect = imp1.Rect; typedef VecRect = imp1.VecRect; diff --git a/lib/src/g/highgui.yaml b/packages/dartcv/lib/src/g/highgui.yaml similarity index 93% rename from lib/src/g/highgui.yaml rename to packages/dartcv/lib/src/g/highgui.yaml index 3704336a..f0cd41b7 100644 --- a/lib/src/g/highgui.yaml +++ b/packages/dartcv/lib/src/g/highgui.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/highgui.g.dart: + package:dartcv/src/g/highgui.g.dart: used-config: ffi-native: false symbols: @@ -40,11 +40,11 @@ files: name: Window_WaitKey c:@F@destroyAllWindows: name: destroyAllWindows + c:types.h@T@CvRect: + name: CvRect c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat - c:types.h@T@Rect: - name: Rect c:types.h@T@VecRect: name: VecRect diff --git a/lib/src/g/imgcodecs.g.dart b/packages/dartcv/lib/src/g/imgcodecs.g.dart similarity index 99% rename from lib/src/g/imgcodecs.g.dart rename to packages/dartcv/lib/src/g/imgcodecs.g.dart index 9edceda0..23c20318 100644 --- a/lib/src/g/imgcodecs.g.dart +++ b/packages/dartcv/lib/src/g/imgcodecs.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Imgcodecs /// diff --git a/lib/src/g/imgcodecs.yaml b/packages/dartcv/lib/src/g/imgcodecs.yaml similarity index 95% rename from lib/src/g/imgcodecs.yaml rename to packages/dartcv/lib/src/g/imgcodecs.yaml index e04c6e8b..227b4785 100644 --- a/lib/src/g/imgcodecs.yaml +++ b/packages/dartcv/lib/src/g/imgcodecs.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/imgcodecs.g.dart: + package:dartcv/src/g/imgcodecs.g.dart: used-config: ffi-native: false symbols: diff --git a/lib/src/g/imgproc.g.dart b/packages/dartcv/lib/src/g/imgproc.g.dart similarity index 89% rename from lib/src/g/imgproc.g.dart rename to packages/dartcv/lib/src/g/imgproc.g.dart index 22147436..09265c77 100644 --- a/lib/src/g/imgproc.g.dart +++ b/packages/dartcv/lib/src/g/imgproc.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Imgproc /// @@ -252,8 +252,8 @@ class CvNativeImgproc { ffi.Pointer ArrowedLine( Mat img, - Point pt1, - Point pt2, + CvPoint pt1, + CvPoint pt2, Scalar color, int thickness, int line_type, @@ -274,16 +274,16 @@ class CvNativeImgproc { late final _ArrowedLinePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Point, Point, Scalar, ffi.Int, + ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, ffi.Int, ffi.Int, ffi.Int, ffi.Double)>>('ArrowedLine'); late final _ArrowedLine = _ArrowedLinePtr.asFunction< ffi.Pointer Function( - Mat, Point, Point, Scalar, int, int, int, double)>(); + Mat, CvPoint, CvPoint, Scalar, int, int, int, double)>(); ffi.Pointer ArrowedLine_Async( Mat img, - Point pt1, - Point pt2, + CvPoint pt1, + CvPoint pt2, Scalar color, int thickness, int line_type, @@ -308,8 +308,8 @@ class CvNativeImgproc { ffi.NativeFunction< ffi.Pointer Function( Mat, - Point, - Point, + CvPoint, + CvPoint, Scalar, ffi.Int, ffi.Int, @@ -317,8 +317,8 @@ class CvNativeImgproc { ffi.Double, imp1.CvCallback_0)>>('ArrowedLine_Async'); late final _ArrowedLine_Async = _ArrowedLine_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Point, Point, Scalar, int, int, int, - double, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, int, int, + int, double, imp1.CvCallback_0)>(); ffi.Pointer BilateralFilter( Mat src, @@ -370,7 +370,7 @@ class CvNativeImgproc { ffi.Pointer Blur( Mat src, Mat dst, - Size ps, + CvSize ps, ) { return _Blur( src, @@ -380,14 +380,14 @@ class CvNativeImgproc { } late final _BlurPtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Size)>>('Blur'); + ffi.NativeFunction Function(Mat, Mat, CvSize)>>( + 'Blur'); late final _Blur = - _BlurPtr.asFunction Function(Mat, Mat, Size)>(); + _BlurPtr.asFunction Function(Mat, Mat, CvSize)>(); ffi.Pointer Blur_Async( Mat src, - Size ps, + CvSize ps, imp1.CvCallback_1 callback, ) { return _Blur_Async( @@ -400,13 +400,13 @@ class CvNativeImgproc { late final _Blur_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Size, imp1.CvCallback_1)>>('Blur_Async'); + Mat, CvSize, imp1.CvCallback_1)>>('Blur_Async'); late final _Blur_Async = _Blur_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Size, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, CvSize, imp1.CvCallback_1)>(); ffi.Pointer BoundingRect( VecPoint pts, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _BoundingRect( pts, @@ -417,9 +417,9 @@ class CvNativeImgproc { late final _BoundingRectPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VecPoint, ffi.Pointer)>>('BoundingRect'); + VecPoint, ffi.Pointer)>>('BoundingRect'); late final _BoundingRect = _BoundingRectPtr.asFunction< - ffi.Pointer Function(VecPoint, ffi.Pointer)>(); + ffi.Pointer Function(VecPoint, ffi.Pointer)>(); ffi.Pointer BoundingRect_Async( VecPoint pts, @@ -442,8 +442,8 @@ class CvNativeImgproc { Mat src, Mat dst, int ddepth, - Size ps, - Point anchor, + CvSize ps, + CvPoint anchor, bool normalize, int borderType, ) { @@ -460,15 +460,16 @@ class CvNativeImgproc { late final _BoxFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, Size, Point, ffi.Bool, ffi.Int)>>('BoxFilter'); + ffi.Pointer Function(Mat, Mat, ffi.Int, CvSize, CvPoint, + ffi.Bool, ffi.Int)>>('BoxFilter'); late final _BoxFilter = _BoxFilterPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, Size, Point, bool, int)>(); + ffi.Pointer Function( + Mat, Mat, int, CvSize, CvPoint, bool, int)>(); ffi.Pointer BoxFilter_Async( Mat src, int ddepth, - Size ps, + CvSize ps, imp1.CvCallback_1 callback, ) { return _BoxFilter_Async( @@ -482,9 +483,9 @@ class CvNativeImgproc { late final _BoxFilter_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, Size, imp1.CvCallback_1)>>('BoxFilter_Async'); + Mat, ffi.Int, CvSize, imp1.CvCallback_1)>>('BoxFilter_Async'); late final _BoxFilter_Async = _BoxFilter_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, Size, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, int, CvSize, imp1.CvCallback_1)>(); ffi.Pointer BoxPoints( RotatedRect rect, @@ -633,7 +634,7 @@ class CvNativeImgproc { ffi.Pointer CLAHE_CreateWithParams( double clipLimit, - Size tileGridSize, + CvSize tileGridSize, ffi.Pointer rval, ) { return _CLAHE_CreateWithParams( @@ -645,14 +646,14 @@ class CvNativeImgproc { late final _CLAHE_CreateWithParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ffi.Double, Size, ffi.Pointer)>>('CLAHE_CreateWithParams'); + ffi.Pointer Function(ffi.Double, CvSize, + ffi.Pointer)>>('CLAHE_CreateWithParams'); late final _CLAHE_CreateWithParams = _CLAHE_CreateWithParamsPtr.asFunction< - ffi.Pointer Function(double, Size, ffi.Pointer)>(); + ffi.Pointer Function(double, CvSize, ffi.Pointer)>(); ffi.Pointer CLAHE_CreateWithParams_Async( double clipLimit, - Size tileGridSize, + CvSize tileGridSize, imp1.CvCallback_1 callback, ) { return _CLAHE_CreateWithParams_Async( @@ -664,11 +665,11 @@ class CvNativeImgproc { late final _CLAHE_CreateWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Double, Size, + ffi.Pointer Function(ffi.Double, CvSize, imp1.CvCallback_1)>>('CLAHE_CreateWithParams_Async'); late final _CLAHE_CreateWithParams_Async = _CLAHE_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(double, Size, imp1.CvCallback_1)>(); + ffi.Pointer Function(double, CvSize, imp1.CvCallback_1)>(); ffi.Pointer CLAHE_Create_Async( imp1.CvCallback_1 callback, @@ -721,7 +722,7 @@ class CvNativeImgproc { ffi.Pointer CLAHE_GetTilesGridSize( CLAHE c, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _CLAHE_GetTilesGridSize( c, @@ -732,9 +733,9 @@ class CvNativeImgproc { late final _CLAHE_GetTilesGridSizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CLAHE, ffi.Pointer)>>('CLAHE_GetTilesGridSize'); + CLAHE, ffi.Pointer)>>('CLAHE_GetTilesGridSize'); late final _CLAHE_GetTilesGridSize = _CLAHE_GetTilesGridSizePtr.asFunction< - ffi.Pointer Function(CLAHE, ffi.Pointer)>(); + ffi.Pointer Function(CLAHE, ffi.Pointer)>(); ffi.Pointer CLAHE_GetTilesGridSize_Async( CLAHE self, @@ -792,7 +793,7 @@ class CvNativeImgproc { ffi.Pointer CLAHE_SetTilesGridSize( CLAHE c, - Size size, + CvSize size, ) { return _CLAHE_SetTilesGridSize( c, @@ -800,15 +801,15 @@ class CvNativeImgproc { ); } - late final _CLAHE_SetTilesGridSizePtr = - _lookup Function(CLAHE, Size)>>( - 'CLAHE_SetTilesGridSize'); + late final _CLAHE_SetTilesGridSizePtr = _lookup< + ffi.NativeFunction Function(CLAHE, CvSize)>>( + 'CLAHE_SetTilesGridSize'); late final _CLAHE_SetTilesGridSize = _CLAHE_SetTilesGridSizePtr.asFunction< - ffi.Pointer Function(CLAHE, Size)>(); + ffi.Pointer Function(CLAHE, CvSize)>(); ffi.Pointer CLAHE_SetTilesGridSize_Async( CLAHE self, - Size size, + CvSize size, imp1.CvCallback_0 callback, ) { return _CLAHE_SetTilesGridSize_Async( @@ -820,11 +821,11 @@ class CvNativeImgproc { late final _CLAHE_SetTilesGridSize_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - CLAHE, Size, imp1.CvCallback_0)>>('CLAHE_SetTilesGridSize_Async'); + ffi.Pointer Function(CLAHE, CvSize, + imp1.CvCallback_0)>>('CLAHE_SetTilesGridSize_Async'); late final _CLAHE_SetTilesGridSize_Async = _CLAHE_SetTilesGridSize_AsyncPtr.asFunction< - ffi.Pointer Function(CLAHE, Size, imp1.CvCallback_0)>(); + ffi.Pointer Function(CLAHE, CvSize, imp1.CvCallback_0)>(); ffi.Pointer CalcBackProject( VecMat mats, @@ -987,7 +988,7 @@ class CvNativeImgproc { ffi.Pointer Circle( Mat img, - Point center, + CvPoint center, int radius, Scalar color, int thickness, @@ -1004,13 +1005,13 @@ class CvNativeImgproc { late final _CirclePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Point, ffi.Int, Scalar, ffi.Int)>>('Circle'); + Mat, CvPoint, ffi.Int, Scalar, ffi.Int)>>('Circle'); late final _Circle = _CirclePtr.asFunction< - ffi.Pointer Function(Mat, Point, int, Scalar, int)>(); + ffi.Pointer Function(Mat, CvPoint, int, Scalar, int)>(); ffi.Pointer CircleWithParams( Mat img, - Point center, + CvPoint center, int radius, Scalar color, int thickness, @@ -1030,14 +1031,15 @@ class CvNativeImgproc { late final _CircleWithParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Point, ffi.Int, Scalar, ffi.Int, + ffi.Pointer Function(Mat, CvPoint, ffi.Int, Scalar, ffi.Int, ffi.Int, ffi.Int)>>('CircleWithParams'); late final _CircleWithParams = _CircleWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Point, int, Scalar, int, int, int)>(); + ffi.Pointer Function( + Mat, CvPoint, int, Scalar, int, int, int)>(); ffi.Pointer CircleWithParams_Async( Mat img, - Point center, + CvPoint center, int radius, Scalar color, int thickness, @@ -1059,15 +1061,15 @@ class CvNativeImgproc { late final _CircleWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Point, ffi.Int, Scalar, ffi.Int, + ffi.Pointer Function(Mat, CvPoint, ffi.Int, Scalar, ffi.Int, ffi.Int, ffi.Int, imp1.CvCallback_0)>>('CircleWithParams_Async'); late final _CircleWithParams_Async = _CircleWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Point, int, Scalar, int, int, int, imp1.CvCallback_0)>(); + Mat, CvPoint, int, Scalar, int, int, int, imp1.CvCallback_0)>(); ffi.Pointer Circle_Async( Mat img, - Point center, + CvPoint center, int radius, Scalar color, int thickness, @@ -1085,16 +1087,16 @@ class CvNativeImgproc { late final _Circle_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Point, ffi.Int, Scalar, ffi.Int, + ffi.Pointer Function(Mat, CvPoint, ffi.Int, Scalar, ffi.Int, imp1.CvCallback_0)>>('Circle_Async'); late final _Circle_Async = _Circle_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Point, int, Scalar, int, imp1.CvCallback_0)>(); + Mat, CvPoint, int, Scalar, int, imp1.CvCallback_0)>(); ffi.Pointer ClipLine( - Rect imgRect, - Point pt1, - Point pt2, + CvRect imgRect, + CvPoint pt1, + CvPoint pt2, ffi.Pointer rval, ) { return _ClipLine( @@ -1108,15 +1110,15 @@ class CvNativeImgproc { late final _ClipLinePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Rect, Point, Point, ffi.Pointer)>>('ClipLine'); + CvRect, CvPoint, CvPoint, ffi.Pointer)>>('ClipLine'); late final _ClipLine = _ClipLinePtr.asFunction< ffi.Pointer Function( - Rect, Point, Point, ffi.Pointer)>(); + CvRect, CvPoint, CvPoint, ffi.Pointer)>(); ffi.Pointer ClipLine_Async( - Rect imgRect, - Point pt1, - Point pt2, + CvRect imgRect, + CvPoint pt1, + CvPoint pt2, imp1.CvCallback_1 callback, ) { return _ClipLine_Async( @@ -1130,9 +1132,10 @@ class CvNativeImgproc { late final _ClipLine_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Rect, Point, Point, imp1.CvCallback_1)>>('ClipLine_Async'); + CvRect, CvPoint, CvPoint, imp1.CvCallback_1)>>('ClipLine_Async'); late final _ClipLine_Async = _ClipLine_AsyncPtr.asFunction< - ffi.Pointer Function(Rect, Point, Point, imp1.CvCallback_1)>(); + ffi.Pointer Function( + CvRect, CvPoint, CvPoint, imp1.CvCallback_1)>(); ffi.Pointer CompareHist( Mat hist1, @@ -1401,8 +1404,8 @@ class CvNativeImgproc { ffi.Pointer CornerSubPix( Mat img, VecPoint2f corners, - Size winSize, - Size zeroZone, + CvSize winSize, + CvSize zeroZone, TermCriteria criteria, ) { return _CornerSubPix( @@ -1417,16 +1420,16 @@ class CvNativeImgproc { late final _CornerSubPixPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, VecPoint2f, Size, Size, TermCriteria)>>('CornerSubPix'); + Mat, VecPoint2f, CvSize, CvSize, TermCriteria)>>('CornerSubPix'); late final _CornerSubPix = _CornerSubPixPtr.asFunction< ffi.Pointer Function( - Mat, VecPoint2f, Size, Size, TermCriteria)>(); + Mat, VecPoint2f, CvSize, CvSize, TermCriteria)>(); ffi.Pointer CornerSubPix_Async( Mat img, VecPoint2f corners, - Size winSize, - Size zeroZone, + CvSize winSize, + CvSize zeroZone, TermCriteria criteria, imp1.CvCallback_0 callback, ) { @@ -1442,11 +1445,11 @@ class CvNativeImgproc { late final _CornerSubPix_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, VecPoint2f, Size, Size, + ffi.Pointer Function(Mat, VecPoint2f, CvSize, CvSize, TermCriteria, imp1.CvCallback_0)>>('CornerSubPix_Async'); late final _CornerSubPix_Async = _CornerSubPix_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, VecPoint2f, Size, Size, TermCriteria, imp1.CvCallback_0)>(); + Mat, VecPoint2f, CvSize, CvSize, TermCriteria, imp1.CvCallback_0)>(); ffi.Pointer CvtColor( Mat src, @@ -1507,7 +1510,7 @@ class CvNativeImgproc { Mat src, Mat dst, Mat kernel, - Point anchor, + CvPoint anchor, int iterations, int borderType, Scalar borderValue, @@ -1525,15 +1528,16 @@ class CvNativeImgproc { late final _DilateWithParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Point, ffi.Int, ffi.Int, - Scalar)>>('DilateWithParams'); + ffi.Pointer Function(Mat, Mat, Mat, CvPoint, ffi.Int, + ffi.Int, Scalar)>>('DilateWithParams'); late final _DilateWithParams = _DilateWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Point, int, int, Scalar)>(); + ffi.Pointer Function( + Mat, Mat, Mat, CvPoint, int, int, Scalar)>(); ffi.Pointer DilateWithParams_Async( Mat src, Mat kernel, - Point anchor, + CvPoint anchor, int iterations, int borderType, Scalar borderValue, @@ -1552,11 +1556,11 @@ class CvNativeImgproc { late final _DilateWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Point, ffi.Int, ffi.Int, + ffi.Pointer Function(Mat, Mat, CvPoint, ffi.Int, ffi.Int, Scalar, imp1.CvCallback_1)>>('DilateWithParams_Async'); late final _DilateWithParams_Async = _DilateWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Point, int, int, Scalar, imp1.CvCallback_1)>(); + Mat, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_1)>(); ffi.Pointer Dilate_Async( Mat src, @@ -1657,7 +1661,7 @@ class CvNativeImgproc { int lineType, Mat hierarchy, int maxLevel, - Point offset, + CvPoint offset, ) { return _DrawContoursWithParams( src, @@ -1683,10 +1687,10 @@ class CvNativeImgproc { ffi.Int, Mat, ffi.Int, - Point)>>('DrawContoursWithParams'); + CvPoint)>>('DrawContoursWithParams'); late final _DrawContoursWithParams = _DrawContoursWithParamsPtr.asFunction< ffi.Pointer Function( - Mat, VecVecPoint, int, Scalar, int, int, Mat, int, Point)>(); + Mat, VecVecPoint, int, Scalar, int, int, Mat, int, CvPoint)>(); ffi.Pointer DrawContoursWithParams_Async( Mat src, @@ -1697,7 +1701,7 @@ class CvNativeImgproc { int lineType, Mat hierarchy, int maxLevel, - Point offset, + CvPoint offset, imp1.CvCallback_0 callback, ) { return _DrawContoursWithParams_Async( @@ -1725,12 +1729,12 @@ class CvNativeImgproc { ffi.Int, Mat, ffi.Int, - Point, + CvPoint, imp1.CvCallback_0)>>('DrawContoursWithParams_Async'); late final _DrawContoursWithParams_Async = _DrawContoursWithParams_AsyncPtr.asFunction< ffi.Pointer Function(Mat, VecVecPoint, int, Scalar, int, - int, Mat, int, Point, imp1.CvCallback_0)>(); + int, Mat, int, CvPoint, imp1.CvCallback_0)>(); ffi.Pointer DrawContours_Async( Mat src, @@ -1760,8 +1764,8 @@ class CvNativeImgproc { ffi.Pointer Ellipse( Mat img, - Point center, - Point axes, + CvPoint center, + CvPoint axes, double angle, double startAngle, double endAngle, @@ -1782,16 +1786,16 @@ class CvNativeImgproc { late final _EllipsePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Point, Point, ffi.Double, + ffi.Pointer Function(Mat, CvPoint, CvPoint, ffi.Double, ffi.Double, ffi.Double, Scalar, ffi.Int)>>('Ellipse'); late final _Ellipse = _EllipsePtr.asFunction< ffi.Pointer Function( - Mat, Point, Point, double, double, double, Scalar, int)>(); + Mat, CvPoint, CvPoint, double, double, double, Scalar, int)>(); ffi.Pointer EllipseWithParams( Mat img, - Point center, - Point axes, + CvPoint center, + CvPoint axes, double angle, double startAngle, double endAngle, @@ -1818,8 +1822,8 @@ class CvNativeImgproc { ffi.NativeFunction< ffi.Pointer Function( Mat, - Point, - Point, + CvPoint, + CvPoint, ffi.Double, ffi.Double, ffi.Double, @@ -1828,13 +1832,13 @@ class CvNativeImgproc { ffi.Int, ffi.Int)>>('EllipseWithParams'); late final _EllipseWithParams = _EllipseWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, Point, Point, double, double, double, Scalar, int, int, int)>(); + ffi.Pointer Function(Mat, CvPoint, CvPoint, double, double, + double, Scalar, int, int, int)>(); ffi.Pointer EllipseWithParams_Async( Mat img, - Point center, - Point axes, + CvPoint center, + CvPoint axes, double angle, double startAngle, double endAngle, @@ -1863,8 +1867,8 @@ class CvNativeImgproc { ffi.NativeFunction< ffi.Pointer Function( Mat, - Point, - Point, + CvPoint, + CvPoint, ffi.Double, ffi.Double, ffi.Double, @@ -1874,13 +1878,13 @@ class CvNativeImgproc { ffi.Int, imp1.CvCallback_0)>>('EllipseWithParams_Async'); late final _EllipseWithParams_Async = _EllipseWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Point, Point, double, double, double, - Scalar, int, int, int, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, CvPoint, CvPoint, double, double, + double, Scalar, int, int, int, imp1.CvCallback_0)>(); ffi.Pointer Ellipse_Async( Mat img, - Point center, - Point axes, + CvPoint center, + CvPoint axes, double angle, double startAngle, double endAngle, @@ -1905,8 +1909,8 @@ class CvNativeImgproc { ffi.NativeFunction< ffi.Pointer Function( Mat, - Point, - Point, + CvPoint, + CvPoint, ffi.Double, ffi.Double, ffi.Double, @@ -1914,8 +1918,8 @@ class CvNativeImgproc { ffi.Int, imp1.CvCallback_0)>>('Ellipse_Async'); late final _Ellipse_Async = _Ellipse_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Point, Point, double, double, double, - Scalar, int, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, CvPoint, CvPoint, double, double, + double, Scalar, int, imp1.CvCallback_0)>(); ffi.Pointer EqualizeHist( Mat src, @@ -1972,7 +1976,7 @@ class CvNativeImgproc { Mat src, Mat dst, Mat kernel, - Point anchor, + CvPoint anchor, int iterations, int borderType, Scalar borderValue, @@ -1990,15 +1994,16 @@ class CvNativeImgproc { late final _ErodeWithParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Point, ffi.Int, ffi.Int, - Scalar)>>('ErodeWithParams'); + ffi.Pointer Function(Mat, Mat, Mat, CvPoint, ffi.Int, + ffi.Int, Scalar)>>('ErodeWithParams'); late final _ErodeWithParams = _ErodeWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Point, int, int, Scalar)>(); + ffi.Pointer Function( + Mat, Mat, Mat, CvPoint, int, int, Scalar)>(); ffi.Pointer ErodeWithParams_Async( Mat src, Mat kernel, - Point anchor, + CvPoint anchor, int iterations, int borderType, Scalar borderValue, @@ -2017,11 +2022,11 @@ class CvNativeImgproc { late final _ErodeWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Point, ffi.Int, ffi.Int, + ffi.Pointer Function(Mat, Mat, CvPoint, ffi.Int, ffi.Int, Scalar, imp1.CvCallback_1)>>('ErodeWithParams_Async'); late final _ErodeWithParams_Async = _ErodeWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Point, int, int, Scalar, imp1.CvCallback_1)>(); + Mat, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_1)>(); ffi.Pointer Erode_Async( Mat src, @@ -2067,7 +2072,7 @@ class CvNativeImgproc { Scalar color, int lineType, int shift, - Point offset, + CvPoint offset, ) { return _FillPolyWithParams( img, @@ -2082,10 +2087,10 @@ class CvNativeImgproc { late final _FillPolyWithParamsPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, VecVecPoint, Scalar, ffi.Int, - ffi.Int, Point)>>('FillPolyWithParams'); + ffi.Int, CvPoint)>>('FillPolyWithParams'); late final _FillPolyWithParams = _FillPolyWithParamsPtr.asFunction< ffi.Pointer Function( - Mat, VecVecPoint, Scalar, int, int, Point)>(); + Mat, VecVecPoint, Scalar, int, int, CvPoint)>(); ffi.Pointer FillPolyWithParams_Async( Mat img, @@ -2093,7 +2098,7 @@ class CvNativeImgproc { Scalar color, int lineType, int shift, - Point offset, + CvPoint offset, imp1.CvCallback_0 callback, ) { return _FillPolyWithParams_Async( @@ -2109,12 +2114,18 @@ class CvNativeImgproc { late final _FillPolyWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, VecVecPoint, Scalar, ffi.Int, - ffi.Int, Point, imp1.CvCallback_0)>>('FillPolyWithParams_Async'); + ffi.Pointer Function( + Mat, + VecVecPoint, + Scalar, + ffi.Int, + ffi.Int, + CvPoint, + imp1.CvCallback_0)>>('FillPolyWithParams_Async'); late final _FillPolyWithParams_Async = _FillPolyWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, VecVecPoint, Scalar, int, int, Point, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, VecVecPoint, Scalar, int, int, + CvPoint, imp1.CvCallback_0)>(); ffi.Pointer FillPoly_Async( Mat img, @@ -2143,7 +2154,7 @@ class CvNativeImgproc { Mat dst, int ddepth, Mat kernel, - Point anchor, + CvPoint anchor, double delta, int borderType, ) { @@ -2160,16 +2171,17 @@ class CvNativeImgproc { late final _Filter2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, Mat, Point, ffi.Double, ffi.Int)>>('Filter2D'); + ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, CvPoint, + ffi.Double, ffi.Int)>>('Filter2D'); late final _Filter2D = _Filter2DPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, Mat, Point, double, int)>(); + ffi.Pointer Function( + Mat, Mat, int, Mat, CvPoint, double, int)>(); ffi.Pointer Filter2D_Async( Mat src, int ddepth, Mat kernel, - Point anchor, + CvPoint anchor, double delta, int borderType, imp1.CvCallback_1 callback, @@ -2187,11 +2199,11 @@ class CvNativeImgproc { late final _Filter2D_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, Mat, Point, ffi.Double, + ffi.Pointer Function(Mat, ffi.Int, Mat, CvPoint, ffi.Double, ffi.Int, imp1.CvCallback_1)>>('Filter2D_Async'); late final _Filter2D_Async = _Filter2D_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, int, Mat, Point, double, int, imp1.CvCallback_1)>(); + Mat, int, Mat, CvPoint, double, int, imp1.CvCallback_1)>(); ffi.Pointer FindContours( Mat src, @@ -2327,9 +2339,9 @@ class CvNativeImgproc { ffi.Pointer FloodFill( Mat src, Mat mask, - Point seedPoint, + CvPoint seedPoint, Scalar newVal, - ffi.Pointer rect, + ffi.Pointer rect, Scalar loDiff, Scalar upDiff, int flags, @@ -2353,21 +2365,21 @@ class CvNativeImgproc { ffi.Pointer Function( Mat, Mat, - Point, + CvPoint, Scalar, - ffi.Pointer, + ffi.Pointer, Scalar, Scalar, ffi.Int, ffi.Pointer)>>('FloodFill'); late final _FloodFill = _FloodFillPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Point, Scalar, ffi.Pointer, - Scalar, Scalar, int, ffi.Pointer)>(); + ffi.Pointer Function(Mat, Mat, CvPoint, Scalar, + ffi.Pointer, Scalar, Scalar, int, ffi.Pointer)>(); ffi.Pointer FloodFill_Async( Mat src, Mat mask, - Point seedPoint, + CvPoint seedPoint, Scalar newVal, Scalar loDiff, Scalar upDiff, @@ -2388,16 +2400,16 @@ class CvNativeImgproc { late final _FloodFill_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Point, Scalar, Scalar, + ffi.Pointer Function(Mat, Mat, CvPoint, Scalar, Scalar, Scalar, ffi.Int, imp1.CvCallback_2)>>('FloodFill_Async'); late final _FloodFill_Async = _FloodFill_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Point, Scalar, Scalar, Scalar, int, imp1.CvCallback_2)>(); + Mat, Mat, CvPoint, Scalar, Scalar, Scalar, int, imp1.CvCallback_2)>(); ffi.Pointer GaussianBlur( Mat src, Mat dst, - Size ps, + CvSize ps, double sX, double sY, int bt, @@ -2414,14 +2426,14 @@ class CvNativeImgproc { late final _GaussianBlurPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Size, ffi.Double, ffi.Double, - ffi.Int)>>('GaussianBlur'); + ffi.Pointer Function(Mat, Mat, CvSize, ffi.Double, + ffi.Double, ffi.Int)>>('GaussianBlur'); late final _GaussianBlur = _GaussianBlurPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Size, double, double, int)>(); + ffi.Pointer Function(Mat, Mat, CvSize, double, double, int)>(); ffi.Pointer GaussianBlur_Async( Mat src, - Size ps, + CvSize ps, double sX, double sY, int bt, @@ -2439,11 +2451,11 @@ class CvNativeImgproc { late final _GaussianBlur_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, ffi.Double, ffi.Double, + ffi.Pointer Function(Mat, CvSize, ffi.Double, ffi.Double, ffi.Int, imp1.CvCallback_1)>>('GaussianBlur_Async'); late final _GaussianBlur_Async = _GaussianBlur_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Size, double, double, int, imp1.CvCallback_1)>(); + Mat, CvSize, double, double, int, imp1.CvCallback_1)>(); ffi.Pointer GetAffineTransform( VecPoint src, @@ -2661,8 +2673,8 @@ class CvNativeImgproc { ffi.Pointer GetRectSubPix( Mat src, - Size patchSize, - Point2f center, + CvSize patchSize, + CvPoint2f center, Mat dst, ) { return _GetRectSubPix( @@ -2676,14 +2688,14 @@ class CvNativeImgproc { late final _GetRectSubPixPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Size, Point2f, Mat)>>('GetRectSubPix'); + Mat, CvSize, CvPoint2f, Mat)>>('GetRectSubPix'); late final _GetRectSubPix = _GetRectSubPixPtr.asFunction< - ffi.Pointer Function(Mat, Size, Point2f, Mat)>(); + ffi.Pointer Function(Mat, CvSize, CvPoint2f, Mat)>(); ffi.Pointer GetRectSubPix_Async( Mat src, - Size patchSize, - Point2f center, + CvSize patchSize, + CvPoint2f center, imp1.CvCallback_1 callback, ) { return _GetRectSubPix_Async( @@ -2696,13 +2708,14 @@ class CvNativeImgproc { late final _GetRectSubPix_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Size, Point2f, imp1.CvCallback_1)>>('GetRectSubPix_Async'); + ffi.Pointer Function(Mat, CvSize, CvPoint2f, + imp1.CvCallback_1)>>('GetRectSubPix_Async'); late final _GetRectSubPix_Async = _GetRectSubPix_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Size, Point2f, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, CvSize, CvPoint2f, imp1.CvCallback_1)>(); ffi.Pointer GetRotationMatrix2D( - Point2f center, + CvPoint2f center, double angle, double scale, ffi.Pointer rval, @@ -2717,14 +2730,14 @@ class CvNativeImgproc { late final _GetRotationMatrix2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Point2f, ffi.Double, ffi.Double, + ffi.Pointer Function(CvPoint2f, ffi.Double, ffi.Double, ffi.Pointer)>>('GetRotationMatrix2D'); late final _GetRotationMatrix2D = _GetRotationMatrix2DPtr.asFunction< ffi.Pointer Function( - Point2f, double, double, ffi.Pointer)>(); + CvPoint2f, double, double, ffi.Pointer)>(); ffi.Pointer GetRotationMatrix2D_Async( - Point2f center, + CvPoint2f center, double angle, double scale, imp1.CvCallback_1 callback, @@ -2739,16 +2752,16 @@ class CvNativeImgproc { late final _GetRotationMatrix2D_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Point2f, ffi.Double, ffi.Double, + ffi.Pointer Function(CvPoint2f, ffi.Double, ffi.Double, imp1.CvCallback_1)>>('GetRotationMatrix2D_Async'); late final _GetRotationMatrix2D_Async = _GetRotationMatrix2D_AsyncPtr.asFunction< ffi.Pointer Function( - Point2f, double, double, imp1.CvCallback_1)>(); + CvPoint2f, double, double, imp1.CvCallback_1)>(); ffi.Pointer GetStructuringElement( int shape, - Size ksize, + CvSize ksize, ffi.Pointer rval, ) { return _GetStructuringElement( @@ -2761,14 +2774,14 @@ class CvNativeImgproc { late final _GetStructuringElementPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Int, Size, ffi.Pointer)>>('GetStructuringElement'); + ffi.Int, CvSize, ffi.Pointer)>>('GetStructuringElement'); late final _GetStructuringElement = _GetStructuringElementPtr.asFunction< - ffi.Pointer Function(int, Size, ffi.Pointer)>(); + ffi.Pointer Function(int, CvSize, ffi.Pointer)>(); ffi.Pointer GetStructuringElement_Async( int shape, - Size ksize, - Point anchor, + CvSize ksize, + CvPoint anchor, imp1.CvCallback_1 callback, ) { return _GetStructuringElement_Async( @@ -2781,12 +2794,12 @@ class CvNativeImgproc { late final _GetStructuringElement_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, Size, Point, + ffi.Pointer Function(ffi.Int, CvSize, CvPoint, imp1.CvCallback_1)>>('GetStructuringElement_Async'); late final _GetStructuringElement_Async = _GetStructuringElement_AsyncPtr.asFunction< ffi.Pointer Function( - int, Size, Point, imp1.CvCallback_1)>(); + int, CvSize, CvPoint, imp1.CvCallback_1)>(); ffi.Pointer GetTextSizeWithBaseline( ffi.Pointer text, @@ -2794,7 +2807,7 @@ class CvNativeImgproc { double fontScale, int thickness, ffi.Pointer baseline, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _GetTextSizeWithBaseline( text, @@ -2814,10 +2827,10 @@ class CvNativeImgproc { ffi.Double, ffi.Int, ffi.Pointer, - ffi.Pointer)>>('GetTextSizeWithBaseline'); + ffi.Pointer)>>('GetTextSizeWithBaseline'); late final _GetTextSizeWithBaseline = _GetTextSizeWithBaselinePtr.asFunction< ffi.Pointer Function(ffi.Pointer, int, double, int, - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, ffi.Pointer)>(); ffi.Pointer GetTextSizeWithBaseline_Async( ffi.Pointer text, @@ -3020,7 +3033,7 @@ class CvNativeImgproc { ffi.Pointer GrabCut( Mat img, Mat mask, - Rect rect, + CvRect rect, Mat bgdModel, Mat fgdModel, int iterCount, @@ -3040,14 +3053,14 @@ class CvNativeImgproc { late final _GrabCutPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Rect, Mat, Mat, ffi.Int, ffi.Int)>>('GrabCut'); + Mat, Mat, CvRect, Mat, Mat, ffi.Int, ffi.Int)>>('GrabCut'); late final _GrabCut = _GrabCutPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Rect, Mat, Mat, int, int)>(); + ffi.Pointer Function(Mat, Mat, CvRect, Mat, Mat, int, int)>(); ffi.Pointer GrabCut_Async( Mat img, Mat mask, - Rect rect, + CvRect rect, Mat bgdModel, Mat fgdModel, int iterCount, @@ -3068,11 +3081,11 @@ class CvNativeImgproc { late final _GrabCut_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Rect, Mat, Mat, ffi.Int, + ffi.Pointer Function(Mat, Mat, CvRect, Mat, Mat, ffi.Int, ffi.Int, imp1.CvCallback_0)>>('GrabCut_Async'); late final _GrabCut_Async = _GrabCut_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Rect, Mat, Mat, int, int, imp1.CvCallback_0)>(); + Mat, Mat, CvRect, Mat, Mat, int, int, imp1.CvCallback_0)>(); ffi.Pointer HoughCircles( Mat src, @@ -3616,8 +3629,8 @@ class CvNativeImgproc { ffi.Pointer Line( Mat img, - Point pt1, - Point pt2, + CvPoint pt1, + CvPoint pt2, Scalar color, int thickness, int lineType, @@ -3636,16 +3649,16 @@ class CvNativeImgproc { late final _LinePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Point, Point, Scalar, ffi.Int, ffi.Int, ffi.Int)>>('Line'); + ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, ffi.Int, + ffi.Int, ffi.Int)>>('Line'); late final _Line = _LinePtr.asFunction< ffi.Pointer Function( - Mat, Point, Point, Scalar, int, int, int)>(); + Mat, CvPoint, CvPoint, Scalar, int, int, int)>(); ffi.Pointer Line_Async( Mat img, - Point pt1, - Point pt2, + CvPoint pt1, + CvPoint pt2, Scalar color, int thickness, int lineType, @@ -3666,16 +3679,16 @@ class CvNativeImgproc { late final _Line_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Point, Point, Scalar, ffi.Int, + ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, ffi.Int, ffi.Int, ffi.Int, imp1.CvCallback_0)>>('Line_Async'); late final _Line_Async = _Line_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Point, Point, Scalar, int, int, int, imp1.CvCallback_0)>(); + Mat, CvPoint, CvPoint, Scalar, int, int, int, imp1.CvCallback_0)>(); ffi.Pointer LinearPolar( Mat src, Mat dst, - Point2f center, + CvPoint2f center, double maxRadius, int flags, ) { @@ -3691,13 +3704,13 @@ class CvNativeImgproc { late final _LinearPolarPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Point2f, ffi.Double, ffi.Int)>>('LinearPolar'); + Mat, Mat, CvPoint2f, ffi.Double, ffi.Int)>>('LinearPolar'); late final _LinearPolar = _LinearPolarPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Point2f, double, int)>(); + ffi.Pointer Function(Mat, Mat, CvPoint2f, double, int)>(); ffi.Pointer LinearPolar_Async( Mat src, - Point2f center, + CvPoint2f center, double maxRadius, int flags, imp1.CvCallback_1 callback, @@ -3713,16 +3726,16 @@ class CvNativeImgproc { late final _LinearPolar_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Point2f, ffi.Double, ffi.Int, + ffi.Pointer Function(Mat, CvPoint2f, ffi.Double, ffi.Int, imp1.CvCallback_1)>>('LinearPolar_Async'); late final _LinearPolar_Async = _LinearPolar_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Point2f, double, int, imp1.CvCallback_1)>(); + Mat, CvPoint2f, double, int, imp1.CvCallback_1)>(); ffi.Pointer LogPolar( Mat src, Mat dst, - Point2f center, + CvPoint2f center, double m, int flags, ) { @@ -3738,13 +3751,13 @@ class CvNativeImgproc { late final _LogPolarPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Point2f, ffi.Double, ffi.Int)>>('LogPolar'); + Mat, Mat, CvPoint2f, ffi.Double, ffi.Int)>>('LogPolar'); late final _LogPolar = _LogPolarPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Point2f, double, int)>(); + ffi.Pointer Function(Mat, Mat, CvPoint2f, double, int)>(); ffi.Pointer LogPolar_Async( Mat src, - Point2f center, + CvPoint2f center, double m, int flags, imp1.CvCallback_1 callback, @@ -3760,11 +3773,11 @@ class CvNativeImgproc { late final _LogPolar_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Point2f, ffi.Double, ffi.Int, + ffi.Pointer Function(Mat, CvPoint2f, ffi.Double, ffi.Int, imp1.CvCallback_1)>>('LogPolar_Async'); late final _LogPolar_Async = _LogPolar_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Point2f, double, int, imp1.CvCallback_1)>(); + Mat, CvPoint2f, double, int, imp1.CvCallback_1)>(); ffi.Pointer Mat_Accumulate( Mat src, @@ -4259,7 +4272,7 @@ class CvNativeImgproc { ffi.Pointer MinEnclosingCircle( VecPoint pts, - ffi.Pointer center, + ffi.Pointer center, ffi.Pointer radius, ) { return _MinEnclosingCircle( @@ -4271,11 +4284,11 @@ class CvNativeImgproc { late final _MinEnclosingCirclePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint, ffi.Pointer, + ffi.Pointer Function(VecPoint, ffi.Pointer, ffi.Pointer)>>('MinEnclosingCircle'); late final _MinEnclosingCircle = _MinEnclosingCirclePtr.asFunction< ffi.Pointer Function( - VecPoint, ffi.Pointer, ffi.Pointer)>(); + VecPoint, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer MinEnclosingCircle_Async( VecPoint pts, @@ -4390,7 +4403,7 @@ class CvNativeImgproc { Mat dst, int op, Mat kernel, - Point pt, + CvPoint pt, int iterations, int borderType, Scalar borderValue, @@ -4409,17 +4422,17 @@ class CvNativeImgproc { late final _MorphologyExWithParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, Point, ffi.Int, - ffi.Int, Scalar)>>('MorphologyExWithParams'); + ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, CvPoint, + ffi.Int, ffi.Int, Scalar)>>('MorphologyExWithParams'); late final _MorphologyExWithParams = _MorphologyExWithParamsPtr.asFunction< ffi.Pointer Function( - Mat, Mat, int, Mat, Point, int, int, Scalar)>(); + Mat, Mat, int, Mat, CvPoint, int, int, Scalar)>(); ffi.Pointer MorphologyExWithParams_Async( Mat src, int op, Mat kernel, - Point pt, + CvPoint pt, int iterations, int borderType, Scalar borderValue, @@ -4443,7 +4456,7 @@ class CvNativeImgproc { Mat, ffi.Int, Mat, - Point, + CvPoint, ffi.Int, ffi.Int, Scalar, @@ -4451,7 +4464,7 @@ class CvNativeImgproc { late final _MorphologyExWithParams_Async = _MorphologyExWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, int, Mat, Point, int, int, Scalar, imp1.CvCallback_1)>(); + Mat, int, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_1)>(); ffi.Pointer MorphologyEx_Async( Mat src, @@ -4479,7 +4492,7 @@ class CvNativeImgproc { Mat src2, Mat window, ffi.Pointer response, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _PhaseCorrelate( src1, @@ -4493,10 +4506,10 @@ class CvNativeImgproc { late final _PhaseCorrelatePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer, - ffi.Pointer)>>('PhaseCorrelate'); + ffi.Pointer)>>('PhaseCorrelate'); late final _PhaseCorrelate = _PhaseCorrelatePtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, ffi.Pointer, ffi.Pointer)>(); + Mat, Mat, Mat, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer PhaseCorrelate_Async( Mat src1, @@ -4521,7 +4534,7 @@ class CvNativeImgproc { ffi.Pointer PointPolygonTest( VecPoint pts, - Point2f pt, + CvPoint2f pt, bool measureDist, ffi.Pointer rval, ) { @@ -4535,15 +4548,15 @@ class CvNativeImgproc { late final _PointPolygonTestPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint, Point2f, ffi.Bool, + ffi.Pointer Function(VecPoint, CvPoint2f, ffi.Bool, ffi.Pointer)>>('PointPolygonTest'); late final _PointPolygonTest = _PointPolygonTestPtr.asFunction< ffi.Pointer Function( - VecPoint, Point2f, bool, ffi.Pointer)>(); + VecPoint, CvPoint2f, bool, ffi.Pointer)>(); ffi.Pointer PointPolygonTest_Async( VecPoint pts, - Point2f pt, + CvPoint2f pt, bool measureDist, imp1.CvCallback_1 callback, ) { @@ -4557,11 +4570,11 @@ class CvNativeImgproc { late final _PointPolygonTest_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint, Point2f, ffi.Bool, + ffi.Pointer Function(VecPoint, CvPoint2f, ffi.Bool, imp1.CvCallback_1)>>('PointPolygonTest_Async'); late final _PointPolygonTest_Async = _PointPolygonTest_AsyncPtr.asFunction< ffi.Pointer Function( - VecPoint, Point2f, bool, imp1.CvCallback_1)>(); + VecPoint, CvPoint2f, bool, imp1.CvCallback_1)>(); ffi.Pointer Polylines( Mat img, @@ -4615,7 +4628,7 @@ class CvNativeImgproc { ffi.Pointer PutText( Mat img, ffi.Pointer text, - Point org, + CvPoint org, int fontFace, double fontScale, Scalar color, @@ -4634,16 +4647,16 @@ class CvNativeImgproc { late final _PutTextPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, Point, + ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, ffi.Int, ffi.Double, Scalar, ffi.Int)>>('PutText'); late final _PutText = _PutTextPtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, Point, int, double, Scalar, int)>(); + Mat, ffi.Pointer, CvPoint, int, double, Scalar, int)>(); ffi.Pointer PutTextWithParams( Mat img, ffi.Pointer text, - Point org, + CvPoint org, int fontFace, double fontScale, Scalar color, @@ -4669,7 +4682,7 @@ class CvNativeImgproc { ffi.Pointer Function( Mat, ffi.Pointer, - Point, + CvPoint, ffi.Int, ffi.Double, Scalar, @@ -4677,13 +4690,13 @@ class CvNativeImgproc { ffi.Int, ffi.Bool)>>('PutTextWithParams'); late final _PutTextWithParams = _PutTextWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, Point, int, + ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, int, double, Scalar, int, int, bool)>(); ffi.Pointer PutTextWithParams_Async( Mat img, ffi.Pointer text, - Point org, + CvPoint org, int fontFace, double fontScale, Scalar color, @@ -4711,7 +4724,7 @@ class CvNativeImgproc { ffi.Pointer Function( Mat, ffi.Pointer, - Point, + CvPoint, ffi.Int, ffi.Double, Scalar, @@ -4720,13 +4733,13 @@ class CvNativeImgproc { ffi.Bool, imp1.CvCallback_0)>>('PutTextWithParams_Async'); late final _PutTextWithParams_Async = _PutTextWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, Point, int, + ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, int, double, Scalar, int, int, bool, imp1.CvCallback_0)>(); ffi.Pointer PutText_Async( Mat img, ffi.Pointer text, - Point org, + CvPoint org, int fontFace, double fontScale, Scalar color, @@ -4750,20 +4763,20 @@ class CvNativeImgproc { ffi.Pointer Function( Mat, ffi.Pointer, - Point, + CvPoint, ffi.Int, ffi.Double, Scalar, ffi.Int, imp1.CvCallback_0)>>('PutText_Async'); late final _PutText_Async = _PutText_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, Point, int, + ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, int, double, Scalar, int, imp1.CvCallback_0)>(); ffi.Pointer PyrDown( Mat src, Mat dst, - Size dstsize, + CvSize dstsize, int borderType, ) { return _PyrDown( @@ -4776,13 +4789,14 @@ class CvNativeImgproc { late final _PyrDownPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Size, ffi.Int)>>('PyrDown'); + ffi.Pointer Function( + Mat, Mat, CvSize, ffi.Int)>>('PyrDown'); late final _PyrDown = _PyrDownPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Size, int)>(); + ffi.Pointer Function(Mat, Mat, CvSize, int)>(); ffi.Pointer PyrDown_Async( Mat src, - Size dstsize, + CvSize dstsize, int borderType, imp1.CvCallback_1 callback, ) { @@ -4797,14 +4811,14 @@ class CvNativeImgproc { late final _PyrDown_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Size, ffi.Int, imp1.CvCallback_1)>>('PyrDown_Async'); + Mat, CvSize, ffi.Int, imp1.CvCallback_1)>>('PyrDown_Async'); late final _PyrDown_Async = _PyrDown_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Size, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, CvSize, int, imp1.CvCallback_1)>(); ffi.Pointer PyrUp( Mat src, Mat dst, - Size dstsize, + CvSize dstsize, int borderType, ) { return _PyrUp( @@ -4817,13 +4831,13 @@ class CvNativeImgproc { late final _PyrUpPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Size, ffi.Int)>>('PyrUp'); + ffi.Pointer Function(Mat, Mat, CvSize, ffi.Int)>>('PyrUp'); late final _PyrUp = _PyrUpPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Size, int)>(); + ffi.Pointer Function(Mat, Mat, CvSize, int)>(); ffi.Pointer PyrUp_Async( Mat src, - Size dstsize, + CvSize dstsize, int borderType, imp1.CvCallback_1 callback, ) { @@ -4838,13 +4852,13 @@ class CvNativeImgproc { late final _PyrUp_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Size, ffi.Int, imp1.CvCallback_1)>>('PyrUp_Async'); + Mat, CvSize, ffi.Int, imp1.CvCallback_1)>>('PyrUp_Async'); late final _PyrUp_Async = _PyrUp_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Size, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, CvSize, int, imp1.CvCallback_1)>(); ffi.Pointer Rectangle( Mat img, - Rect rect, + CvRect rect, Scalar color, int thickness, ) { @@ -4859,13 +4873,13 @@ class CvNativeImgproc { late final _RectanglePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Rect, Scalar, ffi.Int)>>('Rectangle'); + Mat, CvRect, Scalar, ffi.Int)>>('Rectangle'); late final _Rectangle = _RectanglePtr.asFunction< - ffi.Pointer Function(Mat, Rect, Scalar, int)>(); + ffi.Pointer Function(Mat, CvRect, Scalar, int)>(); ffi.Pointer RectangleWithParams( Mat img, - Rect rect, + CvRect rect, Scalar color, int thickness, int lineType, @@ -4883,14 +4897,14 @@ class CvNativeImgproc { late final _RectangleWithParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Rect, Scalar, ffi.Int, ffi.Int, + ffi.Pointer Function(Mat, CvRect, Scalar, ffi.Int, ffi.Int, ffi.Int)>>('RectangleWithParams'); late final _RectangleWithParams = _RectangleWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Rect, Scalar, int, int, int)>(); + ffi.Pointer Function(Mat, CvRect, Scalar, int, int, int)>(); ffi.Pointer RectangleWithParams_Async( Mat img, - Rect rect, + CvRect rect, Scalar color, int thickness, int lineType, @@ -4910,16 +4924,16 @@ class CvNativeImgproc { late final _RectangleWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Rect, Scalar, ffi.Int, ffi.Int, + ffi.Pointer Function(Mat, CvRect, Scalar, ffi.Int, ffi.Int, ffi.Int, imp1.CvCallback_0)>>('RectangleWithParams_Async'); late final _RectangleWithParams_Async = _RectangleWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Rect, Scalar, int, int, int, imp1.CvCallback_0)>(); + Mat, CvRect, Scalar, int, int, int, imp1.CvCallback_0)>(); ffi.Pointer Rectangle_Async( Mat img, - Rect rect, + CvRect rect, Scalar color, int thickness, imp1.CvCallback_0 callback, @@ -4935,11 +4949,11 @@ class CvNativeImgproc { late final _Rectangle_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Rect, Scalar, ffi.Int, + ffi.Pointer Function(Mat, CvRect, Scalar, ffi.Int, imp1.CvCallback_0)>>('Rectangle_Async'); late final _Rectangle_Async = _Rectangle_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Rect, Scalar, int, imp1.CvCallback_0)>(); + Mat, CvRect, Scalar, int, imp1.CvCallback_0)>(); ffi.Pointer Remap( Mat src, @@ -4999,7 +5013,7 @@ class CvNativeImgproc { ffi.Pointer Resize( Mat src, Mat dst, - Size sz, + CvSize sz, double fx, double fy, int interp, @@ -5017,13 +5031,13 @@ class CvNativeImgproc { late final _ResizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Size, ffi.Double, ffi.Double, ffi.Int)>>('Resize'); + Mat, Mat, CvSize, ffi.Double, ffi.Double, ffi.Int)>>('Resize'); late final _Resize = _ResizePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Size, double, double, int)>(); + ffi.Pointer Function(Mat, Mat, CvSize, double, double, int)>(); ffi.Pointer Resize_Async( Mat src, - Size sz, + CvSize sz, double fx, double fy, int interp, @@ -5041,11 +5055,11 @@ class CvNativeImgproc { late final _Resize_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Size, ffi.Double, ffi.Double, + ffi.Pointer Function(Mat, CvSize, ffi.Double, ffi.Double, ffi.Int, imp1.CvCallback_1)>>('Resize_Async'); late final _Resize_Async = _Resize_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Size, double, double, int, imp1.CvCallback_1)>(); + Mat, CvSize, double, double, int, imp1.CvCallback_1)>(); ffi.Pointer Scharr( Mat src, @@ -5120,7 +5134,7 @@ class CvNativeImgproc { int ddepth, Mat kernelX, Mat kernelY, - Point anchor, + CvPoint anchor, double delta, int borderType, ) { @@ -5138,18 +5152,18 @@ class CvNativeImgproc { late final _SepFilter2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, Mat, Point, + ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, Mat, CvPoint, ffi.Double, ffi.Int)>>('SepFilter2D'); late final _SepFilter2D = _SepFilter2DPtr.asFunction< ffi.Pointer Function( - Mat, Mat, int, Mat, Mat, Point, double, int)>(); + Mat, Mat, int, Mat, Mat, CvPoint, double, int)>(); ffi.Pointer SepFilter2D_Async( Mat src, int ddepth, Mat kernelX, Mat kernelY, - Point anchor, + CvPoint anchor, double delta, int borderType, imp1.CvCallback_1 callback, @@ -5168,11 +5182,11 @@ class CvNativeImgproc { late final _SepFilter2D_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, Mat, Mat, Point, + ffi.Pointer Function(Mat, ffi.Int, Mat, Mat, CvPoint, ffi.Double, ffi.Int, imp1.CvCallback_1)>>('SepFilter2D_Async'); late final _SepFilter2D_Async = _SepFilter2D_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, int, Mat, Mat, Point, double, int, imp1.CvCallback_1)>(); + Mat, int, Mat, Mat, CvPoint, double, int, imp1.CvCallback_1)>(); ffi.Pointer Sobel( Mat src, @@ -5293,7 +5307,7 @@ class CvNativeImgproc { ffi.Pointer SqBoxFilter_Async( Mat src, int ddepth, - Size ps, + CvSize ps, imp1.CvCallback_1 callback, ) { return _SqBoxFilter_Async( @@ -5307,16 +5321,16 @@ class CvNativeImgproc { late final _SqBoxFilter_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, Size, imp1.CvCallback_1)>>('SqBoxFilter_Async'); + Mat, ffi.Int, CvSize, imp1.CvCallback_1)>>('SqBoxFilter_Async'); late final _SqBoxFilter_Async = _SqBoxFilter_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, Size, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, int, CvSize, imp1.CvCallback_1)>(); ffi.Pointer SqrBoxFilter( Mat src, Mat dst, int ddepth, - Size ps, - Point anchor, + CvSize ps, + CvPoint anchor, bool normalize, int borderType, ) { @@ -5333,10 +5347,11 @@ class CvNativeImgproc { late final _SqrBoxFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, Size, Point, + ffi.Pointer Function(Mat, Mat, ffi.Int, CvSize, CvPoint, ffi.Bool, ffi.Int)>>('SqrBoxFilter'); late final _SqrBoxFilter = _SqrBoxFilterPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, Size, Point, bool, int)>(); + ffi.Pointer Function( + Mat, Mat, int, CvSize, CvPoint, bool, int)>(); void Subdiv2D_Close( Subdiv2DPtr self, @@ -5372,7 +5387,7 @@ class CvNativeImgproc { ffi.Pointer Subdiv2D_EdgeDst( Subdiv2D self, int edge, - ffi.Pointer dstpt, + ffi.Pointer dstpt, ffi.Pointer rval, ) { return _Subdiv2D_EdgeDst( @@ -5385,11 +5400,14 @@ class CvNativeImgproc { late final _Subdiv2D_EdgeDstPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, ffi.Int, - ffi.Pointer, ffi.Pointer)>>('Subdiv2D_EdgeDst'); + ffi.Pointer Function( + Subdiv2D, + ffi.Int, + ffi.Pointer, + ffi.Pointer)>>('Subdiv2D_EdgeDst'); late final _Subdiv2D_EdgeDst = _Subdiv2D_EdgeDstPtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); + Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer Subdiv2D_EdgeDst_Async( Subdiv2D self, @@ -5413,7 +5431,7 @@ class CvNativeImgproc { ffi.Pointer Subdiv2D_EdgeOrg( Subdiv2D self, int edge, - ffi.Pointer orgpt, + ffi.Pointer orgpt, ffi.Pointer rval, ) { return _Subdiv2D_EdgeOrg( @@ -5426,11 +5444,14 @@ class CvNativeImgproc { late final _Subdiv2D_EdgeOrgPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, ffi.Int, - ffi.Pointer, ffi.Pointer)>>('Subdiv2D_EdgeOrg'); + ffi.Pointer Function( + Subdiv2D, + ffi.Int, + ffi.Pointer, + ffi.Pointer)>>('Subdiv2D_EdgeOrg'); late final _Subdiv2D_EdgeOrg = _Subdiv2D_EdgeOrgPtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); + Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer Subdiv2D_EdgeOrg_Async( Subdiv2D self, @@ -5453,8 +5474,8 @@ class CvNativeImgproc { ffi.Pointer Subdiv2D_FindNearest( Subdiv2D self, - Point2f pt, - ffi.Pointer nearestPt, + CvPoint2f pt, + ffi.Pointer nearestPt, ffi.Pointer rval, ) { return _Subdiv2D_FindNearest( @@ -5469,16 +5490,16 @@ class CvNativeImgproc { ffi.NativeFunction< ffi.Pointer Function( Subdiv2D, - Point2f, - ffi.Pointer, + CvPoint2f, + ffi.Pointer, ffi.Pointer)>>('Subdiv2D_FindNearest'); late final _Subdiv2D_FindNearest = _Subdiv2D_FindNearestPtr.asFunction< ffi.Pointer Function( - Subdiv2D, Point2f, ffi.Pointer, ffi.Pointer)>(); + Subdiv2D, CvPoint2f, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer Subdiv2D_FindNearest_Async( Subdiv2D self, - Point2f pt, + CvPoint2f pt, imp1.CvCallback_2 callback, ) { return _Subdiv2D_FindNearest_Async( @@ -5490,12 +5511,12 @@ class CvNativeImgproc { late final _Subdiv2D_FindNearest_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, Point2f, + ffi.Pointer Function(Subdiv2D, CvPoint2f, imp1.CvCallback_2)>>('Subdiv2D_FindNearest_Async'); late final _Subdiv2D_FindNearest_Async = _Subdiv2D_FindNearest_AsyncPtr.asFunction< ffi.Pointer Function( - Subdiv2D, Point2f, imp1.CvCallback_2)>(); + Subdiv2D, CvPoint2f, imp1.CvCallback_2)>(); ffi.Pointer Subdiv2D_GetEdge( Subdiv2D self, @@ -5522,7 +5543,7 @@ class CvNativeImgproc { ffi.Pointer Subdiv2D_GetEdgeList( Subdiv2D self, ffi.Pointer> rval, - ffi.Pointer size, + ffi.Pointer size, ) { return _Subdiv2D_GetEdgeList( self, @@ -5536,10 +5557,10 @@ class CvNativeImgproc { ffi.Pointer Function( Subdiv2D, ffi.Pointer>, - ffi.Pointer)>>('Subdiv2D_GetEdgeList'); + ffi.Pointer)>>('Subdiv2D_GetEdgeList'); late final _Subdiv2D_GetEdgeList = _Subdiv2D_GetEdgeListPtr.asFunction< ffi.Pointer Function( - Subdiv2D, ffi.Pointer>, ffi.Pointer)>(); + Subdiv2D, ffi.Pointer>, ffi.Pointer)>(); ffi.Pointer Subdiv2D_GetEdgeList_Async( Subdiv2D self, @@ -5619,7 +5640,7 @@ class CvNativeImgproc { ffi.Pointer Subdiv2D_GetTriangleList( Subdiv2D self, ffi.Pointer> rval, - ffi.Pointer size, + ffi.Pointer size, ) { return _Subdiv2D_GetTriangleList( self, @@ -5633,11 +5654,11 @@ class CvNativeImgproc { ffi.Pointer Function( Subdiv2D, ffi.Pointer>, - ffi.Pointer)>>('Subdiv2D_GetTriangleList'); + ffi.Pointer)>>('Subdiv2D_GetTriangleList'); late final _Subdiv2D_GetTriangleList = _Subdiv2D_GetTriangleListPtr.asFunction< ffi.Pointer Function(Subdiv2D, - ffi.Pointer>, ffi.Pointer)>(); + ffi.Pointer>, ffi.Pointer)>(); ffi.Pointer Subdiv2D_GetTriangleList_Async( Subdiv2D self, @@ -5661,7 +5682,7 @@ class CvNativeImgproc { Subdiv2D self, int vertex, ffi.Pointer firstEdge, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _Subdiv2D_GetVertex( self, @@ -5677,10 +5698,10 @@ class CvNativeImgproc { Subdiv2D, ffi.Int, ffi.Pointer, - ffi.Pointer)>>('Subdiv2D_GetVertex'); + ffi.Pointer)>>('Subdiv2D_GetVertex'); late final _Subdiv2D_GetVertex = _Subdiv2D_GetVertexPtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); + Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer Subdiv2D_GetVertex_Async( Subdiv2D self, @@ -5751,7 +5772,7 @@ class CvNativeImgproc { ffi.Pointer Subdiv2D_InitDelaunay( Subdiv2D self, - Rect rect, + CvRect rect, ) { return _Subdiv2D_InitDelaunay( self, @@ -5760,14 +5781,14 @@ class CvNativeImgproc { } late final _Subdiv2D_InitDelaunayPtr = _lookup< - ffi.NativeFunction Function(Subdiv2D, Rect)>>( + ffi.NativeFunction Function(Subdiv2D, CvRect)>>( 'Subdiv2D_InitDelaunay'); late final _Subdiv2D_InitDelaunay = _Subdiv2D_InitDelaunayPtr.asFunction< - ffi.Pointer Function(Subdiv2D, Rect)>(); + ffi.Pointer Function(Subdiv2D, CvRect)>(); ffi.Pointer Subdiv2D_InitDelaunay_Async( Subdiv2D self, - Rect rect, + CvRect rect, imp1.CvCallback_0 callback, ) { return _Subdiv2D_InitDelaunay_Async( @@ -5779,15 +5800,16 @@ class CvNativeImgproc { late final _Subdiv2D_InitDelaunay_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, Rect, + ffi.Pointer Function(Subdiv2D, CvRect, imp1.CvCallback_0)>>('Subdiv2D_InitDelaunay_Async'); late final _Subdiv2D_InitDelaunay_Async = _Subdiv2D_InitDelaunay_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, Rect, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Subdiv2D, CvRect, imp1.CvCallback_0)>(); ffi.Pointer Subdiv2D_Insert( Subdiv2D self, - Point2f pt, + CvPoint2f pt, ffi.Pointer rval, ) { return _Subdiv2D_Insert( @@ -5800,10 +5822,10 @@ class CvNativeImgproc { late final _Subdiv2D_InsertPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Subdiv2D, Point2f, ffi.Pointer)>>('Subdiv2D_Insert'); + Subdiv2D, CvPoint2f, ffi.Pointer)>>('Subdiv2D_Insert'); late final _Subdiv2D_Insert = _Subdiv2D_InsertPtr.asFunction< ffi.Pointer Function( - Subdiv2D, Point2f, ffi.Pointer)>(); + Subdiv2D, CvPoint2f, ffi.Pointer)>(); ffi.Pointer Subdiv2D_InsertVec( Subdiv2D self, @@ -5845,7 +5867,7 @@ class CvNativeImgproc { ffi.Pointer Subdiv2D_Insert_Async( Subdiv2D self, - Point2f pt, + CvPoint2f pt, imp1.CvCallback_1 callback, ) { return _Subdiv2D_Insert_Async( @@ -5857,14 +5879,14 @@ class CvNativeImgproc { late final _Subdiv2D_Insert_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, Point2f, imp1.CvCallback_1)>>('Subdiv2D_Insert_Async'); + ffi.Pointer Function(Subdiv2D, CvPoint2f, + imp1.CvCallback_1)>>('Subdiv2D_Insert_Async'); late final _Subdiv2D_Insert_Async = _Subdiv2D_Insert_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, Point2f, imp1.CvCallback_1)>(); + ffi.Pointer Function(Subdiv2D, CvPoint2f, imp1.CvCallback_1)>(); ffi.Pointer Subdiv2D_Locate( Subdiv2D self, - Point2f pt, + CvPoint2f pt, ffi.Pointer edge, ffi.Pointer vertex, ffi.Pointer rval, @@ -5882,17 +5904,17 @@ class CvNativeImgproc { ffi.NativeFunction< ffi.Pointer Function( Subdiv2D, - Point2f, + CvPoint2f, ffi.Pointer, ffi.Pointer, ffi.Pointer)>>('Subdiv2D_Locate'); late final _Subdiv2D_Locate = _Subdiv2D_LocatePtr.asFunction< - ffi.Pointer Function(Subdiv2D, Point2f, ffi.Pointer, + ffi.Pointer Function(Subdiv2D, CvPoint2f, ffi.Pointer, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer Subdiv2D_Locate_Async( Subdiv2D self, - Point2f pt, + CvPoint2f pt, imp1.CvCallback_3 callback, ) { return _Subdiv2D_Locate_Async( @@ -5904,10 +5926,10 @@ class CvNativeImgproc { late final _Subdiv2D_Locate_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, Point2f, imp1.CvCallback_3)>>('Subdiv2D_Locate_Async'); + ffi.Pointer Function(Subdiv2D, CvPoint2f, + imp1.CvCallback_3)>>('Subdiv2D_Locate_Async'); late final _Subdiv2D_Locate_Async = _Subdiv2D_Locate_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, Point2f, imp1.CvCallback_3)>(); + ffi.Pointer Function(Subdiv2D, CvPoint2f, imp1.CvCallback_3)>(); ffi.Pointer Subdiv2D_NewEmpty( ffi.Pointer rval, @@ -5940,7 +5962,7 @@ class CvNativeImgproc { ffi.Pointer Function(imp1.CvCallback_1)>(); ffi.Pointer Subdiv2D_NewWithRect( - Rect rect, + CvRect rect, ffi.Pointer rval, ) { return _Subdiv2D_NewWithRect( @@ -5952,12 +5974,12 @@ class CvNativeImgproc { late final _Subdiv2D_NewWithRectPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Rect, ffi.Pointer)>>('Subdiv2D_NewWithRect'); + CvRect, ffi.Pointer)>>('Subdiv2D_NewWithRect'); late final _Subdiv2D_NewWithRect = _Subdiv2D_NewWithRectPtr.asFunction< - ffi.Pointer Function(Rect, ffi.Pointer)>(); + ffi.Pointer Function(CvRect, ffi.Pointer)>(); ffi.Pointer Subdiv2D_NewWithRect_Async( - Rect rect, + CvRect rect, imp1.CvCallback_1 callback, ) { return _Subdiv2D_NewWithRect_Async( @@ -5969,9 +5991,9 @@ class CvNativeImgproc { late final _Subdiv2D_NewWithRect_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Rect, imp1.CvCallback_1)>>('Subdiv2D_NewWithRect_Async'); + CvRect, imp1.CvCallback_1)>>('Subdiv2D_NewWithRect_Async'); late final _Subdiv2D_NewWithRect_Async = _Subdiv2D_NewWithRect_AsyncPtr - .asFunction Function(Rect, imp1.CvCallback_1)>(); + .asFunction Function(CvRect, imp1.CvCallback_1)>(); ffi.Pointer Subdiv2D_NextEdge( Subdiv2D self, @@ -6148,7 +6170,7 @@ class CvNativeImgproc { Mat src, Mat dst, Mat rot_mat, - Size dsize, + CvSize dsize, ) { return _WarpAffine( src, @@ -6160,15 +6182,15 @@ class CvNativeImgproc { late final _WarpAffinePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Size)>>('WarpAffine'); + ffi.Pointer Function(Mat, Mat, Mat, CvSize)>>('WarpAffine'); late final _WarpAffine = _WarpAffinePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Size)>(); + ffi.Pointer Function(Mat, Mat, Mat, CvSize)>(); ffi.Pointer WarpAffineWithParams( Mat src, Mat dst, Mat rot_mat, - Size dsize, + CvSize dsize, int flags, int borderMode, Scalar borderValue, @@ -6186,15 +6208,16 @@ class CvNativeImgproc { late final _WarpAffineWithParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Size, ffi.Int, ffi.Int, - Scalar)>>('WarpAffineWithParams'); + ffi.Pointer Function(Mat, Mat, Mat, CvSize, ffi.Int, + ffi.Int, Scalar)>>('WarpAffineWithParams'); late final _WarpAffineWithParams = _WarpAffineWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Size, int, int, Scalar)>(); + ffi.Pointer Function( + Mat, Mat, Mat, CvSize, int, int, Scalar)>(); ffi.Pointer WarpAffineWithParams_Async( Mat src, Mat rot_mat, - Size dsize, + CvSize dsize, int flags, int borderMode, Scalar borderValue, @@ -6213,17 +6236,17 @@ class CvNativeImgproc { late final _WarpAffineWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Size, ffi.Int, ffi.Int, + ffi.Pointer Function(Mat, Mat, CvSize, ffi.Int, ffi.Int, Scalar, imp1.CvCallback_1)>>('WarpAffineWithParams_Async'); late final _WarpAffineWithParams_Async = _WarpAffineWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Size, int, int, Scalar, imp1.CvCallback_1)>(); + Mat, Mat, CvSize, int, int, Scalar, imp1.CvCallback_1)>(); ffi.Pointer WarpAffine_Async( Mat src, Mat rot_mat, - Size dsize, + CvSize dsize, imp1.CvCallback_1 callback, ) { return _WarpAffine_Async( @@ -6237,15 +6260,15 @@ class CvNativeImgproc { late final _WarpAffine_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Size, imp1.CvCallback_1)>>('WarpAffine_Async'); + Mat, Mat, CvSize, imp1.CvCallback_1)>>('WarpAffine_Async'); late final _WarpAffine_Async = _WarpAffine_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Size, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, CvSize, imp1.CvCallback_1)>(); ffi.Pointer WarpPerspective( Mat src, Mat dst, Mat m, - Size dsize, + CvSize dsize, ) { return _WarpPerspective( src, @@ -6256,17 +6279,17 @@ class CvNativeImgproc { } late final _WarpPerspectivePtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Mat, Size)>>( - 'WarpPerspective'); + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, Mat, CvSize)>>('WarpPerspective'); late final _WarpPerspective = _WarpPerspectivePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Size)>(); + ffi.Pointer Function(Mat, Mat, Mat, CvSize)>(); ffi.Pointer WarpPerspectiveWithParams( Mat src, Mat dst, Mat rot_mat, - Size dsize, + CvSize dsize, int flags, int borderMode, Scalar borderValue, @@ -6284,17 +6307,17 @@ class CvNativeImgproc { late final _WarpPerspectiveWithParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Size, ffi.Int, ffi.Int, - Scalar)>>('WarpPerspectiveWithParams'); + ffi.Pointer Function(Mat, Mat, Mat, CvSize, ffi.Int, + ffi.Int, Scalar)>>('WarpPerspectiveWithParams'); late final _WarpPerspectiveWithParams = _WarpPerspectiveWithParamsPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, Size, int, int, Scalar)>(); + Mat, Mat, Mat, CvSize, int, int, Scalar)>(); ffi.Pointer WarpPerspectiveWithParams_Async( Mat src, Mat rot_mat, - Size dsize, + CvSize dsize, int flags, int borderMode, Scalar borderValue, @@ -6313,17 +6336,17 @@ class CvNativeImgproc { late final _WarpPerspectiveWithParams_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Size, ffi.Int, ffi.Int, + ffi.Pointer Function(Mat, Mat, CvSize, ffi.Int, ffi.Int, Scalar, imp1.CvCallback_1)>>('WarpPerspectiveWithParams_Async'); late final _WarpPerspectiveWithParams_Async = _WarpPerspectiveWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Size, int, int, Scalar, imp1.CvCallback_1)>(); + Mat, Mat, CvSize, int, int, Scalar, imp1.CvCallback_1)>(); ffi.Pointer WarpPerspective_Async( Mat src, Mat m, - Size dsize, + CvSize dsize, imp1.CvCallback_1 callback, ) { return _WarpPerspective_Async( @@ -6337,9 +6360,9 @@ class CvNativeImgproc { late final _WarpPerspective_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Size, imp1.CvCallback_1)>>('WarpPerspective_Async'); + Mat, Mat, CvSize, imp1.CvCallback_1)>>('WarpPerspective_Async'); late final _WarpPerspective_Async = _WarpPerspective_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Size, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, CvSize, imp1.CvCallback_1)>(); ffi.Pointer Watershed( Mat image, @@ -6399,15 +6422,15 @@ final class CLAHE extends ffi.Struct { } typedef CLAHEPtr = ffi.Pointer; +typedef CvPoint = imp1.CvPoint; +typedef CvPoint2f = imp1.CvPoint2f; +typedef CvRect = imp1.CvRect; +typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; typedef Mat = imp1.Mat; typedef Moment = imp1.Moment; -typedef Point = imp1.Point; -typedef Point2f = imp1.Point2f; -typedef Rect = imp1.Rect; typedef RotatedRect = imp1.RotatedRect; typedef Scalar = imp1.Scalar; -typedef Size = imp1.Size; final class Subdiv2D extends ffi.Struct { external ffi.Pointer ptr; diff --git a/lib/src/g/imgproc.yaml b/packages/dartcv/lib/src/g/imgproc.yaml similarity index 98% rename from lib/src/g/imgproc.yaml rename to packages/dartcv/lib/src/g/imgproc.yaml index 5d72394d..540e43ff 100644 --- a/lib/src/g/imgproc.yaml +++ b/packages/dartcv/lib/src/g/imgproc.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/imgproc.g.dart: + package:dartcv/src/g/imgproc.g.dart: used-config: ffi-native: false symbols: @@ -548,24 +548,24 @@ files: name: CLAHEPtr c:imgproc.h@T@Subdiv2DPtr: name: Subdiv2DPtr + c:types.h@T@CvPoint: + name: CvPoint + c:types.h@T@CvPoint2f: + name: CvPoint2f + c:types.h@T@CvRect: + name: CvRect + c:types.h@T@CvSize: + name: CvSize c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat c:types.h@T@Moment: name: Moment - c:types.h@T@Point: - name: Point - c:types.h@T@Point2f: - name: Point2f - c:types.h@T@Rect: - name: Rect c:types.h@T@RotatedRect: name: RotatedRect c:types.h@T@Scalar: name: Scalar - c:types.h@T@Size: - name: Size c:types.h@T@TermCriteria: name: TermCriteria c:types.h@T@Vec4f: diff --git a/lib/src/g/objdetect.g.dart b/packages/dartcv/lib/src/g/objdetect.g.dart similarity index 95% rename from lib/src/g/objdetect.g.dart rename to packages/dartcv/lib/src/g/objdetect.g.dart index 66a48dc2..ddb4d865 100644 --- a/lib/src/g/objdetect.g.dart +++ b/packages/dartcv/lib/src/g/objdetect.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Objdetect /// @@ -73,8 +73,8 @@ class CvNativeObjdetect { double scaleFactor, int minNeighbors, int flags, - Size minSize, - Size maxSize, + CvSize minSize, + CvSize maxSize, ) { return _CascadeClassifier_DetectMultiScale2( self, @@ -99,8 +99,8 @@ class CvNativeObjdetect { ffi.Double, ffi.Int, ffi.Int, - Size, - Size)>>('CascadeClassifier_DetectMultiScale2'); + CvSize, + CvSize)>>('CascadeClassifier_DetectMultiScale2'); late final _CascadeClassifier_DetectMultiScale2 = _CascadeClassifier_DetectMultiScale2Ptr.asFunction< ffi.Pointer Function( @@ -111,8 +111,8 @@ class CvNativeObjdetect { double, int, int, - Size, - Size)>(); + CvSize, + CvSize)>(); ffi.Pointer CascadeClassifier_DetectMultiScale2_Async( CascadeClassifier self, @@ -120,8 +120,8 @@ class CvNativeObjdetect { double scaleFactor, int minNeighbors, int flags, - Size minSize, - Size maxSize, + CvSize minSize, + CvSize maxSize, imp1.CvCallback_2 callback, ) { return _CascadeClassifier_DetectMultiScale2_Async( @@ -144,13 +144,13 @@ class CvNativeObjdetect { ffi.Double, ffi.Int, ffi.Int, - Size, - Size, + CvSize, + CvSize, imp1.CvCallback_2)>>('CascadeClassifier_DetectMultiScale2_Async'); late final _CascadeClassifier_DetectMultiScale2_Async = _CascadeClassifier_DetectMultiScale2_AsyncPtr.asFunction< ffi.Pointer Function(CascadeClassifier, Mat, double, int, - int, Size, Size, imp1.CvCallback_2)>(); + int, CvSize, CvSize, imp1.CvCallback_2)>(); ffi.Pointer CascadeClassifier_DetectMultiScale3( CascadeClassifier self, @@ -161,8 +161,8 @@ class CvNativeObjdetect { double scaleFactor, int minNeighbors, int flags, - Size minSize, - Size maxSize, + CvSize minSize, + CvSize maxSize, bool outputRejectLevels, ) { return _CascadeClassifier_DetectMultiScale3( @@ -191,8 +191,8 @@ class CvNativeObjdetect { ffi.Double, ffi.Int, ffi.Int, - Size, - Size, + CvSize, + CvSize, ffi.Bool)>>('CascadeClassifier_DetectMultiScale3'); late final _CascadeClassifier_DetectMultiScale3 = _CascadeClassifier_DetectMultiScale3Ptr.asFunction< @@ -205,8 +205,8 @@ class CvNativeObjdetect { double, int, int, - Size, - Size, + CvSize, + CvSize, bool)>(); ffi.Pointer CascadeClassifier_DetectMultiScale3_Async( @@ -215,8 +215,8 @@ class CvNativeObjdetect { double scaleFactor, int minNeighbors, int flags, - Size minSize, - Size maxSize, + CvSize minSize, + CvSize maxSize, bool outputRejectLevels, imp1.CvCallback_3 callback, ) { @@ -241,14 +241,14 @@ class CvNativeObjdetect { ffi.Double, ffi.Int, ffi.Int, - Size, - Size, + CvSize, + CvSize, ffi.Bool, imp1.CvCallback_3)>>('CascadeClassifier_DetectMultiScale3_Async'); late final _CascadeClassifier_DetectMultiScale3_Async = _CascadeClassifier_DetectMultiScale3_AsyncPtr.asFunction< ffi.Pointer Function(CascadeClassifier, Mat, double, int, - int, Size, Size, bool, imp1.CvCallback_3)>(); + int, CvSize, CvSize, bool, imp1.CvCallback_3)>(); ffi.Pointer CascadeClassifier_DetectMultiScaleWithParams( CascadeClassifier self, @@ -257,8 +257,8 @@ class CvNativeObjdetect { double scale, int minNeighbors, int flags, - Size minSize, - Size maxSize, + CvSize minSize, + CvSize maxSize, ) { return _CascadeClassifier_DetectMultiScaleWithParams( self, @@ -281,12 +281,12 @@ class CvNativeObjdetect { ffi.Double, ffi.Int, ffi.Int, - Size, - Size)>>('CascadeClassifier_DetectMultiScaleWithParams'); + CvSize, + CvSize)>>('CascadeClassifier_DetectMultiScaleWithParams'); late final _CascadeClassifier_DetectMultiScaleWithParams = _CascadeClassifier_DetectMultiScaleWithParamsPtr.asFunction< ffi.Pointer Function(CascadeClassifier, Mat, - ffi.Pointer, double, int, int, Size, Size)>(); + ffi.Pointer, double, int, int, CvSize, CvSize)>(); ffi.Pointer CascadeClassifier_DetectMultiScaleWithParams_Async( CascadeClassifier self, @@ -294,8 +294,8 @@ class CvNativeObjdetect { double scale, int minNeighbors, int flags, - Size minSize, - Size maxSize, + CvSize minSize, + CvSize maxSize, imp1.CvCallback_1 callback, ) { return _CascadeClassifier_DetectMultiScaleWithParams_Async( @@ -313,12 +313,12 @@ class CvNativeObjdetect { late final _CascadeClassifier_DetectMultiScaleWithParams_AsyncPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(CascadeClassifier, Mat, ffi.Double, - ffi.Int, ffi.Int, Size, Size, imp1.CvCallback_1)>>( + ffi.Int, ffi.Int, CvSize, CvSize, imp1.CvCallback_1)>>( 'CascadeClassifier_DetectMultiScaleWithParams_Async'); late final _CascadeClassifier_DetectMultiScaleWithParams_Async = _CascadeClassifier_DetectMultiScaleWithParams_AsyncPtr.asFunction< ffi.Pointer Function(CascadeClassifier, Mat, double, int, - int, Size, Size, imp1.CvCallback_1)>(); + int, CvSize, CvSize, imp1.CvCallback_1)>(); ffi.Pointer CascadeClassifier_DetectMultiScale_Async( CascadeClassifier self, @@ -532,7 +532,7 @@ class CvNativeObjdetect { ffi.Pointer CascadeClassifier_getOriginalWindowSize( CascadeClassifier self, - ffi.Pointer rval, + ffi.Pointer rval, ) { return _CascadeClassifier_getOriginalWindowSize( self, @@ -543,11 +543,11 @@ class CvNativeObjdetect { late final _CascadeClassifier_getOriginalWindowSizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(CascadeClassifier, - ffi.Pointer)>>('CascadeClassifier_getOriginalWindowSize'); + ffi.Pointer)>>('CascadeClassifier_getOriginalWindowSize'); late final _CascadeClassifier_getOriginalWindowSize = _CascadeClassifier_getOriginalWindowSizePtr.asFunction< ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + CascadeClassifier, ffi.Pointer)>(); ffi.Pointer CascadeClassifier_getOriginalWindowSize_Async( CascadeClassifier self, @@ -664,7 +664,7 @@ class CvNativeObjdetect { ffi.Pointer FaceDetectorYN_GetInputSize( FaceDetectorYN self, - ffi.Pointer input_size, + ffi.Pointer input_size, ) { return _FaceDetectorYN_GetInputSize( self, @@ -675,10 +675,11 @@ class CvNativeObjdetect { late final _FaceDetectorYN_GetInputSizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(FaceDetectorYN, - ffi.Pointer)>>('FaceDetectorYN_GetInputSize'); + ffi.Pointer)>>('FaceDetectorYN_GetInputSize'); late final _FaceDetectorYN_GetInputSize = _FaceDetectorYN_GetInputSizePtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, ffi.Pointer)>(); + ffi.Pointer Function( + FaceDetectorYN, ffi.Pointer)>(); ffi.Pointer FaceDetectorYN_GetInputSize_Async( FaceDetectorYN self, @@ -810,7 +811,7 @@ class CvNativeObjdetect { ffi.Pointer FaceDetectorYN_New( ffi.Pointer model, ffi.Pointer config, - Size input_size, + CvSize input_size, double score_threshold, double nms_threshold, int top_k, @@ -836,7 +837,7 @@ class CvNativeObjdetect { ffi.Pointer Function( ffi.Pointer, ffi.Pointer, - Size, + CvSize, ffi.Float, ffi.Float, ffi.Int, @@ -847,7 +848,7 @@ class CvNativeObjdetect { ffi.Pointer Function( ffi.Pointer, ffi.Pointer, - Size, + CvSize, double, double, int, @@ -859,7 +860,7 @@ class CvNativeObjdetect { ffi.Pointer framework, VecUChar buffer, VecUChar buffer_config, - Size input_size, + CvSize input_size, double score_threshold, double nms_threshold, int top_k, @@ -887,7 +888,7 @@ class CvNativeObjdetect { ffi.Pointer, VecUChar, VecUChar, - Size, + CvSize, ffi.Float, ffi.Float, ffi.Int, @@ -900,7 +901,7 @@ class CvNativeObjdetect { ffi.Pointer, VecUChar, VecUChar, - Size, + CvSize, double, double, int, @@ -912,7 +913,7 @@ class CvNativeObjdetect { ffi.Pointer framework, VecUChar buffer, VecUChar buffer_config, - Size input_size, + CvSize input_size, double score_threshold, double nms_threshold, int top_k, @@ -940,7 +941,7 @@ class CvNativeObjdetect { ffi.Pointer, VecUChar, VecUChar, - Size, + CvSize, ffi.Float, ffi.Float, ffi.Int, @@ -953,7 +954,7 @@ class CvNativeObjdetect { ffi.Pointer, VecUChar, VecUChar, - Size, + CvSize, double, double, int, @@ -964,7 +965,7 @@ class CvNativeObjdetect { ffi.Pointer FaceDetectorYN_New_Async( ffi.Pointer model, ffi.Pointer config, - Size input_size, + CvSize input_size, double score_threshold, double nms_threshold, int top_k, @@ -990,7 +991,7 @@ class CvNativeObjdetect { ffi.Pointer Function( ffi.Pointer, ffi.Pointer, - Size, + CvSize, ffi.Float, ffi.Float, ffi.Int, @@ -1002,7 +1003,7 @@ class CvNativeObjdetect { ffi.Pointer Function( ffi.Pointer, ffi.Pointer, - Size, + CvSize, double, double, int, @@ -1012,7 +1013,7 @@ class CvNativeObjdetect { ffi.Pointer FaceDetectorYN_SetInputSize( FaceDetectorYN self, - Size input_size, + CvSize input_size, ) { return _FaceDetectorYN_SetInputSize( self, @@ -1023,13 +1024,13 @@ class CvNativeObjdetect { late final _FaceDetectorYN_SetInputSizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - FaceDetectorYN, Size)>>('FaceDetectorYN_SetInputSize'); + FaceDetectorYN, CvSize)>>('FaceDetectorYN_SetInputSize'); late final _FaceDetectorYN_SetInputSize = _FaceDetectorYN_SetInputSizePtr - .asFunction Function(FaceDetectorYN, Size)>(); + .asFunction Function(FaceDetectorYN, CvSize)>(); ffi.Pointer FaceDetectorYN_SetInputSize_Async( FaceDetectorYN self, - Size input_size, + CvSize input_size, imp1.CvCallback_0 callback, ) { return _FaceDetectorYN_SetInputSize_Async( @@ -1041,12 +1042,12 @@ class CvNativeObjdetect { late final _FaceDetectorYN_SetInputSize_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, Size, + ffi.Pointer Function(FaceDetectorYN, CvSize, imp1.CvCallback_0)>>('FaceDetectorYN_SetInputSize_Async'); late final _FaceDetectorYN_SetInputSize_Async = _FaceDetectorYN_SetInputSize_AsyncPtr.asFunction< ffi.Pointer Function( - FaceDetectorYN, Size, imp1.CvCallback_0)>(); + FaceDetectorYN, CvSize, imp1.CvCallback_0)>(); ffi.Pointer FaceDetectorYN_SetNMSThreshold( FaceDetectorYN self, @@ -1435,8 +1436,8 @@ class CvNativeObjdetect { HOGDescriptor self, Mat img, ffi.Pointer descriptors, - Size winStride, - Size padding, + CvSize winStride, + CvSize padding, ffi.Pointer locations, ) { return _HOGDescriptor_Compute( @@ -1455,18 +1456,18 @@ class CvNativeObjdetect { HOGDescriptor, Mat, ffi.Pointer, - Size, - Size, + CvSize, + CvSize, ffi.Pointer)>>('HOGDescriptor_Compute'); late final _HOGDescriptor_Compute = _HOGDescriptor_ComputePtr.asFunction< ffi.Pointer Function(HOGDescriptor, Mat, ffi.Pointer, - Size, Size, ffi.Pointer)>(); + CvSize, CvSize, ffi.Pointer)>(); ffi.Pointer HOGDescriptor_Compute_Async( HOGDescriptor self, Mat img, - Size winStride, - Size padding, + CvSize winStride, + CvSize padding, imp1.CvCallback_2 callback, ) { return _HOGDescriptor_Compute_Async( @@ -1480,12 +1481,12 @@ class CvNativeObjdetect { late final _HOGDescriptor_Compute_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, Size, Size, + ffi.Pointer Function(HOGDescriptor, Mat, CvSize, CvSize, imp1.CvCallback_2)>>('HOGDescriptor_Compute_Async'); late final _HOGDescriptor_Compute_Async = _HOGDescriptor_Compute_AsyncPtr.asFunction< ffi.Pointer Function( - HOGDescriptor, Mat, Size, Size, imp1.CvCallback_2)>(); + HOGDescriptor, Mat, CvSize, CvSize, imp1.CvCallback_2)>(); ffi.Pointer HOGDescriptor_Detect( HOGDescriptor self, @@ -1493,8 +1494,8 @@ class CvNativeObjdetect { ffi.Pointer foundLocations, ffi.Pointer weights, double hitThresh, - Size winStride, - Size padding, + CvSize winStride, + CvSize padding, ffi.Pointer searchLocations, ) { return _HOGDescriptor_Detect( @@ -1517,20 +1518,27 @@ class CvNativeObjdetect { ffi.Pointer, ffi.Pointer, ffi.Double, - Size, - Size, + CvSize, + CvSize, ffi.Pointer)>>('HOGDescriptor_Detect'); late final _HOGDescriptor_Detect = _HOGDescriptor_DetectPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, Mat, ffi.Pointer, - ffi.Pointer, double, Size, Size, ffi.Pointer)>(); + ffi.Pointer Function( + HOGDescriptor, + Mat, + ffi.Pointer, + ffi.Pointer, + double, + CvSize, + CvSize, + ffi.Pointer)>(); ffi.Pointer HOGDescriptor_Detect2( HOGDescriptor self, Mat img, ffi.Pointer foundLocations, double hitThresh, - Size winStride, - Size padding, + CvSize winStride, + CvSize padding, ffi.Pointer searchLocations, ) { return _HOGDescriptor_Detect2( @@ -1551,19 +1559,19 @@ class CvNativeObjdetect { Mat, ffi.Pointer, ffi.Double, - Size, - Size, + CvSize, + CvSize, ffi.Pointer)>>('HOGDescriptor_Detect2'); late final _HOGDescriptor_Detect2 = _HOGDescriptor_Detect2Ptr.asFunction< ffi.Pointer Function(HOGDescriptor, Mat, ffi.Pointer, - double, Size, Size, ffi.Pointer)>(); + double, CvSize, CvSize, ffi.Pointer)>(); ffi.Pointer HOGDescriptor_Detect2_Async( HOGDescriptor self, Mat img, double hitThresh, - Size winStride, - Size padding, + CvSize winStride, + CvSize padding, imp1.CvCallback_2 callback, ) { return _HOGDescriptor_Detect2_Async( @@ -1578,12 +1586,12 @@ class CvNativeObjdetect { late final _HOGDescriptor_Detect2_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, ffi.Double, Size, - Size, imp1.CvCallback_2)>>('HOGDescriptor_Detect2_Async'); + ffi.Pointer Function(HOGDescriptor, Mat, ffi.Double, CvSize, + CvSize, imp1.CvCallback_2)>>('HOGDescriptor_Detect2_Async'); late final _HOGDescriptor_Detect2_Async = _HOGDescriptor_Detect2_AsyncPtr.asFunction< ffi.Pointer Function( - HOGDescriptor, Mat, double, Size, Size, imp1.CvCallback_2)>(); + HOGDescriptor, Mat, double, CvSize, CvSize, imp1.CvCallback_2)>(); ffi.Pointer HOGDescriptor_DetectMultiScale( HOGDescriptor self, @@ -1610,8 +1618,8 @@ class CvNativeObjdetect { HOGDescriptor self, Mat img, double hitThresh, - Size winStride, - Size padding, + CvSize winStride, + CvSize padding, double scale, double finalThreshold, bool useMeanshiftGrouping, @@ -1636,8 +1644,8 @@ class CvNativeObjdetect { HOGDescriptor, Mat, ffi.Double, - Size, - Size, + CvSize, + CvSize, ffi.Double, ffi.Double, ffi.Bool, @@ -1645,15 +1653,15 @@ class CvNativeObjdetect { 'HOGDescriptor_DetectMultiScaleWithParams'); late final _HOGDescriptor_DetectMultiScaleWithParams = _HOGDescriptor_DetectMultiScaleWithParamsPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, Mat, double, Size, Size, - double, double, bool, ffi.Pointer)>(); + ffi.Pointer Function(HOGDescriptor, Mat, double, CvSize, + CvSize, double, double, bool, ffi.Pointer)>(); ffi.Pointer HOGDescriptor_DetectMultiScaleWithParams_Async( HOGDescriptor self, Mat img, double hitThresh, - Size winStride, - Size padding, + CvSize winStride, + CvSize padding, double scale, double finalThreshold, bool useMeanshiftGrouping, @@ -1678,8 +1686,8 @@ class CvNativeObjdetect { HOGDescriptor, Mat, ffi.Double, - Size, - Size, + CvSize, + CvSize, ffi.Double, ffi.Double, ffi.Bool, @@ -1687,8 +1695,8 @@ class CvNativeObjdetect { 'HOGDescriptor_DetectMultiScaleWithParams_Async'); late final _HOGDescriptor_DetectMultiScaleWithParams_Async = _HOGDescriptor_DetectMultiScaleWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, Mat, double, Size, Size, - double, double, bool, imp1.CvCallback_1)>(); + ffi.Pointer Function(HOGDescriptor, Mat, double, CvSize, + CvSize, double, double, bool, imp1.CvCallback_1)>(); ffi.Pointer HOGDescriptor_DetectMultiScale_Async( HOGDescriptor self, @@ -1715,8 +1723,8 @@ class CvNativeObjdetect { HOGDescriptor self, Mat img, double hitThresh, - Size winStride, - Size padding, + CvSize winStride, + CvSize padding, imp1.CvCallback_3 callback, ) { return _HOGDescriptor_Detect_Async( @@ -1731,12 +1739,12 @@ class CvNativeObjdetect { late final _HOGDescriptor_Detect_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, ffi.Double, Size, - Size, imp1.CvCallback_3)>>('HOGDescriptor_Detect_Async'); + ffi.Pointer Function(HOGDescriptor, Mat, ffi.Double, CvSize, + CvSize, imp1.CvCallback_3)>>('HOGDescriptor_Detect_Async'); late final _HOGDescriptor_Detect_Async = _HOGDescriptor_Detect_AsyncPtr.asFunction< ffi.Pointer Function( - HOGDescriptor, Mat, double, Size, Size, imp1.CvCallback_3)>(); + HOGDescriptor, Mat, double, CvSize, CvSize, imp1.CvCallback_3)>(); ffi.Pointer HOGDescriptor_Load( HOGDescriptor self, @@ -1890,8 +1898,8 @@ class CvNativeObjdetect { Mat img, Mat grad, Mat angleOfs, - Size paddingTL, - Size paddingBR, + CvSize paddingTL, + CvSize paddingBR, ) { return _HOGDescriptor_computeGradient( self, @@ -1905,20 +1913,20 @@ class CvNativeObjdetect { late final _HOGDescriptor_computeGradientPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, Mat, Mat, Size, - Size)>>('HOGDescriptor_computeGradient'); + ffi.Pointer Function(HOGDescriptor, Mat, Mat, Mat, CvSize, + CvSize)>>('HOGDescriptor_computeGradient'); late final _HOGDescriptor_computeGradient = _HOGDescriptor_computeGradientPtr.asFunction< ffi.Pointer Function( - HOGDescriptor, Mat, Mat, Mat, Size, Size)>(); + HOGDescriptor, Mat, Mat, Mat, CvSize, CvSize)>(); ffi.Pointer HOGDescriptor_computeGradient_Async( HOGDescriptor self, Mat img, Mat grad, Mat angleOfs, - Size paddingTL, - Size paddingBR, + CvSize paddingTL, + CvSize paddingBR, imp1.CvCallback_0 callback, ) { return _HOGDescriptor_computeGradient_Async( @@ -1934,12 +1942,18 @@ class CvNativeObjdetect { late final _HOGDescriptor_computeGradient_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, Mat, Mat, Size, - Size, imp1.CvCallback_0)>>('HOGDescriptor_computeGradient_Async'); + ffi.Pointer Function( + HOGDescriptor, + Mat, + Mat, + Mat, + CvSize, + CvSize, + imp1.CvCallback_0)>>('HOGDescriptor_computeGradient_Async'); late final _HOGDescriptor_computeGradient_Async = _HOGDescriptor_computeGradient_AsyncPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, Mat, Mat, Mat, Size, Size, imp1.CvCallback_0)>(); + ffi.Pointer Function(HOGDescriptor, Mat, Mat, Mat, CvSize, + CvSize, imp1.CvCallback_0)>(); ffi.Pointer HOGDescriptor_getDaimlerPeopleDetector( ffi.Pointer rval, @@ -2682,6 +2696,7 @@ final class CascadeClassifier extends ffi.Struct { } typedef CascadeClassifierPtr = ffi.Pointer; +typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; final class FaceDetectorYN extends ffi.Struct { @@ -2708,7 +2723,6 @@ final class QRCodeDetector extends ffi.Struct { } typedef QRCodeDetectorPtr = ffi.Pointer; -typedef Size = imp1.Size; typedef VecF32 = imp1.VecF32; typedef VecF64 = imp1.VecF64; typedef VecI32 = imp1.VecI32; diff --git a/lib/src/g/objdetect.yaml b/packages/dartcv/lib/src/g/objdetect.yaml similarity index 99% rename from lib/src/g/objdetect.yaml rename to packages/dartcv/lib/src/g/objdetect.yaml index bb790275..cda3be3a 100644 --- a/lib/src/g/objdetect.yaml +++ b/packages/dartcv/lib/src/g/objdetect.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/objdetect.g.dart: + package:dartcv/src/g/objdetect.g.dart: used-config: ffi-native: false symbols: @@ -246,12 +246,12 @@ files: name: HOGDescriptorPtr c:objdetect.h@T@QRCodeDetectorPtr: name: QRCodeDetectorPtr + c:types.h@T@CvSize: + name: CvSize c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat - c:types.h@T@Size: - name: Size c:types.h@T@VecF32: name: VecF32 c:types.h@T@VecF64: diff --git a/lib/src/g/photo.g.dart b/packages/dartcv/lib/src/g/photo.g.dart similarity index 98% rename from lib/src/g/photo.g.dart rename to packages/dartcv/lib/src/g/photo.g.dart index 4d7ff123..84323490 100644 --- a/lib/src/g/photo.g.dart +++ b/packages/dartcv/lib/src/g/photo.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Photo /// @@ -861,7 +861,7 @@ class CvNativePhoto { Mat src, Mat dst, Mat mask, - Point p, + CvPoint p, Mat blend, int flags, ) { @@ -878,15 +878,15 @@ class CvNativePhoto { late final _SeamlessClonePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, Point, Mat, ffi.Int)>>('SeamlessClone'); + Mat, Mat, Mat, CvPoint, Mat, ffi.Int)>>('SeamlessClone'); late final _SeamlessClone = _SeamlessClonePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Point, Mat, int)>(); + ffi.Pointer Function(Mat, Mat, Mat, CvPoint, Mat, int)>(); ffi.Pointer SeamlessClone_Async( Mat src, Mat dst, Mat mask, - Point p, + CvPoint p, int flags, imp1.CvCallback_1 callback, ) { @@ -902,11 +902,11 @@ class CvNativePhoto { late final _SeamlessClone_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Point, ffi.Int, + ffi.Pointer Function(Mat, Mat, Mat, CvPoint, ffi.Int, imp1.CvCallback_1)>>('SeamlessClone_Async'); late final _SeamlessClone_Async = _SeamlessClone_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, Point, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, CvPoint, int, imp1.CvCallback_1)>(); ffi.Pointer Stylization( Mat src, @@ -1018,6 +1018,7 @@ final class AlignMTB extends ffi.Struct { } typedef AlignMTBPtr = ffi.Pointer; +typedef CvPoint = imp1.CvPoint; typedef CvStatus = imp1.CvStatus; typedef Mat = imp1.Mat; @@ -1026,5 +1027,4 @@ final class MergeMertens extends ffi.Struct { } typedef MergeMertensPtr = ffi.Pointer; -typedef Point = imp1.Point; typedef VecMat = imp1.VecMat; diff --git a/lib/src/g/photo.yaml b/packages/dartcv/lib/src/g/photo.yaml similarity index 97% rename from lib/src/g/photo.yaml rename to packages/dartcv/lib/src/g/photo.yaml index 33dc0998..31042e3e 100644 --- a/lib/src/g/photo.yaml +++ b/packages/dartcv/lib/src/g/photo.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/photo.g.dart: + package:dartcv/src/g/photo.g.dart: used-config: ffi-native: false symbols: @@ -100,11 +100,11 @@ files: name: AlignMTBPtr c:photo.h@T@MergeMertensPtr: name: MergeMertensPtr + c:types.h@T@CvPoint: + name: CvPoint c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat - c:types.h@T@Point: - name: Point c:types.h@T@VecMat: name: VecMat diff --git a/lib/src/g/stitching.g.dart b/packages/dartcv/lib/src/g/stitching.g.dart similarity index 99% rename from lib/src/g/stitching.g.dart rename to packages/dartcv/lib/src/g/stitching.g.dart index 7ef70341..43346733 100644 --- a/lib/src/g/stitching.g.dart +++ b/packages/dartcv/lib/src/g/stitching.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Stitching /// diff --git a/lib/src/g/stitching.yaml b/packages/dartcv/lib/src/g/stitching.yaml similarity index 99% rename from lib/src/g/stitching.yaml rename to packages/dartcv/lib/src/g/stitching.yaml index bd066ada..e7da7f17 100644 --- a/lib/src/g/stitching.yaml +++ b/packages/dartcv/lib/src/g/stitching.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/stitching.g.dart: + package:dartcv/src/g/stitching.g.dart: used-config: ffi-native: false symbols: diff --git a/lib/src/g/types.g.dart b/packages/dartcv/lib/src/g/types.g.dart similarity index 96% rename from lib/src/g/types.g.dart rename to packages/dartcv/lib/src/g/types.g.dart index 84e7eb51..ebc17413 100644 --- a/lib/src/g/types.g.dart +++ b/packages/dartcv/lib/src/g/types.g.dart @@ -145,6 +145,88 @@ typedef DartCvCallback_9Function = void Function( ffi.Pointer, ffi.Pointer); +final class CvPoint extends ffi.Struct { + @ffi.Int() + external int x; + + @ffi.Int() + external int y; +} + +final class CvPoint2f extends ffi.Struct { + @ffi.Float() + external double x; + + @ffi.Float() + external double y; +} + +final class CvPoint3f extends ffi.Struct { + @ffi.Float() + external double x; + + @ffi.Float() + external double y; + + @ffi.Float() + external double z; +} + +final class CvPoint3i extends ffi.Struct { + @ffi.Int() + external int x; + + @ffi.Int() + external int y; + + @ffi.Int() + external int z; +} + +final class CvRect extends ffi.Struct { + @ffi.Int() + external int x; + + @ffi.Int() + external int y; + + @ffi.Int() + external int width; + + @ffi.Int() + external int height; +} + +final class CvRect2f extends ffi.Struct { + @ffi.Float() + external double x; + + @ffi.Float() + external double y; + + @ffi.Float() + external double width; + + @ffi.Float() + external double height; +} + +final class CvSize extends ffi.Struct { + @ffi.Int() + external int width; + + @ffi.Int() + external int height; +} + +final class CvSize2f extends ffi.Struct { + @ffi.Float() + external double width; + + @ffi.Float() + external double height; +} + final class CvStatus extends ffi.Struct { @ffi.Int() external int code; @@ -289,82 +371,16 @@ final class Moment extends ffi.Struct { external double nu03; } -final class Point extends ffi.Struct { - @ffi.Int() - external int x; - - @ffi.Int() - external int y; -} - -final class Point2f extends ffi.Struct { - @ffi.Float() - external double x; - - @ffi.Float() - external double y; -} - -final class Point3f extends ffi.Struct { - @ffi.Float() - external double x; - - @ffi.Float() - external double y; - - @ffi.Float() - external double z; -} - -final class Point3i extends ffi.Struct { - @ffi.Int() - external int x; - - @ffi.Int() - external int y; - - @ffi.Int() - external int z; -} - final class RNG extends ffi.Struct { external ffi.Pointer ptr; } typedef RNGPtr = ffi.Pointer; -final class Rect extends ffi.Struct { - @ffi.Int() - external int x; - - @ffi.Int() - external int y; - - @ffi.Int() - external int width; - - @ffi.Int() - external int height; -} - -final class Rect2f extends ffi.Struct { - @ffi.Float() - external double x; - - @ffi.Float() - external double y; - - @ffi.Float() - external double width; - - @ffi.Float() - external double height; -} - final class RotatedRect extends ffi.Struct { - external Point2f center; + external CvPoint2f center; - external Size2f size; + external CvSize2f size; @ffi.Double() external double angle; @@ -384,22 +400,6 @@ final class Scalar extends ffi.Struct { external double val4; } -final class Size extends ffi.Struct { - @ffi.Int() - external int width; - - @ffi.Int() - external int height; -} - -final class Size2f extends ffi.Struct { - @ffi.Float() - external double width; - - @ffi.Float() - external double height; -} - final class TermCriteria extends ffi.Struct { @ffi.Int() external int type; @@ -786,14 +786,14 @@ final class VecMat extends ffi.Struct { typedef VecMatPtr = ffi.Pointer; final class VecPoint extends ffi.Struct { - external ffi.Pointer ptr; + external ffi.Pointer ptr; @ffi.Size() external int length; } final class VecPoint2f extends ffi.Struct { - external ffi.Pointer ptr; + external ffi.Pointer ptr; @ffi.Size() external int length; @@ -802,7 +802,7 @@ final class VecPoint2f extends ffi.Struct { typedef VecPoint2fPtr = ffi.Pointer; final class VecPoint3f extends ffi.Struct { - external ffi.Pointer ptr; + external ffi.Pointer ptr; @ffi.Size() external int length; @@ -811,7 +811,7 @@ final class VecPoint3f extends ffi.Struct { typedef VecPoint3fPtr = ffi.Pointer; final class VecPoint3i extends ffi.Struct { - external ffi.Pointer ptr; + external ffi.Pointer ptr; @ffi.Size() external int length; @@ -821,7 +821,7 @@ typedef VecPoint3iPtr = ffi.Pointer; typedef VecPointPtr = ffi.Pointer; final class VecRect extends ffi.Struct { - external ffi.Pointer ptr; + external ffi.Pointer ptr; @ffi.Size() external int length; diff --git a/lib/src/g/types.yaml b/packages/dartcv/lib/src/g/types.yaml similarity index 94% rename from lib/src/g/types.yaml rename to packages/dartcv/lib/src/g/types.yaml index 8b5e563d..dd713e00 100644 --- a/lib/src/g/types.yaml +++ b/packages/dartcv/lib/src/g/types.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/types.g.dart: + package:dartcv/src/g/types.g.dart: used-config: ffi-native: false symbols: @@ -24,6 +24,22 @@ files: name: CvCallback_8Function CvCallback_9Function: name: CvCallback_9Function + c:@S@CvPoint: + name: CvPoint + c:@S@CvPoint2f: + name: CvPoint2f + c:@S@CvPoint3f: + name: CvPoint3f + c:@S@CvPoint3i: + name: CvPoint3i + c:@S@CvRect: + name: CvRect + c:@S@CvRect2f: + name: CvRect2f + c:@S@CvSize: + name: CvSize + c:@S@CvSize2f: + name: CvSize2f c:@S@CvStatus: name: CvStatus c:@S@DMatch: @@ -38,28 +54,12 @@ files: name: MatStep c:@S@Moment: name: Moment - c:@S@Point: - name: Point - c:@S@Point2f: - name: Point2f - c:@S@Point3f: - name: Point3f - c:@S@Point3i: - name: Point3i c:@S@RNG: name: RNG - c:@S@Rect: - name: Rect - c:@S@Rect2f: - name: Rect2f c:@S@RotatedRect: name: RotatedRect c:@S@Scalar: name: Scalar - c:@S@Size: - name: Size - c:@S@Size2f: - name: Size2f c:@S@TermCriteria: name: TermCriteria c:@S@Vec2b: diff --git a/lib/src/g/video_io.g.dart b/packages/dartcv/lib/src/g/video.g.dart similarity index 67% rename from lib/src/g/video_io.g.dart rename to packages/dartcv/lib/src/g/video.g.dart index 5247f82b..b4eec0bb 100644 --- a/lib/src/g/video_io.g.dart +++ b/packages/dartcv/lib/src/g/video.g.dart @@ -11,21 +11,21 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:opencv_dart/src/g/types.g.dart' as imp1; +import 'package:dartcv/src/g/types.g.dart' as imp1; -/// Native bindings for OpenCV - VideoIO +/// Native bindings for OpenCV - Video /// -class CvNativeVideoIO { +class CvNativeVideo { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) _lookup; /// The symbols are looked up in [dynamicLibrary]. - CvNativeVideoIO(ffi.DynamicLibrary dynamicLibrary) + CvNativeVideo(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup; /// The symbols are looked up with [lookup]. - CvNativeVideoIO.fromLookup( + CvNativeVideo.fromLookup( ffi.Pointer Function(String symbolName) lookup) : _lookup = lookup; @@ -401,8 +401,8 @@ class CvNativeVideoIO { Mat nextImg, VecPoint2f prevPts, ffi.Pointer nextPts, - VecUChar status, - VecF32 err, + ffi.Pointer status, + ffi.Pointer err, ) { return _CalcOpticalFlowPyrLK( prevImg, @@ -421,11 +421,16 @@ class CvNativeVideoIO { Mat, VecPoint2f, ffi.Pointer, - VecUChar, - VecF32)>>('CalcOpticalFlowPyrLK'); + ffi.Pointer, + ffi.Pointer)>>('CalcOpticalFlowPyrLK'); late final _CalcOpticalFlowPyrLK = _CalcOpticalFlowPyrLKPtr.asFunction< ffi.Pointer Function( - Mat, Mat, VecPoint2f, ffi.Pointer, VecUChar, VecF32)>(); + Mat, + Mat, + VecPoint2f, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); ffi.Pointer CalcOpticalFlowPyrLKWithParams( Mat prevImg, @@ -434,7 +439,7 @@ class CvNativeVideoIO { ffi.Pointer nextPts, ffi.Pointer status, ffi.Pointer err, - Size winSize, + CvSize winSize, int maxLevel, TermCriteria criteria, int flags, @@ -464,7 +469,7 @@ class CvNativeVideoIO { ffi.Pointer, ffi.Pointer, ffi.Pointer, - Size, + CvSize, ffi.Int, TermCriteria, ffi.Int, @@ -478,7 +483,7 @@ class CvNativeVideoIO { ffi.Pointer, ffi.Pointer, ffi.Pointer, - Size, + CvSize, int, TermCriteria, int, @@ -489,7 +494,7 @@ class CvNativeVideoIO { Mat nextImg, VecPoint2f prevPts, ffi.Pointer nextPts, - Size winSize, + CvSize winSize, int maxLevel, TermCriteria criteria, int flags, @@ -517,7 +522,7 @@ class CvNativeVideoIO { Mat, VecPoint2f, ffi.Pointer, - Size, + CvSize, ffi.Int, TermCriteria, ffi.Int, @@ -530,7 +535,7 @@ class CvNativeVideoIO { Mat, VecPoint2f, ffi.Pointer, - Size, + CvSize, int, TermCriteria, int, @@ -1837,7 +1842,7 @@ class CvNativeVideoIO { ffi.Pointer TrackerMIL_Init( TrackerMIL self, Mat image, - Rect bbox, + CvRect bbox, ) { return _TrackerMIL_Init( self, @@ -1849,14 +1854,14 @@ class CvNativeVideoIO { late final _TrackerMIL_InitPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - TrackerMIL, Mat, Rect)>>('TrackerMIL_Init'); + TrackerMIL, Mat, CvRect)>>('TrackerMIL_Init'); late final _TrackerMIL_Init = _TrackerMIL_InitPtr.asFunction< - ffi.Pointer Function(TrackerMIL, Mat, Rect)>(); + ffi.Pointer Function(TrackerMIL, Mat, CvRect)>(); ffi.Pointer TrackerMIL_Init_Async( TrackerMIL self, Mat image, - Rect bbox, + CvRect bbox, imp1.CvCallback_0 callback, ) { return _TrackerMIL_Init_Async( @@ -1869,16 +1874,16 @@ class CvNativeVideoIO { late final _TrackerMIL_Init_AsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(TrackerMIL, Mat, Rect, + ffi.Pointer Function(TrackerMIL, Mat, CvRect, imp1.CvCallback_0)>>('TrackerMIL_Init_Async'); late final _TrackerMIL_Init_Async = _TrackerMIL_Init_AsyncPtr.asFunction< ffi.Pointer Function( - TrackerMIL, Mat, Rect, imp1.CvCallback_0)>(); + TrackerMIL, Mat, CvRect, imp1.CvCallback_0)>(); ffi.Pointer TrackerMIL_Update( TrackerMIL self, Mat image, - ffi.Pointer boundingBox, + ffi.Pointer boundingBox, ffi.Pointer rval, ) { return _TrackerMIL_Update( @@ -1891,11 +1896,11 @@ class CvNativeVideoIO { late final _TrackerMIL_UpdatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(TrackerMIL, Mat, ffi.Pointer, + ffi.Pointer Function(TrackerMIL, Mat, ffi.Pointer, ffi.Pointer)>>('TrackerMIL_Update'); late final _TrackerMIL_Update = _TrackerMIL_UpdatePtr.asFunction< ffi.Pointer Function( - TrackerMIL, Mat, ffi.Pointer, ffi.Pointer)>(); + TrackerMIL, Mat, ffi.Pointer, ffi.Pointer)>(); ffi.Pointer TrackerMIL_Update_Async( TrackerMIL self, @@ -1916,944 +1921,11 @@ class CvNativeVideoIO { late final _TrackerMIL_Update_Async = _TrackerMIL_Update_AsyncPtr.asFunction< ffi.Pointer Function(TrackerMIL, Mat, imp1.CvCallback_2)>(); - void VideoCapture_Close( - VideoCapturePtr self, - ) { - return _VideoCapture_Close( - self, - ); - } - - late final _VideoCapture_ClosePtr = - _lookup>( - 'VideoCapture_Close'); - late final _VideoCapture_Close = - _VideoCapture_ClosePtr.asFunction(); - - ffi.Pointer VideoCapture_Get( - VideoCapture self, - int prop, - ffi.Pointer rval, - ) { - return _VideoCapture_Get( - self, - prop, - rval, - ); - } - - late final _VideoCapture_GetPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, - ffi.Pointer)>>('VideoCapture_Get'); - late final _VideoCapture_Get = _VideoCapture_GetPtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_Get_Async( - VideoCapture self, - int prop, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_Get_Async( - self, - prop, - callback, - ); - } - - late final _VideoCapture_Get_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_Get_Async'); - late final _VideoCapture_Get_Async = _VideoCapture_Get_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_Grab( - VideoCapture self, - int skip, - ) { - return _VideoCapture_Grab( - self, - skip, - ); - } - - late final _VideoCapture_GrabPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, ffi.Int)>>('VideoCapture_Grab'); - late final _VideoCapture_Grab = _VideoCapture_GrabPtr.asFunction< - ffi.Pointer Function(VideoCapture, int)>(); - - ffi.Pointer VideoCapture_Grab_Async( - VideoCapture self, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_Grab_Async( - self, - callback, - ); - } - - late final _VideoCapture_Grab_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, imp1.CvCallback_1)>>('VideoCapture_Grab_Async'); - late final _VideoCapture_Grab_Async = _VideoCapture_Grab_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_IsOpened( - VideoCapture self, - ffi.Pointer rval, - ) { - return _VideoCapture_IsOpened( - self, - rval, - ); - } - - late final _VideoCapture_IsOpenedPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer)>>('VideoCapture_IsOpened'); - late final _VideoCapture_IsOpened = _VideoCapture_IsOpenedPtr.asFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_IsOpened_Async( - VideoCapture self, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_IsOpened_Async( - self, - callback, - ); - } - - late final _VideoCapture_IsOpened_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, imp1.CvCallback_1)>>('VideoCapture_IsOpened_Async'); - late final _VideoCapture_IsOpened_Async = - _VideoCapture_IsOpened_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_New( - ffi.Pointer rval, - ) { - return _VideoCapture_New( - rval, - ); - } - - late final _VideoCapture_NewPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('VideoCapture_New'); - late final _VideoCapture_New = _VideoCapture_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer VideoCapture_NewFromFile( - ffi.Pointer filename, - int apiPreference, - ffi.Pointer rval, - ) { - return _VideoCapture_NewFromFile( - filename, - apiPreference, - rval, - ); - } - - late final _VideoCapture_NewFromFilePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, - ffi.Pointer)>>('VideoCapture_NewFromFile'); - late final _VideoCapture_NewFromFile = - _VideoCapture_NewFromFilePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_NewFromFile_Async( - ffi.Pointer filename, - int apiPreference, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_NewFromFile_Async( - filename, - apiPreference, - callback, - ); - } - - late final _VideoCapture_NewFromFile_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_NewFromFile_Async'); - late final _VideoCapture_NewFromFile_Async = - _VideoCapture_NewFromFile_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_NewFromIndex( - int index, - int apiPreference, - ffi.Pointer rval, - ) { - return _VideoCapture_NewFromIndex( - index, - apiPreference, - rval, - ); - } - - late final _VideoCapture_NewFromIndexPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, - ffi.Pointer)>>('VideoCapture_NewFromIndex'); - late final _VideoCapture_NewFromIndex = - _VideoCapture_NewFromIndexPtr.asFunction< - ffi.Pointer Function( - int, int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_NewFromIndex_Async( - int index, - int apiPreference, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_NewFromIndex_Async( - index, - apiPreference, - callback, - ); - } - - late final _VideoCapture_NewFromIndex_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_NewFromIndex_Async'); - late final _VideoCapture_NewFromIndex_Async = - _VideoCapture_NewFromIndex_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_New_Async( - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_New_Async( - callback, - ); - } - - late final _VideoCapture_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'VideoCapture_New_Async'); - late final _VideoCapture_New_Async = _VideoCapture_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_Open( - VideoCapture self, - ffi.Pointer uri, - ffi.Pointer rval, - ) { - return _VideoCapture_Open( - self, - uri, - rval, - ); - } - - late final _VideoCapture_OpenPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - ffi.Pointer)>>('VideoCapture_Open'); - late final _VideoCapture_Open = _VideoCapture_OpenPtr.asFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_OpenDevice( - VideoCapture self, - int device, - ffi.Pointer rval, - ) { - return _VideoCapture_OpenDevice( - self, - device, - rval, - ); - } - - late final _VideoCapture_OpenDevicePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, - ffi.Pointer)>>('VideoCapture_OpenDevice'); - late final _VideoCapture_OpenDevice = _VideoCapture_OpenDevicePtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_OpenDeviceWithAPI( - VideoCapture self, - int device, - int apiPreference, - ffi.Pointer rval, - ) { - return _VideoCapture_OpenDeviceWithAPI( - self, - device, - apiPreference, - rval, - ); - } - - late final _VideoCapture_OpenDeviceWithAPIPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Int, - ffi.Pointer)>>('VideoCapture_OpenDeviceWithAPI'); - late final _VideoCapture_OpenDeviceWithAPI = - _VideoCapture_OpenDeviceWithAPIPtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_OpenDeviceWithAPI_Async( - VideoCapture self, - int device, - int apiPreference, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_OpenDeviceWithAPI_Async( - self, - device, - apiPreference, - callback, - ); - } - - late final _VideoCapture_OpenDeviceWithAPI_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_OpenDeviceWithAPI_Async'); - late final _VideoCapture_OpenDeviceWithAPI_Async = - _VideoCapture_OpenDeviceWithAPI_AsyncPtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_OpenDevice_Async( - VideoCapture self, - int device, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_OpenDevice_Async( - self, - device, - callback, - ); - } - - late final _VideoCapture_OpenDevice_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_OpenDevice_Async'); - late final _VideoCapture_OpenDevice_Async = - _VideoCapture_OpenDevice_AsyncPtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_OpenWithAPI( - VideoCapture self, - ffi.Pointer uri, - int apiPreference, - ffi.Pointer rval, - ) { - return _VideoCapture_OpenWithAPI( - self, - uri, - apiPreference, - rval, - ); - } - - late final _VideoCapture_OpenWithAPIPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - ffi.Int, ffi.Pointer)>>('VideoCapture_OpenWithAPI'); - late final _VideoCapture_OpenWithAPI = - _VideoCapture_OpenWithAPIPtr.asFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_OpenWithAPI_Async( - VideoCapture self, - ffi.Pointer uri, - int apiPreference, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_OpenWithAPI_Async( - self, - uri, - apiPreference, - callback, - ); - } - - late final _VideoCapture_OpenWithAPI_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - ffi.Int, imp1.CvCallback_1)>>('VideoCapture_OpenWithAPI_Async'); - late final _VideoCapture_OpenWithAPI_Async = - _VideoCapture_OpenWithAPI_AsyncPtr.asFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_Open_Async( - VideoCapture self, - ffi.Pointer uri, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_Open_Async( - self, - uri, - callback, - ); - } - - late final _VideoCapture_Open_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - imp1.CvCallback_1)>>('VideoCapture_Open_Async'); - late final _VideoCapture_Open_Async = _VideoCapture_Open_AsyncPtr.asFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_Read( - VideoCapture self, - Mat buf, - ffi.Pointer rval, - ) { - return _VideoCapture_Read( - self, - buf, - rval, - ); - } - - late final _VideoCapture_ReadPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, Mat, ffi.Pointer)>>('VideoCapture_Read'); - late final _VideoCapture_Read = _VideoCapture_ReadPtr.asFunction< - ffi.Pointer Function( - VideoCapture, Mat, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_Read_Async( - VideoCapture self, - imp1.CvCallback_2 callback, - ) { - return _VideoCapture_Read_Async( - self, - callback, - ); - } - - late final _VideoCapture_Read_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, imp1.CvCallback_2)>>('VideoCapture_Read_Async'); - late final _VideoCapture_Read_Async = _VideoCapture_Read_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, imp1.CvCallback_2)>(); - - ffi.Pointer VideoCapture_Release( - VideoCapture self, - ) { - return _VideoCapture_Release( - self, - ); - } - - late final _VideoCapture_ReleasePtr = - _lookup Function(VideoCapture)>>( - 'VideoCapture_Release'); - late final _VideoCapture_Release = _VideoCapture_ReleasePtr.asFunction< - ffi.Pointer Function(VideoCapture)>(); - - ffi.Pointer VideoCapture_Release_Async( - VideoCapture self, - imp1.CvCallback_0 callback, - ) { - return _VideoCapture_Release_Async( - self, - callback, - ); - } - - late final _VideoCapture_Release_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, imp1.CvCallback_0)>>('VideoCapture_Release_Async'); - late final _VideoCapture_Release_Async = - _VideoCapture_Release_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, imp1.CvCallback_0)>(); - - ffi.Pointer VideoCapture_Set( - VideoCapture self, - int prop, - double param, - ) { - return _VideoCapture_Set( - self, - prop, - param, - ); - } - - late final _VideoCapture_SetPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, ffi.Int, ffi.Double)>>('VideoCapture_Set'); - late final _VideoCapture_Set = _VideoCapture_SetPtr.asFunction< - ffi.Pointer Function(VideoCapture, int, double)>(); - - ffi.Pointer VideoCapture_Set_Async( - VideoCapture self, - int prop, - double param, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_Set_Async( - self, - prop, - param, - callback, - ); - } - - late final _VideoCapture_Set_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Double, - imp1.CvCallback_1)>>('VideoCapture_Set_Async'); - late final _VideoCapture_Set_Async = _VideoCapture_Set_AsyncPtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, double, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_getBackendName( - VideoCapture self, - ffi.Pointer> rval, - ) { - return _VideoCapture_getBackendName( - self, - rval, - ); - } - - late final _VideoCapture_getBackendNamePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer>)>>( - 'VideoCapture_getBackendName'); - late final _VideoCapture_getBackendName = - _VideoCapture_getBackendNamePtr.asFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer>)>(); - - void VideoWriter_Close( - VideoWriterPtr self, - ) { - return _VideoWriter_Close( - self, - ); - } - - late final _VideoWriter_ClosePtr = - _lookup>( - 'VideoWriter_Close'); - late final _VideoWriter_Close = - _VideoWriter_ClosePtr.asFunction(); - - ffi.Pointer VideoWriter_Fourcc( - int c1, - int c2, - int c3, - int c4, - ffi.Pointer rval, - ) { - return _VideoWriter_Fourcc( - c1, - c2, - c3, - c4, - rval, - ); - } - - late final _VideoWriter_FourccPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Char, ffi.Char, ffi.Char, ffi.Char, - ffi.Pointer)>>('VideoWriter_Fourcc'); - late final _VideoWriter_Fourcc = _VideoWriter_FourccPtr.asFunction< - ffi.Pointer Function( - int, int, int, int, ffi.Pointer)>(); - - ffi.Pointer VideoWriter_Fourcc_Async( - int c1, - int c2, - int c3, - int c4, - imp1.CvCallback_1 callback, - ) { - return _VideoWriter_Fourcc_Async( - c1, - c2, - c3, - c4, - callback, - ); - } - - late final _VideoWriter_Fourcc_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Char, ffi.Char, ffi.Char, ffi.Char, - imp1.CvCallback_1)>>('VideoWriter_Fourcc_Async'); - late final _VideoWriter_Fourcc_Async = - _VideoWriter_Fourcc_AsyncPtr.asFunction< - ffi.Pointer Function( - int, int, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoWriter_IsOpened( - VideoWriter self, - ffi.Pointer rval, - ) { - return _VideoWriter_IsOpened( - self, - rval, - ); - } - - late final _VideoWriter_IsOpenedPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, ffi.Pointer)>>('VideoWriter_IsOpened'); - late final _VideoWriter_IsOpened = _VideoWriter_IsOpenedPtr.asFunction< - ffi.Pointer Function(VideoWriter, ffi.Pointer)>(); - - ffi.Pointer VideoWriter_IsOpened_Async( - VideoWriter self, - imp1.CvCallback_1 callback, - ) { - return _VideoWriter_IsOpened_Async( - self, - callback, - ); - } - - late final _VideoWriter_IsOpened_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, imp1.CvCallback_1)>>('VideoWriter_IsOpened_Async'); - late final _VideoWriter_IsOpened_Async = - _VideoWriter_IsOpened_AsyncPtr.asFunction< - ffi.Pointer Function(VideoWriter, imp1.CvCallback_1)>(); - - ffi.Pointer VideoWriter_New( - ffi.Pointer rval, - ) { - return _VideoWriter_New( - rval, - ); - } - - late final _VideoWriter_NewPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('VideoWriter_New'); - late final _VideoWriter_New = _VideoWriter_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer VideoWriter_NewFromFile( - ffi.Pointer name, - int fourcc, - double fps, - int width, - int height, - bool isColor, - ffi.Pointer rval, - ) { - return _VideoWriter_NewFromFile( - name, - fourcc, - fps, - width, - height, - isColor, - rval, - ); - } - - late final _VideoWriter_NewFromFilePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Int, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Bool, - ffi.Pointer)>>('VideoWriter_NewFromFile'); - late final _VideoWriter_NewFromFile = _VideoWriter_NewFromFilePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, double, int, - int, bool, ffi.Pointer)>(); - - ffi.Pointer VideoWriter_NewFromFile_1( - ffi.Pointer name, - int apiPreference, - int fourcc, - double fps, - int width, - int height, - bool isColor, - ffi.Pointer rval, - ) { - return _VideoWriter_NewFromFile_1( - name, - apiPreference, - fourcc, - fps, - width, - height, - isColor, - rval, - ); - } - - late final _VideoWriter_NewFromFile_1Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Bool, - ffi.Pointer)>>('VideoWriter_NewFromFile_1'); - late final _VideoWriter_NewFromFile_1 = - _VideoWriter_NewFromFile_1Ptr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, int, - double, int, int, bool, ffi.Pointer)>(); - - ffi.Pointer VideoWriter_New_Async( - imp1.CvCallback_1 callback, - ) { - return _VideoWriter_New_Async( - callback, - ); - } - - late final _VideoWriter_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'VideoWriter_New_Async'); - late final _VideoWriter_New_Async = _VideoWriter_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer VideoWriter_Open( - VideoWriter self, - ffi.Pointer name, - int fourcc, - double fps, - int width, - int height, - bool isColor, - ) { - return _VideoWriter_Open( - self, - name, - fourcc, - fps, - width, - height, - isColor, - ); - } - - late final _VideoWriter_OpenPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, - ffi.Pointer, - ffi.Int, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Bool)>>('VideoWriter_Open'); - late final _VideoWriter_Open = _VideoWriter_OpenPtr.asFunction< - ffi.Pointer Function( - VideoWriter, ffi.Pointer, int, double, int, int, bool)>(); - - ffi.Pointer VideoWriter_Open_1( - VideoWriter self, - ffi.Pointer name, - int apiPreference, - int fourcc, - double fps, - int width, - int height, - bool isColor, - ) { - return _VideoWriter_Open_1( - self, - name, - apiPreference, - fourcc, - fps, - width, - height, - isColor, - ); - } - - late final _VideoWriter_Open_1Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Bool)>>('VideoWriter_Open_1'); - late final _VideoWriter_Open_1 = _VideoWriter_Open_1Ptr.asFunction< - ffi.Pointer Function(VideoWriter, ffi.Pointer, int, - int, double, int, int, bool)>(); - - ffi.Pointer VideoWriter_Open_Async( - VideoWriter self, - ffi.Pointer name, - ffi.Pointer codec, - double fps, - int width, - int height, - bool isColor, - imp1.CvCallback_1 callback, - ) { - return _VideoWriter_Open_Async( - self, - name, - codec, - fps, - width, - height, - isColor, - callback, - ); - } - - late final _VideoWriter_Open_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, - ffi.Pointer, - ffi.Pointer, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Bool, - imp1.CvCallback_1)>>('VideoWriter_Open_Async'); - late final _VideoWriter_Open_Async = _VideoWriter_Open_AsyncPtr.asFunction< - ffi.Pointer Function(VideoWriter, ffi.Pointer, - ffi.Pointer, double, int, int, bool, imp1.CvCallback_1)>(); - - ffi.Pointer VideoWriter_Release( - VideoWriter self, - ) { - return _VideoWriter_Release( - self, - ); - } - - late final _VideoWriter_ReleasePtr = - _lookup Function(VideoWriter)>>( - 'VideoWriter_Release'); - late final _VideoWriter_Release = _VideoWriter_ReleasePtr.asFunction< - ffi.Pointer Function(VideoWriter)>(); - - ffi.Pointer VideoWriter_Release_Async( - VideoWriter self, - imp1.CvCallback_0 callback, - ) { - return _VideoWriter_Release_Async( - self, - callback, - ); - } - - late final _VideoWriter_Release_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, imp1.CvCallback_0)>>('VideoWriter_Release_Async'); - late final _VideoWriter_Release_Async = - _VideoWriter_Release_AsyncPtr.asFunction< - ffi.Pointer Function(VideoWriter, imp1.CvCallback_0)>(); - - ffi.Pointer VideoWriter_Write( - VideoWriter self, - Mat img, - ) { - return _VideoWriter_Write( - self, - img, - ); - } - - late final _VideoWriter_WritePtr = _lookup< - ffi.NativeFunction Function(VideoWriter, Mat)>>( - 'VideoWriter_Write'); - late final _VideoWriter_Write = _VideoWriter_WritePtr.asFunction< - ffi.Pointer Function(VideoWriter, Mat)>(); - - ffi.Pointer VideoWriter_Write_Async( - VideoWriter self, - Mat img, - imp1.CvCallback_0 callback, - ) { - return _VideoWriter_Write_Async( - self, - img, - callback, - ); - } - - late final _VideoWriter_Write_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, Mat, imp1.CvCallback_0)>>('VideoWriter_Write_Async'); - late final _VideoWriter_Write_Async = _VideoWriter_Write_AsyncPtr.asFunction< - ffi.Pointer Function(VideoWriter, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer VideoWriter_getBackendName( - VideoWriter self, - ffi.Pointer> rval, - ) { - return _VideoWriter_getBackendName( - self, - rval, - ); - } - - late final _VideoWriter_getBackendNamePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, ffi.Pointer>)>>( - 'VideoWriter_getBackendName'); - late final _VideoWriter_getBackendName = - _VideoWriter_getBackendNamePtr.asFunction< - ffi.Pointer Function( - VideoWriter, ffi.Pointer>)>(); - late final addresses = _SymbolAddresses(this); } class _SymbolAddresses { - final CvNativeVideoIO _library; + final CvNativeVideo _library; _SymbolAddresses(this._library); ffi.Pointer> get BackgroundSubtractorKNN_Close => @@ -2866,10 +1938,6 @@ class _SymbolAddresses { get KalmanFilter_Close => _library._KalmanFilter_ClosePtr; ffi.Pointer> get TrackerMIL_Close => _library._TrackerMIL_ClosePtr; - ffi.Pointer> - get VideoCapture_Close => _library._VideoCapture_ClosePtr; - ffi.Pointer> - get VideoWriter_Close => _library._VideoWriter_ClosePtr; } final class BackgroundSubtractorKNN extends ffi.Struct { @@ -2883,6 +1951,8 @@ final class BackgroundSubtractorMOG2 extends ffi.Struct { } typedef BackgroundSubtractorMOG2Ptr = ffi.Pointer; +typedef CvRect = imp1.CvRect; +typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; final class KalmanFilter extends ffi.Struct { @@ -2891,8 +1961,6 @@ final class KalmanFilter extends ffi.Struct { typedef KalmanFilterPtr = ffi.Pointer; typedef Mat = imp1.Mat; -typedef Rect = imp1.Rect; -typedef Size = imp1.Size; typedef TermCriteria = imp1.TermCriteria; final class Tracker extends ffi.Struct { @@ -2914,15 +1982,3 @@ typedef TrackerPtr = ffi.Pointer; typedef VecF32 = imp1.VecF32; typedef VecPoint2f = imp1.VecPoint2f; typedef VecUChar = imp1.VecUChar; - -final class VideoCapture extends ffi.Struct { - external ffi.Pointer ptr; -} - -typedef VideoCapturePtr = ffi.Pointer; - -final class VideoWriter extends ffi.Struct { - external ffi.Pointer ptr; -} - -typedef VideoWriterPtr = ffi.Pointer; diff --git a/lib/src/g/video_io.yaml b/packages/dartcv/lib/src/g/video.yaml similarity index 70% rename from lib/src/g/video_io.yaml rename to packages/dartcv/lib/src/g/video.yaml index 5ade4162..43061d98 100644 --- a/lib/src/g/video_io.yaml +++ b/packages/dartcv/lib/src/g/video.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:opencv_dart/src/g/video_io.g.dart: + package:dartcv/src/g/video.g.dart: used-config: ffi-native: false symbols: @@ -186,96 +186,6 @@ files: name: TrackerMIL_Update c:@F@TrackerMIL_Update_Async: name: TrackerMIL_Update_Async - c:@F@VideoCapture_Close: - name: VideoCapture_Close - c:@F@VideoCapture_Get: - name: VideoCapture_Get - c:@F@VideoCapture_Get_Async: - name: VideoCapture_Get_Async - c:@F@VideoCapture_Grab: - name: VideoCapture_Grab - c:@F@VideoCapture_Grab_Async: - name: VideoCapture_Grab_Async - c:@F@VideoCapture_IsOpened: - name: VideoCapture_IsOpened - c:@F@VideoCapture_IsOpened_Async: - name: VideoCapture_IsOpened_Async - c:@F@VideoCapture_New: - name: VideoCapture_New - c:@F@VideoCapture_NewFromFile: - name: VideoCapture_NewFromFile - c:@F@VideoCapture_NewFromFile_Async: - name: VideoCapture_NewFromFile_Async - c:@F@VideoCapture_NewFromIndex: - name: VideoCapture_NewFromIndex - c:@F@VideoCapture_NewFromIndex_Async: - name: VideoCapture_NewFromIndex_Async - c:@F@VideoCapture_New_Async: - name: VideoCapture_New_Async - c:@F@VideoCapture_Open: - name: VideoCapture_Open - c:@F@VideoCapture_OpenDevice: - name: VideoCapture_OpenDevice - c:@F@VideoCapture_OpenDeviceWithAPI: - name: VideoCapture_OpenDeviceWithAPI - c:@F@VideoCapture_OpenDeviceWithAPI_Async: - name: VideoCapture_OpenDeviceWithAPI_Async - c:@F@VideoCapture_OpenDevice_Async: - name: VideoCapture_OpenDevice_Async - c:@F@VideoCapture_OpenWithAPI: - name: VideoCapture_OpenWithAPI - c:@F@VideoCapture_OpenWithAPI_Async: - name: VideoCapture_OpenWithAPI_Async - c:@F@VideoCapture_Open_Async: - name: VideoCapture_Open_Async - c:@F@VideoCapture_Read: - name: VideoCapture_Read - c:@F@VideoCapture_Read_Async: - name: VideoCapture_Read_Async - c:@F@VideoCapture_Release: - name: VideoCapture_Release - c:@F@VideoCapture_Release_Async: - name: VideoCapture_Release_Async - c:@F@VideoCapture_Set: - name: VideoCapture_Set - c:@F@VideoCapture_Set_Async: - name: VideoCapture_Set_Async - c:@F@VideoCapture_getBackendName: - name: VideoCapture_getBackendName - c:@F@VideoWriter_Close: - name: VideoWriter_Close - c:@F@VideoWriter_Fourcc: - name: VideoWriter_Fourcc - c:@F@VideoWriter_Fourcc_Async: - name: VideoWriter_Fourcc_Async - c:@F@VideoWriter_IsOpened: - name: VideoWriter_IsOpened - c:@F@VideoWriter_IsOpened_Async: - name: VideoWriter_IsOpened_Async - c:@F@VideoWriter_New: - name: VideoWriter_New - c:@F@VideoWriter_NewFromFile: - name: VideoWriter_NewFromFile - c:@F@VideoWriter_NewFromFile_1: - name: VideoWriter_NewFromFile_1 - c:@F@VideoWriter_New_Async: - name: VideoWriter_New_Async - c:@F@VideoWriter_Open: - name: VideoWriter_Open - c:@F@VideoWriter_Open_1: - name: VideoWriter_Open_1 - c:@F@VideoWriter_Open_Async: - name: VideoWriter_Open_Async - c:@F@VideoWriter_Release: - name: VideoWriter_Release - c:@F@VideoWriter_Release_Async: - name: VideoWriter_Release_Async - c:@F@VideoWriter_Write: - name: VideoWriter_Write - c:@F@VideoWriter_Write_Async: - name: VideoWriter_Write_Async - c:@F@VideoWriter_getBackendName: - name: VideoWriter_getBackendName c:@S@BackgroundSubtractorKNN: name: BackgroundSubtractorKNN c:@S@BackgroundSubtractorMOG2: @@ -288,18 +198,14 @@ files: name: TrackerGOTURN c:@S@TrackerMIL: name: TrackerMIL - c:@S@VideoCapture: - name: VideoCapture - c:@S@VideoWriter: - name: VideoWriter + c:types.h@T@CvRect: + name: CvRect + c:types.h@T@CvSize: + name: CvSize c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: name: Mat - c:types.h@T@Rect: - name: Rect - c:types.h@T@Size: - name: Size c:types.h@T@TermCriteria: name: TermCriteria c:types.h@T@VecF32: @@ -320,7 +226,3 @@ files: name: TrackerMILPtr c:video.h@T@TrackerPtr: name: TrackerPtr - c:videoio.h@T@VideoCapturePtr: - name: VideoCapturePtr - c:videoio.h@T@VideoWriterPtr: - name: VideoWriterPtr diff --git a/packages/dartcv/lib/src/g/videoio.g.dart b/packages/dartcv/lib/src/g/videoio.g.dart new file mode 100644 index 00000000..cf88c81c --- /dev/null +++ b/packages/dartcv/lib/src/g/videoio.g.dart @@ -0,0 +1,991 @@ +// coverage:ignore-file +// opencv_dart - OpenCV bindings for Dart language +// some c wrappers were from gocv: https://github.com/hybridgroup/gocv +// License: Apache-2.0 https://github.com/hybridgroup/gocv/blob/release/LICENSE.txt +// Author: Rainyl +// License: Apache-2.0 +// Date: 2024/01/28 + +// AUTO GENERATED FILE, DO NOT EDIT. +// +// Generated by `package:ffigen`. +// ignore_for_file: type=lint +import 'dart:ffi' as ffi; +import 'package:dartcv/src/g/types.g.dart' as imp1; + +/// Native bindings for OpenCV - VideoIO +/// +class CvNativeVideoIO { + /// Holds the symbol lookup function. + final ffi.Pointer Function(String symbolName) + _lookup; + + /// The symbols are looked up in [dynamicLibrary]. + CvNativeVideoIO(ffi.DynamicLibrary dynamicLibrary) + : _lookup = dynamicLibrary.lookup; + + /// The symbols are looked up with [lookup]. + CvNativeVideoIO.fromLookup( + ffi.Pointer Function(String symbolName) + lookup) + : _lookup = lookup; + + void VideoCapture_Close( + VideoCapturePtr self, + ) { + return _VideoCapture_Close( + self, + ); + } + + late final _VideoCapture_ClosePtr = + _lookup>( + 'VideoCapture_Close'); + late final _VideoCapture_Close = + _VideoCapture_ClosePtr.asFunction(); + + ffi.Pointer VideoCapture_Get( + VideoCapture self, + int prop, + ffi.Pointer rval, + ) { + return _VideoCapture_Get( + self, + prop, + rval, + ); + } + + late final _VideoCapture_GetPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Int, + ffi.Pointer)>>('VideoCapture_Get'); + late final _VideoCapture_Get = _VideoCapture_GetPtr.asFunction< + ffi.Pointer Function( + VideoCapture, int, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_Get_Async( + VideoCapture self, + int prop, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_Get_Async( + self, + prop, + callback, + ); + } + + late final _VideoCapture_Get_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Int, + imp1.CvCallback_1)>>('VideoCapture_Get_Async'); + late final _VideoCapture_Get_Async = _VideoCapture_Get_AsyncPtr.asFunction< + ffi.Pointer Function(VideoCapture, int, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_Grab( + VideoCapture self, + int skip, + ) { + return _VideoCapture_Grab( + self, + skip, + ); + } + + late final _VideoCapture_GrabPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, ffi.Int)>>('VideoCapture_Grab'); + late final _VideoCapture_Grab = _VideoCapture_GrabPtr.asFunction< + ffi.Pointer Function(VideoCapture, int)>(); + + ffi.Pointer VideoCapture_Grab_Async( + VideoCapture self, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_Grab_Async( + self, + callback, + ); + } + + late final _VideoCapture_Grab_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, imp1.CvCallback_1)>>('VideoCapture_Grab_Async'); + late final _VideoCapture_Grab_Async = _VideoCapture_Grab_AsyncPtr.asFunction< + ffi.Pointer Function(VideoCapture, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_IsOpened( + VideoCapture self, + ffi.Pointer rval, + ) { + return _VideoCapture_IsOpened( + self, + rval, + ); + } + + late final _VideoCapture_IsOpenedPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, ffi.Pointer)>>('VideoCapture_IsOpened'); + late final _VideoCapture_IsOpened = _VideoCapture_IsOpenedPtr.asFunction< + ffi.Pointer Function(VideoCapture, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_IsOpened_Async( + VideoCapture self, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_IsOpened_Async( + self, + callback, + ); + } + + late final _VideoCapture_IsOpened_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, imp1.CvCallback_1)>>('VideoCapture_IsOpened_Async'); + late final _VideoCapture_IsOpened_Async = + _VideoCapture_IsOpened_AsyncPtr.asFunction< + ffi.Pointer Function(VideoCapture, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_New( + ffi.Pointer rval, + ) { + return _VideoCapture_New( + rval, + ); + } + + late final _VideoCapture_NewPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('VideoCapture_New'); + late final _VideoCapture_New = _VideoCapture_NewPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); + + ffi.Pointer VideoCapture_NewFromFile( + ffi.Pointer filename, + int apiPreference, + ffi.Pointer rval, + ) { + return _VideoCapture_NewFromFile( + filename, + apiPreference, + rval, + ); + } + + late final _VideoCapture_NewFromFilePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, ffi.Int, + ffi.Pointer)>>('VideoCapture_NewFromFile'); + late final _VideoCapture_NewFromFile = + _VideoCapture_NewFromFilePtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, int, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_NewFromFile_Async( + ffi.Pointer filename, + int apiPreference, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_NewFromFile_Async( + filename, + apiPreference, + callback, + ); + } + + late final _VideoCapture_NewFromFile_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, ffi.Int, + imp1.CvCallback_1)>>('VideoCapture_NewFromFile_Async'); + late final _VideoCapture_NewFromFile_Async = + _VideoCapture_NewFromFile_AsyncPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, int, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_NewFromIndex( + int index, + int apiPreference, + ffi.Pointer rval, + ) { + return _VideoCapture_NewFromIndex( + index, + apiPreference, + rval, + ); + } + + late final _VideoCapture_NewFromIndexPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Int, ffi.Int, + ffi.Pointer)>>('VideoCapture_NewFromIndex'); + late final _VideoCapture_NewFromIndex = + _VideoCapture_NewFromIndexPtr.asFunction< + ffi.Pointer Function( + int, int, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_NewFromIndex_Async( + int index, + int apiPreference, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_NewFromIndex_Async( + index, + apiPreference, + callback, + ); + } + + late final _VideoCapture_NewFromIndex_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Int, ffi.Int, + imp1.CvCallback_1)>>('VideoCapture_NewFromIndex_Async'); + late final _VideoCapture_NewFromIndex_Async = + _VideoCapture_NewFromIndex_AsyncPtr.asFunction< + ffi.Pointer Function(int, int, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_New_Async( + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_New_Async( + callback, + ); + } + + late final _VideoCapture_New_AsyncPtr = _lookup< + ffi + .NativeFunction Function(imp1.CvCallback_1)>>( + 'VideoCapture_New_Async'); + late final _VideoCapture_New_Async = _VideoCapture_New_AsyncPtr.asFunction< + ffi.Pointer Function(imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_Open( + VideoCapture self, + ffi.Pointer uri, + ffi.Pointer rval, + ) { + return _VideoCapture_Open( + self, + uri, + rval, + ); + } + + late final _VideoCapture_OpenPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Pointer, + ffi.Pointer)>>('VideoCapture_Open'); + late final _VideoCapture_Open = _VideoCapture_OpenPtr.asFunction< + ffi.Pointer Function( + VideoCapture, ffi.Pointer, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_OpenDevice( + VideoCapture self, + int device, + ffi.Pointer rval, + ) { + return _VideoCapture_OpenDevice( + self, + device, + rval, + ); + } + + late final _VideoCapture_OpenDevicePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Int, + ffi.Pointer)>>('VideoCapture_OpenDevice'); + late final _VideoCapture_OpenDevice = _VideoCapture_OpenDevicePtr.asFunction< + ffi.Pointer Function( + VideoCapture, int, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_OpenDeviceWithAPI( + VideoCapture self, + int device, + int apiPreference, + ffi.Pointer rval, + ) { + return _VideoCapture_OpenDeviceWithAPI( + self, + device, + apiPreference, + rval, + ); + } + + late final _VideoCapture_OpenDeviceWithAPIPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Int, + ffi.Pointer)>>('VideoCapture_OpenDeviceWithAPI'); + late final _VideoCapture_OpenDeviceWithAPI = + _VideoCapture_OpenDeviceWithAPIPtr.asFunction< + ffi.Pointer Function( + VideoCapture, int, int, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_OpenDeviceWithAPI_Async( + VideoCapture self, + int device, + int apiPreference, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_OpenDeviceWithAPI_Async( + self, + device, + apiPreference, + callback, + ); + } + + late final _VideoCapture_OpenDeviceWithAPI_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Int, + imp1.CvCallback_1)>>('VideoCapture_OpenDeviceWithAPI_Async'); + late final _VideoCapture_OpenDeviceWithAPI_Async = + _VideoCapture_OpenDeviceWithAPI_AsyncPtr.asFunction< + ffi.Pointer Function( + VideoCapture, int, int, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_OpenDevice_Async( + VideoCapture self, + int device, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_OpenDevice_Async( + self, + device, + callback, + ); + } + + late final _VideoCapture_OpenDevice_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Int, + imp1.CvCallback_1)>>('VideoCapture_OpenDevice_Async'); + late final _VideoCapture_OpenDevice_Async = + _VideoCapture_OpenDevice_AsyncPtr.asFunction< + ffi.Pointer Function( + VideoCapture, int, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_OpenWithAPI( + VideoCapture self, + ffi.Pointer uri, + int apiPreference, + ffi.Pointer rval, + ) { + return _VideoCapture_OpenWithAPI( + self, + uri, + apiPreference, + rval, + ); + } + + late final _VideoCapture_OpenWithAPIPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Pointer, + ffi.Int, ffi.Pointer)>>('VideoCapture_OpenWithAPI'); + late final _VideoCapture_OpenWithAPI = + _VideoCapture_OpenWithAPIPtr.asFunction< + ffi.Pointer Function(VideoCapture, ffi.Pointer, + int, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_OpenWithAPI_Async( + VideoCapture self, + ffi.Pointer uri, + int apiPreference, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_OpenWithAPI_Async( + self, + uri, + apiPreference, + callback, + ); + } + + late final _VideoCapture_OpenWithAPI_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Pointer, + ffi.Int, imp1.CvCallback_1)>>('VideoCapture_OpenWithAPI_Async'); + late final _VideoCapture_OpenWithAPI_Async = + _VideoCapture_OpenWithAPI_AsyncPtr.asFunction< + ffi.Pointer Function( + VideoCapture, ffi.Pointer, int, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_Open_Async( + VideoCapture self, + ffi.Pointer uri, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_Open_Async( + self, + uri, + callback, + ); + } + + late final _VideoCapture_Open_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Pointer, + imp1.CvCallback_1)>>('VideoCapture_Open_Async'); + late final _VideoCapture_Open_Async = _VideoCapture_Open_AsyncPtr.asFunction< + ffi.Pointer Function( + VideoCapture, ffi.Pointer, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_Read( + VideoCapture self, + Mat buf, + ffi.Pointer rval, + ) { + return _VideoCapture_Read( + self, + buf, + rval, + ); + } + + late final _VideoCapture_ReadPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, Mat, ffi.Pointer)>>('VideoCapture_Read'); + late final _VideoCapture_Read = _VideoCapture_ReadPtr.asFunction< + ffi.Pointer Function( + VideoCapture, Mat, ffi.Pointer)>(); + + ffi.Pointer VideoCapture_Read_Async( + VideoCapture self, + imp1.CvCallback_2 callback, + ) { + return _VideoCapture_Read_Async( + self, + callback, + ); + } + + late final _VideoCapture_Read_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, imp1.CvCallback_2)>>('VideoCapture_Read_Async'); + late final _VideoCapture_Read_Async = _VideoCapture_Read_AsyncPtr.asFunction< + ffi.Pointer Function(VideoCapture, imp1.CvCallback_2)>(); + + ffi.Pointer VideoCapture_Release( + VideoCapture self, + ) { + return _VideoCapture_Release( + self, + ); + } + + late final _VideoCapture_ReleasePtr = + _lookup Function(VideoCapture)>>( + 'VideoCapture_Release'); + late final _VideoCapture_Release = _VideoCapture_ReleasePtr.asFunction< + ffi.Pointer Function(VideoCapture)>(); + + ffi.Pointer VideoCapture_Release_Async( + VideoCapture self, + imp1.CvCallback_0 callback, + ) { + return _VideoCapture_Release_Async( + self, + callback, + ); + } + + late final _VideoCapture_Release_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, imp1.CvCallback_0)>>('VideoCapture_Release_Async'); + late final _VideoCapture_Release_Async = + _VideoCapture_Release_AsyncPtr.asFunction< + ffi.Pointer Function(VideoCapture, imp1.CvCallback_0)>(); + + ffi.Pointer VideoCapture_Set( + VideoCapture self, + int prop, + double param, + ) { + return _VideoCapture_Set( + self, + prop, + param, + ); + } + + late final _VideoCapture_SetPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, ffi.Int, ffi.Double)>>('VideoCapture_Set'); + late final _VideoCapture_Set = _VideoCapture_SetPtr.asFunction< + ffi.Pointer Function(VideoCapture, int, double)>(); + + ffi.Pointer VideoCapture_Set_Async( + VideoCapture self, + int prop, + double param, + imp1.CvCallback_1 callback, + ) { + return _VideoCapture_Set_Async( + self, + prop, + param, + callback, + ); + } + + late final _VideoCapture_Set_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Double, + imp1.CvCallback_1)>>('VideoCapture_Set_Async'); + late final _VideoCapture_Set_Async = _VideoCapture_Set_AsyncPtr.asFunction< + ffi.Pointer Function( + VideoCapture, int, double, imp1.CvCallback_1)>(); + + ffi.Pointer VideoCapture_getBackendName( + VideoCapture self, + ffi.Pointer> rval, + ) { + return _VideoCapture_getBackendName( + self, + rval, + ); + } + + late final _VideoCapture_getBackendNamePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoCapture, ffi.Pointer>)>>( + 'VideoCapture_getBackendName'); + late final _VideoCapture_getBackendName = + _VideoCapture_getBackendNamePtr.asFunction< + ffi.Pointer Function( + VideoCapture, ffi.Pointer>)>(); + + void VideoWriter_Close( + VideoWriterPtr self, + ) { + return _VideoWriter_Close( + self, + ); + } + + late final _VideoWriter_ClosePtr = + _lookup>( + 'VideoWriter_Close'); + late final _VideoWriter_Close = + _VideoWriter_ClosePtr.asFunction(); + + ffi.Pointer VideoWriter_Fourcc( + int c1, + int c2, + int c3, + int c4, + ffi.Pointer rval, + ) { + return _VideoWriter_Fourcc( + c1, + c2, + c3, + c4, + rval, + ); + } + + late final _VideoWriter_FourccPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Char, ffi.Char, ffi.Char, ffi.Char, + ffi.Pointer)>>('VideoWriter_Fourcc'); + late final _VideoWriter_Fourcc = _VideoWriter_FourccPtr.asFunction< + ffi.Pointer Function( + int, int, int, int, ffi.Pointer)>(); + + ffi.Pointer VideoWriter_Fourcc_Async( + int c1, + int c2, + int c3, + int c4, + imp1.CvCallback_1 callback, + ) { + return _VideoWriter_Fourcc_Async( + c1, + c2, + c3, + c4, + callback, + ); + } + + late final _VideoWriter_Fourcc_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Char, ffi.Char, ffi.Char, ffi.Char, + imp1.CvCallback_1)>>('VideoWriter_Fourcc_Async'); + late final _VideoWriter_Fourcc_Async = + _VideoWriter_Fourcc_AsyncPtr.asFunction< + ffi.Pointer Function( + int, int, int, int, imp1.CvCallback_1)>(); + + ffi.Pointer VideoWriter_IsOpened( + VideoWriter self, + ffi.Pointer rval, + ) { + return _VideoWriter_IsOpened( + self, + rval, + ); + } + + late final _VideoWriter_IsOpenedPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoWriter, ffi.Pointer)>>('VideoWriter_IsOpened'); + late final _VideoWriter_IsOpened = _VideoWriter_IsOpenedPtr.asFunction< + ffi.Pointer Function(VideoWriter, ffi.Pointer)>(); + + ffi.Pointer VideoWriter_IsOpened_Async( + VideoWriter self, + imp1.CvCallback_1 callback, + ) { + return _VideoWriter_IsOpened_Async( + self, + callback, + ); + } + + late final _VideoWriter_IsOpened_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoWriter, imp1.CvCallback_1)>>('VideoWriter_IsOpened_Async'); + late final _VideoWriter_IsOpened_Async = + _VideoWriter_IsOpened_AsyncPtr.asFunction< + ffi.Pointer Function(VideoWriter, imp1.CvCallback_1)>(); + + ffi.Pointer VideoWriter_New( + ffi.Pointer rval, + ) { + return _VideoWriter_New( + rval, + ); + } + + late final _VideoWriter_NewPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('VideoWriter_New'); + late final _VideoWriter_New = _VideoWriter_NewPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); + + ffi.Pointer VideoWriter_NewFromFile( + ffi.Pointer name, + int fourcc, + double fps, + int width, + int height, + bool isColor, + ffi.Pointer rval, + ) { + return _VideoWriter_NewFromFile( + name, + fourcc, + fps, + width, + height, + isColor, + rval, + ); + } + + late final _VideoWriter_NewFromFilePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Int, + ffi.Double, + ffi.Int, + ffi.Int, + ffi.Bool, + ffi.Pointer)>>('VideoWriter_NewFromFile'); + late final _VideoWriter_NewFromFile = _VideoWriter_NewFromFilePtr.asFunction< + ffi.Pointer Function(ffi.Pointer, int, double, int, + int, bool, ffi.Pointer)>(); + + ffi.Pointer VideoWriter_NewFromFile_1( + ffi.Pointer name, + int apiPreference, + int fourcc, + double fps, + int width, + int height, + bool isColor, + ffi.Pointer rval, + ) { + return _VideoWriter_NewFromFile_1( + name, + apiPreference, + fourcc, + fps, + width, + height, + isColor, + rval, + ); + } + + late final _VideoWriter_NewFromFile_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Double, + ffi.Int, + ffi.Int, + ffi.Bool, + ffi.Pointer)>>('VideoWriter_NewFromFile_1'); + late final _VideoWriter_NewFromFile_1 = + _VideoWriter_NewFromFile_1Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, int, int, + double, int, int, bool, ffi.Pointer)>(); + + ffi.Pointer VideoWriter_New_Async( + imp1.CvCallback_1 callback, + ) { + return _VideoWriter_New_Async( + callback, + ); + } + + late final _VideoWriter_New_AsyncPtr = _lookup< + ffi + .NativeFunction Function(imp1.CvCallback_1)>>( + 'VideoWriter_New_Async'); + late final _VideoWriter_New_Async = _VideoWriter_New_AsyncPtr.asFunction< + ffi.Pointer Function(imp1.CvCallback_1)>(); + + ffi.Pointer VideoWriter_Open( + VideoWriter self, + ffi.Pointer name, + int fourcc, + double fps, + int width, + int height, + bool isColor, + ) { + return _VideoWriter_Open( + self, + name, + fourcc, + fps, + width, + height, + isColor, + ); + } + + late final _VideoWriter_OpenPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoWriter, + ffi.Pointer, + ffi.Int, + ffi.Double, + ffi.Int, + ffi.Int, + ffi.Bool)>>('VideoWriter_Open'); + late final _VideoWriter_Open = _VideoWriter_OpenPtr.asFunction< + ffi.Pointer Function( + VideoWriter, ffi.Pointer, int, double, int, int, bool)>(); + + ffi.Pointer VideoWriter_Open_1( + VideoWriter self, + ffi.Pointer name, + int apiPreference, + int fourcc, + double fps, + int width, + int height, + bool isColor, + ) { + return _VideoWriter_Open_1( + self, + name, + apiPreference, + fourcc, + fps, + width, + height, + isColor, + ); + } + + late final _VideoWriter_Open_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoWriter, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Double, + ffi.Int, + ffi.Int, + ffi.Bool)>>('VideoWriter_Open_1'); + late final _VideoWriter_Open_1 = _VideoWriter_Open_1Ptr.asFunction< + ffi.Pointer Function(VideoWriter, ffi.Pointer, int, + int, double, int, int, bool)>(); + + ffi.Pointer VideoWriter_Open_Async( + VideoWriter self, + ffi.Pointer name, + ffi.Pointer codec, + double fps, + int width, + int height, + bool isColor, + imp1.CvCallback_1 callback, + ) { + return _VideoWriter_Open_Async( + self, + name, + codec, + fps, + width, + height, + isColor, + callback, + ); + } + + late final _VideoWriter_Open_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoWriter, + ffi.Pointer, + ffi.Pointer, + ffi.Double, + ffi.Int, + ffi.Int, + ffi.Bool, + imp1.CvCallback_1)>>('VideoWriter_Open_Async'); + late final _VideoWriter_Open_Async = _VideoWriter_Open_AsyncPtr.asFunction< + ffi.Pointer Function(VideoWriter, ffi.Pointer, + ffi.Pointer, double, int, int, bool, imp1.CvCallback_1)>(); + + ffi.Pointer VideoWriter_Release( + VideoWriter self, + ) { + return _VideoWriter_Release( + self, + ); + } + + late final _VideoWriter_ReleasePtr = + _lookup Function(VideoWriter)>>( + 'VideoWriter_Release'); + late final _VideoWriter_Release = _VideoWriter_ReleasePtr.asFunction< + ffi.Pointer Function(VideoWriter)>(); + + ffi.Pointer VideoWriter_Release_Async( + VideoWriter self, + imp1.CvCallback_0 callback, + ) { + return _VideoWriter_Release_Async( + self, + callback, + ); + } + + late final _VideoWriter_Release_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoWriter, imp1.CvCallback_0)>>('VideoWriter_Release_Async'); + late final _VideoWriter_Release_Async = + _VideoWriter_Release_AsyncPtr.asFunction< + ffi.Pointer Function(VideoWriter, imp1.CvCallback_0)>(); + + ffi.Pointer VideoWriter_Write( + VideoWriter self, + Mat img, + ) { + return _VideoWriter_Write( + self, + img, + ); + } + + late final _VideoWriter_WritePtr = _lookup< + ffi.NativeFunction Function(VideoWriter, Mat)>>( + 'VideoWriter_Write'); + late final _VideoWriter_Write = _VideoWriter_WritePtr.asFunction< + ffi.Pointer Function(VideoWriter, Mat)>(); + + ffi.Pointer VideoWriter_Write_Async( + VideoWriter self, + Mat img, + imp1.CvCallback_0 callback, + ) { + return _VideoWriter_Write_Async( + self, + img, + callback, + ); + } + + late final _VideoWriter_Write_AsyncPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoWriter, Mat, imp1.CvCallback_0)>>('VideoWriter_Write_Async'); + late final _VideoWriter_Write_Async = _VideoWriter_Write_AsyncPtr.asFunction< + ffi.Pointer Function(VideoWriter, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer VideoWriter_getBackendName( + VideoWriter self, + ffi.Pointer> rval, + ) { + return _VideoWriter_getBackendName( + self, + rval, + ); + } + + late final _VideoWriter_getBackendNamePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + VideoWriter, ffi.Pointer>)>>( + 'VideoWriter_getBackendName'); + late final _VideoWriter_getBackendName = + _VideoWriter_getBackendNamePtr.asFunction< + ffi.Pointer Function( + VideoWriter, ffi.Pointer>)>(); + + late final addresses = _SymbolAddresses(this); +} + +class _SymbolAddresses { + final CvNativeVideoIO _library; + _SymbolAddresses(this._library); + ffi.Pointer> + get VideoCapture_Close => _library._VideoCapture_ClosePtr; + ffi.Pointer> + get VideoWriter_Close => _library._VideoWriter_ClosePtr; +} + +typedef CvStatus = imp1.CvStatus; +typedef Mat = imp1.Mat; + +final class VideoCapture extends ffi.Struct { + external ffi.Pointer ptr; +} + +typedef VideoCapturePtr = ffi.Pointer; + +final class VideoWriter extends ffi.Struct { + external ffi.Pointer ptr; +} + +typedef VideoWriterPtr = ffi.Pointer; diff --git a/packages/dartcv/lib/src/g/videoio.yaml b/packages/dartcv/lib/src/g/videoio.yaml new file mode 100644 index 00000000..5bb5f4f1 --- /dev/null +++ b/packages/dartcv/lib/src/g/videoio.yaml @@ -0,0 +1,108 @@ +format_version: 1.0.0 +files: + package:dartcv/src/g/videoio.g.dart: + used-config: + ffi-native: false + symbols: + c:@F@VideoCapture_Close: + name: VideoCapture_Close + c:@F@VideoCapture_Get: + name: VideoCapture_Get + c:@F@VideoCapture_Get_Async: + name: VideoCapture_Get_Async + c:@F@VideoCapture_Grab: + name: VideoCapture_Grab + c:@F@VideoCapture_Grab_Async: + name: VideoCapture_Grab_Async + c:@F@VideoCapture_IsOpened: + name: VideoCapture_IsOpened + c:@F@VideoCapture_IsOpened_Async: + name: VideoCapture_IsOpened_Async + c:@F@VideoCapture_New: + name: VideoCapture_New + c:@F@VideoCapture_NewFromFile: + name: VideoCapture_NewFromFile + c:@F@VideoCapture_NewFromFile_Async: + name: VideoCapture_NewFromFile_Async + c:@F@VideoCapture_NewFromIndex: + name: VideoCapture_NewFromIndex + c:@F@VideoCapture_NewFromIndex_Async: + name: VideoCapture_NewFromIndex_Async + c:@F@VideoCapture_New_Async: + name: VideoCapture_New_Async + c:@F@VideoCapture_Open: + name: VideoCapture_Open + c:@F@VideoCapture_OpenDevice: + name: VideoCapture_OpenDevice + c:@F@VideoCapture_OpenDeviceWithAPI: + name: VideoCapture_OpenDeviceWithAPI + c:@F@VideoCapture_OpenDeviceWithAPI_Async: + name: VideoCapture_OpenDeviceWithAPI_Async + c:@F@VideoCapture_OpenDevice_Async: + name: VideoCapture_OpenDevice_Async + c:@F@VideoCapture_OpenWithAPI: + name: VideoCapture_OpenWithAPI + c:@F@VideoCapture_OpenWithAPI_Async: + name: VideoCapture_OpenWithAPI_Async + c:@F@VideoCapture_Open_Async: + name: VideoCapture_Open_Async + c:@F@VideoCapture_Read: + name: VideoCapture_Read + c:@F@VideoCapture_Read_Async: + name: VideoCapture_Read_Async + c:@F@VideoCapture_Release: + name: VideoCapture_Release + c:@F@VideoCapture_Release_Async: + name: VideoCapture_Release_Async + c:@F@VideoCapture_Set: + name: VideoCapture_Set + c:@F@VideoCapture_Set_Async: + name: VideoCapture_Set_Async + c:@F@VideoCapture_getBackendName: + name: VideoCapture_getBackendName + c:@F@VideoWriter_Close: + name: VideoWriter_Close + c:@F@VideoWriter_Fourcc: + name: VideoWriter_Fourcc + c:@F@VideoWriter_Fourcc_Async: + name: VideoWriter_Fourcc_Async + c:@F@VideoWriter_IsOpened: + name: VideoWriter_IsOpened + c:@F@VideoWriter_IsOpened_Async: + name: VideoWriter_IsOpened_Async + c:@F@VideoWriter_New: + name: VideoWriter_New + c:@F@VideoWriter_NewFromFile: + name: VideoWriter_NewFromFile + c:@F@VideoWriter_NewFromFile_1: + name: VideoWriter_NewFromFile_1 + c:@F@VideoWriter_New_Async: + name: VideoWriter_New_Async + c:@F@VideoWriter_Open: + name: VideoWriter_Open + c:@F@VideoWriter_Open_1: + name: VideoWriter_Open_1 + c:@F@VideoWriter_Open_Async: + name: VideoWriter_Open_Async + c:@F@VideoWriter_Release: + name: VideoWriter_Release + c:@F@VideoWriter_Release_Async: + name: VideoWriter_Release_Async + c:@F@VideoWriter_Write: + name: VideoWriter_Write + c:@F@VideoWriter_Write_Async: + name: VideoWriter_Write_Async + c:@F@VideoWriter_getBackendName: + name: VideoWriter_getBackendName + c:@S@VideoCapture: + name: VideoCapture + c:@S@VideoWriter: + name: VideoWriter + c:types.h@T@CvStatus: + name: CvStatus + c:types.h@T@Mat: + name: Mat + c:videoio.h@T@VideoCapturePtr: + name: VideoCapturePtr + c:videoio.h@T@VideoWriterPtr: + name: VideoWriterPtr diff --git a/lib/src/gapi/gapi.dart b/packages/dartcv/lib/src/gapi/gapi.dart similarity index 100% rename from lib/src/gapi/gapi.dart rename to packages/dartcv/lib/src/gapi/gapi.dart diff --git a/lib/src/gapi/gcomputation.dart b/packages/dartcv/lib/src/gapi/gcomputation.dart similarity index 100% rename from lib/src/gapi/gcomputation.dart rename to packages/dartcv/lib/src/gapi/gcomputation.dart diff --git a/lib/src/gapi/gmat.dart b/packages/dartcv/lib/src/gapi/gmat.dart similarity index 100% rename from lib/src/gapi/gmat.dart rename to packages/dartcv/lib/src/gapi/gmat.dart diff --git a/lib/src/gapi/gscalar.dart b/packages/dartcv/lib/src/gapi/gscalar.dart similarity index 100% rename from lib/src/gapi/gscalar.dart rename to packages/dartcv/lib/src/gapi/gscalar.dart diff --git a/lib/src/highgui/highgui.dart b/packages/dartcv/lib/src/highgui/highgui.dart similarity index 99% rename from lib/src/highgui/highgui.dart rename to packages/dartcv/lib/src/highgui/highgui.dart index 8b9aaa1e..526a773d 100644 --- a/lib/src/highgui/highgui.dart +++ b/packages/dartcv/lib/src/highgui/highgui.dart @@ -141,7 +141,7 @@ class Window { /// For further details, please see: /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga8daf4730d3adf7035b6de9be4c469af5 Rect selectROI(Mat img) { - final result = calloc(); + final result = calloc(); final cname = name.toNativeUtf8().cast(); cvRun(() => chighgui.Window_SelectROI(cname, img.ref, result)); calloc.free(cname); diff --git a/lib/src/imgcodecs/imgcodecs.dart b/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart similarity index 100% rename from lib/src/imgcodecs/imgcodecs.dart rename to packages/dartcv/lib/src/imgcodecs/imgcodecs.dart diff --git a/lib/src/imgcodecs/imgcodecs_async.dart b/packages/dartcv/lib/src/imgcodecs/imgcodecs_async.dart similarity index 100% rename from lib/src/imgcodecs/imgcodecs_async.dart rename to packages/dartcv/lib/src/imgcodecs/imgcodecs_async.dart diff --git a/lib/src/imgproc/clahe.dart b/packages/dartcv/lib/src/imgproc/clahe.dart similarity index 97% rename from lib/src/imgproc/clahe.dart rename to packages/dartcv/lib/src/imgproc/clahe.dart index 127dc993..647df860 100644 --- a/lib/src/imgproc/clahe.dart +++ b/packages/dartcv/lib/src/imgproc/clahe.dart @@ -35,7 +35,7 @@ class CLAHE extends CvStruct { /// https:///docs.opencv.org/master/d6/db6/classcv_1_1CLAHE.html factory CLAHE.create([double clipLimit = 40, (int width, int height) tileGridSize = (8, 8)]) { final p = calloc(); - final size = calloc() + final size = calloc() ..ref.width = tileGridSize.$1 ..ref.height = tileGridSize.$2; cimgproc.CLAHE_CreateWithParams(clipLimit, size.ref, p); @@ -66,7 +66,7 @@ class CLAHE extends CvStruct { } Size get tilesGridSize { - final p = calloc(); + final p = calloc(); cvRun(() => cimgproc.CLAHE_GetTilesGridSize(ref, p)); return Size.fromPointer(p); } diff --git a/lib/src/imgproc/clahe_async.dart b/packages/dartcv/lib/src/imgproc/clahe_async.dart similarity index 95% rename from lib/src/imgproc/clahe_async.dart rename to packages/dartcv/lib/src/imgproc/clahe_async.dart index bbbca790..271b9d4e 100644 --- a/lib/src/imgproc/clahe_async.dart +++ b/packages/dartcv/lib/src/imgproc/clahe_async.dart @@ -17,7 +17,7 @@ extension CLAHEAsync on CLAHE { (int width, int height) tileGridSize = (8, 8), ]) async => cvRunAsync( - (callback) => cimgproc.CLAHE_CreateWithParams_Async(clipLimit, tileGridSize.cvd.ref, callback), + (callback) => cimgproc.CLAHE_CreateWithParams_Async(clipLimit, tileGridSize.toSize().ref, callback), (c, p) => c.complete(CLAHE.fromPointer(p.cast())), ); diff --git a/lib/src/imgproc/imgproc.dart b/packages/dartcv/lib/src/imgproc/imgproc.dart similarity index 99% rename from lib/src/imgproc/imgproc.dart rename to packages/dartcv/lib/src/imgproc/imgproc.dart index dfecc4e4..07de902d 100644 --- a/lib/src/imgproc/imgproc.dart +++ b/packages/dartcv/lib/src/imgproc/imgproc.dart @@ -328,7 +328,7 @@ Mat erode( loDiff ??= Scalar(); upDiff ??= Scalar(); mask ??= Mat.empty(); - final pRect = calloc(); + final pRect = calloc(); final pRval = calloc(); cvRun( () => cimgproc.FloodFill( @@ -353,7 +353,7 @@ Mat erode( /// For further details, please see: /// https:///docs.opencv.org/3.3.0/d3/dc0/group__imgproc__shape.html#gacb413ddce8e48ff3ca61ed7cf626a366 Rect boundingRect(VecPoint points) { - final rect = calloc(); + final rect = calloc(); cvRun(() => cimgproc.BoundingRect(points.ref, rect)); return Rect.fromPointer(rect); } @@ -411,7 +411,7 @@ RotatedRect fitEllipse(VecPoint points) { /// https:///docs.opencv.org/3.4/d3/dc0/group__imgproc__shape.html#ga8ce13c24081bbc7151e9326f412190f1 (Point2f center, double radius) minEnclosingCircle(VecPoint points) { return cvRunArena<(Point2f, double)>((arena) { - final center = calloc(); + final center = calloc(); final radius = arena(); cvRun(() => cimgproc.MinEnclosingCircle(points.ref, center, radius)); return (Point2f.fromPointer(center), radius.value); @@ -1157,7 +1157,7 @@ Mat polylines( ) { return using<(Size, int)>((arena) { final baseline = arena(); - final size = calloc(); + final size = calloc(); final textPtr = text.toNativeUtf8(allocator: arena); cvRun(() => cimgproc.GetTextSizeWithBaseline(textPtr.cast(), fontFace, fontScale, thickness, baseline, size)); @@ -1541,7 +1541,7 @@ Mat invertAffineTransform(InputArray M, {OutputArray? iM}) { window ??= Mat.empty(); return cvRunArena<(Point2f, double)>((arena) { final p = arena(); - final pp = calloc(); + final pp = calloc(); cvRun(() => cimgproc.PhaseCorrelate(src1.ref, src2.ref, window!.ref, p, pp)); return (Point2f.fromPointer(pp), p.value); }); diff --git a/lib/src/imgproc/imgproc_async.dart b/packages/dartcv/lib/src/imgproc/imgproc_async.dart similarity index 99% rename from lib/src/imgproc/imgproc_async.dart rename to packages/dartcv/lib/src/imgproc/imgproc_async.dart index 2f697833..dec29f58 100644 --- a/lib/src/imgproc/imgproc_async.dart +++ b/packages/dartcv/lib/src/imgproc/imgproc_async.dart @@ -279,7 +279,7 @@ Future<(int rval, Mat image, Mat mask, Rect rect)> floodFillAsync( (c, prval, prect) { final rval = prval.cast().value; calloc.free(prval); - final rect = Rect.fromPointer(prect.cast()); + final rect = Rect.fromPointer(prect.cast()); c.complete((rval, image, mask ?? Mat.empty(), rect)); }, ); @@ -1061,7 +1061,7 @@ Future<(Size size, int baseline)> getTextSizeAsync( final ret = cvRunAsync2<(Size, int)>( (callback) => cimgproc.GetTextSizeWithBaseline_Async(ctext, fontFace, fontScale, thickness, callback), (completer, p, p1) { - final size = Size.fromPointer(p.cast()); + final size = Size.fromPointer(p.cast()); final baseline = p1.cast().value; calloc.free(p1); completer.complete((size, baseline)); @@ -1444,7 +1444,7 @@ Future<(Point2f rval, double response)> phaseCorrelateAsync( (c, p, p1) { final response = p1.cast().value; calloc.free(p1); - c.complete((Point2f.fromPointer(p.cast()), response)); + c.complete((Point2f.fromPointer(p.cast()), response)); }, ); diff --git a/lib/src/imgproc/subdiv2d.dart b/packages/dartcv/lib/src/imgproc/subdiv2d.dart similarity index 97% rename from lib/src/imgproc/subdiv2d.dart rename to packages/dartcv/lib/src/imgproc/subdiv2d.dart index a5e7ef3b..ddf8c70d 100644 --- a/lib/src/imgproc/subdiv2d.dart +++ b/packages/dartcv/lib/src/imgproc/subdiv2d.dart @@ -49,7 +49,7 @@ class Subdiv2D extends CvStruct { /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aee192f95bf19c74619641496c457586d (int rval, Point2f dstpt) edgeDst(int edge) { return using<(int, Point2f)>((arena) { - final pp = calloc(); + final pp = calloc(); final p = arena(); cvRun(() => cimgproc.Subdiv2D_EdgeDst(ref, edge, pp, p)); return (p.value, Point2f.fromPointer(pp)); @@ -61,7 +61,7 @@ class Subdiv2D extends CvStruct { /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a5563e3cae0a9b95df63e72f0c12f9389 (int rval, Point2f orgpt) edgeOrg(int edge) { return using<(int, Point2f)>((arena) { - final pp = calloc(); + final pp = calloc(); final p = arena(); cvRun(() => cimgproc.Subdiv2D_EdgeOrg(ref, edge, pp, p)); return (p.value, Point2f.fromPointer(pp)); @@ -78,7 +78,7 @@ class Subdiv2D extends CvStruct { /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a3ec256af000e129e08eb5f269ccdeb0f (int rval, Point2f nearestPt) findNearest(Point2f pt) { return using<(int, Point2f)>((arena) { - final pp = calloc(); + final pp = calloc(); final p = arena(); cvRun(() => cimgproc.Subdiv2D_FindNearest(ref, pt.ref, pp, p)); return (p.value, Point2f.fromPointer(pp)); @@ -114,7 +114,7 @@ class Subdiv2D extends CvStruct { List getEdgeList() { return using>((arena) { final pv = arena>(); - final psize = arena(); + final psize = arena(); cvRun(() => cimgproc.Subdiv2D_GetEdgeList(ref, pv, psize)); return List.generate(psize.value, (i) { final v = pv.value[i]; @@ -143,7 +143,7 @@ class Subdiv2D extends CvStruct { List getTriangleList() { return using>((arena) { final pv = arena>(); - final psize = arena(); + final psize = arena(); cvRun(() => cimgproc.Subdiv2D_GetTriangleList(ref, pv, psize)); return List.generate(psize.value, (i) { final v = pv.value[i]; @@ -157,7 +157,7 @@ class Subdiv2D extends CvStruct { /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a5297daca30f90d1e6d0cc5a75ba76351 (Point2f rval, int firstEdge) getVertex(int vertex) { return using<(Point2f, int)>((arena) { - final pp = calloc(); + final pp = calloc(); final p = arena(); cvRun(() => cimgproc.Subdiv2D_GetVertex(ref, vertex, p, pp)); return (Point2f.fromPointer(pp), p.value); diff --git a/lib/src/imgproc/subdiv2d_async.dart b/packages/dartcv/lib/src/imgproc/subdiv2d_async.dart similarity index 98% rename from lib/src/imgproc/subdiv2d_async.dart rename to packages/dartcv/lib/src/imgproc/subdiv2d_async.dart index 9ee47a7e..2d4ba90e 100644 --- a/lib/src/imgproc/subdiv2d_async.dart +++ b/packages/dartcv/lib/src/imgproc/subdiv2d_async.dart @@ -38,7 +38,7 @@ extension Subdiv2DAsync on Subdiv2D { cvRunAsync2((callback) => cimgproc.Subdiv2D_EdgeDst_Async(ref, edge, callback), (completer, p, p1) { final rval = p.cast().value; calloc.free(p); - completer.complete((rval, Point2f.fromPointer(p1.cast()))); + completer.complete((rval, Point2f.fromPointer(p1.cast()))); }); /// Returns the edge origin. @@ -48,7 +48,7 @@ extension Subdiv2DAsync on Subdiv2D { cvRunAsync2((callback) => cimgproc.Subdiv2D_EdgeOrg_Async(ref, edge, callback), (completer, p, p1) { final rval = p.cast().value; calloc.free(p); - completer.complete((rval, Point2f.fromPointer(p1.cast()))); + completer.complete((rval, Point2f.fromPointer(p1.cast()))); }); /// Finds the subdivision vertex closest to the given point. @@ -64,7 +64,7 @@ extension Subdiv2DAsync on Subdiv2D { (completer, p, p1) { final rval = p.cast().value; calloc.free(p); - completer.complete((rval, Point2f.fromPointer(p1.cast()))); + completer.complete((rval, Point2f.fromPointer(p1.cast()))); }); /// Returns one of the edges related to the given edge. @@ -119,7 +119,7 @@ extension Subdiv2DAsync on Subdiv2D { cvRunAsync2((callback) => cimgproc.Subdiv2D_GetVertex_Async(ref, vertex, callback), (c, p, p1) { final firstEdge = p1.cast().value; calloc.free(p1); - c.complete((Point2f.fromPointer(p.cast()), firstEdge)); + c.complete((Point2f.fromPointer(p.cast()), firstEdge)); }); /// Returns a list of all Voronoi facets. diff --git a/lib/src/native_lib.dart b/packages/dartcv/lib/src/native_lib.dart similarity index 52% rename from lib/src/native_lib.dart rename to packages/dartcv/lib/src/native_lib.dart index 7e749222..17c49251 100644 --- a/lib/src/native_lib.dart +++ b/packages/dartcv/lib/src/native_lib.dart @@ -18,35 +18,35 @@ import 'g/objdetect.g.dart' as objdetect; import 'g/photo.g.dart' as photo; import 'g/stitching.g.dart' as stitching; // import 'g/types.g.dart' as types; -import 'g/video_io.g.dart' as video_io; - -const _libraryName = "opencv_dart"; +import 'g/video.g.dart' as video; +import 'g/videoio.g.dart' as videoio; // load native library -ffi.DynamicLibrary loadNativeLibrary() { - if (Platform.isIOS) return ffi.DynamicLibrary.process(); +ffi.DynamicLibrary loadNativeLibrary(String libName) { + if (Platform.isIOS || Platform.isMacOS) return ffi.DynamicLibrary.process(); final defaultLibPath = switch (Platform.operatingSystem) { - "windows" => "$_libraryName.dll", - "linux" || "android" || "fuchsia" => "lib$_libraryName.so", - "macos" => "lib$_libraryName.dylib", + "windows" => "$libName.dll", + "linux" || "android" || "fuchsia" => "lib$libName.so", + "macos" => "lib$libName.dylib", _ => throw UnsupportedError( "Platform ${Platform.operatingSystem} not supported", ) }; - final libPath = Platform.environment["OPENCV_DART_LIB_PATH"] ?? defaultLibPath; + final libPath = Platform.environment["dartcv_core_LIB_PATH"] ?? defaultLibPath; return ffi.DynamicLibrary.open(libPath); } -final ccalib3d = calib3d.CvNativeCalib3d(loadNativeLibrary()); -final ccontrib = contrib.CvNativeContrib(loadNativeLibrary()); -final ccore = core.CvNativeCore(loadNativeLibrary()); -final cdnn = dnn.CvNativeDnn(loadNativeLibrary()); -final cfeatures2d = features2d.CvNativeFeatures2d(loadNativeLibrary()); -final cgapi = gapi.CvNativeGapi(loadNativeLibrary()); -final chighgui = highgui.CvNativeHighgui(loadNativeLibrary()); -final cimgcodecs = imgcodecs.CvNativeImgcodecs(loadNativeLibrary()); -final cimgproc = imgproc.CvNativeImgproc(loadNativeLibrary()); -final cobjdetect = objdetect.CvNativeObjdetect(loadNativeLibrary()); -final cphoto = photo.CvNativePhoto(loadNativeLibrary()); -final cstitching = stitching.CvNativeStitching(loadNativeLibrary()); -final cvideo = video_io.CvNativeVideoIO(loadNativeLibrary()); +final ccalib3d = calib3d.CvNativeCalib3d(loadNativeLibrary("dartcv")); +final ccontrib = contrib.CvNativeContrib(loadNativeLibrary("dartcv")); +final ccore = core.CvNativeCore(loadNativeLibrary("dartcv")); +final cdnn = dnn.CvNativeDnn(loadNativeLibrary("dartcv")); +final cfeatures2d = features2d.CvNativeFeatures2d(loadNativeLibrary("dartcv")); +final cgapi = gapi.CvNativeGapi(loadNativeLibrary("dartcv")); +final chighgui = highgui.CvNativeHighgui(loadNativeLibrary("dartcv")); +final cimgcodecs = imgcodecs.CvNativeImgcodecs(loadNativeLibrary("dartcv")); +final cimgproc = imgproc.CvNativeImgproc(loadNativeLibrary("dartcv")); +final cobjdetect = objdetect.CvNativeObjdetect(loadNativeLibrary("dartcv")); +final cphoto = photo.CvNativePhoto(loadNativeLibrary("dartcv")); +final cstitching = stitching.CvNativeStitching(loadNativeLibrary("dartcv")); +final cvideo = video.CvNativeVideo(loadNativeLibrary("dartcv")); +final cvideoio = videoio.CvNativeVideoIO(loadNativeLibrary("dartcv")); diff --git a/lib/src/objdetect/objdetect.dart b/packages/dartcv/lib/src/objdetect/objdetect.dart similarity index 99% rename from lib/src/objdetect/objdetect.dart rename to packages/dartcv/lib/src/objdetect/objdetect.dart index 0a77b9ff..4be3f69e 100644 --- a/lib/src/objdetect/objdetect.dart +++ b/packages/dartcv/lib/src/objdetect/objdetect.dart @@ -165,7 +165,7 @@ class CascadeClassifier extends CvStruct { /// https://docs.opencv.org/4.x/d1/de5/classcv_1_1CascadeClassifier.html#a7a131d319ab42a444ff2bcbb433b7b41 (int, int) getOriginalWindowSize() { - final p = calloc(); + final p = calloc(); cvRun(() => cobjdetect.CascadeClassifier_getOriginalWindowSize(ref, p)); final ret = (p.ref.width, p.ref.height); calloc.free(p); @@ -745,7 +745,7 @@ class FaceDetectorYN extends CvStruct { /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#a68b6fb9bffbed0f3d5c104996113f247 (int, int) getInputSize() { - final p = calloc(); + final p = calloc(); cvRun(() => cobjdetect.FaceDetectorYN_GetInputSize(ref, p)); final ret = (p.ref.width, p.ref.height); calloc.free(p); diff --git a/lib/src/objdetect/objdetect_async.dart b/packages/dartcv/lib/src/objdetect/objdetect_async.dart similarity index 99% rename from lib/src/objdetect/objdetect_async.dart rename to packages/dartcv/lib/src/objdetect/objdetect_async.dart index c6c709c2..4c6b9ffd 100644 --- a/lib/src/objdetect/objdetect_async.dart +++ b/packages/dartcv/lib/src/objdetect/objdetect_async.dart @@ -63,8 +63,8 @@ extension CascadeClassifierAsync on CascadeClassifier { scaleFactor, minNeighbors, flags, - minSize.cvd.ref, - maxSize.cvd.ref, + minSize.toSize().ref, + maxSize.toSize().ref, callback, ), (c, ret) { return c.complete(VecRect.fromPointer(ret.cast())); @@ -154,7 +154,7 @@ extension CascadeClassifierAsync on CascadeClassifier { Future<(int, int)> getOriginalWindowSizeAsync() async { final rval = cvRunAsync<(int, int)>( (callback) => cobjdetect.CascadeClassifier_getOriginalWindowSize_Async(ref, callback), (c, p) { - final size = p.cast().ref; + final size = p.cast().ref; final ret = (size.width, size.height); return c.complete(ret); }); @@ -633,7 +633,7 @@ extension FaceDetectorYNAsync on FaceDetectorYN { Future<(int, int)> getInputSizeAsync() async { final rval = cvRunAsync<(int, int)>( (callback) => cobjdetect.FaceDetectorYN_GetInputSize_Async(ref, callback), (c, p) { - final size = p.cast().ref; + final size = p.cast().ref; final ret = (size.width, size.height); return c.complete(ret); }); diff --git a/lib/src/photo/photo.dart b/packages/dartcv/lib/src/photo/photo.dart similarity index 100% rename from lib/src/photo/photo.dart rename to packages/dartcv/lib/src/photo/photo.dart diff --git a/lib/src/photo/photo_async.dart b/packages/dartcv/lib/src/photo/photo_async.dart similarity index 100% rename from lib/src/photo/photo_async.dart rename to packages/dartcv/lib/src/photo/photo_async.dart diff --git a/lib/src/stitching/stitching.dart b/packages/dartcv/lib/src/stitching/stitching.dart similarity index 100% rename from lib/src/stitching/stitching.dart rename to packages/dartcv/lib/src/stitching/stitching.dart diff --git a/lib/src/stitching/stitching_async.dart b/packages/dartcv/lib/src/stitching/stitching_async.dart similarity index 100% rename from lib/src/stitching/stitching_async.dart rename to packages/dartcv/lib/src/stitching/stitching_async.dart diff --git a/lib/src/video/video.dart b/packages/dartcv/lib/src/video/video.dart similarity index 99% rename from lib/src/video/video.dart rename to packages/dartcv/lib/src/video/video.dart index 29915539..007a6a19 100644 --- a/lib/src/video/video.dart +++ b/packages/dartcv/lib/src/video/video.dart @@ -17,7 +17,7 @@ import '../core/size.dart'; import '../core/termcriteria.dart'; import '../core/vec.dart'; import '../g/constants.g.dart'; -import '../g/video_io.g.dart' as cvg; +import '../g/video.g.dart' as cvg; import '../native_lib.dart' show cvideo; class BackgroundSubtractorMOG2 extends CvStruct { @@ -281,7 +281,7 @@ class TrackerMIL extends CvStruct { /// https://docs.opencv.org/4.x/d0/d0a/classcv_1_1Tracker.html#a92d2012f576e6c06eb2e257d110a6529 (bool, Rect) update(Mat img) { return cvRunArena<(bool, Rect)>((arena) { - final bBox = calloc(); + final bBox = calloc(); final p = arena(); cvRun(() => cvideo.TrackerMIL_Update(ref, img.ref, bBox, p)); return (p.value, Rect.fromPointer(bBox)); diff --git a/lib/src/video/video_async.dart b/packages/dartcv/lib/src/video/video_async.dart similarity index 99% rename from lib/src/video/video_async.dart rename to packages/dartcv/lib/src/video/video_async.dart index 5e82ba52..0a38b0ef 100644 --- a/lib/src/video/video_async.dart +++ b/packages/dartcv/lib/src/video/video_async.dart @@ -17,7 +17,7 @@ import '../core/size.dart'; import '../core/termcriteria.dart'; import '../core/vec.dart'; import '../g/constants.g.dart'; -import '../g/video_io.g.dart' as cvg; +import '../g/video.g.dart' as cvg; import '../native_lib.dart' show cvideo; import 'video.dart'; @@ -235,7 +235,7 @@ extension TrackerMILAsync on TrackerMIL { (completer, p, p1) { final rval = p.cast().value; calloc.free(p); - completer.complete((rval, Rect.fromPointer(p1.cast()))); + completer.complete((rval, Rect.fromPointer(p1.cast()))); }, ); } diff --git a/lib/src/video/videoio.dart b/packages/dartcv/lib/src/videoio/videoio.dart similarity index 81% rename from lib/src/video/videoio.dart rename to packages/dartcv/lib/src/videoio/videoio.dart index 5b76113e..fc0fdbcd 100644 --- a/lib/src/video/videoio.dart +++ b/packages/dartcv/lib/src/videoio/videoio.dart @@ -12,8 +12,8 @@ import 'package:ffi/ffi.dart'; import '../core/base.dart'; import '../core/mat.dart'; import '../g/constants.g.dart'; -import '../g/video_io.g.dart' as cvg; -import '../native_lib.dart' show cvideo; +import '../g/videoio.g.dart' as cvg; +import '../native_lib.dart' show cvideoio; class VideoCapture extends CvStruct { VideoCapture._(cvg.VideoCapturePtr ptr, [bool attach = true]) : super.fromPointer(ptr) { @@ -26,7 +26,7 @@ class VideoCapture extends CvStruct { factory VideoCapture.empty() { final p = calloc(); - cvRun(() => cvideo.VideoCapture_New(p)); + cvRun(() => cvideoio.VideoCapture_New(p)); return VideoCapture._(p); } @@ -37,7 +37,7 @@ class VideoCapture extends CvStruct { return using((arena) { final p = calloc(); final cname = filename.toNativeUtf8(allocator: arena); - cvRun(() => cvideo.VideoCapture_NewFromFile(cname.cast(), apiPreference, p)); + cvRun(() => cvideoio.VideoCapture_NewFromFile(cname.cast(), apiPreference, p)); return VideoCapture._(p); }); } @@ -48,17 +48,17 @@ class VideoCapture extends CvStruct { factory VideoCapture.fromDevice(int device, {int apiPreference = CAP_ANY}) { final p = calloc(); - cvRun(() => cvideo.VideoCapture_NewFromIndex(device, apiPreference, p)); + cvRun(() => cvideoio.VideoCapture_NewFromIndex(device, apiPreference, p)); return VideoCapture._(p); } @override cvg.VideoCapture get ref => ptr.ref; - static final finalizer = OcvFinalizer(cvideo.addresses.VideoCapture_Close); + static final finalizer = OcvFinalizer(cvideoio.addresses.VideoCapture_Close); void dispose() { finalizer.detach(this); - cvideo.VideoCapture_Close(ptr); + cvideoio.VideoCapture_Close(ptr); } /// Returns the specified [VideoCapture] property. @@ -67,18 +67,18 @@ class VideoCapture extends CvStruct { double get(int propId) { return cvRunArena((arena) { final p = arena(); - cvRun(() => cvideo.VideoCapture_Get(ref, propId, p)); + cvRun(() => cvideoio.VideoCapture_Get(ref, propId, p)); return p.value; }); } void set(int prop, double value) { - cvRun(() => cvideo.VideoCapture_Set(ref, prop, value)); + cvRun(() => cvideoio.VideoCapture_Set(ref, prop, value)); } String getBackendName() { final p = calloc>(); - cvRun(() => cvideo.VideoCapture_getBackendName(ref, p)); + cvRun(() => cvideoio.VideoCapture_getBackendName(ref, p)); final name = p.value.toDartString(); calloc.free(p); return name; @@ -91,25 +91,25 @@ class VideoCapture extends CvStruct { bool get isOpened { return cvRunArena((arena) { final p = arena(); - cvRun(() => cvideo.VideoCapture_IsOpened(ref, p)); + cvRun(() => cvideoio.VideoCapture_IsOpened(ref, p)); return p.value != 0; }); } - // String getBackendName()=>cffiVideoIO.videocapture + // String getBackendName()=>cvideoioVideoIO.videocapture /// Grabs the next frame from video file or capturing device. /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939 void grab({int skip = 0}) { - cvRun(() => cvideo.VideoCapture_Grab(ref, skip)); + cvRun(() => cvideoio.VideoCapture_Grab(ref, skip)); } (bool, Mat) read({Mat? m}) { m ??= Mat.empty(); return cvRunArena<(bool, Mat)>((arena) { final p = arena(); - cvRun(() => cvideo.VideoCapture_Read(ref, m!.ref, p)); + cvRun(() => cvideoio.VideoCapture_Read(ref, m!.ref, p)); return (p.value != 0, m!); }); } @@ -123,7 +123,7 @@ class VideoCapture extends CvStruct { return using((arena) { final cname = filename.toNativeUtf8(allocator: arena); final success = arena(); - cvRun(() => cvideo.VideoCapture_OpenWithAPI(ref, cname.cast(), apiPreference, success)); + cvRun(() => cvideoio.VideoCapture_OpenWithAPI(ref, cname.cast(), apiPreference, success)); return success.value; }); } @@ -134,7 +134,7 @@ class VideoCapture extends CvStruct { bool openIndex(int index, {int apiPreference = CAP_ANY}) { return using((arena) { final success = arena(); - cvRun(() => cvideo.VideoCapture_OpenDeviceWithAPI(ref, index, apiPreference, success)); + cvRun(() => cvideoio.VideoCapture_OpenDeviceWithAPI(ref, index, apiPreference, success)); return success.value; }); } @@ -156,7 +156,7 @@ class VideoCapture extends CvStruct { } void release() { - cvRun(() => cvideo.VideoCapture_Release(ref)); + cvRun(() => cvideoio.VideoCapture_Release(ref)); } } @@ -171,7 +171,7 @@ class VideoWriter extends CvStruct { factory VideoWriter.empty() { final p = calloc(); - cvRun(() => cvideo.VideoWriter_New(p)); + cvRun(() => cvideoio.VideoWriter_New(p)); return VideoWriter._(p); } @@ -188,7 +188,7 @@ class VideoWriter extends CvStruct { final codec_ = VideoWriter.fourcc(codec); apiPreference == null ? cvRun( - () => cvideo.VideoWriter_NewFromFile( + () => cvideoio.VideoWriter_NewFromFile( cname.cast(), codec_, fps, @@ -199,7 +199,7 @@ class VideoWriter extends CvStruct { ), ) : cvRun( - () => cvideo.VideoWriter_NewFromFile_1( + () => cvideoio.VideoWriter_NewFromFile_1( cname.cast(), apiPreference, codec_, @@ -226,7 +226,7 @@ class VideoWriter extends CvStruct { final codec_ = VideoWriter.fourcc(codec); apiPreference == null ? cvRun( - () => cvideo.VideoWriter_Open( + () => cvideoio.VideoWriter_Open( ref, cname.cast(), codec_, @@ -237,7 +237,7 @@ class VideoWriter extends CvStruct { ), ) : cvRun( - () => cvideo.VideoWriter_Open_1( + () => cvideoio.VideoWriter_Open_1( ref, cname.cast(), apiPreference, @@ -252,7 +252,7 @@ class VideoWriter extends CvStruct { } void write(InputArray image) { - cvRun(() => cvideo.VideoWriter_Write(ref, image.ref)); + cvRun(() => cvideoio.VideoWriter_Write(ref, image.ref)); } static int fourcc(String cc) { @@ -260,28 +260,28 @@ class VideoWriter extends CvStruct { if (cc_.length != 4) return -1; return cvRunArena((arena) { final p = arena(); - cvRun(() => cvideo.VideoWriter_Fourcc(cc_[0], cc_[1], cc_[2], cc_[3], p)); + cvRun(() => cvideoio.VideoWriter_Fourcc(cc_[0], cc_[1], cc_[2], cc_[3], p)); return p.value; }); } void release() { - cvRun(() => cvideo.VideoWriter_Release(ref)); + cvRun(() => cvideoio.VideoWriter_Release(ref)); } @override cvg.VideoWriter get ref => ptr.ref; - static final finalizer = OcvFinalizer(cvideo.addresses.VideoWriter_Close); + static final finalizer = OcvFinalizer(cvideoio.addresses.VideoWriter_Close); void dispose() { finalizer.detach(this); - cvideo.VideoWriter_Close(ptr); + cvideoio.VideoWriter_Close(ptr); } bool get isOpened { return cvRunArena((arena) { final p = arena(); - cvRun(() => cvideo.VideoWriter_IsOpened(ref, p)); + cvRun(() => cvideoio.VideoWriter_IsOpened(ref, p)); return p.value != 0; }); } diff --git a/lib/src/video/videoio_async.dart b/packages/dartcv/lib/src/videoio/videoio_async.dart similarity index 76% rename from lib/src/video/videoio_async.dart rename to packages/dartcv/lib/src/videoio/videoio_async.dart index e57bd546..516e8124 100644 --- a/lib/src/video/videoio_async.dart +++ b/packages/dartcv/lib/src/videoio/videoio_async.dart @@ -12,13 +12,13 @@ import 'package:ffi/ffi.dart'; import '../core/base.dart'; import '../core/mat.dart'; import '../g/constants.g.dart'; -import '../g/video_io.g.dart' as cvg; -import '../native_lib.dart' show cvideo; +import '../g/videoio.g.dart' as cvg; +import '../native_lib.dart' show cvideoio; import 'videoio.dart'; extension VideoCaptureAsync on VideoCapture { static Future emptyAsync() async => cvRunAsync( - cvideo.VideoCapture_New_Async, + cvideoio.VideoCapture_New_Async, (completer, p) => completer.complete(VideoCapture.fromPointer(p.cast())), ); @@ -28,7 +28,7 @@ extension VideoCaptureAsync on VideoCapture { static Future fromFileAsync(String filename, {int apiPreference = CAP_ANY}) async { final cname = filename.toNativeUtf8().cast(); final rval = cvRunAsync( - (callback) => cvideo.VideoCapture_NewFromFile_Async(cname, apiPreference, callback), + (callback) => cvideoio.VideoCapture_NewFromFile_Async(cname, apiPreference, callback), (completer, p) => completer.complete(VideoCapture.fromPointer(p.cast())), ); calloc.free(cname); @@ -36,7 +36,7 @@ extension VideoCaptureAsync on VideoCapture { } static Future fromDeviceAsync(int device, {int apiPreference = CAP_ANY}) async => cvRunAsync( - (callback) => cvideo.VideoCapture_NewFromIndex_Async(device, apiPreference, callback), + (callback) => cvideoio.VideoCapture_NewFromIndex_Async(device, apiPreference, callback), (completer, p) => completer.complete(VideoCapture.fromPointer(p.cast())), ); @@ -44,10 +44,10 @@ extension VideoCaptureAsync on VideoCapture { /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939 Future grabAsync() async => - cvRunAsync((callback) => cvideo.VideoCapture_Grab_Async(ref, callback), boolCompleter); + cvRunAsync((callback) => cvideoio.VideoCapture_Grab_Async(ref, callback), boolCompleter); Future<(bool, Mat)> readAsync() async => - cvRunAsync2((callback) => cvideo.VideoCapture_Read_Async(ref, callback), (completer, p, p1) { + cvRunAsync2((callback) => cvideoio.VideoCapture_Read_Async(ref, callback), (completer, p, p1) { final rval = p.cast().value; calloc.free(p); completer.complete((rval, Mat.fromPointer(p1.cast()))); @@ -61,7 +61,7 @@ extension VideoCaptureAsync on VideoCapture { Future openAsync(String uri, {int apiPreference = CAP_ANY}) { final cname = uri.toNativeUtf8().cast(); final rval = cvRunAsync( - (callback) => cvideo.VideoCapture_OpenWithAPI_Async(ref, cname, apiPreference, callback), + (callback) => cvideoio.VideoCapture_OpenWithAPI_Async(ref, cname, apiPreference, callback), boolCompleter, ); calloc.free(cname); @@ -72,19 +72,19 @@ extension VideoCaptureAsync on VideoCapture { /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#a10867868137c2d142aac30a0648d00fe Future openIndexAsync(int index, {int apiPreference = CAP_ANY}) async => cvRunAsync( - (callback) => cvideo.VideoCapture_OpenDeviceWithAPI_Async(ref, index, apiPreference, callback), + (callback) => cvideoio.VideoCapture_OpenDeviceWithAPI_Async(ref, index, apiPreference, callback), boolCompleter, ); Future releaseAsync() async => cvRunAsync0( - (callback) => cvideo.VideoCapture_Release_Async(ref, callback), + (callback) => cvideoio.VideoCapture_Release_Async(ref, callback), (completer) => completer.complete(), ); } extension VideoWriterAsync on VideoWriter { static Future emptyAsync() async => cvRunAsync( - cvideo.VideoWriter_New_Async, + cvideoio.VideoWriter_New_Async, (c, p) => c.complete(VideoWriter.fromPointer(p.cast())), ); @@ -96,7 +96,7 @@ extension VideoWriterAsync on VideoWriter { bool isColor = true, }) async { final vw = await cvRunAsync( - cvideo.VideoWriter_New_Async, + cvideoio.VideoWriter_New_Async, (c, p) => c.complete(VideoWriter.fromPointer(p.cast())), ); await vw.openAsync(filename, codec, fps, frameSize, isColor: isColor); @@ -113,8 +113,8 @@ extension VideoWriterAsync on VideoWriter { final name = filename.toNativeUtf8().cast(); final codec_ = codec.toNativeUtf8().cast(); final rval = cvRunAsync( - (callback) => cvideo.VideoWriter_Open_Async( - ref, name, codec_, fps, frameSize.$1, frameSize.$2, isColor, callback), + (callback) => + cvideoio.VideoWriter_Open_Async(ref, name, codec_, fps, frameSize.$1, frameSize.$2, isColor, callback), boolCompleter, ); calloc.free(name); @@ -123,19 +123,19 @@ extension VideoWriterAsync on VideoWriter { } Future writeAsync(InputArray image) async => - cvRunAsync0((callback) => cvideo.VideoWriter_Write_Async(ref, image.ref, callback), voidCompleter); + cvRunAsync0((callback) => cvideoio.VideoWriter_Write_Async(ref, image.ref, callback), voidCompleter); static Future fourccAsync(String cc) async { final cc_ = ascii.encode(cc); if (cc_.length != 4) return -1; return cvRunAsync( - (callback) => cvideo.VideoWriter_Fourcc_Async(cc_[0], cc_[1], cc_[2], cc_[3], callback), + (callback) => cvideoio.VideoWriter_Fourcc_Async(cc_[0], cc_[1], cc_[2], cc_[3], callback), intCompleter, ); } Future releaseAsync() async => cvRunAsync0( - (callback) => cvideo.VideoWriter_Release_Async(ref, callback), + (callback) => cvideoio.VideoWriter_Release_Async(ref, callback), voidCompleter, ); } diff --git a/lib/stitching.dart b/packages/dartcv/lib/stitching.dart similarity index 91% rename from lib/stitching.dart rename to packages/dartcv/lib/stitching.dart index 57f9b8d1..7bf4b806 100644 --- a/lib/stitching.dart +++ b/packages/dartcv/lib/stitching.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.stitching; +library dartcv.stitching; export 'src/stitching/stitching.dart'; export 'src/stitching/stitching_async.dart'; diff --git a/lib/video.dart b/packages/dartcv/lib/video.dart similarity index 73% rename from lib/video.dart rename to packages/dartcv/lib/video.dart index 3aa3d62c..be636fc3 100644 --- a/lib/video.dart +++ b/packages/dartcv/lib/video.dart @@ -2,9 +2,7 @@ // Use of this source code is governed by a Apache-2.0 license // that can be found in the LICENSE file. -library cv.video; +library dartcv.video; export 'src/video/video.dart'; export 'src/video/video_async.dart'; -export 'src/video/videoio.dart'; -export 'src/video/videoio_async.dart'; diff --git a/packages/dartcv/lib/videoio.dart b/packages/dartcv/lib/videoio.dart new file mode 100644 index 00000000..516309bc --- /dev/null +++ b/packages/dartcv/lib/videoio.dart @@ -0,0 +1,8 @@ +// Copyright (c) 2024, rainyl and all contributors. All rights reserved. +// Use of this source code is governed by a Apache-2.0 license +// that can be found in the LICENSE file. + +library dartcv.videoio; + +export 'src/videoio/videoio.dart'; +export 'src/videoio/videoio_async.dart'; diff --git a/packages/dartcv/pubspec.yaml b/packages/dartcv/pubspec.yaml new file mode 100644 index 00000000..d5f71b6b --- /dev/null +++ b/packages/dartcv/pubspec.yaml @@ -0,0 +1,20 @@ +name: dartcv +description: "OpenCV bindings for Dart language. dartcv is for pure dart only, for flutter, please use opencv_dart." +version: 1.0.0 +homepage: https://github.com/rainyl/opencv_dart/packages/dartcv + +environment: + sdk: ">=3.3.0 <4.0.0" + +dependencies: + ffi: ^2.1.3 + +dev_dependencies: + ffigen: ">=13.0.0 <15.0.0" + test: ^1.25.2 + +topics: + - opencv + - image + - ffi + - flutter diff --git a/test/calib3d_test.dart b/packages/dartcv/test/calib3d_test.dart similarity index 99% rename from test/calib3d_test.dart rename to packages/dartcv/test/calib3d_test.dart index 3ed04520..2b694d5c 100644 --- a/test/calib3d_test.dart +++ b/packages/dartcv/test/calib3d_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/contrib/aruco_async_test.dart b/packages/dartcv/test/contrib/aruco_async_test.dart similarity index 97% rename from test/contrib/aruco_async_test.dart rename to packages/dartcv/test/contrib/aruco_async_test.dart index acef9f0d..b4d9902e 100644 --- a/test/contrib/aruco_async_test.dart +++ b/packages/dartcv/test/contrib/aruco_async_test.dart @@ -1,5 +1,5 @@ // ignore_for_file: constant_identifier_names -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; const arucoImage6x6_250 = "test/images/aruco_6X6_250_6.png"; diff --git a/test/contrib/aruco_test.dart b/packages/dartcv/test/contrib/aruco_test.dart similarity index 99% rename from test/contrib/aruco_test.dart rename to packages/dartcv/test/contrib/aruco_test.dart index fc795c87..ecd8454b 100644 --- a/test/contrib/aruco_test.dart +++ b/packages/dartcv/test/contrib/aruco_test.dart @@ -1,5 +1,5 @@ // ignore_for_file: constant_identifier_names -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; const arucoImage6x6_250 = "test/images/aruco_6X6_250_6.png"; diff --git a/test/contrib/img_hash_async_test.dart b/packages/dartcv/test/contrib/img_hash_async_test.dart similarity index 97% rename from test/contrib/img_hash_async_test.dart rename to packages/dartcv/test/contrib/img_hash_async_test.dart index 79269c92..27bade4d 100644 --- a/test/contrib/img_hash_async_test.dart +++ b/packages/dartcv/test/contrib/img_hash_async_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; const testImage = "test/images/space_shuttle.jpg"; diff --git a/test/contrib/img_hash_test.dart b/packages/dartcv/test/contrib/img_hash_test.dart similarity index 97% rename from test/contrib/img_hash_test.dart rename to packages/dartcv/test/contrib/img_hash_test.dart index 72f74760..9ae36dd1 100644 --- a/test/contrib/img_hash_test.dart +++ b/packages/dartcv/test/contrib/img_hash_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; const testImage = "test/images/space_shuttle.jpg"; diff --git a/test/contrib/quality_test.dart b/packages/dartcv/test/contrib/quality_test.dart similarity index 98% rename from test/contrib/quality_test.dart rename to packages/dartcv/test/contrib/quality_test.dart index 63e1da2c..cd244a78 100644 --- a/test/contrib/quality_test.dart +++ b/packages/dartcv/test/contrib/quality_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void checkResult(cv.Scalar value, List values, {double eps = 1e-3, cv.Mat? qualityMap}) { diff --git a/test/contrib/wechat_qrcode_async_test.dart b/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart similarity index 95% rename from test/contrib/wechat_qrcode_async_test.dart rename to packages/dartcv/test/contrib/wechat_qrcode_async_test.dart index 3fbd9060..ee88ac95 100644 --- a/test/contrib/wechat_qrcode_async_test.dart +++ b/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/contrib/wechat_qrcode_test.dart b/packages/dartcv/test/contrib/wechat_qrcode_test.dart similarity index 95% rename from test/contrib/wechat_qrcode_test.dart rename to packages/dartcv/test/contrib/wechat_qrcode_test.dart index 8e2a0ad1..91634d36 100644 --- a/test/contrib/wechat_qrcode_test.dart +++ b/packages/dartcv/test/contrib/wechat_qrcode_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/contrib/ximgproc_test.dart b/packages/dartcv/test/contrib/ximgproc_test.dart similarity index 99% rename from test/contrib/ximgproc_test.dart rename to packages/dartcv/test/contrib/ximgproc_test.dart index 26e990bf..9901abce 100644 --- a/test/contrib/ximgproc_test.dart +++ b/packages/dartcv/test/contrib/ximgproc_test.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/core/core_async_test.dart b/packages/dartcv/test/core/core_async_test.dart similarity index 99% rename from test/core/core_async_test.dart rename to packages/dartcv/test/core/core_async_test.dart index 98ca1fb4..a67c5c7f 100644 --- a/test/core/core_async_test.dart +++ b/packages/dartcv/test/core/core_async_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: avoid_print -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/core/core_test.dart b/packages/dartcv/test/core/core_test.dart similarity index 99% rename from test/core/core_test.dart rename to packages/dartcv/test/core/core_test.dart index 14517719..2b8a012c 100644 --- a/test/core/core_test.dart +++ b/packages/dartcv/test/core/core_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: avoid_print -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/core/mat_async_test.dart b/packages/dartcv/test/core/mat_async_test.dart similarity index 98% rename from test/core/mat_async_test.dart rename to packages/dartcv/test/core/mat_async_test.dart index 41f8bb34..4021bb09 100644 --- a/test/core/mat_async_test.dart +++ b/packages/dartcv/test/core/mat_async_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/core/mat_test.dart b/packages/dartcv/test/core/mat_test.dart similarity index 99% rename from test/core/mat_test.dart rename to packages/dartcv/test/core/mat_test.dart index 90dadc7f..3ee7ead5 100644 --- a/test/core/mat_test.dart +++ b/packages/dartcv/test/core/mat_test.dart @@ -2,7 +2,7 @@ import 'dart:ffi' as ffi; -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/core/others_test.dart b/packages/dartcv/test/core/others_test.dart similarity index 99% rename from test/core/others_test.dart rename to packages/dartcv/test/core/others_test.dart index ac3765fd..f71d3268 100644 --- a/test/core/others_test.dart +++ b/packages/dartcv/test/core/others_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; import 'vec_matcher.dart'; diff --git a/test/core/point_test.dart b/packages/dartcv/test/core/point_test.dart similarity index 99% rename from test/core/point_test.dart rename to packages/dartcv/test/core/point_test.dart index e594f84b..7aa09805 100644 --- a/test/core/point_test.dart +++ b/packages/dartcv/test/core/point_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/core/rng_test.dart b/packages/dartcv/test/core/rng_test.dart similarity index 95% rename from test/core/rng_test.dart rename to packages/dartcv/test/core/rng_test.dart index 6baa9886..39bad42a 100644 --- a/test/core/rng_test.dart +++ b/packages/dartcv/test/core/rng_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/core/vec_matcher.dart b/packages/dartcv/test/core/vec_matcher.dart similarity index 91% rename from test/core/vec_matcher.dart rename to packages/dartcv/test/core/vec_matcher.dart index d0f1c008..776bb1bb 100644 --- a/test/core/vec_matcher.dart +++ b/packages/dartcv/test/core/vec_matcher.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; VecElementEquals vecElementEquals(cv.Vec expectedValues) => VecElementEquals(expectedValues); diff --git a/test/core/vec_test.dart b/packages/dartcv/test/core/vec_test.dart similarity index 99% rename from test/core/vec_test.dart rename to packages/dartcv/test/core/vec_test.dart index d1ceee72..97734d4a 100644 --- a/test/core/vec_test.dart +++ b/packages/dartcv/test/core/vec_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; import 'vec_matcher.dart'; diff --git a/test/data/brisque_model_live.yml b/packages/dartcv/test/data/brisque_model_live.yml similarity index 100% rename from test/data/brisque_model_live.yml rename to packages/dartcv/test/data/brisque_model_live.yml diff --git a/test/data/brisque_range_live.yml b/packages/dartcv/test/data/brisque_range_live.yml similarity index 100% rename from test/data/brisque_range_live.yml rename to packages/dartcv/test/data/brisque_range_live.yml diff --git a/test/data/haarcascade_frontalface_default.xml b/packages/dartcv/test/data/haarcascade_frontalface_default.xml similarity index 100% rename from test/data/haarcascade_frontalface_default.xml rename to packages/dartcv/test/data/haarcascade_frontalface_default.xml diff --git a/test/data/hog.xml b/packages/dartcv/test/data/hog.xml similarity index 100% rename from test/data/hog.xml rename to packages/dartcv/test/data/hog.xml diff --git a/test/data/hogcascade_pedestrians.xml b/packages/dartcv/test/data/hogcascade_pedestrians.xml similarity index 100% rename from test/data/hogcascade_pedestrians.xml rename to packages/dartcv/test/data/hogcascade_pedestrians.xml diff --git a/test/dnn/dnn_async_test.dart b/packages/dartcv/test/dnn/dnn_async_test.dart similarity index 99% rename from test/dnn/dnn_async_test.dart rename to packages/dartcv/test/dnn/dnn_async_test.dart index 31bf3c35..1215be78 100644 --- a/test/dnn/dnn_async_test.dart +++ b/packages/dartcv/test/dnn/dnn_async_test.dart @@ -1,7 +1,7 @@ @Tags(["no-local-files"]) import 'dart:io'; -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; Future checkCaffeNetAsync(cv.Net net) async { diff --git a/test/dnn/dnn_test.dart b/packages/dartcv/test/dnn/dnn_test.dart similarity index 99% rename from test/dnn/dnn_test.dart rename to packages/dartcv/test/dnn/dnn_test.dart index f60ff070..c7ecc12b 100644 --- a/test/dnn/dnn_test.dart +++ b/packages/dartcv/test/dnn/dnn_test.dart @@ -1,7 +1,7 @@ @Tags(["no-local-files"]) import 'dart:io'; -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; bool checkCaffeNet(cv.Net net) { diff --git a/test/features2d/features2d_async_test.dart b/packages/dartcv/test/features2d/features2d_async_test.dart similarity index 99% rename from test/features2d/features2d_async_test.dart rename to packages/dartcv/test/features2d/features2d_async_test.dart index bada2155..0fdd1e00 100644 --- a/test/features2d/features2d_async_test.dart +++ b/packages/dartcv/test/features2d/features2d_async_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/features2d/features2d_test.dart b/packages/dartcv/test/features2d/features2d_test.dart similarity index 99% rename from test/features2d/features2d_test.dart rename to packages/dartcv/test/features2d/features2d_test.dart index fbf3a6e6..93e82af9 100644 --- a/test/features2d/features2d_test.dart +++ b/packages/dartcv/test/features2d/features2d_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/gapi/structs_test.dart b/packages/dartcv/test/gapi/structs_test.dart similarity index 92% rename from test/gapi/structs_test.dart rename to packages/dartcv/test/gapi/structs_test.dart index 096ed1f1..a7ab79ff 100644 --- a/test/gapi/structs_test.dart +++ b/packages/dartcv/test/gapi/structs_test.dart @@ -1,5 +1,5 @@ -import 'package:opencv_dart/gapi.dart' as cv_gapi; -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/gapi.dart' as cv_gapi; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/highgui_test.dart b/packages/dartcv/test/highgui_test.dart similarity index 96% rename from test/highgui_test.dart rename to packages/dartcv/test/highgui_test.dart index d2d75448..16722a65 100644 --- a/test/highgui_test.dart +++ b/packages/dartcv/test/highgui_test.dart @@ -1,5 +1,5 @@ @Tags(['skip-workflow']) -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/images/MNIST_5.png b/packages/dartcv/test/images/MNIST_5.png similarity index 100% rename from test/images/MNIST_5.png rename to packages/dartcv/test/images/MNIST_5.png diff --git a/test/images/MNIST_9.png b/packages/dartcv/test/images/MNIST_9.png similarity index 100% rename from test/images/MNIST_9.png rename to packages/dartcv/test/images/MNIST_9.png diff --git a/test/images/aruco_6X6_250_1.png b/packages/dartcv/test/images/aruco_6X6_250_1.png similarity index 100% rename from test/images/aruco_6X6_250_1.png rename to packages/dartcv/test/images/aruco_6X6_250_1.png diff --git a/test/images/aruco_6X6_250_6.png b/packages/dartcv/test/images/aruco_6X6_250_6.png similarity index 100% rename from test/images/aruco_6X6_250_6.png rename to packages/dartcv/test/images/aruco_6X6_250_6.png diff --git a/test/images/aruco_6X6_250_6_contour.png b/packages/dartcv/test/images/aruco_6X6_250_6_contour.png similarity index 100% rename from test/images/aruco_6X6_250_6_contour.png rename to packages/dartcv/test/images/aruco_6X6_250_6_contour.png diff --git a/test/images/barcode1.png b/packages/dartcv/test/images/barcode1.png similarity index 100% rename from test/images/barcode1.png rename to packages/dartcv/test/images/barcode1.png diff --git a/test/images/barcode2.png b/packages/dartcv/test/images/barcode2.png similarity index 100% rename from test/images/barcode2.png rename to packages/dartcv/test/images/barcode2.png diff --git a/test/images/barcode_mask1.png b/packages/dartcv/test/images/barcode_mask1.png similarity index 100% rename from test/images/barcode_mask1.png rename to packages/dartcv/test/images/barcode_mask1.png diff --git a/test/images/barcode_mask2.png b/packages/dartcv/test/images/barcode_mask2.png similarity index 100% rename from test/images/barcode_mask2.png rename to packages/dartcv/test/images/barcode_mask2.png diff --git a/test/images/box.png b/packages/dartcv/test/images/box.png similarity index 100% rename from test/images/box.png rename to packages/dartcv/test/images/box.png diff --git a/test/images/box_in_scene.png b/packages/dartcv/test/images/box_in_scene.png similarity index 100% rename from test/images/box_in_scene.png rename to packages/dartcv/test/images/box_in_scene.png diff --git a/test/images/chessboard_4x6.png b/packages/dartcv/test/images/chessboard_4x6.png similarity index 100% rename from test/images/chessboard_4x6.png rename to packages/dartcv/test/images/chessboard_4x6.png diff --git a/test/images/chessboard_4x6_distort.png b/packages/dartcv/test/images/chessboard_4x6_distort.png similarity index 100% rename from test/images/chessboard_4x6_distort.png rename to packages/dartcv/test/images/chessboard_4x6_distort.png diff --git a/test/images/chessboard_4x6_distort_correct.png b/packages/dartcv/test/images/chessboard_4x6_distort_correct.png similarity index 100% rename from test/images/chessboard_4x6_distort_correct.png rename to packages/dartcv/test/images/chessboard_4x6_distort_correct.png diff --git a/test/images/circles.jpg b/packages/dartcv/test/images/circles.jpg similarity index 100% rename from test/images/circles.jpg rename to packages/dartcv/test/images/circles.jpg diff --git a/test/images/contours.png b/packages/dartcv/test/images/contours.png similarity index 100% rename from test/images/contours.png rename to packages/dartcv/test/images/contours.png diff --git a/test/images/distortion-correct.jpg b/packages/dartcv/test/images/distortion-correct.jpg similarity index 100% rename from test/images/distortion-correct.jpg rename to packages/dartcv/test/images/distortion-correct.jpg diff --git a/test/images/distortion-correct.png b/packages/dartcv/test/images/distortion-correct.png similarity index 100% rename from test/images/distortion-correct.png rename to packages/dartcv/test/images/distortion-correct.png diff --git a/test/images/distortion.jpg b/packages/dartcv/test/images/distortion.jpg similarity index 100% rename from test/images/distortion.jpg rename to packages/dartcv/test/images/distortion.jpg diff --git a/test/images/face-detect.jpg b/packages/dartcv/test/images/face-detect.jpg similarity index 100% rename from test/images/face-detect.jpg rename to packages/dartcv/test/images/face-detect.jpg diff --git a/test/images/face.jpg b/packages/dartcv/test/images/face.jpg similarity index 100% rename from test/images/face.jpg rename to packages/dartcv/test/images/face.jpg diff --git a/test/images/fisheye_sample.jpg b/packages/dartcv/test/images/fisheye_sample.jpg similarity index 100% rename from test/images/fisheye_sample.jpg rename to packages/dartcv/test/images/fisheye_sample.jpg diff --git a/test/images/gocvlogo.jpg b/packages/dartcv/test/images/gocvlogo.jpg similarity index 100% rename from test/images/gocvlogo.jpg rename to packages/dartcv/test/images/gocvlogo.jpg diff --git a/test/images/gocvlogo.png b/packages/dartcv/test/images/gocvlogo.png similarity index 100% rename from test/images/gocvlogo.png rename to packages/dartcv/test/images/gocvlogo.png diff --git a/test/images/inpaint-mask.jpg b/packages/dartcv/test/images/inpaint-mask.jpg similarity index 100% rename from test/images/inpaint-mask.jpg rename to packages/dartcv/test/images/inpaint-mask.jpg diff --git a/test/images/inpaint-src.jpg b/packages/dartcv/test/images/inpaint-src.jpg similarity index 100% rename from test/images/inpaint-src.jpg rename to packages/dartcv/test/images/inpaint-src.jpg diff --git a/example/images/lenna.png b/packages/dartcv/test/images/lenna.png similarity index 100% rename from example/images/lenna.png rename to packages/dartcv/test/images/lenna.png diff --git a/test/images/lut.png b/packages/dartcv/test/images/lut.png similarity index 100% rename from test/images/lut.png rename to packages/dartcv/test/images/lut.png diff --git a/test/images/markers_6x6_250.png b/packages/dartcv/test/images/markers_6x6_250.png similarity index 100% rename from test/images/markers_6x6_250.png rename to packages/dartcv/test/images/markers_6x6_250.png diff --git a/test/images/multi_qrcodes.png b/packages/dartcv/test/images/multi_qrcodes.png similarity index 100% rename from test/images/multi_qrcodes.png rename to packages/dartcv/test/images/multi_qrcodes.png diff --git a/test/images/qrcode.png b/packages/dartcv/test/images/qrcode.png similarity index 100% rename from test/images/qrcode.png rename to packages/dartcv/test/images/qrcode.png diff --git a/test/images/sample.webp b/packages/dartcv/test/images/sample.webp similarity index 100% rename from test/images/sample.webp rename to packages/dartcv/test/images/sample.webp diff --git a/test/images/sift_descriptor.png b/packages/dartcv/test/images/sift_descriptor.png similarity index 100% rename from test/images/sift_descriptor.png rename to packages/dartcv/test/images/sift_descriptor.png diff --git a/test/images/simple-translated.jpg b/packages/dartcv/test/images/simple-translated.jpg similarity index 100% rename from test/images/simple-translated.jpg rename to packages/dartcv/test/images/simple-translated.jpg diff --git a/test/images/simple.jpg b/packages/dartcv/test/images/simple.jpg similarity index 100% rename from test/images/simple.jpg rename to packages/dartcv/test/images/simple.jpg diff --git a/test/images/small.mp4 b/packages/dartcv/test/images/small.mp4 similarity index 100% rename from test/images/small.mp4 rename to packages/dartcv/test/images/small.mp4 diff --git a/test/images/space_shuttle.jpg b/packages/dartcv/test/images/space_shuttle.jpg similarity index 100% rename from test/images/space_shuttle.jpg rename to packages/dartcv/test/images/space_shuttle.jpg diff --git a/test/images/toy.jpg b/packages/dartcv/test/images/toy.jpg similarity index 100% rename from test/images/toy.jpg rename to packages/dartcv/test/images/toy.jpg diff --git a/test/images/xquartz.png b/packages/dartcv/test/images/xquartz.png similarity index 100% rename from test/images/xquartz.png rename to packages/dartcv/test/images/xquartz.png diff --git a/test/images_out/basic_drawings.png b/packages/dartcv/test/images_out/basic_drawings.png similarity index 100% rename from test/images_out/basic_drawings.png rename to packages/dartcv/test/images_out/basic_drawings.png diff --git a/test/images_out/circles_equalized.jpg b/packages/dartcv/test/images_out/circles_equalized.jpg similarity index 100% rename from test/images_out/circles_equalized.jpg rename to packages/dartcv/test/images_out/circles_equalized.jpg diff --git a/test/images_out/cv.line.png b/packages/dartcv/test/images_out/cv.line.png similarity index 100% rename from test/images_out/cv.line.png rename to packages/dartcv/test/images_out/cv.line.png diff --git a/test/images_out/markers_6x6_250_contours.png b/packages/dartcv/test/images_out/markers_6x6_250_contours.png similarity index 100% rename from test/images_out/markers_6x6_250_contours.png rename to packages/dartcv/test/images_out/markers_6x6_250_contours.png diff --git a/test/images_out/stitcher_test.jpg b/packages/dartcv/test/images_out/stitcher_test.jpg similarity index 100% rename from test/images_out/stitcher_test.jpg rename to packages/dartcv/test/images_out/stitcher_test.jpg diff --git a/test/images_out/stitcher_test_mask.jpg b/packages/dartcv/test/images_out/stitcher_test_mask.jpg similarity index 100% rename from test/images_out/stitcher_test_mask.jpg rename to packages/dartcv/test/images_out/stitcher_test_mask.jpg diff --git a/test/images_out/test_cvtcolor.png b/packages/dartcv/test/images_out/test_cvtcolor.png similarity index 100% rename from test/images_out/test_cvtcolor.png rename to packages/dartcv/test/images_out/test_cvtcolor.png diff --git a/test/images_out/test_imencode.png b/packages/dartcv/test/images_out/test_imencode.png similarity index 100% rename from test/images_out/test_imencode.png rename to packages/dartcv/test/images_out/test_imencode.png diff --git a/test/images_out/test_imwrite.png b/packages/dartcv/test/images_out/test_imwrite.png similarity index 100% rename from test/images_out/test_imwrite.png rename to packages/dartcv/test/images_out/test_imwrite.png diff --git a/test/imgcodecs_test.dart b/packages/dartcv/test/imgcodecs_test.dart similarity index 98% rename from test/imgcodecs_test.dart rename to packages/dartcv/test/imgcodecs_test.dart index ab578a2e..8caffaa4 100644 --- a/test/imgcodecs_test.dart +++ b/packages/dartcv/test/imgcodecs_test.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/imgproc/clahe_test.dart b/packages/dartcv/test/imgproc/clahe_test.dart similarity index 92% rename from test/imgproc/clahe_test.dart rename to packages/dartcv/test/imgproc/clahe_test.dart index 08a7165a..9ee1554b 100644 --- a/test/imgproc/clahe_test.dart +++ b/packages/dartcv/test/imgproc/clahe_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/imgproc/imgproc_async_test.dart b/packages/dartcv/test/imgproc/imgproc_async_test.dart similarity index 99% rename from test/imgproc/imgproc_async_test.dart rename to packages/dartcv/test/imgproc/imgproc_async_test.dart index 0c73a427..543dab62 100644 --- a/test/imgproc/imgproc_async_test.dart +++ b/packages/dartcv/test/imgproc/imgproc_async_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/imgproc/imgproc_test.dart b/packages/dartcv/test/imgproc/imgproc_test.dart similarity index 99% rename from test/imgproc/imgproc_test.dart rename to packages/dartcv/test/imgproc/imgproc_test.dart index 93a2e425..bab67fc5 100644 --- a/test/imgproc/imgproc_test.dart +++ b/packages/dartcv/test/imgproc/imgproc_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/imgproc/subdiv2d_test.dart b/packages/dartcv/test/imgproc/subdiv2d_test.dart similarity index 98% rename from test/imgproc/subdiv2d_test.dart rename to packages/dartcv/test/imgproc/subdiv2d_test.dart index 59951b68..a44a9e05 100644 --- a/test/imgproc/subdiv2d_test.dart +++ b/packages/dartcv/test/imgproc/subdiv2d_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/objdetect/objdetect_async_test.dart b/packages/dartcv/test/objdetect/objdetect_async_test.dart similarity index 99% rename from test/objdetect/objdetect_async_test.dart rename to packages/dartcv/test/objdetect/objdetect_async_test.dart index 560f3730..36a001d2 100644 --- a/test/objdetect/objdetect_async_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_async_test.dart @@ -1,8 +1,8 @@ import 'dart:io'; import 'dart:typed_data'; -import 'package:opencv_dart/opencv_dart.dart' as cv; -import 'package:opencv_dart/src/core/mat_type.dart'; +import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv/src/core/mat_type.dart'; import 'package:test/test.dart'; cv.Mat visualizeFaceDetect(cv.Mat img, cv.Mat faces) { diff --git a/test/objdetect/objdetect_test.dart b/packages/dartcv/test/objdetect/objdetect_test.dart similarity index 98% rename from test/objdetect/objdetect_test.dart rename to packages/dartcv/test/objdetect/objdetect_test.dart index 3e9801b1..5b053fd3 100644 --- a/test/objdetect/objdetect_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_test.dart @@ -1,8 +1,8 @@ import 'dart:io'; import 'dart:typed_data'; -import 'package:opencv_dart/opencv_dart.dart' as cv; -import 'package:opencv_dart/src/core/mat_type.dart'; +import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv/src/core/mat_type.dart'; import 'package:test/test.dart'; cv.Mat visualizeFaceDetect(cv.Mat img, cv.Mat faces) { diff --git a/test/perf_mat.dart b/packages/dartcv/test/perf_mat.dart similarity index 95% rename from test/perf_mat.dart rename to packages/dartcv/test/perf_mat.dart index 0ff3ae39..6649d1c8 100644 --- a/test/perf_mat.dart +++ b/packages/dartcv/test/perf_mat.dart @@ -1,6 +1,6 @@ // ignore_for_file: unused_local_variable, avoid_print -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; const counts = 10000; diff --git a/test/photo/photo_async_test.dart b/packages/dartcv/test/photo/photo_async_test.dart similarity index 98% rename from test/photo/photo_async_test.dart rename to packages/dartcv/test/photo/photo_async_test.dart index c07b249a..0d070bfa 100644 --- a/test/photo/photo_async_test.dart +++ b/packages/dartcv/test/photo/photo_async_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/photo/photo_test.dart b/packages/dartcv/test/photo/photo_test.dart similarity index 98% rename from test/photo/photo_test.dart rename to packages/dartcv/test/photo/photo_test.dart index ac9d8def..1446adbb 100644 --- a/test/photo/photo_test.dart +++ b/packages/dartcv/test/photo/photo_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/stitching/stitching_async_test.dart b/packages/dartcv/test/stitching/stitching_async_test.dart similarity index 98% rename from test/stitching/stitching_async_test.dart rename to packages/dartcv/test/stitching/stitching_async_test.dart index 70fdb245..8659d0ac 100644 --- a/test/stitching/stitching_async_test.dart +++ b/packages/dartcv/test/stitching/stitching_async_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/stitching/stitching_test.dart b/packages/dartcv/test/stitching/stitching_test.dart similarity index 98% rename from test/stitching/stitching_test.dart rename to packages/dartcv/test/stitching/stitching_test.dart index 62f055d5..0b6e988f 100644 --- a/test/stitching/stitching_test.dart +++ b/packages/dartcv/test/stitching/stitching_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/test/svd_test.dart b/packages/dartcv/test/svd_test.dart similarity index 97% rename from test/svd_test.dart rename to packages/dartcv/test/svd_test.dart index 9004bc33..5eb0ec0e 100644 --- a/test/svd_test.dart +++ b/packages/dartcv/test/svd_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; final resultW = [6.410056, 3.4595323]; diff --git a/test/video/video_async_test.dart b/packages/dartcv/test/video/video_async_test.dart similarity index 99% rename from test/video/video_async_test.dart rename to packages/dartcv/test/video/video_async_test.dart index 0d18b2b9..53a9c077 100644 --- a/test/video/video_async_test.dart +++ b/packages/dartcv/test/video/video_async_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/test/video/video_test.dart b/packages/dartcv/test/video/video_test.dart similarity index 99% rename from test/video/video_test.dart rename to packages/dartcv/test/video/video_test.dart index 81559945..e696d5a9 100644 --- a/test/video/video_test.dart +++ b/packages/dartcv/test/video/video_test.dart @@ -1,4 +1,4 @@ -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:dartcv/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/opencv_core/.gitignore b/packages/opencv_core/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/packages/opencv_core/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/packages/opencv_core/.metadata b/packages/opencv_core/.metadata new file mode 100644 index 00000000..b36ee067 --- /dev/null +++ b/packages/opencv_core/.metadata @@ -0,0 +1,42 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "2663184aa79047d0a33a14a3b607954f8fdd8730" + channel: "stable" + +project_type: plugin_ffi + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + - platform: android + create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + - platform: ios + create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + - platform: linux + create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + - platform: macos + create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + - platform: windows + create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/packages/opencv_core/CHANGELOG.md b/packages/opencv_core/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/opencv_core/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/opencv_core/LICENSE b/packages/opencv_core/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/opencv_core/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/opencv_core/README.md b/packages/opencv_core/README.md new file mode 100644 index 00000000..d4c6e983 --- /dev/null +++ b/packages/opencv_core/README.md @@ -0,0 +1,92 @@ +# opencv_core + +A new Flutter FFI plugin project. + +## Getting Started + +This project is a starting point for a Flutter +[FFI plugin](https://flutter.dev/to/ffi-package), +a specialized package that includes native code directly invoked with Dart FFI. + +## Project structure + +This template uses the following structure: + +* `src`: Contains the native source code, and a CmakeFile.txt file for building + that source code into a dynamic library. + +* `lib`: Contains the Dart code that defines the API of the plugin, and which + calls into the native code using `dart:ffi`. + +* platform folders (`android`, `ios`, `windows`, etc.): Contains the build files + for building and bundling the native code library with the platform application. + +## Building and bundling native code + +The `pubspec.yaml` specifies FFI plugins as follows: + +```yaml + plugin: + platforms: + some_platform: + ffiPlugin: true +``` + +This configuration invokes the native build for the various target platforms +and bundles the binaries in Flutter applications using these FFI plugins. + +This can be combined with dartPluginClass, such as when FFI is used for the +implementation of one platform in a federated plugin: + +```yaml + plugin: + implements: some_other_plugin + platforms: + some_platform: + dartPluginClass: SomeClass + ffiPlugin: true +``` + +A plugin can have both FFI and method channels: + +```yaml + plugin: + platforms: + some_platform: + pluginClass: SomeName + ffiPlugin: true +``` + +The native build systems that are invoked by FFI (and method channel) plugins are: + +* For Android: Gradle, which invokes the Android NDK for native builds. + * See the documentation in android/build.gradle. +* For iOS and MacOS: Xcode, via CocoaPods. + * See the documentation in ios/opencv_core.podspec. + * See the documentation in macos/opencv_core.podspec. +* For Linux and Windows: CMake. + * See the documentation in linux/CMakeLists.txt. + * See the documentation in windows/CMakeLists.txt. + +## Binding to native code + +To use the native code, bindings in Dart are needed. +To avoid writing these by hand, they are generated from the header file +(`src/opencv_core.h`) by `package:ffigen`. +Regenerate the bindings by running `dart run ffigen --config ffigen.yaml`. + +## Invoking native code + +Very short-running native functions can be directly invoked from any isolate. +For example, see `sum` in `lib/opencv_core.dart`. + +Longer-running functions should be invoked on a helper isolate to avoid +dropping frames in Flutter applications. +For example, see `sumAsync` in `lib/opencv_core.dart`. + +## Flutter help + +For help getting started with Flutter, view our +[online documentation](https://docs.flutter.dev), which offers tutorials, +samples, guidance on mobile development, and a full API reference. + diff --git a/packages/opencv_core/analysis_options.yaml b/packages/opencv_core/analysis_options.yaml new file mode 100644 index 00000000..60644262 --- /dev/null +++ b/packages/opencv_core/analysis_options.yaml @@ -0,0 +1,232 @@ +# include: package:solid_lints/analysis_options.yaml + +# https://github.com/solid-software/solid_lints/blob/master/lib/analysis_options.yaml +analyzer: + plugins: + - custom_lint + exclude: + # General generated files + - '**/*.g.dart' + - '**/*.gr.dart' + + # Flutter + - 'lib/generated_plugin_registrant.dart' + + # mockito + - '*.mocks.dart' + - '**/*.mocks.dart' + + # freezed + - '**/*.freezed.dart' + + # protobuf + - '**/*.pb.dart' + + # test_coverage + - test/.test_coverage.dart + + language: + # We've seen errors tied to use of implicit operations similar to the ones described in + # https://dart.dev/guides/language/analysis-options#enabling-additional-type-checks. + # When we do things explicitly there is less room for errors. + strict-casts: true + # strict-raw-types: true + + errors: + constant_identifier_names: ignore + missing_required_param: error + missing_return: error + parameter_assignments: error +linter: + rules: + - always_declare_return_types + - always_put_required_named_parameters_first + # - always_use_package_imports + - annotate_overrides + - avoid_bool_literals_in_conditional_expressions + - avoid_catching_errors + - avoid_double_and_int_checks + - avoid_dynamic_calls + - avoid_empty_else + - avoid_escaping_inner_quotes + - avoid_field_initializers_in_const_classes + # We are already using the `parameter_assignments` lint. + # Adding final to parameters has the same effect as `parameter_assignments` + # so it doesn't make sense to use final parameters with `parameter_assignments`. + - avoid_final_parameters + - avoid_function_literals_in_foreach_calls + - avoid_implementing_value_types + - avoid_init_to_null + # - avoid_multiple_declarations_per_line + - avoid_null_checks_in_equality_operators + # - avoid_positional_boolean_parameters + - avoid_print + - avoid_private_typedef_functions + # - avoid_redundant_argument_values + - avoid_relative_lib_imports + - avoid_renaming_method_parameters + - avoid_return_types_on_setters + - avoid_returning_null_for_void + - avoid_setters_without_getters + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + - avoid_type_to_string + - avoid_types_as_parameter_names + - avoid_unnecessary_containers + - avoid_unused_constructor_parameters + - avoid_void_async + - await_only_futures + - camel_case_extensions + - camel_case_types + - cancel_subscriptions + # Similar to avoid-non-null-assertion, which is already used, + # basically it suggests to not ignore possible null value + - cast_nullable_to_non_nullable + - close_sinks + - comment_references + - conditional_uri_does_not_exist + # - constant_identifier_names + - control_flow_in_finally + - curly_braces_in_flow_control_structures + - depend_on_referenced_packages + - deprecated_consistency + # - diagnostic_describe_all_properties + - directives_ordering + # Pretty much agree with Passy & linter package. + # Our use case for Flutter for web where there are no flavors yet. + # So using dart-define is helpful. + #- do_not_use_environment + - empty_catches + - empty_constructor_bodies + - empty_statements + - eol_at_end_of_file + - exhaustive_cases + - file_names + - hash_and_equals + - implementation_imports + # deprecated rule in Flutter 3.7 + # - invariant_booleans + # - iterable_contains_unrelated_type + - collection_methods_unrelated_type + - join_return_with_assignment + - leading_newlines_in_multiline_strings + - library_names + - library_prefixes + # - lines_longer_than_80_chars + # - list_remove_unrelated_type + - literal_only_boolean_expressions + - no_adjacent_strings_in_list + - no_duplicate_case_values + - no_leading_underscores_for_library_prefixes + - no_leading_underscores_for_local_identifiers + - no_logic_in_create_state + - no_runtimeType_toString + - non_constant_identifier_names + - noop_primitive_operations + - null_check_on_nullable_type_parameter + - overridden_fields + - package_names + - package_prefixed_library_names + - parameter_assignments + - prefer_adjacent_string_concatenation + - prefer_asserts_in_initializer_lists + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - prefer_constructors_over_static_methods + - prefer_contains + # These two are incompatible, and one should be selected depending on your project's style. + # - prefer_double_quotes + # - prefer_single_quotes + # removed in Dart 3.0.0 + # - prefer_equal_for_default_values + # Not used, as the default app template has a single statement return code generated. + # While this could be beneficial for Dart projects and maintaining code style, we are unaware + # of any substantial evidence that improves code when using expression function body + # vs single statement return. We are considering including this in Dart only lints. + # - prefer_expression_function_bodies + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals + # While it is similar to `unnecessary_lambdas`, + # it forcefully replaces structural/procedural semantics with + # their functional counterparts. + # We think this is a stylistic choice and will leave it up to users. + # - prefer_foreach + - prefer_for_elements_to_map_fromIterable + - prefer_function_declarations_over_variables + - prefer_generic_function_type_aliases + - prefer_if_elements_to_conditional_expressions + - prefer_if_null_operators + - prefer_initializing_formals + - prefer_inlined_adds + - prefer_interpolation_to_compose_strings + - prefer_is_empty + - prefer_is_not_empty + - prefer_is_not_operator + - prefer_iterable_whereType + - prefer_null_aware_method_calls + - prefer_null_aware_operators + - prefer_spread_collections + - prefer_typing_uninitialized_variables + - prefer_void_to_null + - provide_deprecation_message + # - public_member_api_docs + - recursive_getters + - require_trailing_commas + - secure_pubspec_urls + - sized_box_for_whitespace + - sized_box_shrink_expand + - slash_for_doc_comments + - sort_child_properties_last + # We tend to use class organization close to standard Java convention, where fields come first. + # Martin, R. C. & Coplien, J. O. (2013), Chapter 10: Classes. Clean code: a handbook of agile software craftsmanship , Prentice Hall , Upper Saddle River, NJ [etc.] . 136 + # - sort_constructors_first + # - sort_pub_dependencies + # - sort_unnamed_constructors_first + - test_types_in_equals + - throw_in_finally + - tighten_type_of_initializing_formals + - type_annotate_public_apis + - type_init_formals + - unawaited_futures + - unnecessary_await_in_return + - unnecessary_brace_in_string_interps + - unnecessary_breaks + - unnecessary_const + - unnecessary_getters_setters + - unnecessary_lambdas + - unnecessary_new + - unnecessary_null_aware_assignments + - unnecessary_null_checks + - unnecessary_null_in_if_null_operators + - unnecessary_nullable_for_final_variable_declarations + - unnecessary_overrides + - unnecessary_parenthesis + - unnecessary_raw_strings + - unnecessary_statements + - unnecessary_string_escapes + - unnecessary_string_interpolations + - unnecessary_this + - unnecessary_to_list_in_spreads + - unrelated_type_equality_checks + - unsafe_html + - use_build_context_synchronously + - use_colored_box + - use_decorated_box + - use_full_hex_values_for_flutter_colors + - use_function_type_syntax_for_parameters + - use_if_null_to_convert_nulls_to_bools + - use_is_even_rather_than_modulo + - use_named_constants + - use_raw_strings + - use_rethrow_when_possible + - use_setters_to_change_properties + - use_string_buffers + - use_super_parameters + - use_test_throws_matchers + - valid_regexps + - void_checks diff --git a/android/.gitignore b/packages/opencv_core/android/.gitignore similarity index 100% rename from android/.gitignore rename to packages/opencv_core/android/.gitignore diff --git a/packages/opencv_core/android/build.gradle b/packages/opencv_core/android/build.gradle new file mode 100644 index 00000000..832ac034 --- /dev/null +++ b/packages/opencv_core/android/build.gradle @@ -0,0 +1,88 @@ +// The Android Gradle Plugin builds the native code with the Android NDK. + +group = "dev.rainyl.opencv_core" +version = "1.0" + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + // The Android Gradle Plugin knows how to build native code with the NDK. + classpath("com.android.tools.build:gradle:8.1.0") + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: "com.android.library" + +def SOURCE_DIR = project.buildscript.sourceFile.parentFile + +android { + if (project.android.hasProperty("namespace")) { + namespace = "dev.rainyl.opencv_core" + } + + // Bumping the plugin compileSdk version requires all clients of this plugin + // to bump the version in their app. + compileSdk = 33 + + // Use the NDK version + // declared in /android/app/build.gradle file of the Flutter project. + // Replace it with a version number if this plugin requires a specific NDK version. + // (e.g. ndkVersion "23.1.7779620") + ndkVersion = android.ndkVersion + + // Invoke the shared CMake build with the Android Gradle Plugin. + externalNativeBuild { + cmake { + path = "../src/CMakeLists.txt" + + // The default CMake version for the Android Gradle Plugin is 3.10.2. + // https://developer.android.com/studio/projects/install-ndk#vanilla_cmake + // + // The Flutter tooling requires that developers have CMake 3.10 or later + // installed. You should not increase this version, as doing so will cause + // the plugin to fail to compile for some customers of the plugin. + // version "3.10.2" + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion 24 + + // Invoke the shared CMake build with the Android Gradle Plugin. + externalNativeBuild { + cmake { + arguments "-DANDROID_ARM_NEON=TRUE", + "-DANDROID_STL=c++_static", + "-DCMAKE_INSTALL_PREFIX=$SOURCE_DIR/src/main/jniLibs", + "-DDARTCV_WITH_CALIB3D=ON", + "-DDARTCV_WITH_CONTRIB=ON", + "-DDARTCV_WITH_DNN=ON", + "-DDARTCV_WITH_FEATURE2D=ON", + "-DDARTCV_WITH_HIGHGUI=ON", + "-DDARTCV_WITH_IMGPROC=ON", + "-DDARTCV_WITH_OBJDETECT=ON", + "-DDARTCV_WITH_PHOTO=ON", + "-DDARTCV_WITH_STITCHING=ON", + "-DDARTCV_WITH_VIDEO=ON", + "-DDARTCV_WITH_VIDEOIO=ON", + "-DDARTCV_WITH_GAPI=OFF" + } + } + } +} diff --git a/packages/opencv_core/android/settings.gradle b/packages/opencv_core/android/settings.gradle new file mode 100644 index 00000000..5d7da17a --- /dev/null +++ b/packages/opencv_core/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'opencv_core' diff --git a/packages/opencv_core/android/src/main/AndroidManifest.xml b/packages/opencv_core/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..4c492b75 --- /dev/null +++ b/packages/opencv_core/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/example/.gitignore b/packages/opencv_core/example/.gitignore similarity index 100% rename from example/.gitignore rename to packages/opencv_core/example/.gitignore diff --git a/packages/opencv_core/example/README.md b/packages/opencv_core/example/README.md new file mode 100644 index 00000000..8633dbab --- /dev/null +++ b/packages/opencv_core/example/README.md @@ -0,0 +1,16 @@ +# opencv_core_example + +Demonstrates how to use the opencv_core plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/example/analysis_options.yaml b/packages/opencv_core/example/analysis_options.yaml similarity index 100% rename from example/analysis_options.yaml rename to packages/opencv_core/example/analysis_options.yaml diff --git a/packages/opencv_core/example/android/.gitignore b/packages/opencv_core/example/android/.gitignore new file mode 100644 index 00000000..55afd919 --- /dev/null +++ b/packages/opencv_core/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/packages/opencv_core/example/android/app/build.gradle b/packages/opencv_core/example/android/app/build.gradle new file mode 100644 index 00000000..986a8ef8 --- /dev/null +++ b/packages/opencv_core/example/android/app/build.gradle @@ -0,0 +1,44 @@ +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +android { + namespace = "dev.rainyl.opencv_core_example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "dev.rainyl.opencv_core_example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdkVersion 24 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} diff --git a/example/android/app/src/debug/AndroidManifest.xml b/packages/opencv_core/example/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from example/android/app/src/debug/AndroidManifest.xml rename to packages/opencv_core/example/android/app/src/debug/AndroidManifest.xml diff --git a/packages/opencv_core/example/android/app/src/main/AndroidManifest.xml b/packages/opencv_core/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..0b433cfb --- /dev/null +++ b/packages/opencv_core/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/opencv_core/example/android/app/src/main/kotlin/dev/rainyl/opencv_core_example/MainActivity.kt b/packages/opencv_core/example/android/app/src/main/kotlin/dev/rainyl/opencv_core_example/MainActivity.kt new file mode 100644 index 00000000..59f1aef6 --- /dev/null +++ b/packages/opencv_core/example/android/app/src/main/kotlin/dev/rainyl/opencv_core_example/MainActivity.kt @@ -0,0 +1,5 @@ +package dev.rainyl.opencv_core_example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/opencv_core/example/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from example/android/app/src/main/res/drawable-v21/launch_background.xml rename to packages/opencv_core/example/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/packages/opencv_core/example/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from example/android/app/src/main/res/drawable/launch_background.xml rename to packages/opencv_core/example/android/app/src/main/res/drawable/launch_background.xml diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/opencv_core/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/opencv_core/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/opencv_core/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to packages/opencv_core/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/opencv_core/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to packages/opencv_core/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/opencv_core/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to packages/opencv_core/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/opencv_core/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to packages/opencv_core/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/values-night/styles.xml b/packages/opencv_core/example/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from example/android/app/src/main/res/values-night/styles.xml rename to packages/opencv_core/example/android/app/src/main/res/values-night/styles.xml diff --git a/example/android/app/src/main/res/values/styles.xml b/packages/opencv_core/example/android/app/src/main/res/values/styles.xml similarity index 100% rename from example/android/app/src/main/res/values/styles.xml rename to packages/opencv_core/example/android/app/src/main/res/values/styles.xml diff --git a/example/android/app/src/profile/AndroidManifest.xml b/packages/opencv_core/example/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from example/android/app/src/profile/AndroidManifest.xml rename to packages/opencv_core/example/android/app/src/profile/AndroidManifest.xml diff --git a/packages/opencv_core/example/android/build.gradle b/packages/opencv_core/example/android/build.gradle new file mode 100644 index 00000000..d2ffbffa --- /dev/null +++ b/packages/opencv_core/example/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/packages/opencv_core/example/android/gradle.properties b/packages/opencv_core/example/android/gradle.properties new file mode 100644 index 00000000..25971708 --- /dev/null +++ b/packages/opencv_core/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/packages/opencv_core/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/opencv_core/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..7bb2df6b --- /dev/null +++ b/packages/opencv_core/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip diff --git a/packages/opencv_core/example/android/settings.gradle b/packages/opencv_core/example/android/settings.gradle new file mode 100644 index 00000000..b9e43bd3 --- /dev/null +++ b/packages/opencv_core/example/android/settings.gradle @@ -0,0 +1,25 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.1.0" apply false + id "org.jetbrains.kotlin.android" version "1.8.22" apply false +} + +include ":app" diff --git a/test/images/lenna.png b/packages/opencv_core/example/images/lenna.png similarity index 100% rename from test/images/lenna.png rename to packages/opencv_core/example/images/lenna.png diff --git a/example/ios/.gitignore b/packages/opencv_core/example/ios/.gitignore similarity index 100% rename from example/ios/.gitignore rename to packages/opencv_core/example/ios/.gitignore diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/packages/opencv_core/example/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from example/ios/Flutter/AppFrameworkInfo.plist rename to packages/opencv_core/example/ios/Flutter/AppFrameworkInfo.plist diff --git a/packages/opencv_core/example/ios/Flutter/Debug.xcconfig b/packages/opencv_core/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/packages/opencv_core/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/opencv_core/example/ios/Flutter/Release.xcconfig b/packages/opencv_core/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/packages/opencv_core/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/opencv_core/example/ios/Runner.xcodeproj/project.pbxproj b/packages/opencv_core/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..e41cdeee --- /dev/null +++ b/packages/opencv_core/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,616 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/opencv_core/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/opencv_core/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/opencv_core/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/opencv_core/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/opencv_core/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/opencv_core/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/opencv_core/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/opencv_core/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/opencv_core/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/opencv_core/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/packages/opencv_core/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/opencv_core/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/opencv_core/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/opencv_core/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to packages/opencv_core/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/packages/opencv_core/example/ios/Runner/AppDelegate.swift b/packages/opencv_core/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..62666446 --- /dev/null +++ b/packages/opencv_core/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to packages/opencv_core/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/opencv_core/example/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from example/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/opencv_core/example/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/packages/opencv_core/example/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from example/ios/Runner/Base.lproj/Main.storyboard rename to packages/opencv_core/example/ios/Runner/Base.lproj/Main.storyboard diff --git a/packages/opencv_core/example/ios/Runner/Info.plist b/packages/opencv_core/example/ios/Runner/Info.plist new file mode 100644 index 00000000..2930f4be --- /dev/null +++ b/packages/opencv_core/example/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Opencv Core + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + opencv_core_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/example/ios/Runner/Runner-Bridging-Header.h b/packages/opencv_core/example/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from example/ios/Runner/Runner-Bridging-Header.h rename to packages/opencv_core/example/ios/Runner/Runner-Bridging-Header.h diff --git a/example/ios/RunnerTests/RunnerTests.swift b/packages/opencv_core/example/ios/RunnerTests/RunnerTests.swift similarity index 100% rename from example/ios/RunnerTests/RunnerTests.swift rename to packages/opencv_core/example/ios/RunnerTests/RunnerTests.swift diff --git a/example/lib/main.dart b/packages/opencv_core/example/lib/main.dart similarity index 63% rename from example/lib/main.dart rename to packages/opencv_core/example/lib/main.dart index 4368bd76..e5e4d38b 100644 --- a/example/lib/main.dart +++ b/packages/opencv_core/example/lib/main.dart @@ -1,11 +1,8 @@ // ignore_for_file: avoid_print -import 'dart:isolate'; -import 'dart:typed_data'; - import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:opencv_dart/opencv_dart.dart' as cv; +import 'package:opencv_core/opencv.dart' as cv; import 'package:image_picker/image_picker.dart'; void main() { @@ -32,23 +29,15 @@ class _MyAppState extends State { super.dispose(); } - // native resources are unsendable for isolate, so use raw data or encoded Uint8List and convert back - Future<(Uint8List, Uint8List)> heavyTask(Uint8List buffer) async => - Isolate.run(() { - final im = cv.imdecode(buffer, cv.IMREAD_COLOR); - late cv.Mat gray, blur; - for (var i = 0; i < 1000; i++) { - gray = cv.cvtColor(im, cv.COLOR_BGR2GRAY); - blur = cv.gaussianBlur(im, (7, 7), 2, sigmaY: 2); - } - return (cv.imencode(".png", gray).$2, cv.imencode(".png", blur).$2); - }); - - Future<(cv.Mat, cv.Mat)> heavyTaskAsync(cv.Mat im) async { + Future<(cv.Mat, cv.Mat)> heavyTaskAsync(cv.Mat im, {int count = 1000}) async { late cv.Mat gray, blur; - for (var i = 0; i < 1000; i++) { + for (var i = 0; i < count; i++) { gray = await cv.cvtColorAsync(im, cv.COLOR_BGR2GRAY); blur = await cv.gaussianBlurAsync(im, (7, 7), 2, sigmaY: 2); + if (i != count - 1) { + gray.dispose(); // manually dispose + blur.dispose(); // manually dispose + } } return (gray, blur); } @@ -67,19 +56,20 @@ class _MyAppState extends State { ElevatedButton( onPressed: () async { final picker = ImagePicker(); - final img = - await picker.pickImage(source: ImageSource.gallery); + final img = await picker.pickImage(source: ImageSource.gallery); if (img != null) { final path = img.path; final mat = cv.imread(path); - print( - "cv.imread: width: ${mat.cols}, height: ${mat.rows}, path: $path"); - final (success, bytes) = cv.imencode(".png", mat); - print("imencode: $success, ${bytes.length}"); + print("cv.imread: width: ${mat.cols}, height: ${mat.rows}, path: $path"); + debugPrint("mat.data.length: ${mat.data.length}"); // heavy computation - final (gray, blur) = await heavyTask(bytes); + final (gray, blur) = await heavyTaskAsync(mat, count: 1); setState(() { - images = [bytes, gray, blur]; + images = [ + cv.imencode(".png", mat).$2, + cv.imencode(".png", gray).$2, + cv.imencode(".png", blur).$2, + ]; }); } }, @@ -87,22 +77,16 @@ class _MyAppState extends State { ), ElevatedButton( onPressed: () async { - final data = await DefaultAssetBundle.of(context) - .load("images/lenna.png"); + final data = await DefaultAssetBundle.of(context).load("images/lenna.png"); final bytes = data.buffer.asUint8List(); // heavy computation // final (gray, blur) = await heavyTask(bytes); // setState(() { // images = [bytes, gray, blur]; // }); - final (gray, blur) = - await heavyTaskAsync(cv.imdecode(bytes, cv.IMREAD_COLOR)); + final (gray, blur) = await heavyTaskAsync(cv.imdecode(bytes, cv.IMREAD_COLOR)); setState(() { - images = [ - bytes, - cv.imencode(".png", gray).$2, - cv.imencode(".png", blur).$2 - ]; + images = [bytes, cv.imencode(".png", gray).$2, cv.imencode(".png", blur).$2]; }); }, child: const Text("Process"), diff --git a/example/linux/.gitignore b/packages/opencv_core/example/linux/.gitignore similarity index 100% rename from example/linux/.gitignore rename to packages/opencv_core/example/linux/.gitignore diff --git a/packages/opencv_core/example/linux/CMakeLists.txt b/packages/opencv_core/example/linux/CMakeLists.txt new file mode 100644 index 00000000..21f470c7 --- /dev/null +++ b/packages/opencv_core/example/linux/CMakeLists.txt @@ -0,0 +1,145 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "opencv_core_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "dev.rainyl.opencv_core") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/example/linux/flutter/CMakeLists.txt b/packages/opencv_core/example/linux/flutter/CMakeLists.txt similarity index 100% rename from example/linux/flutter/CMakeLists.txt rename to packages/opencv_core/example/linux/flutter/CMakeLists.txt diff --git a/example/linux/flutter/generated_plugin_registrant.cc b/packages/opencv_core/example/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from example/linux/flutter/generated_plugin_registrant.cc rename to packages/opencv_core/example/linux/flutter/generated_plugin_registrant.cc diff --git a/example/linux/flutter/generated_plugin_registrant.h b/packages/opencv_core/example/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from example/linux/flutter/generated_plugin_registrant.h rename to packages/opencv_core/example/linux/flutter/generated_plugin_registrant.h diff --git a/packages/opencv_core/example/linux/flutter/generated_plugins.cmake b/packages/opencv_core/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..4e509958 --- /dev/null +++ b/packages/opencv_core/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,25 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + opencv_core +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/example/linux/main.cc b/packages/opencv_core/example/linux/main.cc similarity index 100% rename from example/linux/main.cc rename to packages/opencv_core/example/linux/main.cc diff --git a/packages/opencv_core/example/linux/my_application.cc b/packages/opencv_core/example/linux/my_application.cc new file mode 100644 index 00000000..c2ade776 --- /dev/null +++ b/packages/opencv_core/example/linux/my_application.cc @@ -0,0 +1,124 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "opencv_core_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "opencv_core_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/example/linux/my_application.h b/packages/opencv_core/example/linux/my_application.h similarity index 100% rename from example/linux/my_application.h rename to packages/opencv_core/example/linux/my_application.h diff --git a/example/macos/.gitignore b/packages/opencv_core/example/macos/.gitignore similarity index 100% rename from example/macos/.gitignore rename to packages/opencv_core/example/macos/.gitignore diff --git a/packages/opencv_core/example/macos/Flutter/Flutter-Debug.xcconfig b/packages/opencv_core/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/packages/opencv_core/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/opencv_core/example/macos/Flutter/Flutter-Release.xcconfig b/packages/opencv_core/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/packages/opencv_core/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/opencv_core/example/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from example/macos/Flutter/GeneratedPluginRegistrant.swift rename to packages/opencv_core/example/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/packages/opencv_core/example/macos/Runner.xcodeproj/project.pbxproj b/packages/opencv_core/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..1225982e --- /dev/null +++ b/packages/opencv_core/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* opencv_core_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "opencv_core_example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* opencv_core_example.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* opencv_core_example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/opencv_core_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/opencv_core_example"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/opencv_core_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/opencv_core_example"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/opencv_core_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/opencv_core_example"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/opencv_core/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/opencv_core/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/opencv_core/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/opencv_core/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..bb927d4d --- /dev/null +++ b/packages/opencv_core/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/opencv_core/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/opencv_core/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/packages/opencv_core/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/opencv_core/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to packages/opencv_core/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/packages/opencv_core/example/macos/Runner/AppDelegate.swift b/packages/opencv_core/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..8e02df28 --- /dev/null +++ b/packages/opencv_core/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to packages/opencv_core/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/example/macos/Runner/Base.lproj/MainMenu.xib b/packages/opencv_core/example/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from example/macos/Runner/Base.lproj/MainMenu.xib rename to packages/opencv_core/example/macos/Runner/Base.lproj/MainMenu.xib diff --git a/packages/opencv_core/example/macos/Runner/Configs/AppInfo.xcconfig b/packages/opencv_core/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..d3da352c --- /dev/null +++ b/packages/opencv_core/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = opencv_core_example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = dev.rainyl.opencvCoreExample + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 dev.rainyl. All rights reserved. diff --git a/example/macos/Runner/Configs/Debug.xcconfig b/packages/opencv_core/example/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from example/macos/Runner/Configs/Debug.xcconfig rename to packages/opencv_core/example/macos/Runner/Configs/Debug.xcconfig diff --git a/example/macos/Runner/Configs/Release.xcconfig b/packages/opencv_core/example/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from example/macos/Runner/Configs/Release.xcconfig rename to packages/opencv_core/example/macos/Runner/Configs/Release.xcconfig diff --git a/example/macos/Runner/Configs/Warnings.xcconfig b/packages/opencv_core/example/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from example/macos/Runner/Configs/Warnings.xcconfig rename to packages/opencv_core/example/macos/Runner/Configs/Warnings.xcconfig diff --git a/example/macos/Runner/DebugProfile.entitlements b/packages/opencv_core/example/macos/Runner/DebugProfile.entitlements similarity index 100% rename from example/macos/Runner/DebugProfile.entitlements rename to packages/opencv_core/example/macos/Runner/DebugProfile.entitlements diff --git a/example/macos/Runner/Info.plist b/packages/opencv_core/example/macos/Runner/Info.plist similarity index 100% rename from example/macos/Runner/Info.plist rename to packages/opencv_core/example/macos/Runner/Info.plist diff --git a/example/macos/Runner/MainFlutterWindow.swift b/packages/opencv_core/example/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from example/macos/Runner/MainFlutterWindow.swift rename to packages/opencv_core/example/macos/Runner/MainFlutterWindow.swift diff --git a/example/macos/Runner/Release.entitlements b/packages/opencv_core/example/macos/Runner/Release.entitlements similarity index 100% rename from example/macos/Runner/Release.entitlements rename to packages/opencv_core/example/macos/Runner/Release.entitlements diff --git a/packages/opencv_core/example/macos/RunnerTests/RunnerTests.swift b/packages/opencv_core/example/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..61f3bd1f --- /dev/null +++ b/packages/opencv_core/example/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/packages/opencv_core/example/pubspec.yaml b/packages/opencv_core/example/pubspec.yaml new file mode 100644 index 00000000..fd02ec78 --- /dev/null +++ b/packages/opencv_core/example/pubspec.yaml @@ -0,0 +1,97 @@ +name: opencv_core_example +description: "Demonstrates how to use the opencv_core plugin." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ^3.5.3 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + opencv_core: + # When depending on this package from a real application you should use: + # opencv_core: ^x.y.z + # See https://dart.dev/tools/pub/dependencies#version-constraints + # The example app is bundled with the plugin so we use a path dependency on + # the parent directory to use the current plugin's version. + path: ../ + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + image_picker: ^1.0.7 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^4.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - images/lenna.png + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/example/windows/.gitignore b/packages/opencv_core/example/windows/.gitignore similarity index 100% rename from example/windows/.gitignore rename to packages/opencv_core/example/windows/.gitignore diff --git a/packages/opencv_core/example/windows/CMakeLists.txt b/packages/opencv_core/example/windows/CMakeLists.txt new file mode 100644 index 00000000..8c8a378e --- /dev/null +++ b/packages/opencv_core/example/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(opencv_core_example LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "opencv_core_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/example/windows/flutter/CMakeLists.txt b/packages/opencv_core/example/windows/flutter/CMakeLists.txt similarity index 100% rename from example/windows/flutter/CMakeLists.txt rename to packages/opencv_core/example/windows/flutter/CMakeLists.txt diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/packages/opencv_core/example/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from example/windows/flutter/generated_plugin_registrant.cc rename to packages/opencv_core/example/windows/flutter/generated_plugin_registrant.cc diff --git a/example/windows/flutter/generated_plugin_registrant.h b/packages/opencv_core/example/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from example/windows/flutter/generated_plugin_registrant.h rename to packages/opencv_core/example/windows/flutter/generated_plugin_registrant.h diff --git a/packages/opencv_core/example/windows/flutter/generated_plugins.cmake b/packages/opencv_core/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..1a60cacb --- /dev/null +++ b/packages/opencv_core/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,25 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + opencv_core +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/example/windows/runner/CMakeLists.txt b/packages/opencv_core/example/windows/runner/CMakeLists.txt similarity index 100% rename from example/windows/runner/CMakeLists.txt rename to packages/opencv_core/example/windows/runner/CMakeLists.txt diff --git a/packages/opencv_core/example/windows/runner/Runner.rc b/packages/opencv_core/example/windows/runner/Runner.rc new file mode 100644 index 00000000..06ed2d64 --- /dev/null +++ b/packages/opencv_core/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "dev.rainyl" "\0" + VALUE "FileDescription", "opencv_core_example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "opencv_core_example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 dev.rainyl. All rights reserved." "\0" + VALUE "OriginalFilename", "opencv_core_example.exe" "\0" + VALUE "ProductName", "opencv_core_example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/example/windows/runner/flutter_window.cpp b/packages/opencv_core/example/windows/runner/flutter_window.cpp similarity index 100% rename from example/windows/runner/flutter_window.cpp rename to packages/opencv_core/example/windows/runner/flutter_window.cpp diff --git a/example/windows/runner/flutter_window.h b/packages/opencv_core/example/windows/runner/flutter_window.h similarity index 100% rename from example/windows/runner/flutter_window.h rename to packages/opencv_core/example/windows/runner/flutter_window.h diff --git a/packages/opencv_core/example/windows/runner/main.cpp b/packages/opencv_core/example/windows/runner/main.cpp new file mode 100644 index 00000000..ec90a923 --- /dev/null +++ b/packages/opencv_core/example/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"opencv_core_example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/example/windows/runner/resource.h b/packages/opencv_core/example/windows/runner/resource.h similarity index 100% rename from example/windows/runner/resource.h rename to packages/opencv_core/example/windows/runner/resource.h diff --git a/example/windows/runner/resources/app_icon.ico b/packages/opencv_core/example/windows/runner/resources/app_icon.ico similarity index 100% rename from example/windows/runner/resources/app_icon.ico rename to packages/opencv_core/example/windows/runner/resources/app_icon.ico diff --git a/packages/opencv_core/example/windows/runner/runner.exe.manifest b/packages/opencv_core/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..153653e8 --- /dev/null +++ b/packages/opencv_core/example/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/packages/opencv_core/example/windows/runner/utils.cpp b/packages/opencv_core/example/windows/runner/utils.cpp new file mode 100644 index 00000000..3a0b4651 --- /dev/null +++ b/packages/opencv_core/example/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/example/windows/runner/utils.h b/packages/opencv_core/example/windows/runner/utils.h similarity index 100% rename from example/windows/runner/utils.h rename to packages/opencv_core/example/windows/runner/utils.h diff --git a/example/windows/runner/win32_window.cpp b/packages/opencv_core/example/windows/runner/win32_window.cpp similarity index 100% rename from example/windows/runner/win32_window.cpp rename to packages/opencv_core/example/windows/runner/win32_window.cpp diff --git a/example/windows/runner/win32_window.h b/packages/opencv_core/example/windows/runner/win32_window.h similarity index 100% rename from example/windows/runner/win32_window.h rename to packages/opencv_core/example/windows/runner/win32_window.h diff --git a/packages/opencv_core/ios/opencv_core.podspec b/packages/opencv_core/ios/opencv_core.podspec new file mode 100644 index 00000000..9c4dfa28 --- /dev/null +++ b/packages/opencv_core/ios/opencv_core.podspec @@ -0,0 +1,28 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint opencv_core.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'opencv_core' + s.version = '0.0.1' + s.summary = 'OpenCV bindings for Dart.' + s.description = <<-DESC + OpenCV bindings for Dart. Without highgui and videoio. + DESC + s.homepage = 'https://github.com/rainyl/opencv_dart' + s.license = { :file => '../LICENSE' } + s.author = { 'Rainyl' => 'rainyliusy3@gmail.com' } + + # This will ensure the source files in Classes/ are included in the native + # builds of apps using this FFI plugin. Podspec does not support relative + # paths, so Classes contains a forwarder C file that relatively imports + # `../src/*` so that the C sources can be shared among all target platforms. + s.source = { :path => '.' } + # s.source_files = 'Classes/**/*' + s.dependency 'Flutter' + s.dependency 'DartCvIOS', '4.10.0+1' + s.platform = :ios, '12.0' + + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } + s.swift_version = '5.0' +end diff --git a/packages/opencv_core/lib/opencv.dart b/packages/opencv_core/lib/opencv.dart new file mode 100644 index 00000000..6c374f3b --- /dev/null +++ b/packages/opencv_core/lib/opencv.dart @@ -0,0 +1,8 @@ +// Copyright (c) 2024, rainyl and all contributors. All rights reserved. +// Use of this source code is governed by a Apache-2.0 license +// that can be found in the LICENSE file. + +/// OpenCV bindings for Flutter +library cv; + +export 'package:dartcv/dartcv.dart'; diff --git a/packages/opencv_core/linux/CMakeLists.txt b/packages/opencv_core/linux/CMakeLists.txt new file mode 100644 index 00000000..7ecc3e58 --- /dev/null +++ b/packages/opencv_core/linux/CMakeLists.txt @@ -0,0 +1,22 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "opencv_core") +project(${PROJECT_NAME} LANGUAGES CXX) + +# Invoke the build for native code shared with the other target platforms. +# This can be changed to accommodate different builds. +add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(opencv_core_bundled_libraries + # Defined in ../src/CMakeLists.txt. + # This can be changed to accommodate different builds. + $ + PARENT_SCOPE +) diff --git a/packages/opencv_core/macos/opencv_core.podspec b/packages/opencv_core/macos/opencv_core.podspec new file mode 100644 index 00000000..5ee20cfb --- /dev/null +++ b/packages/opencv_core/macos/opencv_core.podspec @@ -0,0 +1,27 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint opencv_core.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'opencv_core' + s.version = '0.0.1' + s.summary = 'OpenCV bindings for Dart.' + s.description = <<-DESC + OpenCV bindings for Dart, without highgui and videoio. + DESC + s.homepage = 'https://github.com/rainyl/opencv_dart' + s.license = { :file => '../LICENSE' } + s.author = { 'Rainyl' => 'rainyliusy3@gmail.com' } + + # This will ensure the source files in Classes/ are included in the native + # builds of apps using this FFI plugin. Podspec does not support relative + # paths, so Classes contains a forwarder C file that relatively imports + # `../src/*` so that the C sources can be shared among all target platforms. + s.source = { :path => '.' } + # s.source_files = 'Classes/**/*' + s.dependency 'FlutterMacOS' + s.dependency 'DartCvMacOS', '4.10.0+1' + s.platform = :osx, '10.15' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } + s.swift_version = '5.0' +end diff --git a/packages/opencv_core/pubspec.yaml b/packages/opencv_core/pubspec.yaml new file mode 100644 index 00000000..92a40eb8 --- /dev/null +++ b/packages/opencv_core/pubspec.yaml @@ -0,0 +1,34 @@ +name: opencv_core +description: | + OpenCV4 bindings for Flutter. + This plugin does NOT include highgui and videoio modules, + if you need them, please use opencv_dart instead. +version: 1.2.6 +homepage: https://github.com/rainyl/opencv_dart + +environment: + sdk: ">=3.3.0 <4.0.0" + flutter: ">=3.0.0" + +dependencies: + flutter: + sdk: flutter + dartcv: + path: ../dartcv + +dev_dependencies: + test: ^1.25.2 + +flutter: + plugin: + platforms: + android: + ffiPlugin: true + ios: + ffiPlugin: true + linux: + ffiPlugin: true + macos: + ffiPlugin: true + windows: + ffiPlugin: true diff --git a/packages/opencv_core/src/CMakeLists.txt b/packages/opencv_core/src/CMakeLists.txt new file mode 100644 index 00000000..975f0ea1 --- /dev/null +++ b/packages/opencv_core/src/CMakeLists.txt @@ -0,0 +1,43 @@ +cmake_minimum_required(VERSION 3.14) + +project(dartcv LANGUAGES CXX VERSION 1.0.0) + +# Flutter doesn't support build android-x86, disable here +# https://docs.flutter.dev/deployment/android#what-are-the-supported-target-architectures +if(ANDROID AND(DEFINED ANDROID_ABI)) + if(${ANDROID_ABI} STREQUAL "x86") + message(STATUS "Unsupported ABI: x86") + return() + endif() +endif() + +set(DARTCV_WITH_CALIB3D ON) +set(DARTCV_WITH_CONTRIB ON) +set(DARTCV_WITH_DNN ON) +set(DARTCV_WITH_FEATURE2D ON) +set(DARTCV_WITH_HIGHGUI OFF) +set(DARTCV_WITH_IMGPROC ON) +set(DARTCV_WITH_OBJDETECT ON) +set(DARTCV_WITH_PHOTO ON) +set(DARTCV_WITH_STITCHING ON) +set(DARTCV_WITH_VIDEO ON) +set(DARTCV_WITH_VIDEOIO OFF) +set(DARTCV_WITH_GAPI OFF) +set(DARTCV_WORLD OFF) + +# TODO: read opencv_version from pubspec.yaml +set(OPENCV_VERSION "4.10.0+9") +set(DARTCV_DISABLE_DOWNLOAD_OPENCV OFF) + +include(FetchContent) +FetchContent_Declare( + dartcv + GIT_REPOSITORY https://github.com/rainyl/dartcv.git + GIT_TAG 61effe0762f7919b38f1da58d87c9aa541ee1569 +) +FetchContent_MakeAvailable(dartcv) + +if(ANDROID) + message(STATUS "Installing ${FFMPEG_LIB_PATHS} to ${CMAKE_INSTALL_PREFIX}") + file(COPY ${FFMPEG_LIB_PATHS} DESTINATION ${CMAKE_INSTALL_PREFIX}/${ANDROID_ABI}) +endif() diff --git a/windows/.gitignore b/packages/opencv_core/windows/.gitignore similarity index 100% rename from windows/.gitignore rename to packages/opencv_core/windows/.gitignore diff --git a/packages/opencv_core/windows/CMakeLists.txt b/packages/opencv_core/windows/CMakeLists.txt new file mode 100644 index 00000000..e7207843 --- /dev/null +++ b/packages/opencv_core/windows/CMakeLists.txt @@ -0,0 +1,23 @@ +# The Flutter tooling requires that developers have a version of Visual Studio +# installed that includes CMake 3.14 or later. You should not increase this +# version, as doing so will cause the plugin to fail to compile for some +# customers of the plugin. +cmake_minimum_required(VERSION 3.14) + +# Project-level configuration. +set(PROJECT_NAME "opencv_core") +project(${PROJECT_NAME} LANGUAGES CXX) + +# Invoke the build for native code shared with the other target platforms. +# This can be changed to accommodate different builds. +add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(opencv_core_bundled_libraries + # Defined in ../src/CMakeLists.txt. + # This can be changed to accommodate different builds. + $ + PARENT_SCOPE +) diff --git a/packages/opencv_dart/.gitignore b/packages/opencv_dart/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/packages/opencv_dart/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/.metadata b/packages/opencv_dart/.metadata similarity index 100% rename from .metadata rename to packages/opencv_dart/.metadata diff --git a/.pubignore b/packages/opencv_dart/.pubignore similarity index 100% rename from .pubignore rename to packages/opencv_dart/.pubignore diff --git a/CHANGELOG.md b/packages/opencv_dart/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/opencv_dart/CHANGELOG.md diff --git a/packages/opencv_dart/analysis_options.yaml b/packages/opencv_dart/analysis_options.yaml new file mode 100644 index 00000000..60644262 --- /dev/null +++ b/packages/opencv_dart/analysis_options.yaml @@ -0,0 +1,232 @@ +# include: package:solid_lints/analysis_options.yaml + +# https://github.com/solid-software/solid_lints/blob/master/lib/analysis_options.yaml +analyzer: + plugins: + - custom_lint + exclude: + # General generated files + - '**/*.g.dart' + - '**/*.gr.dart' + + # Flutter + - 'lib/generated_plugin_registrant.dart' + + # mockito + - '*.mocks.dart' + - '**/*.mocks.dart' + + # freezed + - '**/*.freezed.dart' + + # protobuf + - '**/*.pb.dart' + + # test_coverage + - test/.test_coverage.dart + + language: + # We've seen errors tied to use of implicit operations similar to the ones described in + # https://dart.dev/guides/language/analysis-options#enabling-additional-type-checks. + # When we do things explicitly there is less room for errors. + strict-casts: true + # strict-raw-types: true + + errors: + constant_identifier_names: ignore + missing_required_param: error + missing_return: error + parameter_assignments: error +linter: + rules: + - always_declare_return_types + - always_put_required_named_parameters_first + # - always_use_package_imports + - annotate_overrides + - avoid_bool_literals_in_conditional_expressions + - avoid_catching_errors + - avoid_double_and_int_checks + - avoid_dynamic_calls + - avoid_empty_else + - avoid_escaping_inner_quotes + - avoid_field_initializers_in_const_classes + # We are already using the `parameter_assignments` lint. + # Adding final to parameters has the same effect as `parameter_assignments` + # so it doesn't make sense to use final parameters with `parameter_assignments`. + - avoid_final_parameters + - avoid_function_literals_in_foreach_calls + - avoid_implementing_value_types + - avoid_init_to_null + # - avoid_multiple_declarations_per_line + - avoid_null_checks_in_equality_operators + # - avoid_positional_boolean_parameters + - avoid_print + - avoid_private_typedef_functions + # - avoid_redundant_argument_values + - avoid_relative_lib_imports + - avoid_renaming_method_parameters + - avoid_return_types_on_setters + - avoid_returning_null_for_void + - avoid_setters_without_getters + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + - avoid_type_to_string + - avoid_types_as_parameter_names + - avoid_unnecessary_containers + - avoid_unused_constructor_parameters + - avoid_void_async + - await_only_futures + - camel_case_extensions + - camel_case_types + - cancel_subscriptions + # Similar to avoid-non-null-assertion, which is already used, + # basically it suggests to not ignore possible null value + - cast_nullable_to_non_nullable + - close_sinks + - comment_references + - conditional_uri_does_not_exist + # - constant_identifier_names + - control_flow_in_finally + - curly_braces_in_flow_control_structures + - depend_on_referenced_packages + - deprecated_consistency + # - diagnostic_describe_all_properties + - directives_ordering + # Pretty much agree with Passy & linter package. + # Our use case for Flutter for web where there are no flavors yet. + # So using dart-define is helpful. + #- do_not_use_environment + - empty_catches + - empty_constructor_bodies + - empty_statements + - eol_at_end_of_file + - exhaustive_cases + - file_names + - hash_and_equals + - implementation_imports + # deprecated rule in Flutter 3.7 + # - invariant_booleans + # - iterable_contains_unrelated_type + - collection_methods_unrelated_type + - join_return_with_assignment + - leading_newlines_in_multiline_strings + - library_names + - library_prefixes + # - lines_longer_than_80_chars + # - list_remove_unrelated_type + - literal_only_boolean_expressions + - no_adjacent_strings_in_list + - no_duplicate_case_values + - no_leading_underscores_for_library_prefixes + - no_leading_underscores_for_local_identifiers + - no_logic_in_create_state + - no_runtimeType_toString + - non_constant_identifier_names + - noop_primitive_operations + - null_check_on_nullable_type_parameter + - overridden_fields + - package_names + - package_prefixed_library_names + - parameter_assignments + - prefer_adjacent_string_concatenation + - prefer_asserts_in_initializer_lists + - prefer_collection_literals + - prefer_conditional_assignment + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - prefer_constructors_over_static_methods + - prefer_contains + # These two are incompatible, and one should be selected depending on your project's style. + # - prefer_double_quotes + # - prefer_single_quotes + # removed in Dart 3.0.0 + # - prefer_equal_for_default_values + # Not used, as the default app template has a single statement return code generated. + # While this could be beneficial for Dart projects and maintaining code style, we are unaware + # of any substantial evidence that improves code when using expression function body + # vs single statement return. We are considering including this in Dart only lints. + # - prefer_expression_function_bodies + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals + # While it is similar to `unnecessary_lambdas`, + # it forcefully replaces structural/procedural semantics with + # their functional counterparts. + # We think this is a stylistic choice and will leave it up to users. + # - prefer_foreach + - prefer_for_elements_to_map_fromIterable + - prefer_function_declarations_over_variables + - prefer_generic_function_type_aliases + - prefer_if_elements_to_conditional_expressions + - prefer_if_null_operators + - prefer_initializing_formals + - prefer_inlined_adds + - prefer_interpolation_to_compose_strings + - prefer_is_empty + - prefer_is_not_empty + - prefer_is_not_operator + - prefer_iterable_whereType + - prefer_null_aware_method_calls + - prefer_null_aware_operators + - prefer_spread_collections + - prefer_typing_uninitialized_variables + - prefer_void_to_null + - provide_deprecation_message + # - public_member_api_docs + - recursive_getters + - require_trailing_commas + - secure_pubspec_urls + - sized_box_for_whitespace + - sized_box_shrink_expand + - slash_for_doc_comments + - sort_child_properties_last + # We tend to use class organization close to standard Java convention, where fields come first. + # Martin, R. C. & Coplien, J. O. (2013), Chapter 10: Classes. Clean code: a handbook of agile software craftsmanship , Prentice Hall , Upper Saddle River, NJ [etc.] . 136 + # - sort_constructors_first + # - sort_pub_dependencies + # - sort_unnamed_constructors_first + - test_types_in_equals + - throw_in_finally + - tighten_type_of_initializing_formals + - type_annotate_public_apis + - type_init_formals + - unawaited_futures + - unnecessary_await_in_return + - unnecessary_brace_in_string_interps + - unnecessary_breaks + - unnecessary_const + - unnecessary_getters_setters + - unnecessary_lambdas + - unnecessary_new + - unnecessary_null_aware_assignments + - unnecessary_null_checks + - unnecessary_null_in_if_null_operators + - unnecessary_nullable_for_final_variable_declarations + - unnecessary_overrides + - unnecessary_parenthesis + - unnecessary_raw_strings + - unnecessary_statements + - unnecessary_string_escapes + - unnecessary_string_interpolations + - unnecessary_this + - unnecessary_to_list_in_spreads + - unrelated_type_equality_checks + - unsafe_html + - use_build_context_synchronously + - use_colored_box + - use_decorated_box + - use_full_hex_values_for_flutter_colors + - use_function_type_syntax_for_parameters + - use_if_null_to_convert_nulls_to_bools + - use_is_even_rather_than_modulo + - use_named_constants + - use_raw_strings + - use_rethrow_when_possible + - use_setters_to_change_properties + - use_string_buffers + - use_super_parameters + - use_test_throws_matchers + - valid_regexps + - void_checks diff --git a/packages/opencv_dart/android/.gitignore b/packages/opencv_dart/android/.gitignore new file mode 100644 index 00000000..161bdcda --- /dev/null +++ b/packages/opencv_dart/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.cxx diff --git a/packages/opencv_dart/android/build.gradle b/packages/opencv_dart/android/build.gradle new file mode 100644 index 00000000..90603a01 --- /dev/null +++ b/packages/opencv_dart/android/build.gradle @@ -0,0 +1,85 @@ +group 'dev.rainyl.opencv_dart' +version '1.0' + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + // The Android Gradle Plugin knows how to build native code with the NDK. + classpath("com.android.tools.build:gradle:8.1.0") + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +def SOURCE_DIR = project.buildscript.sourceFile.parentFile + +android { + if (project.android.hasProperty("namespace")) { + namespace 'dev.rainyl.opencv_dart' + } + + // Bumping the plugin compileSdk version requires all clients of this plugin + // to bump the version in their app. + compileSdk 33 + + // Use the NDK version declared in /android/app/build.gradle file of the Flutter project. + // Replace it with a version number if this plugin requires a specific NDK version. + // (e.g. ndkVersion "23.1.7779620") + ndkVersion android.ndkVersion + + // Invoke the shared CMake build with the Android Gradle Plugin. + externalNativeBuild { + cmake { + path "../src/CMakeLists.txt" + + // The default CMake version for the Android Gradle Plugin is 3.10.2. + // https://developer.android.com/studio/projects/install-ndk#vanilla_cmake + // + // The Flutter tooling requires that developers have CMake 3.10 or later + // installed. You should not increase this version, as doing so will cause + // the plugin to fail to compile for some customers of the plugin. + // version "3.10.2" + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion 24 + + // Invoke the shared CMake build with the Android Gradle Plugin. + externalNativeBuild { + cmake { + arguments "-DANDROID_ARM_NEON=TRUE", + "-DANDROID_STL=c++_static", + "-DCMAKE_INSTALL_PREFIX=$SOURCE_DIR/src/main/jniLibs", + "-DDARTCV_WITH_CALIB3D=ON", + "-DDARTCV_WITH_CONTRIB=ON", + "-DDARTCV_WITH_DNN=ON", + "-DDARTCV_WITH_FEATURE2D=ON", + "-DDARTCV_WITH_HIGHGUI=ON", + "-DDARTCV_WITH_IMGPROC=ON", + "-DDARTCV_WITH_OBJDETECT=ON", + "-DDARTCV_WITH_PHOTO=ON", + "-DDARTCV_WITH_STITCHING=ON", + "-DDARTCV_WITH_VIDEO=ON", + "-DDARTCV_WITH_VIDEOIO=ON", + "-DDARTCV_WITH_GAPI=OFF" + } + } + } +} diff --git a/android/settings.gradle b/packages/opencv_dart/android/settings.gradle similarity index 100% rename from android/settings.gradle rename to packages/opencv_dart/android/settings.gradle diff --git a/android/src/main/AndroidManifest.xml b/packages/opencv_dart/android/src/main/AndroidManifest.xml similarity index 100% rename from android/src/main/AndroidManifest.xml rename to packages/opencv_dart/android/src/main/AndroidManifest.xml diff --git a/packages/opencv_dart/example/.gitignore b/packages/opencv_dart/example/.gitignore new file mode 100644 index 00000000..29a3a501 --- /dev/null +++ b/packages/opencv_dart/example/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/example/.metadata b/packages/opencv_dart/example/.metadata similarity index 100% rename from example/.metadata rename to packages/opencv_dart/example/.metadata diff --git a/example/README.md b/packages/opencv_dart/example/README.md similarity index 100% rename from example/README.md rename to packages/opencv_dart/example/README.md diff --git a/packages/opencv_dart/example/analysis_options.yaml b/packages/opencv_dart/example/analysis_options.yaml new file mode 100644 index 00000000..0d290213 --- /dev/null +++ b/packages/opencv_dart/example/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/example/android/.gitignore b/packages/opencv_dart/example/android/.gitignore similarity index 100% rename from example/android/.gitignore rename to packages/opencv_dart/example/android/.gitignore diff --git a/example/android/app/build.gradle b/packages/opencv_dart/example/android/app/build.gradle similarity index 98% rename from example/android/app/build.gradle rename to packages/opencv_dart/example/android/app/build.gradle index a7b4b248..2c5e1b59 100644 --- a/example/android/app/build.gradle +++ b/packages/opencv_dart/example/android/app/build.gradle @@ -45,7 +45,7 @@ android { applicationId "net.rainyl.opencv_dart_example" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion 21 + minSdkVersion 24 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/packages/opencv_dart/example/android/app/src/debug/AndroidManifest.xml b/packages/opencv_dart/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/packages/opencv_dart/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/app/src/main/AndroidManifest.xml b/packages/opencv_dart/example/android/app/src/main/AndroidManifest.xml similarity index 100% rename from example/android/app/src/main/AndroidManifest.xml rename to packages/opencv_dart/example/android/app/src/main/AndroidManifest.xml diff --git a/example/android/app/src/main/kotlin/dev/rainyl/opencv_dart_example/MainActivity.kt b/packages/opencv_dart/example/android/app/src/main/kotlin/dev/rainyl/opencv_dart_example/MainActivity.kt similarity index 100% rename from example/android/app/src/main/kotlin/dev/rainyl/opencv_dart_example/MainActivity.kt rename to packages/opencv_dart/example/android/app/src/main/kotlin/dev/rainyl/opencv_dart_example/MainActivity.kt diff --git a/example/android/app/src/main/kotlin/net/rainyl/example/MainActivity.kt b/packages/opencv_dart/example/android/app/src/main/kotlin/net/rainyl/example/MainActivity.kt similarity index 100% rename from example/android/app/src/main/kotlin/net/rainyl/example/MainActivity.kt rename to packages/opencv_dart/example/android/app/src/main/kotlin/net/rainyl/example/MainActivity.kt diff --git a/example/android/app/src/main/kotlin/net/rainyl/opencv_dart_example/MainActivity.kt b/packages/opencv_dart/example/android/app/src/main/kotlin/net/rainyl/opencv_dart_example/MainActivity.kt similarity index 100% rename from example/android/app/src/main/kotlin/net/rainyl/opencv_dart_example/MainActivity.kt rename to packages/opencv_dart/example/android/app/src/main/kotlin/net/rainyl/opencv_dart_example/MainActivity.kt diff --git a/packages/opencv_dart/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/opencv_dart/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/packages/opencv_dart/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/opencv_dart/example/android/app/src/main/res/drawable/launch_background.xml b/packages/opencv_dart/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/packages/opencv_dart/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/opencv_dart/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/opencv_dart/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/opencv_dart/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/opencv_dart/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/opencv_dart/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/android/app/src/main/res/values-night/styles.xml b/packages/opencv_dart/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/packages/opencv_dart/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/opencv_dart/example/android/app/src/main/res/values/styles.xml b/packages/opencv_dart/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/packages/opencv_dart/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/opencv_dart/example/android/app/src/profile/AndroidManifest.xml b/packages/opencv_dart/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/packages/opencv_dart/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/build.gradle b/packages/opencv_dart/example/android/build.gradle similarity index 100% rename from example/android/build.gradle rename to packages/opencv_dart/example/android/build.gradle diff --git a/example/android/gradle.properties b/packages/opencv_dart/example/android/gradle.properties similarity index 100% rename from example/android/gradle.properties rename to packages/opencv_dart/example/android/gradle.properties diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/opencv_dart/example/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from example/android/gradle/wrapper/gradle-wrapper.properties rename to packages/opencv_dart/example/android/gradle/wrapper/gradle-wrapper.properties diff --git a/example/android/settings.gradle b/packages/opencv_dart/example/android/settings.gradle similarity index 100% rename from example/android/settings.gradle rename to packages/opencv_dart/example/android/settings.gradle diff --git a/packages/opencv_dart/example/images/lenna.png b/packages/opencv_dart/example/images/lenna.png new file mode 100644 index 0000000000000000000000000000000000000000..22c23ca438840b82d2bb90efe475f7637efc029a GIT binary patch literal 446298 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 z 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%0A_{f}Oqa+>F0 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𔽗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

Ii6|H_m#&*u=J2**$pvP29D3Tj2d}0u3 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 + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/example/ios/Flutter/Debug.xcconfig b/packages/opencv_dart/example/ios/Flutter/Debug.xcconfig similarity index 100% rename from example/ios/Flutter/Debug.xcconfig rename to packages/opencv_dart/example/ios/Flutter/Debug.xcconfig diff --git a/example/ios/Flutter/Release.xcconfig b/packages/opencv_dart/example/ios/Flutter/Release.xcconfig similarity index 100% rename from example/ios/Flutter/Release.xcconfig rename to packages/opencv_dart/example/ios/Flutter/Release.xcconfig diff --git a/example/ios/Podfile b/packages/opencv_dart/example/ios/Podfile similarity index 100% rename from example/ios/Podfile rename to packages/opencv_dart/example/ios/Podfile diff --git a/example/ios/Podfile.lock b/packages/opencv_dart/example/ios/Podfile.lock similarity index 100% rename from example/ios/Podfile.lock rename to packages/opencv_dart/example/ios/Podfile.lock diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/packages/opencv_dart/example/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from example/ios/Runner.xcodeproj/project.pbxproj rename to packages/opencv_dart/example/ios/Runner.xcodeproj/project.pbxproj diff --git a/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/opencv_dart/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/opencv_dart/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..8e3ca5df --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/opencv_dart/example/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from example/ios/Runner.xcworkspace/contents.xcworkspacedata rename to packages/opencv_dart/example/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/opencv_dart/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/opencv_dart/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/opencv_dart/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/opencv_dart/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/example/ios/Runner/AppDelegate.swift b/packages/opencv_dart/example/ios/Runner/AppDelegate.swift similarity index 100% rename from example/ios/Runner/AppDelegate.swift rename to packages/opencv_dart/example/ios/Runner/AppDelegate.swift diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 00000000..0bedcf2f --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/packages/opencv_dart/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/opencv_dart/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/opencv_dart/example/ios/Runner/Base.lproj/Main.storyboard b/packages/opencv_dart/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/Info.plist b/packages/opencv_dart/example/ios/Runner/Info.plist similarity index 100% rename from example/ios/Runner/Info.plist rename to packages/opencv_dart/example/ios/Runner/Info.plist diff --git a/packages/opencv_dart/example/ios/Runner/Runner-Bridging-Header.h b/packages/opencv_dart/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/packages/opencv_dart/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/packages/opencv_dart/example/ios/RunnerTests/RunnerTests.swift b/packages/opencv_dart/example/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..86a7c3b1 --- /dev/null +++ b/packages/opencv_dart/example/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/packages/opencv_dart/example/lib/main.dart b/packages/opencv_dart/example/lib/main.dart new file mode 100644 index 00000000..6b90282f --- /dev/null +++ b/packages/opencv_dart/example/lib/main.dart @@ -0,0 +1,120 @@ +// ignore_for_file: avoid_print + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:opencv_dart/opencv.dart' as cv; +import 'package:image_picker/image_picker.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + var images = []; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + Future<(cv.Mat, cv.Mat)> heavyTaskAsync(cv.Mat im, {int count = 1000}) async { + late cv.Mat gray, blur; + for (var i = 0; i < count; i++) { + gray = await cv.cvtColorAsync(im, cv.COLOR_BGR2GRAY); + blur = await cv.gaussianBlurAsync(im, (7, 7), 2, sigmaY: 2); + if (i != count - 1) { + gray.dispose(); // manually dispose + blur.dispose(); // manually dispose + } + } + return (gray, blur); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Native Packages'), + ), + body: Container( + alignment: Alignment.center, + child: Column( + children: [ + ElevatedButton( + onPressed: () async { + final picker = ImagePicker(); + final img = await picker.pickImage(source: ImageSource.gallery); + if (img != null) { + final path = img.path; + final mat = cv.imread(path); + print("cv.imread: width: ${mat.cols}, height: ${mat.rows}, path: $path"); + debugPrint("mat.data.length: ${mat.data.length}"); + // heavy computation + final (gray, blur) = await heavyTaskAsync(mat, count: 1); + setState(() { + images = [ + cv.imencode(".png", mat).$2, + cv.imencode(".png", gray).$2, + cv.imencode(".png", blur).$2, + ]; + }); + } + }, + child: const Text("Pick Image"), + ), + ElevatedButton( + onPressed: () async { + final data = await DefaultAssetBundle.of(context).load("images/lenna.png"); + final bytes = data.buffer.asUint8List(); + // heavy computation + // final (gray, blur) = await heavyTask(bytes); + // setState(() { + // images = [bytes, gray, blur]; + // }); + final (gray, blur) = await heavyTaskAsync(cv.imdecode(bytes, cv.IMREAD_COLOR)); + setState(() { + images = [bytes, cv.imencode(".png", gray).$2, cv.imencode(".png", blur).$2]; + }); + }, + child: const Text("Process"), + ), + Expanded( + flex: 2, + child: Row( + children: [ + Expanded( + child: ListView.builder( + itemCount: images.length, + itemBuilder: (ctx, idx) => Card( + child: Image.memory(images[idx]), + ), + ), + ), + Expanded( + child: SingleChildScrollView( + child: Text(cv.getBuildInformation()), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/packages/opencv_dart/example/linux/.gitignore b/packages/opencv_dart/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/packages/opencv_dart/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/example/linux/CMakeLists.txt b/packages/opencv_dart/example/linux/CMakeLists.txt similarity index 100% rename from example/linux/CMakeLists.txt rename to packages/opencv_dart/example/linux/CMakeLists.txt diff --git a/packages/opencv_dart/example/linux/flutter/CMakeLists.txt b/packages/opencv_dart/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/packages/opencv_dart/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/packages/opencv_dart/example/linux/flutter/generated_plugin_registrant.cc b/packages/opencv_dart/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..64a0ecea --- /dev/null +++ b/packages/opencv_dart/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); +} diff --git a/packages/opencv_dart/example/linux/flutter/generated_plugin_registrant.h b/packages/opencv_dart/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/packages/opencv_dart/example/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/example/linux/flutter/generated_plugins.cmake b/packages/opencv_dart/example/linux/flutter/generated_plugins.cmake similarity index 100% rename from example/linux/flutter/generated_plugins.cmake rename to packages/opencv_dart/example/linux/flutter/generated_plugins.cmake diff --git a/packages/opencv_dart/example/linux/main.cc b/packages/opencv_dart/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/packages/opencv_dart/example/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/example/linux/my_application.cc b/packages/opencv_dart/example/linux/my_application.cc similarity index 100% rename from example/linux/my_application.cc rename to packages/opencv_dart/example/linux/my_application.cc diff --git a/packages/opencv_dart/example/linux/my_application.h b/packages/opencv_dart/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/packages/opencv_dart/example/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/packages/opencv_dart/example/macos/.gitignore b/packages/opencv_dart/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/packages/opencv_dart/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/example/macos/Flutter/Flutter-Debug.xcconfig b/packages/opencv_dart/example/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from example/macos/Flutter/Flutter-Debug.xcconfig rename to packages/opencv_dart/example/macos/Flutter/Flutter-Debug.xcconfig diff --git a/example/macos/Flutter/Flutter-Release.xcconfig b/packages/opencv_dart/example/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from example/macos/Flutter/Flutter-Release.xcconfig rename to packages/opencv_dart/example/macos/Flutter/Flutter-Release.xcconfig diff --git a/packages/opencv_dart/example/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/opencv_dart/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..14b5f7c7 --- /dev/null +++ b/packages/opencv_dart/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,12 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import file_selector_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) +} diff --git a/example/macos/Podfile b/packages/opencv_dart/example/macos/Podfile similarity index 100% rename from example/macos/Podfile rename to packages/opencv_dart/example/macos/Podfile diff --git a/example/macos/Podfile.lock b/packages/opencv_dart/example/macos/Podfile.lock similarity index 100% rename from example/macos/Podfile.lock rename to packages/opencv_dart/example/macos/Podfile.lock diff --git a/example/macos/Runner.xcodeproj/project.pbxproj b/packages/opencv_dart/example/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from example/macos/Runner.xcodeproj/project.pbxproj rename to packages/opencv_dart/example/macos/Runner.xcodeproj/project.pbxproj diff --git a/packages/opencv_dart/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/opencv_dart/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/opencv_dart/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/opencv_dart/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/opencv_dart/example/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from example/macos/Runner.xcworkspace/contents.xcworkspacedata rename to packages/opencv_dart/example/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/opencv_dart/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/opencv_dart/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/example/macos/Runner/AppDelegate.swift b/packages/opencv_dart/example/macos/Runner/AppDelegate.swift similarity index 100% rename from example/macos/Runner/AppDelegate.swift rename to packages/opencv_dart/example/macos/Runner/AppDelegate.swift diff --git a/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z zKpxF`G*X(YOz2^@7i#D+s-~A1E;3&x%%qL5hkiy^JhYjJ74{hvVmAx*6BH`M`!qGC zO9pjEsR)A-n1`6KLACSL%FS_Kcm+?4*z-V?WAZPs?RkzoijIr~I+oh1^~T`q^dCFvG$Gbd8AnTYBjLKYUmayaQz#S1le7Q^Hyr#;X&h*1wDpm+gZC!rSKom zq|+o&UGpeXtlQ1;?@JukKG!8PGS1Io0z6O}ZeL&DsON^I0K+>Mxv#ohK+;ByAZ`Eb z2orY{j0Pa3edA(#-pJA0AaJ6h& z81Gl(pd#j~mrizktoid14K5ig7u8FvZmLLP%l@dl05IprCyqDB?mA2fc*6UB+49lb zZ8`V9epdo=OeZoiY%zw-w`8DNwTORV_>>3T{r)1-YsGSo0E2s>tix9OBqKFBjg#}G z`pgkCblKMYs!Z)r^(qT_c+}gLhR|gnq!1~Qr|~kt&2@_yswx{i$KEn`8J1W8BGljl zr@GEG#W(s#AKKyuqLp+cl1C}7%`m#-!$15XF{M(M*-fD%+i#mFbP35jlgN3{8#A-dmj&OQtG)!031jTwGMal=&YtPfq2AUWekP9J-JT(p099!L`+yen$ zVH1?kRrhV7(mGKkm_jPP_U@Xd;x=ppk}4WY0Rbr> z0MJM_;$GGxL*P68y%KBqHntF{>X&<{aeI4m6+{TQ%~Zp}v%Pujr)zg5mV;cFKqeA- zQm5`#Sd{B6Rc*4PS-rO(vf>YEdXmOK?>K@`L5}|9q}#t_IE%g+U<-1qw3mr5&v;2A zCQ}BEn9_u;;>n5N#dP0RhCF-_UplC+U(i~Zjh>U5+b8%@p3HK(R*IMQwE!uritb}< zF)AK2?+0@-aE3LYkg`B*&N&m~JWB9>(Z>`aqRwgioU)0w{U1K4?>-#i|ZfhNa9hV)2)(%ch zJMH1twoeZWwkE@I!dz$ma+;9GeACv>Ncupl@+gBSeU_uzfj!$+h&@EACkZG_vwLGA z(?^;rcJu1$5H~xI@6lHIYC-$+b&hF1p`AoAOKqw{t0Fu#X`OGt$)7Q!nmJ=&)xjq@ zHoxT4pcYKSPT5(4yzIuQ^S*N2NJpR4v0?rB-^JuaXNLis?E(l>Jo8mUw(gsFLLOy? zEszHWGaCn|lw$LSwoj{G7Uq(zK0W^VVWu#ms8BMRlF2z%-g`fOXmndgC(na8fc)s` zz$GAoxP+l|+T_S4$r1sLwkV77ew1Gug*`|HiE*?FGLm1q; z^p0A0eqqbmk3?|!CB9DBN1Zof6d7+ zJSn!`VD~tVaqy<*Mw^8dM5v3Bvj2VdVFb=)U3L2eDM3@>n(P z?Rr_=I17+r4fE{>1LBQG0&o97nef67n-aNnVP<{dd6*B!Q344 zZbsAof&jw+;CLeK2d87t9s~YZ5?6Qwf&{NPEBN+)LbjOcZRXNcR&h)x`TtdpI+b!>$E~h0o1L*2OddpR9!Gw~-E^Cj(7i69S<66ak$)AYMv|xG+;uR(`;h zGIV3}?+Qxdjz)s;s}jHY{JPmeo@-tN$H@hxaV@)}K?y~ts~E6H(F|SlsN5oH8g7*h zGiC!8c1doE3U|D}Vul1yPmXuCk*hmyU4MG2ml#V0+(G5I+`L_=3cD$%$I=@*8m-LU-!fn&-sZO1%ls63+w}AiAK`Jv z>`q~ztr&&(gCkFpci+*1Ekdv*MhBCzGfPBj9dM|YEjZk(tWBuz4?MGeq+*)t>Q=z6UXF_w z{QDUT4^JQ8J%hW;d2xGB>Fl4Y-bRT!ttP2GE5jYoI1e(eVK0&V5W+>zludt=nf|UN zi1IV;MK$Fy%$yw<oGeW?JIGjmfGLH$Y;l|T0p1V!N*Jvu zHSAG0WpwPip0vm7%VRq8$2O2>P5b!WBfTz*6dZ4Wd6O9Y(8A;nOuG((y?F`ac_u2( z#~17CoTK)1G<~~Z4jXlout{e&nZbDHyHf(=a?OtaJ(2Q(!g#)Ugw-QQ?A?mN#yN%T zBtJ`sA6Lpg`k>Pi8a7GssiY$eG0Be8LCoQL{GDqi-;j0pLmT!Z)szldvbN7GVcu*S zzb1rEq|M)1qa7rM*I8!<#w7FnQ?{v^? z0`MlS3+`#ZB5$DT4+`7e-Hlp_2G0`*F@STbRJ|!tk3cC~1T%NR-p4s=sTT+RqsMjF zyrp-Jv?CD4Y3N&Zb1gr=%`MFR8;|r)uxQ6*X{OpEhQ~+tu}^n8Wijiy`pSMw0uKNi zSNX^Z1y;WirM0o_x%zft0U2GcLm_2BS`b{Z>g|9VOVr%QF*R?pTpiJsEbj4jLVAyd zTA;x15=f~b0^(e*Vo;Tn;WTJSxpI9LmL($Lxob<^S!k7mGhnnVNnAC*g!$ms0#Q|q zs=25I0<>fUw_&+KU`}5P9wlmjRWdMYh%Np6n?AAHQ;JzG?s(Z9UR`pNh79Nzk~DF+ zX~jy>>f-2bl?drlM8 z3NfIQnrT@pLmv+QA6efWPv!sqe;mh3_RcOj5>Ya;4hhN13dtx*_TJ-=kX_kZQDkPz zIw}#e_dK%au@1*L&iUP^cfH?zf1iK)tHv=t|>-9mMT!;;Vg|svSzWkN7q#t$c4N$Q;tl3EYwef_4q>GO<#I89VhY;`X*hz$n*GZ%f+;uViG z?uLlxD1OIeid}0r9%Ssoc7@vJjZIsZlU9zvYpjhYiOrzD5sq3OC zpf-X;Nb!DLpxqX^zDIK%=46-Z3%i-bac`RIBS5*wcw5Pu>G|kF>TQP$dGRYh#1hwD z{|cbbTOKL>Gb1-;X6?vWLC+KJ_^Ij?KzJ7eZ?^8XNgoYU9^z&>d zsIjX*uOK`#Wu!`>L@y!=XpQcW+mBaRjm|XrB@etLdr}Ob57e7EkE;7a*t7=M#XFL6 za;KHHk-rBNTjp-gS^;ehKNv>K>+_jPQ45J%4><1HyKJ?;T9#~k_23?xD}B&@Wp{%H z($hU+nWR?g!9dsJkgVz(J_Yrdns+m~9V_gQ7Sb`&F4wZZ!k}##j$>O{4{?avCbCZfyW zO$)m7LE=P?$CXHDU_RUD+sYwT;nKI7 zSs_XTv!BuxpJ!7(b~uYfsgzt~mj5(vf2r~`LHwpePs!o2A3zEr@#sxo8HEe8>V||d zBiz0@e&6}p*}!6jsm}I0bN9Mc2(c#jg@;Nu6!Kv&4&P8-UcQ-00WJIO%4OuUn;^jU z;I3r=T3KQtiMQ7&x32eVtB`mCe)9ws^7u%2P`B%Xc}=Qc&O^{FmS^{~Rho}^s`B+H z=1_T);9LRK?{$Vx22!5m)Er8aoPOA8&{7fyt`t@~Vw%gtx~+g3qs8LFR%(2Uny28A6dFYnNQgcUa>Sq=%alFh&8#@1o_qgwve* zVFimnUtL{4aHP6s?FB%bu2SP=e*VGqXC8iuZ-JOc{5%Lx0g|VvyWkdh&FD^Gkc!0N zhoolXvp6GC8wj?Y+V;r*EN+<1ac`-+!8Mqb@Nz)=OqV?4gxhR^t7*+^+AfxxVt(n{ z+fkk|-xSGqmkZa@Q%`;;r`-Z|? z0fR6b@l%pTwK*@xY+(MwBUwf^z+F*~piC64BWTrz}-HS1-XF-IA%?Zs_#F8 zcmUuEZ6Of>YIJOe$&{V;3vIBw7|jSGPeS6cvTMdj96Y~pI-z7InGW;(DhFqaiTTO9@KWvQi9__j0btLZ9 zAa~-Po%^sDFfme4@Yiq}r`BgnYK2eTwCjg9_zC4V{{&_GTm-!qHGVR6JXDjw;}GzF z6lXA{xo1+tQM{9vwb1&sRXPdGDHbEMbnwh}t+%tvcw5p4J4r#hEpDl=A{;Mjc%0)T zsG}v<$^HhdcE)5IJ^iBWK{7?Zn)vb%c!5eIj4 zbT}CGO*u)Od@^LuIC@_2{=AP2-O99NglFudj{!T}0e8wtTQcB@F9QW6$J!0Ye`T+U zXDx84b$!hD#4YzSyZLy~!IIZuFa3%eU zG4eg5?}sZ6Yj29P^-PcXG*8%VzLL$0!oL?c(!oQ+G!kORsa+lsf5YER>PX83R4LgF zgPNQJ#Bo#)MXU%J9k?RWD;c>|as5b5p>xAwau=X5XbERX`_ZHB8_XSNDe`s?n(e>) zGF$G%n6o+W{6A-@4hsIK0*J%jpB#Y*G^B48eQD(CDZR5oBl-P=)r7fH^PLf?!aK6V zwkIM35?l*I6p@;^H}JIDNs-fF*IFN?k?kj(M)QKM%%?dSkf1d$Nly2z(>)oq8z}0H zH?Qa{x&36#W@y04!9zx@x7un@ob$&)V8#f~0n1|jF0kFs4aZ{ND1~QjWHToIY5)LY zrgKDCj@dFCx&-w$QMi=CqD*=`$NqC~2k366pPXl#>Y7A=iQD}f`)+B-pS@LIW_M?9 zlBS_)(vGz!L$#P`?<3Hvonw@B1uJ244y)M?0)z0-hq++sJ0GZ+{oiiH;lFi&wy(C! z0Bv9z^M;`4@)USP)7dhg@K5K&U&|7&-@I0Sk>I+ZH75_xEn>qh9qmc%aA@NEKBsVBgUuK zC=b{w-0oU|)~tAVI zyJ3BAB}%rsjz7qZ?x_XCWe6!_u-{e_3u68Asso0IvwKdxq1lN#%4w>J zi>}P;$JZ>58(ZAjsmSJl6BWUTe`0eGEf3f_yS#H6vx;UJWO7CCK!{)4C}`C$j5gNj|k znb$4QRurEE3tPEe!JzG-a0DmvXePO zSD#Q-qOAjTMm|=aBSnvwHoEbgyVIz@J$hT*legak-hhb}e#%cm2$nR2 zV9A{kc)WT$np=5coPQIskbGMO@Fn2NxPv$@SJZdG6}jV;+%(cH+*RFQ(+DjsJlman zy`D(yN?8MCtjWD3w}Q|jQccb$}BDW%M$zZZnri2+5ls)@@(wQD`jt_GpTKL_^CO&SSCcHbfMX#JXYFI^*947 zPh&S-G=l*C@`E5CU1$m7ao(Q&oSmY7)ZZ#5_fEyYzLsFJwJ%GfErFeRN@7lUbUrL| z$6;gQSNsI91LJvT+$Zb0>g<4g8T{B!U05lfKmoSRH^pB^^8sJ3{8PzVq0NeypMF5k zU3qOqksdq{>AUjm3O~dZx^vS6C$ldgCWszl?xd8-sJ;-kPnISB*-f=L*8XggOx$?u zg%B-QovSjBbj}%sShZv~r?`*6PiiQW;nee<-=+y4}S#}q_BgXIJoSOf$YbE7vXt4;Np zrKzZf6Ny0aES8(-cqmnIGMg&ieYWryBZ0VTB=4<*@auP4NdIk&q(Mt(OLPm|Yl za!0OpC9sA#tk>OsaCSx0;!$5r6naw ztzLBo>#LKaxxsO=yWe%yGilL`A|6E#TK! z+1VRQlo*D?(k0-mlRM+`OMT8kVB*-%ZGv}Aj1u^j!wu*~>L<-T+u?6sX!3C}lQte- zk(6_=iwXsQ0JbRvJDwMnk!c99w~s~uD_4vMB=m~-ft-*|z~$*g4g;pgG~Ap1m@@Fx zWS)8IKSN6`^vVQ8hv^Oc+O(Rt7!U%wVsGP+Y6fyS%GG+v+dIdVfCXPzAV~~li+3m5 ztFQmbE)(#2#Oi@k$1#zUS6ijD_yYsa{+BHZAw+^zAEI3bc(h0qm?|pNf?oS}Km#OG zrOfCKn_-CVO;}DXu|5YE#d8I2o>}vUxYlv&>=+I28WY>a1;uI)HUM_IvpF;Ln4ROT zf!=1rpKihNFUo=R@sD-pT!EOm%%ncl43f;aem^;|A#s3`b6vjeAzO!M-gwc`-Kj~{ zBX)tq64*kJl#TrgW4o%hTY3x$P01nD6a6s2#MmwM$vyX5PU|YngU*wXGK*?f?#Eg$~^OWW3I@of-=XVuu-b%A1Z|nqY_2 z;~jD&=QnB#WGU>;RwFq(I< z34K1fCMwf9F}G%k(&?~2EY&)W*-_z0ReS$;7+I1)zz`)M zpAF{5ZHLPMJhYU z;GE*@hM1NM{G{L94dL$!Y-h6A9K9W=I6AYb`Y=v{(tpyLQz^^Aibea(q()R*TU|-m zozpyr!|-BZ_Dn+$*2|vq2Y@ghHo!-`WjVtU-bab(SJp2*2i-}$UP9^qnF_OIFS~-< zYj^VS!)Wu}vn6!LDIt!HJ1SU-@ce>z8f4cT4R9V@O^Xg9)4`VpjsXm*~@%l^Ux;Rf#Zck`BNXu0Y(!C zj%Z}UAmD00nsOS%Uull)dU(fZgJ$bo>3Oa`8h~Wt)EM?v(ndlTS1p0|E9Pg>=&>58 zghD~%R;YpqZAw;F;M(lx5b_wkVbnd+ER+6A-SYj^1XUgNGn0I~ES|f|5emjyPIW)S z0z8i6)BZt&h(qQxih4HbFYa6~jyeKbc_`QEdLD@9SBGButjw|b^l*oQjDk<7Nig08IK zb`ATVGzK%LP+>9aFM0hr8t+m`uNr?h&8o3Rp$T&ql||K}7GgobFhCViaDH~+F#yC- zt>7T3&_PZ*feTKTyd6vlF~JmEA1f+*>CCE4ex}5N^$4o)YuxX&3T$P0(IS!+kan^J z_p>v#1J8bWELml|S02YAQe-&yVew+kipZr~H-I@yc$=8#rZ-8L<_nDx&Qv3dJDwUX z!)@=h1`~R2M{$J8bM^1O&Gy2oxe1T;K?NA{iv_eYuhpLyc3%xu%z`dVc}Z}%cHGHQ<7P!Q|e?dwnSpL!AUf!B^!?#^Q#W!Ry+7ofwPZ1mZq z(Id0{htmX1W?2cAYWZo_lOtT#+Us-nlP$=CGK|Ri4x0Xh>(|iN9y1 z=9y26A4Y}ViRi9Fxzm{>J`YM>GX1D|$4BY9xJrY{oY2~Z&};B{Zq9Pp!pox`8e#0C z-h~@fohA74(#ws!{7kIe4v6XUX<)9bd)g66Bz%^Y4p0~OF+rY;l$v&7T<3~4y!bv> zR$r#LblZcVgy2lq!ff+>yuR4qCcljQa03x|dTcG7`CHcxh#POtGKt6ymNd_0qF7Wf zBj_KC8{jl!zZ>0neDp19n3sD?HC=|WM3!}cK4zCnu6Uoj*hbV1<#F2BD)@A~y%@VXx+u}Hcn=_s-({PxzmMZ^xJ1SV zoZMY*FarYvO_@z8Lr2ep)%HgIL7rhYa~#X&&V8oYSw zA4m{3{hw1Vb~~26K^xro&e7i9eg^SqK0i}kG3z(!_~E?sjJlSWIWXJqKiHAWTG*SpPcCMD`kEc1gx`R^YkYWz zEN4vEIkj@&e4tC!(_~x`-K$w6CU%X7U2Y z)Y}T5stEyoSsB{H{+xfST3tov~6@lO}2gx#N(rHXiOAHT!dp6FiV8V)B4{L_P_% zmX0rPa^-{1xG6|#uEGo+!v)QAOjRe|jg2ICcXU!|Cr+LMbLHlhJ)ErR*P9*z$NLlt zmYjAUbljq004ZyOco?HJovV7M*Wb2nF8vT2D;3kGi%F)6Kr#TVW>}zTHnUQxoGmD0CY9J`|d%8@}n;_co2q zWr98`R_c@PQbMi}x3bWo4XZj{it6qYj+o*XvNoS4>rF;7WNn;vA*|A!3H}Wh-uk@n z*hV0S+XnX;K;BOoz?&*9_{NnM25s4^^QUt|>R!()^Z6#G3OmL{CU^-IG_M7_a~B+& zCrV;ouC1ljbK(K=ygqAE_-}ewnH2&&t0enS7}I4i0wJgNvCf|P$`|DHku`K`HfDa2=n@DCg8MRi_)vpMR2Mxy4PE2Qe! zD||kNXy=0WeU(43v%md9Hg9Zu#CP%d%C67gk_#pfXs8lf>M=betm(}0fdDKq0{26# z_c?J!Cgo-~*=wswLXkR|W8d+rDdV00`22Ouv=_Hod9bmB!=D$I4r@7DZX7e+0tO!9 zR{0d}A6^K#yRx@ykotO4(WUJsmFvN)d-o-wZ(wcDSUS`8jO-JSAMa4y@MK4fDP`(P zzxQ2})ofiauWKj9{Rm$Yw^?g=?`oO(Vf|T^I+-A+o1#F`>tn59d=FtgVJAV=y;G&` z0GMvtEeil5;e$Ln8-41(UeMl2kYLk%vPl?0+Egg_;g)494o5FsvdeZKP;&&fjw7o{ z|B+e%Z|)8Ts?=>@p|hr!nYXgV=ZjI4Cp#$E>+g^6r7Nd3<>-t=G%B5IyZUI{e{49G zqnIXEB=M@5Ndf1J#l5YWcLG=A4ufF8S{z5Kz-uM?Ni{{%mr);=l0=473h#cIc{K3> zZ-VUw_Ng5^HgWQhs5tQU@qv-YBej9`R$a^|lknX<*+sSVXue8M0#EPBJ6_Liwl*8l z_zoD#!l%WIXJZ$jm?|zUu0LdeP&8IW*(|39&QzKGnem$6--u{ZGtHt#Hro*h)?lu zXGKo-4Hv1WP*VLj;uA6UwGSV*6ro%PRbwR{@tXoCOb=OFTB4ru-|Id!rP5Y6LF*-D zy|t0qDSVPo$ffyoj#CIZV?l3VsPRYye$F^xxv~Z78_fwlCWbwW!nYCR2nx0_+@tg3C_UDMVa2Br=X3hfP}^Cp4Yg=#OK}K zKYVY`V9jEKD!UrCbSX6Xym2T-cg}!n;?;o{mM|zWj0P@D|FO-rQ zKt#ApEh#AX%_f%9!G6`I*K=bSnMIhQ%W5&BOMntzVr*eS;WR;FgM)+k`#+Vze*z&V zkU^I-R|!Nwy<~>eeQ~hJqa2|DdpX15kD=6U73Du;T|VarycBP^n#IZeIJ&H3S9#@oec~poZELqX$DAc>XZyuIqd^GK0Jq~0kI=d zA7gMo8%zmkEdnqMh)tkp?V0I;Tm3`>aU3^~dXw zlhdd3=iygnUgYu#GRhxln}4D?Gokczq?T;RjCk0=fUHy18$lt!-q!%sNxee7No^+N$9d?Es*``)0UJ4SC&FNY0pf z_MlbGdUy$|F}YDvJ9GTCkZbsNKj3DL5;=BGBx8xI;n)=A0d0j6MP7Mi6MQdk@Tux2Qy`oI_&*%EQ0bE?|R>P$rDhcFa8O?JIK zPOpFDa?-L*+Q7RrCg#y5z$l0d>n@+OYo3g>-Z*x&`Jj5|=*UOYaJer6;FAbdtt0O? zrFGUE?!XeUG}G8wMgeTs%+r;3uUU;Nq5EuU{h-g&UOBKhdS`;J=m!~xn*ztv_p@dD zR)tR!P=~5kX)FRsx9)uyuu?0dh%Ht7`PTM@e#Cq!z2ts;O;L)tQ1ipDiWqbGz@o_p z^D=UKR#`S7HAt4vQtD(_SeWyj_av~#tJKlb9>-s5Ykuzx_E1ZNl4)~f=zG$*;-y=T z2ozmFva9az<{2&63fQ?(Q8{IPx@t1LuFcxP-LXVctWh3AwazVTt2)w^*Zn-#eB`bD zSHoAusjOBK5(>uQPGj=ijdOH3jqG?(<5#C{*JQ?Lt~@zow=Ii4Al$Vr!#+Cf-gx)A z`_h(>b@7?*6bYM8%628gGW^rwWoG$mK_eCk`}B&llStfwHf12*{5spmTeNH$4{gCY z@Yuwr*k@%m;T<60bw9z6^WpWi@Bu^qe-g;YAzI+VjgsuZaGA=^G*I{KLy@rIjSpWb zFQNsCp2T;S$VaJtZ<(waRu8y7^X;>YhsWp zM)mKgCeE@K;J4vQSV z&-(Gl5AJCp>K*2-`U|4i;u3p8xo6(isu-38>cY zml1Eo&FBBKJpour?}q&nggpFiGM%m+YX`ng8P+uRnJiMyWcv*_AZ8KAB$w;rfmN8C z<-2EB6TqZO>A~P{*<);wYqZgxQS8E*syOXvGkGxF@s(scud0uv?T)fQ z(DGrwM7lvpitUG~6!*}kZUpBn9PuP`5^nMK@($xI^0Q~axP5qU>L~uF{R_<9&m z({}$$WuD1y-QzMVb3jLPk`~bDJNkw(Dv-6cKUb4uzD= z-w?i0NZ2K}AbT}Zi^uOZ32xmSxJw+6(3j%a!~Tdy-@RxVx6YUw2|V6JX+mSJNclfl zF~SD#eo+lnB=ZpHLl{)E+`sI^-V1Vn!6#Ml_W4aH*Pe(++sNI`M=5L3?X1z0;CJeE zJiX5Mp6JH*=R9W0t(1@>>1y=lP^F=yJil6JxU~I}EpTsBx?rJ5LbCbQ zuLBmmX1MO&!E}khx=+#hCesIB53`IWwqyFtR{AUv7vJ{Q^dn1S0@*^UOmRwctFy&> zd={(J@avBzmu$MbyamRMt_$kfHY<*v)%%&nY4hUDH=$k)$8LHlUG0G3Kv#T~-vQjw z)hXbsNIg?~b-jRw)ir5Q(gfwM+Zk+0haf z+4ER%>T8RnKAoJ-(s&tu&-iZ@A?^J|d z6md=9C4am*v2r=aa&a?~37bc($n#wQ<8UGXL+!RtrRXGSj-2INJ#+3J=}e6nOC}G8 zN~lvCS@rxoq7w$CLg-wx!%V%ymw>~xhUw4cADX*$A}D~{21F$!Y61aHwpdL!QcrsN zl~$s5kk%7HWHkZ43%mOcwlk3RcbKGQ*}K(Fxput)rpE0zH0vY(EyY=blQZ`odG#hD z)~{&r6XkSE(^csqsaMm>2c%xsT2&g_Nab1bTY%fIoNHatDY@C@Ei~v@19|F?szU6SWRS)uDXqNY!48RlAb;S*ijqus; zp;bteR835>3BXML2CewOM<^q3M*ubU`}gnI-oS&(vf=GF|JJB-inGOH_dc1xb|iqR zWgrcNy?1*8)vAlAaiBE%K3Q>5Ygy-#Wf$>FqL|Kvgb&6H?iQC*Z|PN)xZJhH#d#=a z@s9O0oea6Lg}submzNZ{iZ*_okZ$6G*h5YO!dE=7c4=YA9g$y%1xjkVl#|1DShEjM zH3(sS?uRfB3mhW5Wrm} zrY>KpBxM&CC;s5Ie_{o}upN{vdb8x<_$5iiQN49`z`+Zz`&E`yLAim;X&}$HAfKmT zkO2Dgdno95mWMH~h2c4);H=MigT8hyzl|4g;dU7F;p^X>w!fa0zf{^rf?>~ z0w{=F_R}ru{g5i@&xwC%R-!-1x|(k6pSb5_)$f`zyErIvSCs{z`iVvU4x_znFKti!!av6BkRX_=+kEc;*`_rla zB`g4ruCJGT3XVTTrlh3Yj>1>PNIy?sV%Yo*=qaBIOY87_?P04yx6TV?_{~K? zOHEo3|2EA2JAMPYZM!H<{|!s-$r>l5{19icxV`Wf-{<0I>{v&H4FZaCy$B6Ludz{v zRH!!HV#JGP?5(L!Zp#}NlOODgWqjO+yo~+LasPYxH+ht2KjdfCFQr(oovP3?vkFK^5FvPJ4^LD=DpYQi4tUXuY1;erJaBQ79 zHcp(>mKvoD+)bq5SX9siR>(%CL??*D>Snn%p}NfGO4(RY^puLI+j$Pw)NZLb5bKo{s|0L~ z-A3R~;QHMg0bHSgESOM&N&@oF4|8gkPF-nVM=sQ;d}wcS{{!iW-)yQ``D6t#xlh(O zRF0Z@O>0uMz9g)u{P))ptV5lH2(gC8I5i(FDRG5Gp1bgBydKgxJy5gBfK(#D7NzZU zatG}S^z#KL*Do5=K*F7hk(`mbdgI1XoM!8*-};#UzNtEG@Nki#`7)GfV;VlfW^)=` zBaAjK5>gx@wf_D!B!2C6xBK^K4%x|+#?P@5N7tlfWo6xWJD~Wz^cnPfFF($Ixt4!j z9%x^1$on56XZB0Irm^kw-*rd1YVO;(*LbB21@7OPJspo%WO676#~oUMws(zP#+shG+$ns0IC3W z_{kYU>N5<_6=j>*0d}r-?8U+--eXfy2M+opoYL|=I932TMp=&k#tzJ^72OtRJ8BVOvTYPh;@EE=LJLeOk`y?d|Dd9%fWlhON^LnB^6x0LyZqz@imyogJ`$C@Lr9Z4o)ZQz>NCavG$$@e2#r3 z4I=}I5KgV>wl)~_Ja7gLQGju0c1{h%cV&6c`doWWv$>q*=ZLc8J{hBiKXNK?zx2Nr zz!pph;BLU2OaZTv>Pzj(VpSp2&OWNCF<~>NgL!nezhxEgj;&2 zl>z@V#>sykFCnFL?|(j)J3SFr|FFa`n@KbhC2pZB7 z#3>qIn&~mG_Vki=p8_x&CFeD4V7MvgJlk^G7H;(apFxr+7Gc0+1KfI6$@aeF+d7DJ~_-A|H=0?Da#&^Cqb=!=fVz>giW5nw=jWQBS%L^t1EZ@ zCm9;qlG{($@0W3T&l17ownc5pWhfM8Mwn-fLtb7H|IYl)8@QikEc_Le+s60x?&B*m z5kObB5{BD}gGr7l84~vP{N)C~3V;xhBWd%=^j0&KBw3T3-HU`;hqWA3OWW~<8nl-M zfYn-BI0_?g`3$_;&Exw<(G{QM|8)Kq28x9NF-F$>r@_BO)t^T*i-U1bX01<)zC_uE zR@8qEQQ#cm$YbXIUPVO?z7KI$pw@r=-V{V@>dC9Hn==1QBVy_b;#*jR+&f*$AwCl?o&G?2Uk4=*Ej zFK^Yvw*HTO9n!XRBWe++o3)4O!OC9PC=_l_<$M(W8(Akk`zv5?nJifb^rH3N?Hhio zo$=nNmSEz_QFHj|XF!vQEcdqPyZz_4|M_GBH)k)KA9XGRlTJD;3*y1c#?ZWkeaQM* z^`Bf04#Z)ARgrE4rMmlk8E5F=NpaW8xKNd3)-orW$m+kh(W12jQbQ7oi z)=#qbmhkplt}u`FC0sV9sdnb5$E!zX_xlA{4wW&j0*DCm`=1;Sh_sB1xiH@C89Z93;8d)EUk=lPNIZ`o3H`Vd+Ig`=CV}#?PAXvzWk{x96fn z0(rYh<>?PJ>Hd8v@c8=*vm+)>P1k@i2>yMaKw2nihLV6Z;wcdc*E2{8=xNh(FkEe3 zq_pc;ISw&}`?lqKx<4vIa67!xu|P}G$c3MDyg?u^InS?uM6Zzys0QM9ChW>g-ypzA zkOUSfvhTTWq{_>TJ{+kpgwX{@>P5ptiJ1NTO5)8 z8BiLUY_!*AJ$V386^TicK@z0qOPWP#Ea5?}!$_&fQ zOcRKuR^tLX*&CM(ahYftiNg!a=uU|He)2nU2(~iX@Yo|foZp906;o=d%aK09YEW7_ z-yX*;XE#z@?zZ&fQ?2fYX!T8@-$(K5Jo+AkyOM+(944x4B%2NR&avFFJY^9_br5UtzSX5@gmYYm@ z@S$jtqFn18bXQr0IYhQ=+2~ZDB_DRW3d=*B+3q`-*1P$i!GVIG(AMp=vBQ#^_mNxp z(;4Iz#_~&9jZ}}7oW?R;_x8&h?b0N326NJq4~>W^TeI^!o4=G5G{|9ff|`NN5+?ns zL@IWva(*@PXPmVGQ#rgIOY*nnoqNDDy$hd2uMT>wBgzg>YT&BV2U{k1ah1(1j_v0` z@o;6~SUGW=!+j!oa9ko_2^G75?VolPmWk=Pb-h{k=phZga( z88Rp7QzbHkpYG!aug9e^DF63Bi|1#CeAW^CpakO9DTT!p$yhuT8Aq10^cl2O@Zl-2RXr`+zCPj#_FqXs}W2{Qvn2Y{BmNsG45? zB{BF_rVgT$u0 zE8o6|@C>uOK1Ba}!V zx!M$9J1B7#_JSs90cKlucib?T&HqQpLE9YV1?v{gh2NWKEt9FX8;3DePnCL5Z=k)Flp=?-i$<5H4zc z`?2ZZ+p~Y8FYr;m3Vn2(u5Z`Av6#S}zkpQpZ|vNP0DY^I-oa$HXzg+ajQC7%wldRN zfOAL!UwFtuphqqR41v|3He4cQF5;UU9M~lti-k<HSTs^#>-Tf|C2&~#m%6WZAy1jz!Q_-IbpZP z8ht8}UG13lz+N-7+01+RlE)6OT^3px7fn@1|_b7^{bhPet}< z_)77(<^>8-qQ2X(n4faVhm@T0@Z{5HFSWs~EDXtV@7IAMbVUP6;v8^%l3PZ#wOZ-* z*Vk4lRj6OYpAZ_$*`t|tYKmLar&&{5{d+5cst)rQTn`n8>Xi+0zXc6YbTPMgzewFg z23F=+`8=FXXF6b*CDVN$v3|6iy;TSFSYh$qrbhKDcT^U9l zj}3g#zty{k*>s8S+>t|cng#3@Rz`z}njy{*?90mV6_Mkvv=iL9pb0ttHf$7;TxkX1 z-klTGb`2~-Mxx6~+{b-KiFd3XG`p?+6-0PMorB#Q@TY_CH5)En#5WrmHqj;@Fvi1A zeGpO@wuYIPOgRY&02e-U+j7!$LZ#5mS72R3MJS^gfheL5`kQV_n{8}KXaj)V%4b~As zFrQ7yZal}~{ELX@8c#V?2LlM@)g(|;VvcBjEuTJ=`WkOem{DL!+7Lr!U;F!mGm_^~ z+V^T?%bz+8noq9{ybcq16Gzd^fS2`skac)@6|;8X8l6Q19epZ@l^3@1ES!x2XLNA4 z_FI8#x5sq7hXVr83D;_5$sU!*Ye}zyx1wMC?Q{DSgrUx#fM?_Fj@{syA2x2yL^J{S zPPLkQ#O+9E9a^H*USdriL6rGHDt$B!vu~t7^)@_e=(<|SVd!MenX48AP(Z$4WoC9_ zeN;I;hEAr{ZvB^gK*1AWfI~5H0a{Y#2UBjn9`7;3JDrI5leeufemoZol*pDlVTSHP z3#8@6kxsJwUFg9(;)>Xm!{nsFC<7}Xwv_?o=eP)$>vvvj>yw z=YS7{pIOg(u@mJ%G0G^TM@L6>l)?_{_e`(yLxmX%h*D zMJS13@e!}HFR{?GNtq;%=4#zUgfFP^$g|Ax1<`vC&qIPbwGNo}3>ZM?=Evk6r|J&S zi$UD-za)A$kcqu)8)1mG z{FI*zS4{wM6S3;RP-!$0&8!6*;>|%T%HJxZt}cmap#~4vD0Pkx22gBbPo~=2iEMFa zSN<~qRz>jf54?e)>3%j;Gc6C1_YO0C|CDQDt7+bE({$0($tizZ)xn2L?@6_ zR3$`yiwH?E%X*^k*^oQ=z!1GA|E&fXHPR=rIEGq4%0=SGvror2Y%k#d`aPmx5@~7a zdkmPa1d-<`6M%& zp9rn|?C(5SRowEcasXoE$)s`=GvJk9wPt|2VX31T2F}6x3#(&IMqZND*a1muBh9?X zX_HSLo?$y$a;qFx^U1W|YAd%)Gaf|AEHqZ*{PW96FF*&nO-@c?c6t5=K_z@2f$8<^ zY}d|9NRviy7sF$61>@bV$B3*VeDg4DX3qScxVTL~5Go^T?}aG+th- z2`EduJx~ZcSssR;yX%oW&ze|$TF?;>HGHp~Eq?$w&SAD?d#s$$|4F@l*T7}X$7>}7 zRvPwxrPaLO5X-qYiQ7{P^4Ui2GDbq&DJ3Yu`)8zfMi1{>HEq`+uR1bJ4x!#n0D6_M8Zs_# z3mc%u30aK|avL-!XI&?{^%v4OXUr4OzaL*|-HV&M5GPx)SUqYMWw@Ex;%DHx^&FOD zncjYHD@AiYbGx1O(rsKW>Eg}cid)6bqA}!r!G{?x#)c?^k+q_uv%Xh3ha^A^{%wnpRPY({1LqK{NQy>!UjUc8f7x2` zgyLiGpsKlFO75ee2#drn3Glyna)PvUP}e(t6P z(8^W6g23+fzT5gZQQ^L-Yg#^P;QK8FTZAe)*|CKS6(I>8a2aoN+XEkYf2jAF!Zi3! zjS($tF@bu(ypeC>`IZtF;jz`F6A-Y7ZUQBuZxp&q4zHb9cc*!1`T3p9xL9`nWhNVr z!2lf=fCA>;1E&E|yfmrHqB#XnUCu28b*4#eZ{lLL(42#`ui?BO&uZj|d_Fh!Bw8g$ zn@2uezsJz@^XM(T{!CEw+EyG*eaF`FuTN%C zOZg)khBpDobCl(3ud$bhr>EdmuQ^l^Cic|y2m>LM+gsZGYKUAeJE5YUX9}j^JDoojv<}Cm&t+agmp?JE0%d#fo}m_cYogpjn5&egilTvDFz-Df}1i zB4)bXfn$dqb!cCa13DdCgMNehaa&${n5Mw&bxeKfNmHq%e{T_H@WB!H3QgFK2gNpB zP<;xkez-y-Lr(0^P^G!YH~WLut`0=mPXbVN64iv6Nd`s=eUQ;?V((+QU0&B4SF3*{Pm$AVrq;v&)c>VLy_UCe45VEsI@ZWM2TaB# zRU6XaLx0^H=0)Z!$rIu`3*s{Z!W7pU@6aHvX*vUuzME+!B5H}k_gFD)3=f;nI zi1|B!@iO%p;L{!JSEI~vyUByf_{HY=;RuAK##-h!06XFwxYi?xl}oWStJ*P{OcVe~ z_v(y8!+BaLQB`(D(XrL0ReKMn$R)8mU2@$q$Pq; zbZq-$IkP4V(`m}e<)cwnZLrjiA-X0@VY~Gi5-PKX20#Eag!JOw1br%7Rr}`(v@d!u zCo@&wE1SwM=zt~$K!eJ**9GAv!}Cogn9(d0X~BwPkU4gaWh?WVRcE3N?C%_R_D)Vw z(YmJTJ_0~fhItqHPqoIFGQYE2!~?aSRa{vjcDWhy5>oT zGOMFTWfL`aLx-!QL(9r?~D6y9Uhq=af8z!rqg#p zXk%gE-;=@G>MUv7p@P#ni@zP*$YQwA0Dlc21`%pV;p!_F@xI(^eA5&SZ{rU?^Wj}! z6Y%C^eMYilc_~MAwqV`h=I0;WA)MqJ^$IvyJ-O0)*RuLYjTL1TWd|(NbhIZ;nOop( z`4bc=fsxaeI@zc!vvYFFetFRKSMjef2_#oIzzPIxZ4oB0sxKOzX4Wltz#G@LD2Qr5 zm9o~xF;EU*_!O`}IigC{sU%1^$$B@>Fa_H0*>*1Amc^7tnKxcPpr8zZTme`6(0@J| zXfBE;0)lcuv%tqq05V8P2B^)Nhq~qdR|1KCfe>(GeuFaNc)T~zvma>o)FZv;sVD@D zynx%jpd8m<{zI zz44BQcmN85TNhy2plu`Nt$b;sKELSBpW)my@*ZnL{lFaD|7-8c-;zw*wh@(1yH+~o zQd6mwOU~P(B4CS|mX=v+F44&NRvMbQpcpDmU!|BhndzGgrsa}~;RGs*v>~aLX|A9$ zxrCyC3y6ZiciVh3@BH@t1LJY%FM8{e94DY4JQ} zYS0fcOC|N!{@iq*a@H$Qe9ONriBWJrhLhC?o5K2)!=~i)0hGh-mMd~RkqdIGCB(fU zy5*IvHssJ&gxudt>g(3w2{)axskJ_#h96qTc~<{c!`n^f zg+SOfdm8=UI!4%}d%RkXd}yWU1H66h)eDTsQr!qkcZE^zbI#F$k(dn7l7z}@YSv1+ zIcEYw{HJjfg()x7R@zQ&o;LdJ2vi6Fkl?OHM-Ga!%w}co(6=I5LZ>n{9pr~6!z|S$ zq_VfE7##n|{H(t$wPI-D`~L#((@V(MZ>p6Eb8k%4{lIGT;hZ9cg%~HhcbDCd%0RbM zs?uZG1wSL{Z0f+NzDiO?w9~XT^dWptKJ@M~0(@5*az*ZgabU465JN9eFY7vD8Wdz_ zlAIonnlivB;uDXov3sIgoKx2>G6a;@?v0qg;r`RnZ{4wMw2%}(e*c8k`R7sNT@>H} zfUU~mHR~8!4rJTHVlT=v3wz2kx&95Nz?@Tj8)s5E}t{|AFA=d_Y zOTqb{ATx>U``k~NJ2hYk3r#Gn1}|1Xj}jq!9%;{k(?9!WZt1z#{OATvapC-}#$LWi zi2R>~v0v6A<|?Eg)Ye#VyRyr7RJ$N4vFEFfmb1jHF(yZN^rc!ULDen>KWu(D9Z5!P ze(qg(G2HmSqyi2B&W`vo@N=3l?+dXbWn-`1LrY1^_mSilpKLLxQp}@s?=Tqw6Do5Pui*IhPZtaT|GAE&MF$;(4s9Bt5f+vbITElRv3( ze&@3GgY%ltiz;PZXq||TeA+sP9bc(#*G<2ck&zF3W?0$Bxit`EwvZb7jke;810>h3 zb}}!oS_xUbJ^$_PWrSlJ-;v4qq!@|L9uM#ALcMu|+|fni+AqPpu+CtjBrs#Y1jKVU zEc6L$d!2l-MgMi5&7?{Dfxj)qn;mIZudn7I6V$88%05A!PtCQTGSxXKMGh;qXa|fE zJBUmhM!}@e#A?s%bajm+=Ka1WxHZWaj;k#XT{T#;bH9c5zA8txVHEz(EeE*PP9eD9 z<2|evdxmVLj_n@`lp>6@ zy_ZTczm54_lGjPwPaq$dF1HdIks&Mp;%bge$QZnnp${}#&Z3)z95ei@b9;c=kJpY- z$G#RZbgyTi3&d4=3%+gXOSp|g^~^%K1id>re4gTka;7m@WA}bFo`GUbT8-n19VVdO}IkuW(H_iil_S}@$xy(Q*fCcNaD60 zxqsWK5lESLWnKgy^ci@da#k9^aW5)oLzbFxlUVBA&UM~79PF7=rW@Ot`>9(Gju3N{A4%EK0dPuz{=J_LUv|Pe^*x3eq_ExMNjB3?{$+xH^_Y z;e5pH)*~Lo@y=;b=P$Iqp9KR|j(>D-kaI4WeI&&HPFRtbZBMiQ^PwE`pF$Z7#(@UF zP2~&InXDTNx3`4)H2mD8yHl{Jk(|C(VA2vwY}3IRqo*qy9HvN7a!$$hlZqjmb6tZy zp1fLd^be5LmcI`_d3@@A`jLDS!b0qXVvP%y>+DfL86Ie=*TZ)PL??Lk^F};4=dwv; zPRBV>*)f&NE0vtjYHw@vs9l(Dk*g-}ARSciwv!f)E361d_9y<;9b7)PBw$3dh`AZi zAY4)BVh3t>;gR=s)nZW3PT_3bOLDK)eTZT^*m%P!HdC!FvK=Z=_iA>Bg!`SsC|P3u zz+oMr^PUcTebccFK>bqp475+?5RUC{Y7klp^p=Q;ZM+c8Zq6wBtH*5c=QHlp7wZS%6AszeebN>>_2^H7uuK@g%1{vF}DT>U{h`}c+u5ubXcFMH)fZ6-l z!y=qVN>jqgj)3T!mALcM;1!8}PDcMCU6<9?l#euNff${zE=b0d%;TcPFfw`y>zjLg#_WgnwatH|t}Y&WrR32m5W_AWNa`OqIc{ zW{_mX(Ck1psRCgMhJ*hXhcAG1ocb_kuY)%9rlYzq8h$K;X}=5m+8CYpJ4Yw6zLi%S zpu}dkAc_hVv>NfWy9eLsQ-6OzoBl{WAkRi|U;anmJ5dFwz(C9~-A(!Vfw z(E!S5ua;@}(q5GrIc6|PAOSPg{il$s$UBI}tk5xuP-VedGyZd}xqXvWvU_`{;Cf0> z5fN79T(#iq-q$RLb(of0ZA0lfepj^!a2-6 zv{v^7r2J*xmj&XVgZ>Wd=RqwGGe1`-Svll~bz(-y7*N1ooU5J*aY@&5ea5ss6n(a? z`N9l?w~=^1g2wLDVRD5ovqLc^Z#YRDFR+QYV4emH*fzOpzer3>Pudh??f``be>dD3 z)xB}1O6bZpnt=j(m92Fxq0dz89n>B05xx10QDL-YDz&e>h_u@9+RG)Pv4{2IYNiMy z8auH}j+fW*;q%Ymtbq+KI_r4gxGUeYJ>hq~vbe!N3%NntH+Dyh7I70!cu(qE_`Vp; z07NvH4Q2s#9;mKj;>umoviK|H+#CbgGq`D+QxI*$r6&D`yf%-M^{H;6gi4*j3?c9c z8$}NK?0I4%b?c`p2;SvL3*xY`0fe_KIZqPm`M%{DCrPUt{bS|zlhbHBNlUe7zcK}E z$L2zIl+z#Z!thJW!}{G&JAC@Pg`H(}GLM_m;uV}C9Yt(vF+F0Dy7{`k zY&v=ZZf?8^qSD>~2iP#{qQK632aMplZye6Q3X>dctS@JHSz2)zJaqXvFEZlr>9$oY z^&9^4pN`1EJcEw_wi@P{zJqQX470?WZTB*5Y7F!3#xJO^z|Gw@)bFoY5#daTP5OgI zcbKI$Ok(|9g_%#If*$3ga=U0_n%|#}eWwyeW~(19Te+!xF*(rd=LU(nM15;<7Z&oA zrqIw#r7}&_qgCdvS7+!|3?8w7JNRtHQ$~8Yyw(xC+n=- z7SQBo3+)tbg2NJn^=lukNOCkiEsgt~4tCrZ{aSnrHRMk@_?1^whFrEn3mT1NSC9B&c-(JrWu@FUhSNf+(>-_%kX#@LYnzq`^M#XX}(*!_LZCY za24(5Y$WH^=;GY^#0c{Y4{_!GPvm_bd#&6ypUpfwu%|+=UEe^Q+oe$7cXnyF@O67L3%SKO#rdayD^4^vH2hG{w%vp|_*jKf4 z=jb?40UP4S+Mi~(Uz(^cvgVB+r+Rt|;wnFRYcz(i=&Q14Ok=V-tTPw4%v&;ZrxI#w z6&rvLjj#yzBr5~N*7o09CkIE=>EWwo`ceL*@Y=504RB*xY#SY{)p3Gvn9zBL_FCN0 zl^axu8p~su8HpiDNi{%5ojAv1{0?t7*mflF9&Y_x4#)X(jyLl~c+s6*I1G7{zBI;tH*_ z94)o##4$cU4ohj~e#C^E><)3E`d;ftdwTQZpDmp)9)n5^+h%BE?)8LI2A`L!zjTBL zPYE&+#0&jDFc&4Tg}VC}E@4ZGyWbiK2dvn6Mpu!cQT_^6!RG!7)fE>V>?PNFm?vc5 z>A8gcW=5Xm2#LEW_;XgMQ$=Y-#lc|zs2}}2ny_4Kb%D@Vrtu6rOmUe!ph7;;L`XHi zXcDHc;OYbIk44?|A9-=Ml{Xap)^{jb5$Kl?v`CIT`bDXV*x{h+UARtzOd}#US>a%X zOdU`5^_P@lkQxB*B<&RQB?FgJOH2-~rMnXf_{5%~s&OlUM^i30FeOM{`XOXs)3_BU zEAyNr%bz8RJ=Cvw8y=)3p z`K|i!j$l~LqQ)kabHK}7WeyB$x*({t#cQWf98qh&X{R*Y--9)~g)?XCL>&z;v9#hY zTFY?DV&1fPE&*z}6Ki`Y5#(-eVYB;OzZjPSDnN%ArA8D>wODpQT4Jt}ah556JE+G_! z_P0uQ!qDhR94VdpAqajIOl4~>oTaQ8H5yXaTZUOb%cRAkWYV?KSNlTqgSM=Wgf)JP zz=?Q5f5zPEVO!NbOCbqEwP^Ff_O_`gdm67#U{Mp^_bKcq2IoO%zcJb(M5z`cjv1Ck z+!awNRhwjj6CQqu+xC#{UWo^3+h?6ymzq3r?3JV}<|u_9x=MWAm`1AqAnOsJ*@)^4 zr|`FkZlg{Cd!#Chmhn=_ZQe;~-DTUOv>)Tbmh0{z_42vWa|vNUO% z_5KA1xNHBgw0zjUH|s5xg$b4k z@Koa#-AFizrr6h2#$k*41tm7_jp$yL4X*DZcklq!u+>9E0WnhcOFPn7Vh^ao@~tno z@RwY)*+8&|Hpdq)`a=L*Teuw;_B@u;o!a!YaOO@bs-?*gqpm?nRkXl~mKFfF z+OVzE%RlC`M5-+KM_GXZ@9b;=2C(sq+R&Ko_RzZ%5P~kDieK3yzV4BN*{$E%KY;4k z)s?*vacHYN~u+?SoI`e@S2!9Co!cdvz;@N@{yj`0-9^8osR(V7PR-O&gM)x3owqs5oJpIwc zgY`#VzjI$V>YYDrIr8D;0JK<10@ycefw z;;oV(!gUR*xBg%xTl-#d>u(5}#jFrLKo}q0b{IuuZhuO7n++ zo@9)d#`(AT$mbW5g;c;&z>1_2Nk%;L?TIhfeK%PYp>5N<5wdihxw4-qvVsN6t@bol zDFgi~t`B&ZU3ek!#fXVE5Ao$7AwI+@amT_m2SclwQE{cLcv3kwhokq+!S%>Fe_*(Z z75)vhq@YqZqa~Hf$0S?T@nr_%mV%*aT${~4)6|(P@Bq_Q!VC4tZa`7?ra`4?oV+wSr2`TVSUmKS_>V@3%0*S#!+L=3f@oF=4k9U9xv0p1;Fx&}V;X2J~h zcz^}G3|;s8JyEFR*LB*fPUm+?f+ofnBQ5uK%NrwA+RV_~h<6-mw_wU?NGRI!zNTh% z&>ty6x8&gW75gdW)?p->&%?{*brS|k@b|(>&<^nyO55Pi_q*eK)=J*Uunw2cw--p%E!VXuDa? ztZ$HPKJ6$Sh7!UrpxVBLFSnpZOw$(ftvg!Nk1LVfL+FL(u zh1Abu(oCSmgqQ2IrE;Zz2f2DAD%T4XO6tU&)2IB}vV3{^xpz1MYFEPy_09RP2QvmA zIqw<(UaCnCs!mFX$+3sjnV*(O5)y`jW!*wzF-l^K`Bxgap+0Ej z@c^nf{Ic`6I5#9bcE7fwiiP8JZ9dr3FsD~SBiW_`8{UgFt*{$@qj#E)90JYra>Zs3 z$sCTuzOye2GdTO;4@;wgJK@!ij-|c--insluCR}{#q=D6Xz#nL6;`rkc*UzLTR%Y{ zN2YK;Zcz4YY=+|(0_?E=#~3U@I1fIyRiBF zIeWj=id+b|L;kSMs>NMfeB^(={IdrC;NYJy_$L+olL`OdOqgH0OpSa?FTRhwb<|%A Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/packages/opencv_dart/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/macos/Runner/Configs/AppInfo.xcconfig b/packages/opencv_dart/example/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from example/macos/Runner/Configs/AppInfo.xcconfig rename to packages/opencv_dart/example/macos/Runner/Configs/AppInfo.xcconfig diff --git a/packages/opencv_dart/example/macos/Runner/Configs/Debug.xcconfig b/packages/opencv_dart/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/opencv_dart/example/macos/Runner/Configs/Release.xcconfig b/packages/opencv_dart/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/packages/opencv_dart/example/macos/Runner/Configs/Warnings.xcconfig b/packages/opencv_dart/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/packages/opencv_dart/example/macos/Runner/DebugProfile.entitlements b/packages/opencv_dart/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/packages/opencv_dart/example/macos/Runner/Info.plist b/packages/opencv_dart/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/packages/opencv_dart/example/macos/Runner/MainFlutterWindow.swift b/packages/opencv_dart/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..3cc05eb2 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/packages/opencv_dart/example/macos/Runner/Release.entitlements b/packages/opencv_dart/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/packages/opencv_dart/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/example/macos/RunnerTests/RunnerTests.swift b/packages/opencv_dart/example/macos/RunnerTests/RunnerTests.swift similarity index 100% rename from example/macos/RunnerTests/RunnerTests.swift rename to packages/opencv_dart/example/macos/RunnerTests/RunnerTests.swift diff --git a/example/pubspec.yaml b/packages/opencv_dart/example/pubspec.yaml similarity index 100% rename from example/pubspec.yaml rename to packages/opencv_dart/example/pubspec.yaml diff --git a/example/test/widget_test.dart b/packages/opencv_dart/example/test/widget_test.dart similarity index 100% rename from example/test/widget_test.dart rename to packages/opencv_dart/example/test/widget_test.dart diff --git a/packages/opencv_dart/example/windows/.gitignore b/packages/opencv_dart/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/packages/opencv_dart/example/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/example/windows/CMakeLists.txt b/packages/opencv_dart/example/windows/CMakeLists.txt similarity index 100% rename from example/windows/CMakeLists.txt rename to packages/opencv_dart/example/windows/CMakeLists.txt diff --git a/packages/opencv_dart/example/windows/flutter/CMakeLists.txt b/packages/opencv_dart/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..903f4899 --- /dev/null +++ b/packages/opencv_dart/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/packages/opencv_dart/example/windows/flutter/generated_plugin_registrant.cc b/packages/opencv_dart/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..77ab7a09 --- /dev/null +++ b/packages/opencv_dart/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); +} diff --git a/packages/opencv_dart/example/windows/flutter/generated_plugin_registrant.h b/packages/opencv_dart/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/packages/opencv_dart/example/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/example/windows/flutter/generated_plugins.cmake b/packages/opencv_dart/example/windows/flutter/generated_plugins.cmake similarity index 100% rename from example/windows/flutter/generated_plugins.cmake rename to packages/opencv_dart/example/windows/flutter/generated_plugins.cmake diff --git a/packages/opencv_dart/example/windows/runner/CMakeLists.txt b/packages/opencv_dart/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..394917c0 --- /dev/null +++ b/packages/opencv_dart/example/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/example/windows/runner/Runner.rc b/packages/opencv_dart/example/windows/runner/Runner.rc similarity index 100% rename from example/windows/runner/Runner.rc rename to packages/opencv_dart/example/windows/runner/Runner.rc diff --git a/packages/opencv_dart/example/windows/runner/flutter_window.cpp b/packages/opencv_dart/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..955ee303 --- /dev/null +++ b/packages/opencv_dart/example/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/packages/opencv_dart/example/windows/runner/flutter_window.h b/packages/opencv_dart/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/packages/opencv_dart/example/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/example/windows/runner/main.cpp b/packages/opencv_dart/example/windows/runner/main.cpp similarity index 100% rename from example/windows/runner/main.cpp rename to packages/opencv_dart/example/windows/runner/main.cpp diff --git a/packages/opencv_dart/example/windows/runner/resource.h b/packages/opencv_dart/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/packages/opencv_dart/example/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/packages/opencv_dart/example/windows/runner/resources/app_icon.ico b/packages/opencv_dart/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/example/windows/runner/runner.exe.manifest b/packages/opencv_dart/example/windows/runner/runner.exe.manifest similarity index 100% rename from example/windows/runner/runner.exe.manifest rename to packages/opencv_dart/example/windows/runner/runner.exe.manifest diff --git a/example/windows/runner/utils.cpp b/packages/opencv_dart/example/windows/runner/utils.cpp similarity index 100% rename from example/windows/runner/utils.cpp rename to packages/opencv_dart/example/windows/runner/utils.cpp diff --git a/packages/opencv_dart/example/windows/runner/utils.h b/packages/opencv_dart/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/packages/opencv_dart/example/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/packages/opencv_dart/example/windows/runner/win32_window.cpp b/packages/opencv_dart/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..60608d0f --- /dev/null +++ b/packages/opencv_dart/example/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/packages/opencv_dart/example/windows/runner/win32_window.h b/packages/opencv_dart/example/windows/runner/win32_window.h new file mode 100644 index 00000000..e901dde6 --- /dev/null +++ b/packages/opencv_dart/example/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/ios/opencv_dart.podspec b/packages/opencv_dart/ios/opencv_dart.podspec similarity index 74% rename from ios/opencv_dart.podspec rename to packages/opencv_dart/ios/opencv_dart.podspec index e0bfd33f..1d638643 100644 --- a/ios/opencv_dart.podspec +++ b/packages/opencv_dart/ios/opencv_dart.podspec @@ -3,8 +3,6 @@ # Run `pod lib lint opencv_dart.podspec` to validate before publishing. # Pod::Spec.new do |s| - system("make setup") - s.name = 'opencv_dart' s.version = '0.0.1' s.summary = 'OpenCV bindings for Dart.' @@ -22,16 +20,9 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'Flutter' + s.dependency 'DartCvIOS', '4.10.0+1' s.platform = :ios, '12.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } - s.user_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } s.swift_version = '5.0' - - s.preserve_paths = 'opencv_dart.xcframework' - s.vendored_frameworks = 'opencv_dart.xcframework' - s.xcconfig = { 'OTHER_LDFLAGS' => '-framework opencv_dart' } - s.frameworks = ['AVFoundation', 'opencv_dart'] - s.library = 'c++' - s.static_framework = true end diff --git a/packages/opencv_dart/lib/opencv.dart b/packages/opencv_dart/lib/opencv.dart new file mode 100644 index 00000000..6c374f3b --- /dev/null +++ b/packages/opencv_dart/lib/opencv.dart @@ -0,0 +1,8 @@ +// Copyright (c) 2024, rainyl and all contributors. All rights reserved. +// Use of this source code is governed by a Apache-2.0 license +// that can be found in the LICENSE file. + +/// OpenCV bindings for Flutter +library cv; + +export 'package:dartcv/dartcv.dart'; diff --git a/packages/opencv_dart/lib/opencv_dart.dart b/packages/opencv_dart/lib/opencv_dart.dart new file mode 100644 index 00000000..be5f1504 --- /dev/null +++ b/packages/opencv_dart/lib/opencv_dart.dart @@ -0,0 +1,10 @@ +// keep this file to compatible with old versions + +// Copyright (c) 2024, rainyl and all contributors. All rights reserved. +// Use of this source code is governed by a Apache-2.0 license +// that can be found in the LICENSE file. + +/// OpenCV bindings for Flutter +library cv; + +export 'opencv.dart'; diff --git a/packages/opencv_dart/linux/CMakeLists.txt b/packages/opencv_dart/linux/CMakeLists.txt new file mode 100644 index 00000000..fe398e5b --- /dev/null +++ b/packages/opencv_dart/linux/CMakeLists.txt @@ -0,0 +1,24 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "opencv_dart") + +project(${PROJECT_NAME} LANGUAGES CXX VERSION 1.0.0) + +# Invoke the build for native code shared with the other target platforms. +# This can be changed to accommodate different builds. +# add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(opencv_dart_bundled_libraries + # Defined in ../src/CMakeLists.txt. + # This can be changed to accommodate different builds. + $ + ${FFMPEG_LIB_PATHS} + PARENT_SCOPE +) diff --git a/macos/opencv_dart.podspec b/packages/opencv_dart/macos/opencv_dart.podspec similarity index 89% rename from macos/opencv_dart.podspec rename to packages/opencv_dart/macos/opencv_dart.podspec index d09790ab..88111790 100644 --- a/macos/opencv_dart.podspec +++ b/packages/opencv_dart/macos/opencv_dart.podspec @@ -3,8 +3,6 @@ # Run `pod lib lint opencv_dart.podspec` to validate before publishing. # Pod::Spec.new do |s| - system("make setup") - s.name = 'opencv_dart' s.version = '0.0.1' s.summary = 'OpenCV bindings for Dart.' @@ -22,9 +20,8 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'FlutterMacOS' - s.vendored_libraries = '*.dylib' - s.platform = :osx, '10.11' - s.static_framework = true + s.dependency 'DartCvMacOS', '4.10.0+1' + s.platform = :osx, '10.15' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } s.swift_version = '5.0' end diff --git a/pubspec.yaml b/packages/opencv_dart/pubspec.yaml similarity index 64% rename from pubspec.yaml rename to packages/opencv_dart/pubspec.yaml index 9b07e470..c894d06f 100644 --- a/pubspec.yaml +++ b/packages/opencv_dart/pubspec.yaml @@ -1,5 +1,10 @@ name: opencv_dart -description: "OpenCV4 bindings for Dart language and Flutter, using dart:ffi. The most complete OpenCV bindings for Dart! With asynchronous support now!" +description: | + OpenCV4 bindings for Flutter, using dart:ffi. + This plugin include videoio module, if you doesn't need it, + please use opencv_core instead. + The most complete OpenCV bindings for Dart! + With asynchronous support now! version: 1.2.5 homepage: https://github.com/rainyl/opencv_dart @@ -10,14 +15,10 @@ environment: dependencies: flutter: sdk: flutter - ffi: ^2.1.3 - path: ^1.9.0 - args: ^2.5.0 - archive: ^3.6.1 - stack_trace: ^1.11.1 + dartcv: + path: ../dartcv dev_dependencies: - ffigen: ">=13.0.0 <15.0.0" test: ^1.25.2 topics: diff --git a/packages/opencv_dart/src/CMakeLists.txt b/packages/opencv_dart/src/CMakeLists.txt new file mode 100644 index 00000000..150c1fa0 --- /dev/null +++ b/packages/opencv_dart/src/CMakeLists.txt @@ -0,0 +1,43 @@ +cmake_minimum_required(VERSION 3.14) + +project(dartcv LANGUAGES CXX VERSION 1.0.0) + +# Flutter doesn't support build android-x86, disable here +# https://docs.flutter.dev/deployment/android#what-are-the-supported-target-architectures +if(ANDROID AND(DEFINED ANDROID_ABI)) + if(${ANDROID_ABI} STREQUAL "x86") + message(STATUS "Unsupported ABI: x86") + return() + endif() +endif() + +set(DARTCV_WITH_CALIB3D ON) +set(DARTCV_WITH_CONTRIB ON) +set(DARTCV_WITH_DNN ON) +set(DARTCV_WITH_FEATURE2D ON) +set(DARTCV_WITH_HIGHGUI ON) +set(DARTCV_WITH_IMGPROC ON) +set(DARTCV_WITH_OBJDETECT ON) +set(DARTCV_WITH_PHOTO ON) +set(DARTCV_WITH_STITCHING ON) +set(DARTCV_WITH_VIDEO ON) +set(DARTCV_WITH_VIDEOIO ON) +set(DARTCV_WITH_GAPI OFF) +set(DARTCV_WORLD OFF) + +# TODO: read opencv_version from pubspec.yaml +set(OPENCV_VERSION "4.10.0+9") +set(DARTCV_DISABLE_DOWNLOAD_OPENCV OFF) + +include(FetchContent) +FetchContent_Declare( + dartcv + GIT_REPOSITORY https://github.com/rainyl/dartcv.git + GIT_TAG 61effe0762f7919b38f1da58d87c9aa541ee1569 +) +FetchContent_MakeAvailable(dartcv) + +if(ANDROID) + message(STATUS "Installing ${FFMPEG_LIB_PATHS} to ${CMAKE_INSTALL_PREFIX}") + file(COPY ${FFMPEG_LIB_PATHS} DESTINATION ${CMAKE_INSTALL_PREFIX}/${ANDROID_ABI}) +endif() diff --git a/packages/opencv_dart/windows/.gitignore b/packages/opencv_dart/windows/.gitignore new file mode 100644 index 00000000..b3eb2be1 --- /dev/null +++ b/packages/opencv_dart/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/packages/opencv_dart/windows/CMakeLists.txt b/packages/opencv_dart/windows/CMakeLists.txt new file mode 100644 index 00000000..74d792de --- /dev/null +++ b/packages/opencv_dart/windows/CMakeLists.txt @@ -0,0 +1,34 @@ +# The Flutter tooling requires that developers have a version of Visual Studio +# installed that includes CMake 3.14 or later. You should not increase this +# version, as doing so will cause the plugin to fail to compile for some +# customers of the plugin. +cmake_minimum_required(VERSION 3.14) + +# Project-level configuration. +set(PROJECT_NAME "opencv_dart") + +project(${PROJECT_NAME} LANGUAGES CXX VERSION 1.0.0) + +# disable warnings +set (CMAKE_C_FLAGS "/wd4244 /D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_DEPRECATE ${CMAKE_C_FLAGS}") +set (CMAKE_C_FLAGS "/wd4244 /D_CRT_NONSTDC_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE ${CMAKE_C_FLAGS}") +set (CMAKE_CXX_FLAGS "/wd4244 /D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_DEPRECATE ${CMAKE_CXX_FLAGS}") +set (CMAKE_CXX_FLAGS "/wd4244 /D_CRT_NONSTDC_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE ${CMAKE_CXX_FLAGS}") + +# use .dll for windows +set(FFMPEG_USE_STATIC_LIBS OFF) + +# Invoke the build for native code shared with the other target platforms. +# This can be changed to accommodate different builds. +add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(opencv_dart_bundled_libraries + # Defined in ../src/CMakeLists.txt. + # This can be changed to accommodate different builds. + $ + ${FFMPEG_LIB_PATHS} + PARENT_SCOPE +) diff --git a/profiles/android-armv7 b/profiles/android-armv7 deleted file mode 100644 index 2521f968..00000000 --- a/profiles/android-armv7 +++ /dev/null @@ -1,13 +0,0 @@ -include(default) - -[settings] -os=Android -os.api_level=24 -arch=armv7 -compiler=clang -compiler.version=12 -compiler.libcxx=c++_static -compiler.cppstd=14 - -[conf] -tools.cmake.cmaketoolchain:generator=Ninja diff --git a/profiles/android-armv8 b/profiles/android-armv8 deleted file mode 100644 index 50bdc9a2..00000000 --- a/profiles/android-armv8 +++ /dev/null @@ -1,13 +0,0 @@ -include(default) - -[settings] -os=Android -os.api_level=24 -arch=armv8 -compiler=clang -compiler.version=12 -compiler.libcxx=c++_static -compiler.cppstd=14 - -[conf] -tools.cmake.cmaketoolchain:generator=Ninja diff --git a/profiles/android-x86_64 b/profiles/android-x86_64 deleted file mode 100644 index 5dd70adf..00000000 --- a/profiles/android-x86_64 +++ /dev/null @@ -1,13 +0,0 @@ -include(default) - -[settings] -os=Android -os.api_level=24 -arch=x86_64 -compiler=clang -compiler.version=12 -compiler.libcxx=c++_static -compiler.cppstd=14 - -[conf] -tools.cmake.cmaketoolchain:generator=Ninja diff --git a/profiles/ios-armv8 b/profiles/ios-armv8 deleted file mode 100644 index cea6f019..00000000 --- a/profiles/ios-armv8 +++ /dev/null @@ -1,13 +0,0 @@ -include(default) - -[settings] -os=iOS -os.version=12.0 -os.sdk=iphoneos -arch=armv8 -build_type=Release - -[conf] -tools.apple:enable_arc=False -tools.apple:enable_visibility=False -tools.cmake.cmaketoolchain:generator=Xcode diff --git a/profiles/ios-x86_64 b/profiles/ios-x86_64 deleted file mode 100644 index 3aee0d06..00000000 --- a/profiles/ios-x86_64 +++ /dev/null @@ -1,13 +0,0 @@ -include(default) - -[settings] -os=iOS -os.version=12.0 -os.sdk=iphonesimulator -arch=x86_64 -build_type=Release - -[conf] -tools.apple:enable_arc=False -tools.apple:enable_visibility=False -tools.cmake.cmaketoolchain:generator=Xcode diff --git a/profiles/ios.toolchain.cmake b/profiles/ios.toolchain.cmake deleted file mode 100644 index db2a3272..00000000 --- a/profiles/ios.toolchain.cmake +++ /dev/null @@ -1,1135 +0,0 @@ -# This file is part of the ios-cmake project. It was retrieved from -# https://github.com/leetal/ios-cmake.git, which is a fork of -# https://github.com/gerstrong/ios-cmake.git, which is a fork of -# https://github.com/cristeab/ios-cmake.git, which is a fork of -# https://code.google.com/p/ios-cmake/. Which in turn is based off of -# the Platform/Darwin.cmake and Platform/UnixPaths.cmake files which -# are included with CMake 2.8.4 -# -# The ios-cmake project is licensed under the new BSD license. -# -# Copyright (c) 2014, Bogdan Cristea and LTE Engineering Software, -# Kitware, Inc., Insight Software Consortium. All rights reserved. -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# This file is based on the Platform/Darwin.cmake and -# Platform/UnixPaths.cmake files which are included with CMake 2.8.4 -# It has been altered for iOS development. -# -# Updated by Alex Stewart (alexs.mac@gmail.com) -# -# ***************************************************************************** -# Now maintained by Alexander Widerberg (widerbergaren [at] gmail.com) -# under the BSD-3-Clause license -# https://github.com/leetal/ios-cmake -# ***************************************************************************** -# -# INFORMATION / HELP -# -############################################################################### -# OPTIONS # -############################################################################### -# -# PLATFORM: (default "OS64") -# OS = Build for iPhoneOS. -# OS64 = Build for arm64 iphoneOS. -# OS64COMBINED = Build for arm64 x86_64 iphoneOS + iphoneOS Simulator. Combined into FAT STATIC lib (only supported on 3.14+ of CMake with "-G Xcode" argument in combination with the "cmake --install" CMake build step) -# SIMULATOR = Build for x86 i386 iphoneOS Simulator. -# SIMULATOR64 = Build for x86_64 iphoneOS Simulator. -# SIMULATORARM64 = Build for arm64 iphoneOS Simulator. -# SIMULATOR64COMBINED = Build for arm64 x86_64 iphoneOS Simulator. Combined into FAT STATIC lib (supported on 3.14+ of CMakewith "-G Xcode" argument ONLY) -# TVOS = Build for arm64 tvOS. -# TVOSCOMBINED = Build for arm64 x86_64 tvOS + tvOS Simulator. Combined into FAT STATIC lib (only supported on 3.14+ of CMake with "-G Xcode" argument in combination with the "cmake --install" CMake build step) -# SIMULATOR_TVOS = Build for x86_64 tvOS Simulator. -# SIMULATORARM64_TVOS = Build for arm64 tvOS Simulator. -# VISIONOSCOMBINED = Build for arm64 visionOS + visionOS Simulator. Combined into FAT STATIC lib (only supported on 3.14+ of CMake with "-G Xcode" argument in combination with the "cmake --install" CMake build step) -# VISIONOS = Build for arm64 visionOS. -# SIMULATOR_VISIONOS = Build for arm64 visionOS Simulator. -# WATCHOS = Build for armv7k arm64_32 for watchOS. -# WATCHOSCOMBINED = Build for armv7k arm64_32 x86_64 watchOS + watchOS Simulator. Combined into FAT STATIC lib (only supported on 3.14+ of CMake with "-G Xcode" argument in combination with the "cmake --install" CMake build step) -# SIMULATOR_WATCHOS = Build for x86_64 for watchOS Simulator. -# SIMULATORARM64_WATCHOS = Build for arm64 for watchOS Simulator. -# MAC = Build for x86_64 macOS. -# MAC_ARM64 = Build for Apple Silicon macOS. -# MAC_UNIVERSAL = Combined build for x86_64 and Apple Silicon on macOS. -# MAC_CATALYST = Build for x86_64 macOS with Catalyst support (iOS toolchain on macOS). -# Note: The build argument "MACOSX_DEPLOYMENT_TARGET" can be used to control min-version of macOS -# MAC_CATALYST_ARM64 = Build for Apple Silicon macOS with Catalyst support (iOS toolchain on macOS). -# Note: The build argument "MACOSX_DEPLOYMENT_TARGET" can be used to control min-version of macOS -# -# CMAKE_OSX_SYSROOT: Path to the SDK to use. By default this is -# automatically determined from PLATFORM and xcodebuild, but -# can also be manually specified (although this should not be required). -# -# CMAKE_DEVELOPER_ROOT: Path to the Developer directory for the platform -# being compiled for. By default, this is automatically determined from -# CMAKE_OSX_SYSROOT, but can also be manually specified (although this should -# not be required). -# -# DEPLOYMENT_TARGET: Minimum SDK version to target. Default 6.0 on watchOS, 13.0 on tvOS+iOS/iPadOS, 11.0 on macOS, 1.0 on visionOS -# -# NAMED_LANGUAGE_SUPPORT: -# ON (default) = Will require "enable_language(OBJC) and/or enable_language(OBJCXX)" for full OBJC|OBJCXX support -# OFF = Will embed the OBJC and OBJCXX flags into the CMAKE_C_FLAGS and CMAKE_CXX_FLAGS (legacy behavior, CMake version < 3.16) -# -# ENABLE_BITCODE: (ON|OFF) Enables or disables bitcode support. Default OFF -# -# ENABLE_ARC: (ON|OFF) Enables or disables ARC support. Default ON (ARC enabled by default) -# -# ENABLE_VISIBILITY: (ON|OFF) Enables or disables symbol visibility support. Default OFF (visibility hidden by default) -# -# ENABLE_STRICT_TRY_COMPILE: (ON|OFF) Enables or disables strict try_compile() on all Check* directives (will run linker -# to actually check if linking is possible). Default OFF (will set CMAKE_TRY_COMPILE_TARGET_TYPE to STATIC_LIBRARY) -# -# ARCHS: (armv7 armv7s armv7k arm64 arm64_32 i386 x86_64) If specified, will override the default architectures for the given PLATFORM -# OS = armv7 armv7s arm64 (if applicable) -# OS64 = arm64 (if applicable) -# SIMULATOR = i386 -# SIMULATOR64 = x86_64 -# SIMULATORARM64 = arm64 -# TVOS = arm64 -# SIMULATOR_TVOS = x86_64 (i386 has since long been deprecated) -# SIMULATORARM64_TVOS = arm64 -# WATCHOS = armv7k arm64_32 (if applicable) -# SIMULATOR_WATCHOS = x86_64 (i386 has since long been deprecated) -# SIMULATORARM64_WATCHOS = arm64 -# MAC = x86_64 -# MAC_ARM64 = arm64 -# MAC_UNIVERSAL = x86_64 arm64 -# MAC_CATALYST = x86_64 -# MAC_CATALYST_ARM64 = arm64 -# -# NOTE: When manually specifying ARCHS, put a semi-colon between the entries. E.g., -DARCHS="armv7;arm64" -# -############################################################################### -# END OPTIONS # -############################################################################### -# -# This toolchain defines the following properties (available via get_property()) for use externally: -# -# PLATFORM: The currently targeted platform. -# XCODE_VERSION: Version number (not including Build version) of Xcode detected. -# SDK_VERSION: Version of SDK being used. -# OSX_ARCHITECTURES: Architectures being compiled for (generated from PLATFORM). -# APPLE_TARGET_TRIPLE: Used by autoconf build systems. NOTE: If "ARCHS" is overridden, this will *NOT* be set! -# -# This toolchain defines the following macros for use externally: -# -# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE XCODE_VARIANT) -# A convenience macro for setting xcode specific properties on targets. -# Available variants are: All, Release, RelWithDebInfo, Debug, MinSizeRel -# example: set_xcode_property (myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1" "all"). -# -# find_host_package (PROGRAM ARGS) -# A macro used to find executable programs on the host system, not within the -# environment. Thanks to the android-cmake project for providing the -# command. -# - -cmake_minimum_required(VERSION 3.8.0) - -# CMake invokes the toolchain file twice during the first build, but only once during subsequent rebuilds. -if(DEFINED ENV{_IOS_TOOLCHAIN_HAS_RUN}) - return() -endif() -set(ENV{_IOS_TOOLCHAIN_HAS_RUN} true) - -# List of supported platform values -list(APPEND _supported_platforms - "OS" "OS64" "OS64COMBINED" "SIMULATOR" "SIMULATOR64" "SIMULATORARM64" "SIMULATOR64COMBINED" - "TVOS" "TVOSCOMBINED" "SIMULATOR_TVOS" "SIMULATORARM64_TVOS" - "WATCHOS" "WATCHOSCOMBINED" "SIMULATOR_WATCHOS" "SIMULATORARM64_WATCHOS" - "MAC" "MAC_ARM64" "MAC_UNIVERSAL" - "VISIONOS" "SIMULATOR_VISIONOS" "VISIONOSCOMBINED" - "MAC_CATALYST" "MAC_CATALYST_ARM64") - -# Cache what generator is used -set(USED_CMAKE_GENERATOR "${CMAKE_GENERATOR}") - -# Check if using a CMake version capable of building combined FAT builds (simulator and target slices combined in one static lib) -if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14") - set(MODERN_CMAKE YES) -endif() - -# Get the Xcode version being used. -# Problem: CMake runs toolchain files multiple times, but can't read cache variables on some runs. -# Workaround: On the first run (in which cache variables are always accessible), set an intermediary environment variable. -# -# NOTE: This pattern is used in many places in this toolchain to speed up checks of all sorts -if(DEFINED XCODE_VERSION_INT) - # Environment variables are always preserved. - set(ENV{_XCODE_VERSION_INT} "${XCODE_VERSION_INT}") -elseif(DEFINED ENV{_XCODE_VERSION_INT}) - set(XCODE_VERSION_INT "$ENV{_XCODE_VERSION_INT}") -elseif(NOT DEFINED XCODE_VERSION_INT) - find_program(XCODEBUILD_EXECUTABLE xcodebuild) - if(NOT XCODEBUILD_EXECUTABLE) - message(FATAL_ERROR "xcodebuild not found. Please install either the standalone commandline tools or Xcode.") - endif() - execute_process(COMMAND ${XCODEBUILD_EXECUTABLE} -version - OUTPUT_VARIABLE XCODE_VERSION_INT - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REGEX MATCH "Xcode [0-9\\.]+" XCODE_VERSION_INT "${XCODE_VERSION_INT}") - string(REGEX REPLACE "Xcode ([0-9\\.]+)" "\\1" XCODE_VERSION_INT "${XCODE_VERSION_INT}") - set(XCODE_VERSION_INT "${XCODE_VERSION_INT}" CACHE INTERNAL "") -endif() - -# Assuming that xcode 12.0 is installed you most probably have ios sdk 14.0 or later installed (tested on Big Sur) -# if you don't set a deployment target it will be set the way you only get 64-bit builds -#if(NOT DEFINED DEPLOYMENT_TARGET AND XCODE_VERSION_INT VERSION_GREATER 12.0) -# Temporarily fix the arm64 issues in CMake install-combined by excluding arm64 for simulator builds (needed for Apple Silicon...) -# set(CMAKE_XCODE_ATTRIBUTE_EXCLUDED_ARCHS[sdk=iphonesimulator*] "arm64") -#endif() - -# Check if the platform variable is set -if(DEFINED PLATFORM) - # Environment variables are always preserved. - set(ENV{_PLATFORM} "${PLATFORM}") -elseif(DEFINED ENV{_PLATFORM}) - set(PLATFORM "$ENV{_PLATFORM}") -elseif(NOT DEFINED PLATFORM) - message(FATAL_ERROR "PLATFORM argument not set. Bailing configure since I don't know what target you want to build for!") -endif () - -if(PLATFORM MATCHES ".*COMBINED" AND NOT CMAKE_GENERATOR MATCHES "Xcode") - message(FATAL_ERROR "The combined builds support requires Xcode to be used as a generator via '-G Xcode' command-line argument in CMake") -endif() - -# Safeguard that the platform value is set and is one of the supported values -list(FIND _supported_platforms ${PLATFORM} contains_PLATFORM) -if("${contains_PLATFORM}" EQUAL "-1") - string(REPLACE ";" "\n * " _supported_platforms_formatted "${_supported_platforms}") - message(FATAL_ERROR " Invalid PLATFORM specified! Current value: ${PLATFORM}.\n" - " Supported PLATFORM values: \n * ${_supported_platforms_formatted}") -endif() - -# Check if Apple Silicon is supported -if(PLATFORM MATCHES "^(MAC_ARM64)$|^(MAC_CATALYST_ARM64)$|^(MAC_UNIVERSAL)$" AND ${CMAKE_VERSION} VERSION_LESS "3.19.5") - message(FATAL_ERROR "Apple Silicon builds requires a minimum of CMake 3.19.5") -endif() - -# Touch the toolchain variable to suppress the "unused variable" warning. -# This happens if CMake is invoked with the same command line the second time. -if(CMAKE_TOOLCHAIN_FILE) -endif() - -# Fix for PThread library not in path -set(CMAKE_THREAD_LIBS_INIT "-lpthread") -set(CMAKE_HAVE_THREADS_LIBRARY 1) -set(CMAKE_USE_WIN32_THREADS_INIT 0) -set(CMAKE_USE_PTHREADS_INIT 1) - -# Specify named language support defaults. -if(NOT DEFINED NAMED_LANGUAGE_SUPPORT AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16") - set(NAMED_LANGUAGE_SUPPORT ON) - message(STATUS "[DEFAULTS] Using explicit named language support! E.g., enable_language(CXX) is needed in the project files.") -elseif(NOT DEFINED NAMED_LANGUAGE_SUPPORT AND ${CMAKE_VERSION} VERSION_LESS "3.16") - set(NAMED_LANGUAGE_SUPPORT OFF) - message(STATUS "[DEFAULTS] Disabling explicit named language support. Falling back to legacy behavior.") -elseif(DEFINED NAMED_LANGUAGE_SUPPORT AND ${CMAKE_VERSION} VERSION_LESS "3.16") - message(FATAL_ERROR "CMake named language support for OBJC and OBJCXX was added in CMake 3.16.") -endif() -set(NAMED_LANGUAGE_SUPPORT_INT ${NAMED_LANGUAGE_SUPPORT} CACHE BOOL - "Whether or not to enable explicit named language support" FORCE) - -# Specify the minimum version of the deployment target. -if(NOT DEFINED DEPLOYMENT_TARGET) - if (PLATFORM MATCHES "WATCHOS") - # Unless specified, SDK version 4.0 is used by default as minimum target version (watchOS). - set(DEPLOYMENT_TARGET "6.0") - elseif(PLATFORM STREQUAL "MAC") - # Unless specified, SDK version 10.13 (High Sierra) is used by default as the minimum target version (macos). - set(DEPLOYMENT_TARGET "11.0") - elseif(PLATFORM STREQUAL "VISIONOS" OR PLATFORM STREQUAL "SIMULATOR_VISIONOS" OR PLATFORM STREQUAL "VISIONOSCOMBINED") - # Unless specified, SDK version 1.0 is used by default as minimum target version (visionOS). - set(DEPLOYMENT_TARGET "1.0") - elseif(PLATFORM STREQUAL "MAC_ARM64") - # Unless specified, SDK version 11.0 (Big Sur) is used by default as the minimum target version (macOS on arm). - set(DEPLOYMENT_TARGET "11.0") - elseif(PLATFORM STREQUAL "MAC_UNIVERSAL") - # Unless specified, SDK version 11.0 (Big Sur) is used by default as minimum target version for universal builds. - set(DEPLOYMENT_TARGET "11.0") - elseif(PLATFORM STREQUAL "MAC_CATALYST" OR PLATFORM STREQUAL "MAC_CATALYST_ARM64") - # Unless specified, SDK version 13.0 is used by default as the minimum target version (mac catalyst minimum requirement). - set(DEPLOYMENT_TARGET "13.1") - else() - # Unless specified, SDK version 11.0 is used by default as the minimum target version (iOS, tvOS). - set(DEPLOYMENT_TARGET "13.0") - endif() - message(STATUS "[DEFAULTS] Using the default min-version since DEPLOYMENT_TARGET not provided!") -elseif(DEFINED DEPLOYMENT_TARGET AND PLATFORM MATCHES "^MAC_CATALYST" AND ${DEPLOYMENT_TARGET} VERSION_LESS "13.1") - message(FATAL_ERROR "Mac Catalyst builds requires a minimum deployment target of 13.1!") -endif() - -# Store the DEPLOYMENT_TARGET in the cache -set(DEPLOYMENT_TARGET "${DEPLOYMENT_TARGET}" CACHE INTERNAL "") - -# Handle the case where we are targeting iOS and a version above 10.3.4 (32-bit support dropped officially) -if(PLATFORM STREQUAL "OS" AND DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 10.3.4) - set(PLATFORM "OS64") - message(STATUS "Targeting minimum SDK version ${DEPLOYMENT_TARGET}. Dropping 32-bit support.") -elseif(PLATFORM STREQUAL "SIMULATOR" AND DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 10.3.4) - set(PLATFORM "SIMULATOR64") - message(STATUS "Targeting minimum SDK version ${DEPLOYMENT_TARGET}. Dropping 32-bit support.") -endif() - -set(PLATFORM_INT "${PLATFORM}") - -if(DEFINED ARCHS) - string(REPLACE ";" "-" ARCHS_SPLIT "${ARCHS}") -endif() - -# Determine the platform name and architectures for use in xcodebuild commands -# from the specified PLATFORM_INT name. -if(PLATFORM_INT STREQUAL "OS") - set(SDK_NAME iphoneos) - if(NOT ARCHS) - set(ARCHS armv7 armv7s arm64) - set(APPLE_TARGET_TRIPLE_INT arm-apple-ios${DEPLOYMENT_TARGET}) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}) - endif() -elseif(PLATFORM_INT STREQUAL "OS64") - set(SDK_NAME iphoneos) - if(NOT ARCHS) - if (XCODE_VERSION_INT VERSION_GREATER 10.0) - set(ARCHS arm64) # FIXME: Add arm64e when Apple has fixed the integration issues with it, libarclite_iphoneos.a is currently missing bitcode markers for example - else() - set(ARCHS arm64) - endif() - set(APPLE_TARGET_TRIPLE_INT arm64-apple-ios${DEPLOYMENT_TARGET}) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}) - endif() -elseif(PLATFORM_INT STREQUAL "OS64COMBINED") - set(SDK_NAME iphoneos) - if(MODERN_CMAKE) - if(NOT ARCHS) - if (XCODE_VERSION_INT VERSION_GREATER 12.0) - set(ARCHS arm64 x86_64) - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64 arm64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64 arm64") - else() - set(ARCHS arm64 x86_64) - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64") - endif() - set(APPLE_TARGET_TRIPLE_INT arm64-x86_64-apple-ios${DEPLOYMENT_TARGET}) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}) - endif() - else() - message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the OS64COMBINED setting work") - endif() -elseif(PLATFORM_INT STREQUAL "SIMULATOR64COMBINED") - set(SDK_NAME iphonesimulator) - if(MODERN_CMAKE) - if(NOT ARCHS) - if (XCODE_VERSION_INT VERSION_GREATER 12.0) - set(ARCHS arm64 x86_64) # FIXME: Add arm64e when Apple have fixed the integration issues with it, libarclite_iphoneos.a is currently missing bitcode markers for example - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64 arm64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64 arm64") - else() - set(ARCHS arm64 x86_64) - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "x86_64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "x86_64") - endif() - set(APPLE_TARGET_TRIPLE_INT aarch64-x86_64-apple-ios${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-simulator) - endif() - else() - message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the SIMULATOR64COMBINED setting work") - endif() -elseif(PLATFORM_INT STREQUAL "SIMULATOR") - set(SDK_NAME iphonesimulator) - if(NOT ARCHS) - set(ARCHS i386) - set(APPLE_TARGET_TRIPLE_INT i386-apple-ios${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-simulator) - endif() - message(DEPRECATION "SIMULATOR IS DEPRECATED. Consider using SIMULATOR64 instead.") -elseif(PLATFORM_INT STREQUAL "SIMULATOR64") - set(SDK_NAME iphonesimulator) - if(NOT ARCHS) - set(ARCHS x86_64) - set(APPLE_TARGET_TRIPLE_INT x86_64-apple-ios${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-simulator) - endif() -elseif(PLATFORM_INT STREQUAL "SIMULATORARM64") - set(SDK_NAME iphonesimulator) - if(NOT ARCHS) - set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT arm64-apple-ios${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-simulator) - endif() -elseif(PLATFORM_INT STREQUAL "TVOS") - set(SDK_NAME appletvos) - if(NOT ARCHS) - set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT arm64-apple-tvos${DEPLOYMENT_TARGET}) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-tvos${DEPLOYMENT_TARGET}) - endif() -elseif (PLATFORM_INT STREQUAL "TVOSCOMBINED") - set(SDK_NAME appletvos) - if(MODERN_CMAKE) - if(NOT ARCHS) - set(ARCHS arm64 x86_64) - set(APPLE_TARGET_TRIPLE_INT arm64-x86_64-apple-tvos${DEPLOYMENT_TARGET}) - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=appletvos*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=appletvsimulator*] "x86_64 arm64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=appletvos*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=appletvsimulator*] "x86_64 arm64") - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-tvos${DEPLOYMENT_TARGET}) - endif() - else() - message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the TVOSCOMBINED setting work") - endif() -elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS") - set(SDK_NAME appletvsimulator) - if(NOT ARCHS) - set(ARCHS x86_64) - set(APPLE_TARGET_TRIPLE_INT x86_64-apple-tvos${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-tvos${DEPLOYMENT_TARGET}-simulator) - endif() -elseif(PLATFORM_INT STREQUAL "SIMULATORARM64_TVOS") - set(SDK_NAME appletvsimulator) - if(NOT ARCHS) - set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT arm64-apple-tvos${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-tvos${DEPLOYMENT_TARGET}-simulator) - endif() -elseif(PLATFORM_INT STREQUAL "WATCHOS") - set(SDK_NAME watchos) - if(NOT ARCHS) - if (XCODE_VERSION_INT VERSION_GREATER 10.0) - set(ARCHS armv7k arm64_32) - set(APPLE_TARGET_TRIPLE_INT arm64_32-apple-watchos${DEPLOYMENT_TARGET}) - else() - set(ARCHS armv7k) - set(APPLE_TARGET_TRIPLE_INT arm-apple-watchos${DEPLOYMENT_TARGET}) - endif() - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-watchos${DEPLOYMENT_TARGET}) - endif() -elseif(PLATFORM_INT STREQUAL "WATCHOSCOMBINED") - set(SDK_NAME watchos) - if(MODERN_CMAKE) - if(NOT ARCHS) - if (XCODE_VERSION_INT VERSION_GREATER 10.0) - set(ARCHS armv7k arm64_32 i386) - set(APPLE_TARGET_TRIPLE_INT arm64_32-i386-apple-watchos${DEPLOYMENT_TARGET}) - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=watchos*] "armv7k arm64_32") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=watchsimulator*] "i386") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=watchos*] "armv7k arm64_32") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=watchsimulator*] "i386") - else() - set(ARCHS armv7k i386) - set(APPLE_TARGET_TRIPLE_INT arm-i386-apple-watchos${DEPLOYMENT_TARGET}) - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=watchos*] "armv7k") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=watchsimulator*] "i386") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=watchos*] "armv7k") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=watchsimulator*] "i386") - endif() - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-watchos${DEPLOYMENT_TARGET}) - endif() - else() - message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the WATCHOSCOMBINED setting work") - endif() -elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS") - set(SDK_NAME watchsimulator) - if(NOT ARCHS) - set(ARCHS i386) - set(APPLE_TARGET_TRIPLE_INT i386-apple-watchos${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-watchos${DEPLOYMENT_TARGET}-simulator) - endif() -elseif(PLATFORM_INT STREQUAL "SIMULATORARM64_WATCHOS") - set(SDK_NAME watchsimulator) - if(NOT ARCHS) - set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT arm64-apple-watchos${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-watchos${DEPLOYMENT_TARGET}-simulator) - endif() -elseif(PLATFORM_INT STREQUAL "SIMULATOR_VISIONOS") - set(SDK_NAME xrsimulator) - if(NOT ARCHS) - set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT arm64-apple-xros${DEPLOYMENT_TARGET}-simulator) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-xros${DEPLOYMENT_TARGET}-simulator) - endif() -elseif(PLATFORM_INT STREQUAL "VISIONOS") - set(SDK_NAME xros) - if(NOT ARCHS) - set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT arm64-apple-xros${DEPLOYMENT_TARGET}) - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-xros${DEPLOYMENT_TARGET}) - endif() -elseif(PLATFORM_INT STREQUAL "VISIONOSCOMBINED") - set(SDK_NAME xros) - if(MODERN_CMAKE) - if(NOT ARCHS) - set(ARCHS arm64) - set(APPLE_TARGET_TRIPLE_INT arm64-apple-xros${DEPLOYMENT_TARGET}) - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=xros*] "arm64") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=xrsimulator*] "arm64") - else() - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-xros${DEPLOYMENT_TARGET}) - endif() - else() - message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the VISIONOSCOMBINED setting work") - endif() -elseif(PLATFORM_INT STREQUAL "MAC" OR PLATFORM_INT STREQUAL "MAC_CATALYST") - set(SDK_NAME macosx) - if(NOT ARCHS) - set(ARCHS x86_64) - endif() - string(REPLACE ";" "-" ARCHS_SPLIT "${ARCHS}") - if(PLATFORM_INT STREQUAL "MAC") - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-macosx${DEPLOYMENT_TARGET}) - elseif(PLATFORM_INT STREQUAL "MAC_CATALYST") - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-macabi) - endif() -elseif(PLATFORM_INT MATCHES "^(MAC_ARM64)$|^(MAC_CATALYST_ARM64)$") - set(SDK_NAME macosx) - if(NOT ARCHS) - set(ARCHS arm64) - endif() - string(REPLACE ";" "-" ARCHS_SPLIT "${ARCHS}") - if(PLATFORM_INT STREQUAL "MAC_ARM64") - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-macosx${DEPLOYMENT_TARGET}) - elseif(PLATFORM_INT STREQUAL "MAC_CATALYST_ARM64") - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-ios${DEPLOYMENT_TARGET}-macabi) - endif() -elseif(PLATFORM_INT STREQUAL "MAC_UNIVERSAL") - set(SDK_NAME macosx) - if(NOT ARCHS) - set(ARCHS "x86_64;arm64") - endif() - string(REPLACE ";" "-" ARCHS_SPLIT "${ARCHS}") - set(APPLE_TARGET_TRIPLE_INT ${ARCHS_SPLIT}-apple-macosx${DEPLOYMENT_TARGET}) -else() - message(FATAL_ERROR "Invalid PLATFORM: ${PLATFORM_INT}") -endif() - -string(REPLACE ";" " " ARCHS_SPACED "${ARCHS}") - -if(MODERN_CMAKE AND PLATFORM_INT MATCHES ".*COMBINED" AND NOT CMAKE_GENERATOR MATCHES "Xcode") - message(FATAL_ERROR "The COMBINED options only work with Xcode generator, -G Xcode") -endif() - -if(CMAKE_GENERATOR MATCHES "Xcode" AND PLATFORM_INT MATCHES "^MAC_CATALYST") - set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") - set(CMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS "macosx") - set(CMAKE_XCODE_ATTRIBUTE_SUPPORTS_MACCATALYST "YES") - if(NOT DEFINED MACOSX_DEPLOYMENT_TARGET) - set(CMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET "10.15") - else() - set(CMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET "${MACOSX_DEPLOYMENT_TARGET}") - endif() -elseif(CMAKE_GENERATOR MATCHES "Xcode") - set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") - set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "${DEPLOYMENT_TARGET}") - if(NOT PLATFORM_INT MATCHES ".*COMBINED") - set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=${SDK_NAME}*] "${ARCHS_SPACED}") - set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=${SDK_NAME}*] "${ARCHS_SPACED}") - endif() -endif() - -# If the user did not specify the SDK root to use, then query xcodebuild for it. -if(DEFINED CMAKE_OSX_SYSROOT_INT) - # Environment variables are always preserved. - set(ENV{_CMAKE_OSX_SYSROOT_INT} "${CMAKE_OSX_SYSROOT_INT}") -elseif(DEFINED ENV{_CMAKE_OSX_SYSROOT_INT}) - set(CMAKE_OSX_SYSROOT_INT "$ENV{_CMAKE_OSX_SYSROOT_INT}") -elseif(NOT DEFINED CMAKE_OSX_SYSROOT_INT) - execute_process(COMMAND ${XCODEBUILD_EXECUTABLE} -version -sdk ${SDK_NAME} Path - OUTPUT_VARIABLE CMAKE_OSX_SYSROOT_INT - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() - -if (NOT DEFINED CMAKE_OSX_SYSROOT_INT AND NOT DEFINED CMAKE_OSX_SYSROOT) - message(SEND_ERROR "Please make sure that Xcode is installed and that the toolchain" - "is pointing to the correct path. Please run:" - "sudo xcode-select -s /Applications/Xcode.app/Contents/Developer" - "and see if that fixes the problem for you.") - message(FATAL_ERROR "Invalid CMAKE_OSX_SYSROOT: ${CMAKE_OSX_SYSROOT} " - "does not exist.") -elseif(DEFINED CMAKE_OSX_SYSROOT_INT) - set(CMAKE_OSX_SYSROOT_INT "${CMAKE_OSX_SYSROOT_INT}" CACHE INTERNAL "") - # Specify the location or name of the platform SDK to be used in CMAKE_OSX_SYSROOT. - set(CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT_INT}" CACHE INTERNAL "") -endif() - -# Use bitcode or not -if(NOT DEFINED ENABLE_BITCODE) - message(STATUS "[DEFAULTS] Disabling bitcode support by default. ENABLE_BITCODE not provided for override!") - set(ENABLE_BITCODE OFF) -endif() -set(ENABLE_BITCODE_INT ${ENABLE_BITCODE} CACHE BOOL - "Whether or not to enable bitcode" FORCE) -# Use ARC or not -if(NOT DEFINED ENABLE_ARC) - # Unless specified, enable ARC support by default - set(ENABLE_ARC ON) - message(STATUS "[DEFAULTS] Enabling ARC support by default. ENABLE_ARC not provided!") -endif() -set(ENABLE_ARC_INT ${ENABLE_ARC} CACHE BOOL "Whether or not to enable ARC" FORCE) -# Use hidden visibility or not -if(NOT DEFINED ENABLE_VISIBILITY) - # Unless specified, disable symbols visibility by default - set(ENABLE_VISIBILITY OFF) - message(STATUS "[DEFAULTS] Hiding symbols visibility by default. ENABLE_VISIBILITY not provided!") -endif() -set(ENABLE_VISIBILITY_INT ${ENABLE_VISIBILITY} CACHE BOOL "Whether or not to hide symbols from the dynamic linker (-fvisibility=hidden)" FORCE) -# Set strict compiler checks or not -if(NOT DEFINED ENABLE_STRICT_TRY_COMPILE) - # Unless specified, disable strict try_compile() - set(ENABLE_STRICT_TRY_COMPILE OFF) - message(STATUS "[DEFAULTS] Using NON-strict compiler checks by default. ENABLE_STRICT_TRY_COMPILE not provided!") -endif() -set(ENABLE_STRICT_TRY_COMPILE_INT ${ENABLE_STRICT_TRY_COMPILE} CACHE BOOL - "Whether or not to use strict compiler checks" FORCE) - -# Get the SDK version information. -if(DEFINED SDK_VERSION) - # Environment variables are always preserved. - set(ENV{_SDK_VERSION} "${SDK_VERSION}") -elseif(DEFINED ENV{_SDK_VERSION}) - set(SDK_VERSION "$ENV{_SDK_VERSION}") -elseif(NOT DEFINED SDK_VERSION) - execute_process(COMMAND ${XCODEBUILD_EXECUTABLE} -sdk ${CMAKE_OSX_SYSROOT_INT} -version SDKVersion - OUTPUT_VARIABLE SDK_VERSION - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() - -# Find the Developer root for the specific iOS platform being compiled for -# from CMAKE_OSX_SYSROOT. Should be ../../ from SDK specified in -# CMAKE_OSX_SYSROOT. There does not appear to be a direct way to obtain -# this information from xcrun or xcodebuild. -if (NOT DEFINED CMAKE_DEVELOPER_ROOT AND NOT CMAKE_GENERATOR MATCHES "Xcode") - get_filename_component(PLATFORM_SDK_DIR ${CMAKE_OSX_SYSROOT_INT} PATH) - get_filename_component(CMAKE_DEVELOPER_ROOT ${PLATFORM_SDK_DIR} PATH) - if (NOT EXISTS "${CMAKE_DEVELOPER_ROOT}") - message(FATAL_ERROR "Invalid CMAKE_DEVELOPER_ROOT: ${CMAKE_DEVELOPER_ROOT} does not exist.") - endif() -endif() - -# Find the C & C++ compilers for the specified SDK. -if(DEFINED CMAKE_C_COMPILER) - # Environment variables are always preserved. - set(ENV{_CMAKE_C_COMPILER} "${CMAKE_C_COMPILER}") -elseif(DEFINED ENV{_CMAKE_C_COMPILER}) - set(CMAKE_C_COMPILER "$ENV{_CMAKE_C_COMPILER}") - set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) -elseif(NOT DEFINED CMAKE_C_COMPILER) - execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT_INT} -find clang - OUTPUT_VARIABLE CMAKE_C_COMPILER - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) -endif() -if(DEFINED CMAKE_CXX_COMPILER) - # Environment variables are always preserved. - set(ENV{_CMAKE_CXX_COMPILER} "${CMAKE_CXX_COMPILER}") -elseif(DEFINED ENV{_CMAKE_CXX_COMPILER}) - set(CMAKE_CXX_COMPILER "$ENV{_CMAKE_CXX_COMPILER}") -elseif(NOT DEFINED CMAKE_CXX_COMPILER) - execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT_INT} -find clang++ - OUTPUT_VARIABLE CMAKE_CXX_COMPILER - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() -# Find (Apple's) libtool. -if(DEFINED BUILD_LIBTOOL) - # Environment variables are always preserved. - set(ENV{_BUILD_LIBTOOL} "${BUILD_LIBTOOL}") -elseif(DEFINED ENV{_BUILD_LIBTOOL}) - set(BUILD_LIBTOOL "$ENV{_BUILD_LIBTOOL}") -elseif(NOT DEFINED BUILD_LIBTOOL) - execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT_INT} -find libtool - OUTPUT_VARIABLE BUILD_LIBTOOL - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() -# Find the toolchain's provided install_name_tool if none is found on the host -if(DEFINED CMAKE_INSTALL_NAME_TOOL) - # Environment variables are always preserved. - set(ENV{_CMAKE_INSTALL_NAME_TOOL} "${CMAKE_INSTALL_NAME_TOOL}") -elseif(DEFINED ENV{_CMAKE_INSTALL_NAME_TOOL}) - set(CMAKE_INSTALL_NAME_TOOL "$ENV{_CMAKE_INSTALL_NAME_TOOL}") -elseif(NOT DEFINED CMAKE_INSTALL_NAME_TOOL) - execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT_INT} -find install_name_tool - OUTPUT_VARIABLE CMAKE_INSTALL_NAME_TOOL_INT - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - set(CMAKE_INSTALL_NAME_TOOL ${CMAKE_INSTALL_NAME_TOOL_INT} CACHE INTERNAL "") -endif() - -# Configure libtool to be used instead of ar + ranlib to build static libraries. -# This is required on Xcode 7+, but should also work on previous versions of -# Xcode. -get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) -foreach(lang ${languages}) - set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "${BUILD_LIBTOOL} -static -o " CACHE INTERNAL "") -endforeach() - -# CMake 3.14+ support building for iOS, watchOS, and tvOS out of the box. -if(MODERN_CMAKE) - if(SDK_NAME MATCHES "iphone") - set(CMAKE_SYSTEM_NAME iOS) - elseif(SDK_NAME MATCHES "xros") - set(CMAKE_SYSTEM_NAME visionOS) - elseif(SDK_NAME MATCHES "xrsimulator") - set(CMAKE_SYSTEM_NAME visionOS) - elseif(SDK_NAME MATCHES "macosx") - set(CMAKE_SYSTEM_NAME Darwin) - elseif(SDK_NAME MATCHES "appletv") - set(CMAKE_SYSTEM_NAME tvOS) - elseif(SDK_NAME MATCHES "watch") - set(CMAKE_SYSTEM_NAME watchOS) - endif() - # Provide flags for a combined FAT library build on newer CMake versions - if(PLATFORM_INT MATCHES ".*COMBINED") - set(CMAKE_IOS_INSTALL_COMBINED YES) - if(CMAKE_GENERATOR MATCHES "Xcode") - # Set the SDKROOT Xcode properties to a Xcode-friendly value (the SDK_NAME, E.g, iphoneos) - # This way, Xcode will automatically switch between the simulator and device SDK when building. - set(CMAKE_XCODE_ATTRIBUTE_SDKROOT "${SDK_NAME}") - # Force to not build just one ARCH, but all! - set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO") - endif() - endif() -elseif(NOT DEFINED CMAKE_SYSTEM_NAME AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.10") - # Legacy code path prior to CMake 3.14 or fallback if no CMAKE_SYSTEM_NAME specified - set(CMAKE_SYSTEM_NAME iOS) -elseif(NOT DEFINED CMAKE_SYSTEM_NAME) - # Legacy code path before CMake 3.14 or fallback if no CMAKE_SYSTEM_NAME specified - set(CMAKE_SYSTEM_NAME Darwin) -endif() -# Standard settings. -set(CMAKE_SYSTEM_VERSION ${SDK_VERSION} CACHE INTERNAL "") -set(UNIX ON CACHE BOOL "") -set(APPLE ON CACHE BOOL "") -if(PLATFORM STREQUAL "MAC" OR PLATFORM STREQUAL "MAC_ARM64" OR PLATFORM STREQUAL "MAC_UNIVERSAL") - set(IOS OFF CACHE BOOL "") - set(MACOS ON CACHE BOOL "") -elseif(PLATFORM STREQUAL "MAC_CATALYST" OR PLATFORM STREQUAL "MAC_CATALYST_ARM64") - set(IOS ON CACHE BOOL "") - set(MACOS ON CACHE BOOL "") -elseif(PLATFORM STREQUAL "VISIONOS" OR PLATFORM STREQUAL "SIMULATOR_VISIONOS" OR PLATFORM STREQUAL "VISIONOSCOMBINED") - set(IOS OFF CACHE BOOL "") - set(VISIONOS ON CACHE BOOL "") -else() - set(IOS ON CACHE BOOL "") -endif() -# Set the architectures for which to build. -set(CMAKE_OSX_ARCHITECTURES ${ARCHS} CACHE INTERNAL "") -# Change the type of target generated for try_compile() so it'll work when cross-compiling, weak compiler checks -if(NOT ENABLE_STRICT_TRY_COMPILE_INT) - set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -endif() -# All iOS/Darwin specific settings - some may be redundant. -if (NOT DEFINED CMAKE_MACOSX_BUNDLE) - set(CMAKE_MACOSX_BUNDLE YES) -endif() -set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO") -set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO") -set(CMAKE_SHARED_LIBRARY_PREFIX "lib") -set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib") -set(CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES ".tbd" ".so") -set(CMAKE_SHARED_MODULE_PREFIX "lib") -set(CMAKE_SHARED_MODULE_SUFFIX ".so") -set(CMAKE_C_COMPILER_ABI ELF) -set(CMAKE_CXX_COMPILER_ABI ELF) -set(CMAKE_C_HAS_ISYSROOT 1) -set(CMAKE_CXX_HAS_ISYSROOT 1) -set(CMAKE_MODULE_EXISTS 1) -set(CMAKE_DL_LIBS "") -set(CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ") -set(CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ") -set(CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}") -set(CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}") - -if(ARCHS MATCHES "((^|;|, )(arm64|arm64e|x86_64))+") - set(CMAKE_C_SIZEOF_DATA_PTR 8) - set(CMAKE_CXX_SIZEOF_DATA_PTR 8) - if(ARCHS MATCHES "((^|;|, )(arm64|arm64e))+") - set(CMAKE_SYSTEM_PROCESSOR "aarch64") - else() - set(CMAKE_SYSTEM_PROCESSOR "x86_64") - endif() -else() - set(CMAKE_C_SIZEOF_DATA_PTR 4) - set(CMAKE_CXX_SIZEOF_DATA_PTR 4) - set(CMAKE_SYSTEM_PROCESSOR "arm") -endif() - -# Note that only Xcode 7+ supports the newer more specific: -# -m${SDK_NAME}-version-min flags, older versions of Xcode use: -# -m(ios/ios-simulator)-version-min instead. -if(${CMAKE_VERSION} VERSION_LESS "3.11") - if(PLATFORM_INT STREQUAL "OS" OR PLATFORM_INT STREQUAL "OS64") - if(XCODE_VERSION_INT VERSION_LESS 7.0) - set(SDK_NAME_VERSION_FLAGS - "-mios-version-min=${DEPLOYMENT_TARGET}") - else() - # Xcode 7.0+ uses flags we can build directly from SDK_NAME. - set(SDK_NAME_VERSION_FLAGS - "-m${SDK_NAME}-version-min=${DEPLOYMENT_TARGET}") - endif() - elseif(PLATFORM_INT STREQUAL "TVOS") - set(SDK_NAME_VERSION_FLAGS - "-mtvos-version-min=${DEPLOYMENT_TARGET}") - elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS") - set(SDK_NAME_VERSION_FLAGS - "-mtvos-simulator-version-min=${DEPLOYMENT_TARGET}") -elseif(PLATFORM_INT STREQUAL "SIMULATORARM64_TVOS") - set(SDK_NAME_VERSION_FLAGS - "-mtvos-simulator-version-min=${DEPLOYMENT_TARGET}") - elseif(PLATFORM_INT STREQUAL "WATCHOS") - set(SDK_NAME_VERSION_FLAGS - "-mwatchos-version-min=${DEPLOYMENT_TARGET}") - elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS") - set(SDK_NAME_VERSION_FLAGS - "-mwatchos-simulator-version-min=${DEPLOYMENT_TARGET}") - elseif(PLATFORM_INT STREQUAL "SIMULATORARM64_WATCHOS") - set(SDK_NAME_VERSION_FLAGS - "-mwatchos-simulator-version-min=${DEPLOYMENT_TARGET}") - elseif(PLATFORM_INT STREQUAL "MAC") - set(SDK_NAME_VERSION_FLAGS - "-mmacosx-version-min=${DEPLOYMENT_TARGET}") - else() - # SIMULATOR or SIMULATOR64 both use -mios-simulator-version-min. - set(SDK_NAME_VERSION_FLAGS - "-mios-simulator-version-min=${DEPLOYMENT_TARGET}") - endif() -elseif(NOT PLATFORM_INT MATCHES "^MAC_CATALYST") - # Newer versions of CMake sets the version min flags correctly, skip this for Mac Catalyst targets - set(CMAKE_OSX_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET} CACHE INTERNAL "Minimum OS X deployment version") -endif() - -if(DEFINED APPLE_TARGET_TRIPLE_INT) - set(APPLE_TARGET_TRIPLE ${APPLE_TARGET_TRIPLE_INT} CACHE INTERNAL "") - set(CMAKE_C_COMPILER_TARGET ${APPLE_TARGET_TRIPLE}) - set(CMAKE_CXX_COMPILER_TARGET ${APPLE_TARGET_TRIPLE}) - set(CMAKE_ASM_COMPILER_TARGET ${APPLE_TARGET_TRIPLE}) -endif() - -if(PLATFORM_INT MATCHES "^MAC_CATALYST") - set(C_TARGET_FLAGS "-isystem ${CMAKE_OSX_SYSROOT_INT}/System/iOSSupport/usr/include -iframework ${CMAKE_OSX_SYSROOT_INT}/System/iOSSupport/System/Library/Frameworks") -endif() - -if(ENABLE_BITCODE_INT) - set(BITCODE "-fembed-bitcode") - set(CMAKE_XCODE_ATTRIBUTE_BITCODE_GENERATION_MODE "bitcode") - set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "YES") -else() - set(BITCODE "") - set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO") -endif() - -if(ENABLE_ARC_INT) - set(FOBJC_ARC "-fobjc-arc") - set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "YES") -else() - set(FOBJC_ARC "-fno-objc-arc") - set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "NO") -endif() - -if(NAMED_LANGUAGE_SUPPORT_INT) - set(OBJC_VARS "-fobjc-abi-version=2 -DOBJC_OLD_DISPATCH_PROTOTYPES=0") - set(OBJC_LEGACY_VARS "") -else() - set(OBJC_VARS "") - set(OBJC_LEGACY_VARS "-fobjc-abi-version=2 -DOBJC_OLD_DISPATCH_PROTOTYPES=0") -endif() - -if(NOT ENABLE_VISIBILITY_INT) - foreach(lang ${languages}) - set(CMAKE_${lang}_VISIBILITY_PRESET "hidden" CACHE INTERNAL "") - endforeach() - set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "YES") - set(VISIBILITY "-fvisibility=hidden -fvisibility-inlines-hidden") -else() - foreach(lang ${languages}) - set(CMAKE_${lang}_VISIBILITY_PRESET "default" CACHE INTERNAL "") - endforeach() - set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "NO") - set(VISIBILITY "-fvisibility=default") -endif() - -if(DEFINED APPLE_TARGET_TRIPLE) - set(APPLE_TARGET_TRIPLE_FLAG "-target ${APPLE_TARGET_TRIPLE}") -endif() - -#Check if Xcode generator is used since that will handle these flags automagically -if(CMAKE_GENERATOR MATCHES "Xcode") - message(STATUS "Not setting any manual command-line buildflags, since Xcode is selected as the generator. Modifying the Xcode build-settings directly instead.") -else() - set(CMAKE_C_FLAGS "${C_TARGET_FLAGS} ${APPLE_TARGET_TRIPLE_FLAG} ${SDK_NAME_VERSION_FLAGS} ${OBJC_LEGACY_VARS} ${BITCODE} ${VISIBILITY} ${CMAKE_C_FLAGS}" CACHE INTERNAL - "Flags used by the compiler during all C build types.") - set(CMAKE_C_FLAGS_DEBUG "-O0 -g ${CMAKE_C_FLAGS_DEBUG}") - set(CMAKE_C_FLAGS_MINSIZEREL "-DNDEBUG -Os ${CMAKE_C_FLAGS_MINSIZEREL}") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "-DNDEBUG -O2 -g ${CMAKE_C_FLAGS_RELWITHDEBINFO}") - set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O3 ${CMAKE_C_FLAGS_RELEASE}") - set(CMAKE_CXX_FLAGS "${C_TARGET_FLAGS} ${APPLE_TARGET_TRIPLE_FLAG} ${SDK_NAME_VERSION_FLAGS} ${OBJC_LEGACY_VARS} ${BITCODE} ${VISIBILITY} ${CMAKE_CXX_FLAGS}" CACHE INTERNAL - "Flags used by the compiler during all CXX build types.") - set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g ${CMAKE_CXX_FLAGS_DEBUG}") - set(CMAKE_CXX_FLAGS_MINSIZEREL "-DNDEBUG -Os ${CMAKE_CXX_FLAGS_MINSIZEREL}") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-DNDEBUG -O2 -g ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3 ${CMAKE_CXX_FLAGS_RELEASE}") - if(NAMED_LANGUAGE_SUPPORT_INT) - set(CMAKE_OBJC_FLAGS "${C_TARGET_FLAGS} ${APPLE_TARGET_TRIPLE_FLAG} ${SDK_NAME_VERSION_FLAGS} ${BITCODE} ${VISIBILITY} ${FOBJC_ARC} ${OBJC_VARS} ${CMAKE_OBJC_FLAGS}" CACHE INTERNAL - "Flags used by the compiler during all OBJC build types.") - set(CMAKE_OBJC_FLAGS_DEBUG "-O0 -g ${CMAKE_OBJC_FLAGS_DEBUG}") - set(CMAKE_OBJC_FLAGS_MINSIZEREL "-DNDEBUG -Os ${CMAKE_OBJC_FLAGS_MINSIZEREL}") - set(CMAKE_OBJC_FLAGS_RELWITHDEBINFO "-DNDEBUG -O2 -g ${CMAKE_OBJC_FLAGS_RELWITHDEBINFO}") - set(CMAKE_OBJC_FLAGS_RELEASE "-DNDEBUG -O3 ${CMAKE_OBJC_FLAGS_RELEASE}") - set(CMAKE_OBJCXX_FLAGS "${C_TARGET_FLAGS} ${APPLE_TARGET_TRIPLE_FLAG} ${SDK_NAME_VERSION_FLAGS} ${BITCODE} ${VISIBILITY} ${FOBJC_ARC} ${OBJC_VARS} ${CMAKE_OBJCXX_FLAGS}" CACHE INTERNAL - "Flags used by the compiler during all OBJCXX build types.") - set(CMAKE_OBJCXX_FLAGS_DEBUG "-O0 -g ${CMAKE_OBJCXX_FLAGS_DEBUG}") - set(CMAKE_OBJCXX_FLAGS_MINSIZEREL "-DNDEBUG -Os ${CMAKE_OBJCXX_FLAGS_MINSIZEREL}") - set(CMAKE_OBJCXX_FLAGS_RELWITHDEBINFO "-DNDEBUG -O2 -g ${CMAKE_OBJCXX_FLAGS_RELWITHDEBINFO}") - set(CMAKE_OBJCXX_FLAGS_RELEASE "-DNDEBUG -O3 ${CMAKE_OBJCXX_FLAGS_RELEASE}") - endif() - set(CMAKE_C_LINK_FLAGS "${C_TARGET_FLAGS} ${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}" CACHE INTERNAL - "Flags used by the compiler for all C link types.") - set(CMAKE_CXX_LINK_FLAGS "${C_TARGET_FLAGS} ${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}" CACHE INTERNAL - "Flags used by the compiler for all CXX link types.") - if(NAMED_LANGUAGE_SUPPORT_INT) - set(CMAKE_OBJC_LINK_FLAGS "${C_TARGET_FLAGS} ${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_OBJC_LINK_FLAGS}" CACHE INTERNAL - "Flags used by the compiler for all OBJC link types.") - set(CMAKE_OBJCXX_LINK_FLAGS "${C_TARGET_FLAGS} ${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_OBJCXX_LINK_FLAGS}" CACHE INTERNAL - "Flags used by the compiler for all OBJCXX link types.") - endif() - set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp -arch ${CMAKE_OSX_ARCHITECTURES} ${APPLE_TARGET_TRIPLE_FLAG}" CACHE INTERNAL - "Flags used by the compiler for all ASM build types.") -endif() - -## Print status messages to inform of the current state -message(STATUS "Configuring ${SDK_NAME} build for platform: ${PLATFORM_INT}, architecture(s): ${ARCHS}") -message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT_INT}") -message(STATUS "Using C compiler: ${CMAKE_C_COMPILER}") -message(STATUS "Using CXX compiler: ${CMAKE_CXX_COMPILER}") -message(STATUS "Using libtool: ${BUILD_LIBTOOL}") -message(STATUS "Using install name tool: ${CMAKE_INSTALL_NAME_TOOL}") -if(DEFINED APPLE_TARGET_TRIPLE) - message(STATUS "Autoconf target triple: ${APPLE_TARGET_TRIPLE}") -endif() -message(STATUS "Using minimum deployment version: ${DEPLOYMENT_TARGET}" - " (SDK version: ${SDK_VERSION})") -if(MODERN_CMAKE) - message(STATUS "Merging integrated CMake 3.14+ iOS,tvOS,watchOS,macOS toolchain(s) with this toolchain!") - if(PLATFORM_INT MATCHES ".*COMBINED") - message(STATUS "Will combine built (static) artifacts into FAT lib...") - endif() -endif() -if(CMAKE_GENERATOR MATCHES "Xcode") - message(STATUS "Using Xcode version: ${XCODE_VERSION_INT}") -endif() -message(STATUS "CMake version: ${CMAKE_VERSION}") -if(DEFINED SDK_NAME_VERSION_FLAGS) - message(STATUS "Using version flags: ${SDK_NAME_VERSION_FLAGS}") -endif() -message(STATUS "Using a data_ptr size of: ${CMAKE_CXX_SIZEOF_DATA_PTR}") -if(ENABLE_BITCODE_INT) - message(STATUS "Bitcode: Enabled") -else() - message(STATUS "Bitcode: Disabled") -endif() - -if(ENABLE_ARC_INT) - message(STATUS "ARC: Enabled") -else() - message(STATUS "ARC: Disabled") -endif() - -if(ENABLE_VISIBILITY_INT) - message(STATUS "Hiding symbols: Disabled") -else() - message(STATUS "Hiding symbols: Enabled") -endif() - -# Set global properties -set_property(GLOBAL PROPERTY PLATFORM "${PLATFORM}") -set_property(GLOBAL PROPERTY APPLE_TARGET_TRIPLE "${APPLE_TARGET_TRIPLE_INT}") -set_property(GLOBAL PROPERTY SDK_VERSION "${SDK_VERSION}") -set_property(GLOBAL PROPERTY XCODE_VERSION "${XCODE_VERSION_INT}") -set_property(GLOBAL PROPERTY OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}") - -# Export configurable variables for the try_compile() command. -set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES - PLATFORM - XCODE_VERSION_INT - SDK_VERSION - NAMED_LANGUAGE_SUPPORT - DEPLOYMENT_TARGET - CMAKE_DEVELOPER_ROOT - CMAKE_OSX_SYSROOT_INT - ENABLE_BITCODE - ENABLE_ARC - CMAKE_ASM_COMPILER - CMAKE_C_COMPILER - CMAKE_C_COMPILER_TARGET - CMAKE_CXX_COMPILER - CMAKE_CXX_COMPILER_TARGET - BUILD_LIBTOOL - CMAKE_INSTALL_NAME_TOOL - CMAKE_C_FLAGS - CMAKE_C_DEBUG - CMAKE_C_MINSIZEREL - CMAKE_C_RELWITHDEBINFO - CMAKE_C_RELEASE - CMAKE_CXX_FLAGS - CMAKE_CXX_FLAGS_DEBUG - CMAKE_CXX_FLAGS_MINSIZEREL - CMAKE_CXX_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS_RELEASE - CMAKE_C_LINK_FLAGS - CMAKE_CXX_LINK_FLAGS - CMAKE_ASM_FLAGS -) - -if(NAMED_LANGUAGE_SUPPORT_INT) - list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES - CMAKE_OBJC_FLAGS - CMAKE_OBJC_DEBUG - CMAKE_OBJC_MINSIZEREL - CMAKE_OBJC_RELWITHDEBINFO - CMAKE_OBJC_RELEASE - CMAKE_OBJCXX_FLAGS - CMAKE_OBJCXX_DEBUG - CMAKE_OBJCXX_MINSIZEREL - CMAKE_OBJCXX_RELWITHDEBINFO - CMAKE_OBJCXX_RELEASE - CMAKE_OBJC_LINK_FLAGS - CMAKE_OBJCXX_LINK_FLAGS - ) -endif() - -set(CMAKE_PLATFORM_HAS_INSTALLNAME 1) -set(CMAKE_SHARED_LINKER_FLAGS "-rpath @executable_path/Frameworks -rpath @loader_path/Frameworks") -set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -Wl,-headerpad_max_install_names") -set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -Wl,-headerpad_max_install_names") -set(CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,") -set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,") -set(CMAKE_FIND_LIBRARY_SUFFIXES ".tbd" ".dylib" ".so" ".a") -set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-install_name") - -# Set the find root to the SDK developer roots. -# Note: CMAKE_FIND_ROOT_PATH is only useful when cross-compiling. Thus, do not set on macOS builds. -if(NOT PLATFORM_INT MATCHES "^MAC.*$") - list(APPEND CMAKE_FIND_ROOT_PATH "${CMAKE_OSX_SYSROOT_INT}" CACHE INTERNAL "") - set(CMAKE_IGNORE_PATH "/System/Library/Frameworks;/usr/local/lib;/opt/homebrew" CACHE INTERNAL "") -endif() - -# Default to searching for frameworks first. -IF(NOT DEFINED CMAKE_FIND_FRAMEWORK) - set(CMAKE_FIND_FRAMEWORK FIRST) -ENDIF(NOT DEFINED CMAKE_FIND_FRAMEWORK) - -# Set up the default search directories for frameworks. -if(PLATFORM_INT MATCHES "^MAC_CATALYST") - set(CMAKE_FRAMEWORK_PATH - ${CMAKE_DEVELOPER_ROOT}/Library/PrivateFrameworks - ${CMAKE_OSX_SYSROOT_INT}/System/Library/Frameworks - ${CMAKE_OSX_SYSROOT_INT}/System/iOSSupport/System/Library/Frameworks - ${CMAKE_FRAMEWORK_PATH} CACHE INTERNAL "") -else() - set(CMAKE_FRAMEWORK_PATH - ${CMAKE_DEVELOPER_ROOT}/Library/PrivateFrameworks - ${CMAKE_OSX_SYSROOT_INT}/System/Library/Frameworks - ${CMAKE_FRAMEWORK_PATH} CACHE INTERNAL "") -endif() - -# By default, search both the specified iOS SDK and the remainder of the host filesystem. -if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH CACHE INTERNAL "") -endif() -if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH CACHE INTERNAL "") -endif() -if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH CACHE INTERNAL "") -endif() -if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH CACHE INTERNAL "") -endif() - -# -# Some helper-macros below to simplify and beautify the CMakeFile -# - -# This little macro lets you set any Xcode specific property. -macro(set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE XCODE_RELVERSION) - set(XCODE_RELVERSION_I "${XCODE_RELVERSION}") - if(XCODE_RELVERSION_I STREQUAL "All") - set_property(TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} "${XCODE_VALUE}") - else() - set_property(TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY}[variant=${XCODE_RELVERSION_I}] "${XCODE_VALUE}") - endif() -endmacro(set_xcode_property) - -# This macro lets you find executable programs on the host system. -macro(find_host_package) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) - set(_TOOLCHAIN_IOS ${IOS}) - set(IOS OFF) - find_package(${ARGN}) - set(IOS ${_TOOLCHAIN_IOS}) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH) -endmacro(find_host_package) diff --git a/scripts/test.ps1 b/scripts/test.ps1 deleted file mode 100644 index 8672a1a7..00000000 --- a/scripts/test.ps1 +++ /dev/null @@ -1,8 +0,0 @@ -$ENV:PATH = "$pwd/windows;$ENV:PATH" - -dart pub global run coverage:test_with_coverage .\test - -# dart pub global run coverage:format_coverage ` -# --packages=.dart_tool/package_config.json ` -# --lcov -i coverage/coverage.json ` -# -o coverage/lcov.info diff --git a/scripts/test.sh b/scripts/test.sh deleted file mode 100644 index c0c72779..00000000 --- a/scripts/test.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"`pwd`/linux" - -dart test test/ - -# dart pub global run coverage:test_with_coverage - -# dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage/coverage.json -o coverage/lcov.info diff --git a/src/calib3d/calib3d.cpp b/src/calib3d/calib3d.cpp deleted file mode 100644 index c72133d5..00000000 --- a/src/calib3d/calib3d.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "calib3d.h" -#include "core/vec.hpp" - -CvStatus *Fisheye_UndistortImage(Mat distorted, Mat undistorted, Mat k, Mat d) { - BEGIN_WRAP - cv::fisheye::undistortImage(*distorted.ptr, *undistorted.ptr, *k.ptr, *d.ptr); - END_WRAP -} - -CvStatus *Fisheye_UndistortImageWithParams( - Mat distorted, Mat *undistorted, Mat k, Mat d, Mat knew, Size size -) { - BEGIN_WRAP - cv::Size sz(size.width, size.height); - cv::Mat _undistorted; - cv::fisheye::undistortImage(*distorted.ptr, _undistorted, *k.ptr, *d.ptr, *knew.ptr, sz); - *undistorted = {new cv::Mat(_undistorted)}; - END_WRAP -} - -CvStatus *Fisheye_UndistortPoints(Mat distorted, Mat undistorted, Mat k, Mat d, Mat r, Mat p) { - BEGIN_WRAP - cv::fisheye::undistortPoints(*distorted.ptr, *undistorted.ptr, *k.ptr, *d.ptr, *r.ptr, *p.ptr); - END_WRAP -} - -CvStatus *Fisheye_EstimateNewCameraMatrixForUndistortRectify( - Mat k, Mat d, Size imgSize, Mat r, Mat p, double balance, Size newSize, double fovScale -) { - BEGIN_WRAP - cv::Size newSz(newSize.width, newSize.height); - cv::Size imgSz(imgSize.width, imgSize.height); - cv::fisheye::estimateNewCameraMatrixForUndistortRectify( - *k.ptr, *d.ptr, imgSz, *r.ptr, *p.ptr, balance, newSz, fovScale - ); - END_WRAP -} - -CvStatus *InitUndistortRectifyMap( - Mat cameraMatrix, - Mat distCoeffs, - Mat r, - Mat newCameraMatrix, - Size size, - int m1type, - Mat *map1, - Mat *map2 -) { - BEGIN_WRAP - cv::Size sz(size.width, size.height); - cv::Mat _map1, _map2; - cv::initUndistortRectifyMap( - *cameraMatrix.ptr, *distCoeffs.ptr, *r.ptr, *newCameraMatrix.ptr, sz, m1type, _map1, _map2 - ); - *map1 = {new cv::Mat(_map1)}; - *map2 = {new cv::Mat(_map2)}; - END_WRAP -} - -CvStatus *GetOptimalNewCameraMatrixWithParams( - Mat cameraMatrix, - Mat distCoeffs, - Size size, - double alpha, - Size newImgSize, - Rect *validPixROI, - bool centerPrincipalPoint, - Mat *rval -) { - BEGIN_WRAP - cv::Size sz(size.width, size.height); - cv::Size newSize(newImgSize.width, newImgSize.height); - cv::Rect rect(validPixROI->x, validPixROI->y, validPixROI->width, validPixROI->height); - cv::Mat *mat = new cv::Mat(cv::getOptimalNewCameraMatrix( - *cameraMatrix.ptr, *distCoeffs.ptr, sz, alpha, newSize, &rect, centerPrincipalPoint - )); - validPixROI->x = rect.x; - validPixROI->y = rect.y; - validPixROI->width = rect.width; - validPixROI->height = rect.height; - *rval = {mat}; - END_WRAP -} - -CvStatus *CalibrateCamera( - VecVecPoint3f objectPoints, - VecVecPoint2f imagePoints, - Size imageSize, - Mat cameraMatrix, - Mat distCoeffs, - Mat rvecs, - Mat tvecs, - int flag, - TermCriteria criteria, - double *rval -) { - BEGIN_WRAP - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - auto _objectPoints = vecvecpoint3f_c2cpp(objectPoints); - auto _imagePoints = vecvecpoint2f_c2cpp(imagePoints); - *rval = cv::calibrateCamera( - _objectPoints, - _imagePoints, - cv::Size(imageSize.width, imageSize.height), - *cameraMatrix.ptr, - *distCoeffs.ptr, - *rvecs.ptr, - *tvecs.ptr, - flag, - tc - ); - END_WRAP -} - -CvStatus *Undistort(Mat src, Mat dst, Mat cameraMatrix, Mat distCoeffs, Mat newCameraMatrix) { - BEGIN_WRAP - cv::undistort(*src.ptr, *dst.ptr, *cameraMatrix.ptr, *distCoeffs.ptr, *newCameraMatrix.ptr); - END_WRAP -} - -CvStatus * -UndistortPoints(Mat distorted, Mat undistorted, Mat k, Mat d, Mat r, Mat p, TermCriteria criteria) { - BEGIN_WRAP - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - cv::undistortPoints(*distorted.ptr, *undistorted.ptr, *k.ptr, *d.ptr, *r.ptr, *p.ptr, tc); - END_WRAP -} - -CvStatus *FindChessboardCorners(Mat image, Size patternSize, Mat corners, int flags, bool *rval) { - BEGIN_WRAP - cv::Size sz(patternSize.width, patternSize.height); - *rval = cv::findChessboardCorners(*image.ptr, sz, *corners.ptr, flags); - END_WRAP -} - -CvStatus *FindChessboardCornersSB(Mat image, Size patternSize, Mat corners, int flags, bool *rval) { - BEGIN_WRAP - cv::Size sz(patternSize.width, patternSize.height); - *rval = cv::findChessboardCornersSB(*image.ptr, sz, *corners.ptr, flags); - END_WRAP -} - -CvStatus *FindChessboardCornersSBWithMeta( - Mat image, Size patternSize, Mat corners, int flags, Mat meta, bool *rval -) { - BEGIN_WRAP - cv::Size sz(patternSize.width, patternSize.height); - *rval = cv::findChessboardCornersSB(*image.ptr, sz, *corners.ptr, flags, *meta.ptr); - END_WRAP -} - -CvStatus *DrawChessboardCorners(Mat image, Size patternSize, Mat corners, bool patternWasFound) { - BEGIN_WRAP - cv::Size sz(patternSize.width, patternSize.height); - cv::drawChessboardCorners(*image.ptr, sz, *corners.ptr, patternWasFound); - END_WRAP -} - -CvStatus *EstimateAffinePartial2D(VecPoint2f from, VecPoint2f to, Mat *rval) { - BEGIN_WRAP - auto _from = vecpoint2f_c2cpp(from); - auto _to = vecpoint2f_c2cpp(to); - *rval = {new cv::Mat(cv::estimateAffinePartial2D(_from, _to))}; - END_WRAP -} - -CvStatus *EstimateAffinePartial2DWithParams( - VecPoint2f from, - VecPoint2f to, - Mat inliers, - int method, - double ransacReprojThreshold, - size_t maxIters, - double confidence, - size_t refineIters, - Mat *rval -) { - BEGIN_WRAP - auto _from = vecpoint2f_c2cpp(from); - auto _to = vecpoint2f_c2cpp(to); - *rval = {new cv::Mat(cv::estimateAffinePartial2D( - _from, _to, *inliers.ptr, method, ransacReprojThreshold, maxIters, confidence, refineIters - ))}; - END_WRAP -} - -CvStatus *EstimateAffine2D(VecPoint2f from, VecPoint2f to, Mat *rval) { - BEGIN_WRAP - auto _from = vecpoint2f_c2cpp(from); - auto _to = vecpoint2f_c2cpp(to); - *rval = {new cv::Mat(cv::estimateAffine2D(_from, _to))}; - END_WRAP -} - -CvStatus *EstimateAffine2DWithParams( - VecPoint2f from, - VecPoint2f to, - Mat inliers, - int method, - double ransacReprojThreshold, - size_t maxIters, - double confidence, - size_t refineIters, - Mat *rval -) { - BEGIN_WRAP - auto _from = vecpoint2f_c2cpp(from); - auto _to = vecpoint2f_c2cpp(to); - *rval = {new cv::Mat(cv::estimateAffine2D( - _from, _to, *inliers.ptr, method, ransacReprojThreshold, maxIters, confidence, refineIters - ))}; - END_WRAP -} - -CvStatus *FindHomography( - Mat src, - Mat dst, - int method, - double ransacReprojThreshold, - Mat mask, - const int maxIters, - const double confidence, - Mat *rval -) { - BEGIN_WRAP - *rval = {new cv::Mat(cv::findHomography( - *src.ptr, *dst.ptr, method, ransacReprojThreshold, *mask.ptr, maxIters, confidence - ))}; - END_WRAP -} diff --git a/src/calib3d/calib3d.h b/src/calib3d/calib3d.h deleted file mode 100644 index 29b1a812..00000000 --- a/src/calib3d/calib3d.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef _OPENCV3_CALIB_H_ -#define _OPENCV3_CALIB_H_ - -#ifdef __cplusplus -#include -#include - -extern "C" { -#endif - -#include "core/core.h" -#include -// Calib -CvStatus *Fisheye_UndistortImage(Mat distorted, Mat undistorted, Mat k, Mat d); -CvStatus *Fisheye_UndistortImageWithParams( - Mat distorted, Mat *undistorted, Mat k, Mat d, Mat knew, Size size -); -CvStatus *Fisheye_UndistortPoints(Mat distorted, Mat undistorted, Mat k, Mat d, Mat R, Mat P); -CvStatus *Fisheye_EstimateNewCameraMatrixForUndistortRectify( - Mat k, Mat d, Size imgSize, Mat r, Mat p, double balance, Size newSize, double fovScale -); - -CvStatus *InitUndistortRectifyMap( - Mat cameraMatrix, - Mat distCoeffs, - Mat r, - Mat newCameraMatrix, - Size size, - int m1type, - Mat *map1, - Mat *map2 -); -CvStatus *GetOptimalNewCameraMatrixWithParams( - Mat cameraMatrix, - Mat distCoeffs, - Size size, - double alpha, - Size newImgSize, - Rect *validPixROI, - bool centerPrincipalPoint, - Mat *rval -); -CvStatus *CalibrateCamera( - VecVecPoint3f objectPoints, - VecVecPoint2f imagePoints, - Size imageSize, - Mat cameraMatrix, - Mat distCoeffs, - Mat rvecs, - Mat tvecs, - int flag, - TermCriteria criteria, - double *rval -); -CvStatus *Undistort(Mat src, Mat dst, Mat cameraMatrix, Mat distCoeffs, Mat newCameraMatrix); -CvStatus * -UndistortPoints(Mat distorted, Mat undistorted, Mat k, Mat d, Mat r, Mat p, TermCriteria criteria); -CvStatus *FindChessboardCorners(Mat image, Size patternSize, Mat corners, int flags, bool *rval); -CvStatus *FindChessboardCornersSB(Mat image, Size patternSize, Mat corners, int flags, bool *rval); -CvStatus *FindChessboardCornersSBWithMeta( - Mat image, Size patternSize, Mat corners, int flags, Mat meta, bool *rval -); -CvStatus *DrawChessboardCorners(Mat image, Size patternSize, Mat corners, bool patternWasFound); -CvStatus *EstimateAffinePartial2D(VecPoint2f from, VecPoint2f to, Mat *rval); -CvStatus *EstimateAffinePartial2DWithParams( - VecPoint2f from, - VecPoint2f to, - Mat inliers, - int method, - double ransacReprojThreshold, - size_t maxIters, - double confidence, - size_t refineIters, - Mat *rval -); -CvStatus *EstimateAffine2D(VecPoint2f from, VecPoint2f to, Mat *rval); -CvStatus *EstimateAffine2DWithParams( - VecPoint2f from, - VecPoint2f to, - Mat inliers, - int method, - double ransacReprojThreshold, - size_t maxIters, - double confidence, - size_t refineIters, - Mat *rval -); -CvStatus *FindHomography( - Mat src, - Mat dst, - int method, - double ransacReprojThreshold, - Mat mask, - const int maxIters, - const double confidence, - Mat *rval -); -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_CALIB_H diff --git a/src/calib3d/calib3d_async.cpp b/src/calib3d/calib3d_async.cpp deleted file mode 100644 index ba4486ad..00000000 --- a/src/calib3d/calib3d_async.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include "calib3d_async.h" -#include "core/types.h" -#include "core/vec.hpp" -#include - -CvStatus *fisheye_undistortImage_Async(Mat distorted, Mat k, Mat d, CVD_OUT CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::fisheye::undistortImage(*distorted.ptr, dst, *k.ptr, *d.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *fisheye_undistortImageWithParams_Async( - Mat distorted, Mat k, Mat d, Mat knew, Size size, CVD_OUT CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::fisheye::undistortImage( - *distorted.ptr, dst, *k.ptr, *d.ptr, *knew.ptr, cv::Size(size.width, size.height) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *fisheye_undistortPoints_Async( - Mat distorted, Mat k, Mat d, Mat R, Mat P, CVD_OUT CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::fisheye::undistortPoints(*distorted.ptr, dst, *k.ptr, *d.ptr, *R.ptr, *P.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *fisheye_estimateNewCameraMatrixForUndistortRectify_Async( - Mat k, - Mat d, - Size imgSize, - Mat r, - double balance, - Size newSize, - double fovScale, - CVD_OUT CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::fisheye::estimateNewCameraMatrixForUndistortRectify( - *k.ptr, - *d.ptr, - cv::Size(imgSize.width, imgSize.height), - *r.ptr, - dst, - balance, - cv::Size(newSize.width, newSize.height), - fovScale - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -// calib3d -CvStatus *calibrateCamera_Async( - VecVecPoint3f objectPoints, - VecVecPoint2f imagePoints, - Size imageSize, - Mat cameraMatrix, - Mat distCoeffs, - int flag, - TermCriteria criteria, - CVD_OUT CvCallback_3 callback -) { - BEGIN_WRAP - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - cv::Mat rvecs; - cv::Mat tvecs; - auto _objectPoints = vecvecpoint3f_c2cpp(objectPoints); - auto _imagePoints = vecvecpoint2f_c2cpp(imagePoints); - auto rval = cv::calibrateCamera( - _objectPoints, - _imagePoints, - cv::Size(imageSize.width, imageSize.height), - *cameraMatrix.ptr, - *distCoeffs.ptr, - rvecs, - tvecs, - flag, - tc - ); - callback(new double(rval), new Mat{new cv::Mat(rvecs)}, new Mat{new cv::Mat(tvecs)}); - END_WRAP -} -CvStatus *drawChessboardCorners_Async( - Mat image, Size patternSize, bool patternWasFound, CVD_OUT CvCallback_0 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::drawChessboardCorners( - *image.ptr, cv::Size(patternSize.width, patternSize.height), dst, patternWasFound - ); - callback(); - END_WRAP -} -CvStatus *estimateAffinePartial2D_Async(VecPoint2f from, VecPoint2f to, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - auto _from = vecpoint2f_c2cpp(from); - auto _to = vecpoint2f_c2cpp(to); - cv::estimateAffinePartial2D(_from, _to, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *estimateAffinePartial2DWithParams_Async( - VecPoint2f from, - VecPoint2f to, - int method, - double ransacReprojThreshold, - size_t maxIters, - double confidence, - size_t refineIters, - CVD_OUT CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat inliers; - auto _from = vecpoint2f_c2cpp(from); - auto _to = vecpoint2f_c2cpp(to); - cv::Mat dst = cv::estimateAffinePartial2D( - _from, _to, inliers, method, ransacReprojThreshold, maxIters, confidence, refineIters - ); - callback(new Mat{new cv::Mat(dst)}, new Mat{new cv::Mat(inliers)}); - END_WRAP -} -CvStatus *estimateAffine2D_Async(VecPoint2f from, VecPoint2f to, CVD_OUT CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - auto _from = vecpoint2f_c2cpp(from); - auto _to = vecpoint2f_c2cpp(to); - cv::estimateAffine2D(_from, _to, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *estimateAffine2DWithParams_Async( - VecPoint2f from, - VecPoint2f to, - int method, - double ransacReprojThreshold, - size_t maxIters, - double confidence, - size_t refineIters, - CVD_OUT CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat inliers; - auto _from = vecpoint2f_c2cpp(from); - auto _to = vecpoint2f_c2cpp(to); - cv::Mat dst = cv::estimateAffine2D( - _from, _to, inliers, method, ransacReprojThreshold, maxIters, confidence, refineIters - ); - callback(new Mat{new cv::Mat(dst)}, new Mat{new cv::Mat(inliers)}); - END_WRAP -} -CvStatus * -findChessboardCorners_Async(Mat image, Size patternSize, int flags, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::Mat dst2; - auto rval = cv::findChessboardCorners( - *image.ptr, cv::Size(patternSize.width, patternSize.height), dst, flags - ); - callback(new bool(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus * -findChessboardCornersSB_Async(Mat image, Size patternSize, int flags, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::Mat dst2; - auto rval = cv::findChessboardCornersSB( - *image.ptr, cv::Size(patternSize.width, patternSize.height), dst, flags - ); - callback(new bool(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *findChessboardCornersSBWithMeta_Async( - Mat image, Size patternSize, int flags, CVD_OUT CvCallback_3 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::Mat dst2; - auto rval = cv::findChessboardCornersSB( - *image.ptr, cv::Size(patternSize.width, patternSize.height), dst, flags, dst2 - ); - callback(new bool(rval), new Mat{new cv::Mat(dst)}, new Mat{new cv::Mat(dst2)}); - END_WRAP -} -CvStatus *getOptimalNewCameraMatrix_Async( - Mat cameraMatrix, - Mat distCoeffs, - Size size, - double alpha, - Size newImgSize, - bool centerPrincipalPoint, - CVD_OUT CvCallback_2 callback -) { - BEGIN_WRAP - cv::Rect dst; - auto rval = cv::getOptimalNewCameraMatrix( - *cameraMatrix.ptr, - *distCoeffs.ptr, - cv::Size(size.width, size.height), - alpha, - cv::Size(newImgSize.width, newImgSize.height), - &dst, - centerPrincipalPoint - ); - callback(new Mat{new cv::Mat(rval)}, new Rect{dst.x, dst.y, dst.width, dst.height}); - END_WRAP -} -CvStatus *initUndistortRectifyMap_Async( - Mat cameraMatrix, - Mat distCoeffs, - Mat r, - Mat newCameraMatrix, - Size size, - int m1type, - CVD_OUT CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat dst1; - cv::Mat dst2; - cv::initUndistortRectifyMap( - *cameraMatrix.ptr, - *distCoeffs.ptr, - *r.ptr, - *newCameraMatrix.ptr, - cv::Size(size.width, size.height), - m1type, - dst1, - dst2 - ); - callback(new Mat{new cv::Mat(dst1)}, new Mat{new cv::Mat(dst2)}); - END_WRAP -} - -CvStatus *undistort_Async( - Mat src, Mat cameraMatrix, Mat distCoeffs, Mat newCameraMatrix, CVD_OUT CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::undistort(*src.ptr, dst, *cameraMatrix.ptr, *distCoeffs.ptr, *newCameraMatrix.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *undistortPoints_Async( - Mat distorted, Mat k, Mat d, Mat r, Mat p, TermCriteria criteria, CVD_OUT CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::undistortPoints( - *distorted.ptr, - dst, - *k.ptr, - *d.ptr, - *r.ptr, - *p.ptr, - cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *FindHomography_Async( - Mat src, - Mat dst, - int method, - double ransacReprojThreshold, - const int maxIters, - const double confidence, - CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat mask; - cv::Mat out = cv::findHomography( - *src.ptr, *dst.ptr, method, ransacReprojThreshold, mask, maxIters, confidence - ); - callback(new Mat{new cv::Mat(out)}, new Mat{new cv::Mat(mask)}); - END_WRAP -} diff --git a/src/calib3d/calib3d_async.h b/src/calib3d/calib3d_async.h deleted file mode 100644 index 1fcffb1d..00000000 --- a/src/calib3d/calib3d_async.h +++ /dev/null @@ -1,227 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef CVD_ASYNC_CALIB3D_H -#define CVD_ASYNC_CALIB3D_H - -#include "core/types.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif -// fisheye -// // Performs camera calibration. -// CvStatus *fisheye_calibrate(VecVecPoint2f objectPoints, VecVecPoint2f -// imagePoints, const Size image_size, -// InputOutputArray K, InputOutputArray D, int -// flags, TermCriteria criteria, CvCallback_3 -// callback); - -// // Distorts 2D points using fisheye model. -// CvStatus *fisheye_distortPoints(InputArray undistorted, OutputArray -// distorted, InputArray K, InputArray D, -// double alpha = 0); - -// // Estimates new camera intrinsic matrix for undistortion or rectification. -// CvStatus *fisheye_estimateNewCameraMatrixForUndistortRectify(InputArray K, -// InputArray D, -// const Size -// &image_size, -// InputArray R, -// OutputArray P, -// double balance = -// 0.0, const Size -// &new_size = -// Size(), double -// fov_scale -// = 1.0); - -// // Computes undistortion and rectification maps for image transform by remap. -// If D is empty zero -// // distortion is used, if R or P is empty identity matrixes are used. -// CvStatus *fisheye_initUndistortRectifyMap(InputArray K, InputArray D, -// InputArray R, InputArray P, -// const Size &size, int m1type, -// OutputArray map1, OutputArray -// map2); - -// // Projects points using fisheye model. -// CvStatus *fisheye_projectPoints(InputArray objectPoints, OutputArray -// imagePoints, const Affine3d &affine, -// InputArray K, InputArray D, double alpha = 0, -// OutputArray jacobian = noArray()); - -// CvStatus *fisheye_projectPoints(InputArray objectPoints, OutputArray -// imagePoints, InputArray rvec, -// InputArray tvec, InputArray K, InputArray D, -// double alpha = 0, OutputArray jacobian = -// noArray()); - -// // Finds an object pose from 3D-2D point correspondences for fisheye camera -// moodel. bool fisheye_solvePnP(InputArray objectPoints, InputArray -// imagePoints, InputArray cameraMatrix, -// InputArray distCoeffs, OutputArray rvec, OutputArray -// tvec, bool useExtrinsicGuess = false, int flags = -// SOLVEPNP_ITERATIVE, TermCriteria criteria = -// TermCriteria(TermCriteria_MAX_ITER + TermCriteria_EPS, -// 10, -// 1e-8)); - -// // This is an overloaded member function, provided for convenience. It -// differs from the above function -// // only in what argument(s) it accepts. -// double fisheye_stereoCalibrate(InputArrayOfArrays objectPoints, -// InputArrayOfArrays imagePoints1, -// InputArrayOfArrays imagePoints2, -// InputOutputArray K1, InputOutputArray D1, -// InputOutputArray K2, InputOutputArray D2, Size -// imageSize, OutputArray R, OutputArray T, int -// flags = fisheye_CALIB_FIX_INTRINSIC, -// TermCriteria criteria = -// TermCriteria(TermCriteria_COUNT + -// TermCriteria_EPS, -// 100, -// DBL_EPSILON)); - -// // Performs stereo calibration. -// double fisheye_stereoCalibrate(InputArrayOfArrays objectPoints, -// InputArrayOfArrays imagePoints1, -// InputArrayOfArrays imagePoints2, -// InputOutputArray K1, InputOutputArray D1, -// InputOutputArray K2, InputOutputArray D2, Size -// imageSize, OutputArray R, OutputArray T, -// OutputArrayOfArrays rvecs, OutputArrayOfArrays -// tvecs, int flags = -// fisheye_CALIB_FIX_INTRINSIC, TermCriteria -// criteria = TermCriteria(TermCriteria_COUNT + -// TermCriteria_EPS, -// 100, -// DBL_EPSILON)); - -// // Stereo rectification for fisheye camera model. -// CvStatus *fisheye_stereoRectify(InputArray K1, InputArray D1, InputArray K2, -// InputArray D2, -// const Size &imageSize, InputArray R, -// InputArray tvec, OutputArray R1, OutputArray -// R2, OutputArray P1, OutputArray P2, -// OutputArray Q, int flags, const Size -// &newImageSize = Size(), double balance = 0.0, -// double fov_scale = 1.0); - -// // Transforms an image to compensate for fisheye lens distortion. -// CvStatus *fisheye_undistortImage(InputArray distorted, OutputArray -// undistorted, InputArray K, InputArray D, -// InputArray Knew = noArray(), const Size -// &new_size = Size()); - -// // Undistorts 2D points using fisheye model. -// CvStatus *fisheye_undistortPoints( -// InputArray distorted, OutputArray undistorted, InputArray K, InputArray -// D, InputArray R = noArray(), InputArray P = noArray(), TermCriteria -// criteria = TermCriteria(TermCriteria_MAX_ITER + TermCriteria_EPS, 10, -// 1e-8)); - -CvStatus *fisheye_undistortImage_Async(Mat distorted, Mat k, Mat d, CVD_OUT CvCallback_1 callback); -CvStatus *fisheye_undistortImageWithParams_Async( - Mat distorted, Mat k, Mat d, Mat knew, Size size, CVD_OUT CvCallback_1 callback -); -CvStatus *fisheye_undistortPoints_Async( - Mat distorted, Mat k, Mat d, Mat R, Mat P, CVD_OUT CvCallback_1 callback -); -CvStatus *fisheye_estimateNewCameraMatrixForUndistortRectify_Async( - Mat k, - Mat d, - Size imgSize, - Mat r, - double balance, - Size newSize, - double fovScale, - CVD_OUT CvCallback_1 p -); - -// calib3d -CvStatus *calibrateCamera_Async( - VecVecPoint3f objectPoints, - VecVecPoint2f imagePoints, - Size imageSize, - Mat cameraMatrix, - Mat distCoeffs, - int flag, - TermCriteria criteria, - CVD_OUT CvCallback_3 callback -); -CvStatus *drawChessboardCorners_Async( - Mat image, Size patternSize, bool patternWasFound, CVD_OUT CvCallback_0 callback -); -CvStatus *estimateAffinePartial2D_Async(VecPoint2f from, VecPoint2f to, CvCallback_1 callback); -CvStatus *estimateAffinePartial2DWithParams_Async( - VecPoint2f from, - VecPoint2f to, - int method, - double ransacReprojThreshold, - size_t maxIters, - double confidence, - size_t refineIters, - CVD_OUT CvCallback_2 callback -); -CvStatus *estimateAffine2D_Async(VecPoint2f from, VecPoint2f to, CVD_OUT CvCallback_1 callback); -CvStatus *estimateAffine2DWithParams_Async( - VecPoint2f from, - VecPoint2f to, - int method, - double ransacReprojThreshold, - size_t maxIters, - double confidence, - size_t refineIters, - CVD_OUT CvCallback_2 callback -); -CvStatus * -findChessboardCorners_Async(Mat image, Size patternSize, int flags, CvCallback_2 callback); -CvStatus * -findChessboardCornersSB_Async(Mat image, Size patternSize, int flags, CvCallback_2 callback); -CvStatus *findChessboardCornersSBWithMeta_Async( - Mat image, Size patternSize, int flags, CVD_OUT CvCallback_3 callback -); -CvStatus *getOptimalNewCameraMatrix_Async( - Mat cameraMatrix, - Mat distCoeffs, - Size size, - double alpha, - Size newImgSize, - bool centerPrincipalPoint, - CVD_OUT CvCallback_2 callback -); -CvStatus *initUndistortRectifyMap_Async( - Mat cameraMatrix, - Mat distCoeffs, - Mat r, - Mat newCameraMatrix, - Size size, - int m1type, - CVD_OUT CvCallback_2 callback -); - -CvStatus *undistort_Async( - Mat src, Mat cameraMatrix, Mat distCoeffs, Mat newCameraMatrix, CVD_OUT CvCallback_1 callback -); -CvStatus *undistortPoints_Async( - Mat distorted, Mat k, Mat d, Mat r, Mat p, TermCriteria criteria, CVD_OUT CvCallback_1 callback -); - -CvStatus *FindHomography_Async( - Mat src, - Mat dst, - int method, - double ransacReprojThreshold, - const int maxIters, - const double confidence, - CvCallback_2 callback -); - -#ifdef __cplusplus -} -#endif -#endif // CVD_ASYNC_CALIB3D_H diff --git a/src/core/constants.h b/src/core/constants.h deleted file mode 100644 index 7d4081d0..00000000 --- a/src/core/constants.h +++ /dev/null @@ -1,2023 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef OPENCV_DART_LIBRARY_ENUMS_H -#define OPENCV_DART_LIBRARY_ENUMS_H - -/** the color conversion codes -@see @ref imgproc_color_conversions -@ingroup imgproc_color_conversions - */ -enum -{ - COLOR_BGR2BGRA = 0, //!< add alpha channel to RGB or BGR image - COLOR_RGB2RGBA = COLOR_BGR2BGRA, - - COLOR_BGRA2BGR = 1, //!< remove alpha channel from RGB or BGR image - COLOR_RGBA2RGB = COLOR_BGRA2BGR, - - COLOR_BGR2RGBA = 2, //!< convert between RGB and BGR color spaces (with or without alpha channel) - COLOR_RGB2BGRA = COLOR_BGR2RGBA, - - COLOR_RGBA2BGR = 3, - COLOR_BGRA2RGB = COLOR_RGBA2BGR, - - COLOR_BGR2RGB = 4, - COLOR_RGB2BGR = COLOR_BGR2RGB, - - COLOR_BGRA2RGBA = 5, - COLOR_RGBA2BGRA = COLOR_BGRA2RGBA, - - COLOR_BGR2GRAY = 6, //!< convert between RGB/BGR and grayscale, @ref color_convert_rgb_gray "color conversions" - COLOR_RGB2GRAY = 7, - COLOR_GRAY2BGR = 8, - COLOR_GRAY2RGB = COLOR_GRAY2BGR, - COLOR_GRAY2BGRA = 9, - COLOR_GRAY2RGBA = COLOR_GRAY2BGRA, - COLOR_BGRA2GRAY = 10, - COLOR_RGBA2GRAY = 11, - - COLOR_BGR2BGR565 = 12, //!< convert between RGB/BGR and BGR565 (16-bit images) - COLOR_RGB2BGR565 = 13, - COLOR_BGR5652BGR = 14, - COLOR_BGR5652RGB = 15, - COLOR_BGRA2BGR565 = 16, - COLOR_RGBA2BGR565 = 17, - COLOR_BGR5652BGRA = 18, - COLOR_BGR5652RGBA = 19, - - COLOR_GRAY2BGR565 = 20, //!< convert between grayscale to BGR565 (16-bit images) - COLOR_BGR5652GRAY = 21, - - COLOR_BGR2BGR555 = 22, //!< convert between RGB/BGR and BGR555 (16-bit images) - COLOR_RGB2BGR555 = 23, - COLOR_BGR5552BGR = 24, - COLOR_BGR5552RGB = 25, - COLOR_BGRA2BGR555 = 26, - COLOR_RGBA2BGR555 = 27, - COLOR_BGR5552BGRA = 28, - COLOR_BGR5552RGBA = 29, - - COLOR_GRAY2BGR555 = 30, //!< convert between grayscale and BGR555 (16-bit images) - COLOR_BGR5552GRAY = 31, - - COLOR_BGR2XYZ = 32, //!< convert RGB/BGR to CIE XYZ, @ref color_convert_rgb_xyz "color conversions" - COLOR_RGB2XYZ = 33, - COLOR_XYZ2BGR = 34, - COLOR_XYZ2RGB = 35, - - COLOR_BGR2YCrCb = 36, //!< convert RGB/BGR to luma-chroma (aka YCC), @ref color_convert_rgb_ycrcb "color conversions" - COLOR_RGB2YCrCb = 37, - COLOR_YCrCb2BGR = 38, - COLOR_YCrCb2RGB = 39, - - COLOR_BGR2HSV = 40, //!< convert RGB/BGR to HSV (hue saturation value) with H range 0..180 if 8 bit image, @ref color_convert_rgb_hsv "color conversions" - COLOR_RGB2HSV = 41, - - COLOR_BGR2Lab = 44, //!< convert RGB/BGR to CIE Lab, @ref color_convert_rgb_lab "color conversions" - COLOR_RGB2Lab = 45, - - COLOR_BGR2Luv = 50, //!< convert RGB/BGR to CIE Luv, @ref color_convert_rgb_luv "color conversions" - COLOR_RGB2Luv = 51, - COLOR_BGR2HLS = 52, //!< convert RGB/BGR to HLS (hue lightness saturation) with H range 0..180 if 8 bit image, @ref color_convert_rgb_hls "color conversions" - COLOR_RGB2HLS = 53, - - COLOR_HSV2BGR = 54, //!< backward conversions HSV to RGB/BGR with H range 0..180 if 8 bit image - COLOR_HSV2RGB = 55, - - COLOR_Lab2BGR = 56, - COLOR_Lab2RGB = 57, - COLOR_Luv2BGR = 58, - COLOR_Luv2RGB = 59, - COLOR_HLS2BGR = 60, //!< backward conversions HLS to RGB/BGR with H range 0..180 if 8 bit image - COLOR_HLS2RGB = 61, - - COLOR_BGR2HSV_FULL = 66, //!< convert RGB/BGR to HSV (hue saturation value) with H range 0..255 if 8 bit image, @ref color_convert_rgb_hsv "color conversions" - COLOR_RGB2HSV_FULL = 67, - COLOR_BGR2HLS_FULL = 68, //!< convert RGB/BGR to HLS (hue lightness saturation) with H range 0..255 if 8 bit image, @ref color_convert_rgb_hls "color conversions" - COLOR_RGB2HLS_FULL = 69, - - COLOR_HSV2BGR_FULL = 70, //!< backward conversions HSV to RGB/BGR with H range 0..255 if 8 bit image - COLOR_HSV2RGB_FULL = 71, - COLOR_HLS2BGR_FULL = 72, //!< backward conversions HLS to RGB/BGR with H range 0..255 if 8 bit image - COLOR_HLS2RGB_FULL = 73, - - COLOR_LBGR2Lab = 74, - COLOR_LRGB2Lab = 75, - COLOR_LBGR2Luv = 76, - COLOR_LRGB2Luv = 77, - - COLOR_Lab2LBGR = 78, - COLOR_Lab2LRGB = 79, - COLOR_Luv2LBGR = 80, - COLOR_Luv2LRGB = 81, - - COLOR_BGR2YUV = 82, //!< convert between RGB/BGR and YUV - COLOR_RGB2YUV = 83, - COLOR_YUV2BGR = 84, - COLOR_YUV2RGB = 85, - - //! YUV 4:2:0 family to RGB - COLOR_YUV2RGB_NV12 = 90, - COLOR_YUV2BGR_NV12 = 91, - COLOR_YUV2RGB_NV21 = 92, - COLOR_YUV2BGR_NV21 = 93, - COLOR_YUV420sp2RGB = COLOR_YUV2RGB_NV21, - COLOR_YUV420sp2BGR = COLOR_YUV2BGR_NV21, - - COLOR_YUV2RGBA_NV12 = 94, - COLOR_YUV2BGRA_NV12 = 95, - COLOR_YUV2RGBA_NV21 = 96, - COLOR_YUV2BGRA_NV21 = 97, - COLOR_YUV420sp2RGBA = COLOR_YUV2RGBA_NV21, - COLOR_YUV420sp2BGRA = COLOR_YUV2BGRA_NV21, - - COLOR_YUV2RGB_YV12 = 98, - COLOR_YUV2BGR_YV12 = 99, - COLOR_YUV2RGB_IYUV = 100, - COLOR_YUV2BGR_IYUV = 101, - COLOR_YUV2RGB_I420 = COLOR_YUV2RGB_IYUV, - COLOR_YUV2BGR_I420 = COLOR_YUV2BGR_IYUV, - COLOR_YUV420p2RGB = COLOR_YUV2RGB_YV12, - COLOR_YUV420p2BGR = COLOR_YUV2BGR_YV12, - - COLOR_YUV2RGBA_YV12 = 102, - COLOR_YUV2BGRA_YV12 = 103, - COLOR_YUV2RGBA_IYUV = 104, - COLOR_YUV2BGRA_IYUV = 105, - COLOR_YUV2RGBA_I420 = COLOR_YUV2RGBA_IYUV, - COLOR_YUV2BGRA_I420 = COLOR_YUV2BGRA_IYUV, - COLOR_YUV420p2RGBA = COLOR_YUV2RGBA_YV12, - COLOR_YUV420p2BGRA = COLOR_YUV2BGRA_YV12, - - COLOR_YUV2GRAY_420 = 106, - COLOR_YUV2GRAY_NV21 = COLOR_YUV2GRAY_420, - COLOR_YUV2GRAY_NV12 = COLOR_YUV2GRAY_420, - COLOR_YUV2GRAY_YV12 = COLOR_YUV2GRAY_420, - COLOR_YUV2GRAY_IYUV = COLOR_YUV2GRAY_420, - COLOR_YUV2GRAY_I420 = COLOR_YUV2GRAY_420, - COLOR_YUV420sp2GRAY = COLOR_YUV2GRAY_420, - COLOR_YUV420p2GRAY = COLOR_YUV2GRAY_420, - - //! YUV 4:2:2 family to RGB - COLOR_YUV2RGB_UYVY = 107, - COLOR_YUV2BGR_UYVY = 108, - // COLOR_YUV2RGB_VYUY = 109, - // COLOR_YUV2BGR_VYUY = 110, - COLOR_YUV2RGB_Y422 = COLOR_YUV2RGB_UYVY, - COLOR_YUV2BGR_Y422 = COLOR_YUV2BGR_UYVY, - COLOR_YUV2RGB_UYNV = COLOR_YUV2RGB_UYVY, - COLOR_YUV2BGR_UYNV = COLOR_YUV2BGR_UYVY, - - COLOR_YUV2RGBA_UYVY = 111, - COLOR_YUV2BGRA_UYVY = 112, - // COLOR_YUV2RGBA_VYUY = 113, - // COLOR_YUV2BGRA_VYUY = 114, - COLOR_YUV2RGBA_Y422 = COLOR_YUV2RGBA_UYVY, - COLOR_YUV2BGRA_Y422 = COLOR_YUV2BGRA_UYVY, - COLOR_YUV2RGBA_UYNV = COLOR_YUV2RGBA_UYVY, - COLOR_YUV2BGRA_UYNV = COLOR_YUV2BGRA_UYVY, - - COLOR_YUV2RGB_YUY2 = 115, - COLOR_YUV2BGR_YUY2 = 116, - COLOR_YUV2RGB_YVYU = 117, - COLOR_YUV2BGR_YVYU = 118, - COLOR_YUV2RGB_YUYV = COLOR_YUV2RGB_YUY2, - COLOR_YUV2BGR_YUYV = COLOR_YUV2BGR_YUY2, - COLOR_YUV2RGB_YUNV = COLOR_YUV2RGB_YUY2, - COLOR_YUV2BGR_YUNV = COLOR_YUV2BGR_YUY2, - - COLOR_YUV2RGBA_YUY2 = 119, - COLOR_YUV2BGRA_YUY2 = 120, - COLOR_YUV2RGBA_YVYU = 121, - COLOR_YUV2BGRA_YVYU = 122, - COLOR_YUV2RGBA_YUYV = COLOR_YUV2RGBA_YUY2, - COLOR_YUV2BGRA_YUYV = COLOR_YUV2BGRA_YUY2, - COLOR_YUV2RGBA_YUNV = COLOR_YUV2RGBA_YUY2, - COLOR_YUV2BGRA_YUNV = COLOR_YUV2BGRA_YUY2, - - COLOR_YUV2GRAY_UYVY = 123, - COLOR_YUV2GRAY_YUY2 = 124, - // CV_YUV2GRAY_VYUY = CV_YUV2GRAY_UYVY, - COLOR_YUV2GRAY_Y422 = COLOR_YUV2GRAY_UYVY, - COLOR_YUV2GRAY_UYNV = COLOR_YUV2GRAY_UYVY, - COLOR_YUV2GRAY_YVYU = COLOR_YUV2GRAY_YUY2, - COLOR_YUV2GRAY_YUYV = COLOR_YUV2GRAY_YUY2, - COLOR_YUV2GRAY_YUNV = COLOR_YUV2GRAY_YUY2, - - //! alpha premultiplication - COLOR_RGBA2mRGBA = 125, - COLOR_mRGBA2RGBA = 126, - - //! RGB to YUV 4:2:0 family - COLOR_RGB2YUV_I420 = 127, - COLOR_BGR2YUV_I420 = 128, - COLOR_RGB2YUV_IYUV = COLOR_RGB2YUV_I420, - COLOR_BGR2YUV_IYUV = COLOR_BGR2YUV_I420, - - COLOR_RGBA2YUV_I420 = 129, - COLOR_BGRA2YUV_I420 = 130, - COLOR_RGBA2YUV_IYUV = COLOR_RGBA2YUV_I420, - COLOR_BGRA2YUV_IYUV = COLOR_BGRA2YUV_I420, - COLOR_RGB2YUV_YV12 = 131, - COLOR_BGR2YUV_YV12 = 132, - COLOR_RGBA2YUV_YV12 = 133, - COLOR_BGRA2YUV_YV12 = 134, - - //! Demosaicing, see @ref color_convert_bayer "color conversions" for additional information - COLOR_BayerBG2BGR = 46, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2BGR = 47, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2BGR = 48, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2BGR = 49, //!< equivalent to GBRG Bayer pattern - - COLOR_BayerRGGB2BGR = COLOR_BayerBG2BGR, - COLOR_BayerGRBG2BGR = COLOR_BayerGB2BGR, - COLOR_BayerBGGR2BGR = COLOR_BayerRG2BGR, - COLOR_BayerGBRG2BGR = COLOR_BayerGR2BGR, - - COLOR_BayerRGGB2RGB = COLOR_BayerBGGR2BGR, - COLOR_BayerGRBG2RGB = COLOR_BayerGBRG2BGR, - COLOR_BayerBGGR2RGB = COLOR_BayerRGGB2BGR, - COLOR_BayerGBRG2RGB = COLOR_BayerGRBG2BGR, - - COLOR_BayerBG2RGB = COLOR_BayerRG2BGR, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2RGB = COLOR_BayerGR2BGR, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2RGB = COLOR_BayerBG2BGR, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2RGB = COLOR_BayerGB2BGR, //!< equivalent to GBRG Bayer pattern - - COLOR_BayerBG2GRAY = 86, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2GRAY = 87, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2GRAY = 88, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2GRAY = 89, //!< equivalent to GBRG Bayer pattern - - COLOR_BayerRGGB2GRAY = COLOR_BayerBG2GRAY, - COLOR_BayerGRBG2GRAY = COLOR_BayerGB2GRAY, - COLOR_BayerBGGR2GRAY = COLOR_BayerRG2GRAY, - COLOR_BayerGBRG2GRAY = COLOR_BayerGR2GRAY, - - //! Demosaicing using Variable Number of Gradients - COLOR_BayerBG2BGR_VNG = 62, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2BGR_VNG = 63, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2BGR_VNG = 64, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2BGR_VNG = 65, //!< equivalent to GBRG Bayer pattern - - COLOR_BayerRGGB2BGR_VNG = COLOR_BayerBG2BGR_VNG, - COLOR_BayerGRBG2BGR_VNG = COLOR_BayerGB2BGR_VNG, - COLOR_BayerBGGR2BGR_VNG = COLOR_BayerRG2BGR_VNG, - COLOR_BayerGBRG2BGR_VNG = COLOR_BayerGR2BGR_VNG, - - COLOR_BayerRGGB2RGB_VNG = COLOR_BayerBGGR2BGR_VNG, - COLOR_BayerGRBG2RGB_VNG = COLOR_BayerGBRG2BGR_VNG, - COLOR_BayerBGGR2RGB_VNG = COLOR_BayerRGGB2BGR_VNG, - COLOR_BayerGBRG2RGB_VNG = COLOR_BayerGRBG2BGR_VNG, - - COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG, //!< equivalent to GBRG Bayer pattern - - //! Edge-Aware Demosaicing - COLOR_BayerBG2BGR_EA = 135, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2BGR_EA = 136, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2BGR_EA = 137, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2BGR_EA = 138, //!< equivalent to GBRG Bayer pattern - - COLOR_BayerRGGB2BGR_EA = COLOR_BayerBG2BGR_EA, - COLOR_BayerGRBG2BGR_EA = COLOR_BayerGB2BGR_EA, - COLOR_BayerBGGR2BGR_EA = COLOR_BayerRG2BGR_EA, - COLOR_BayerGBRG2BGR_EA = COLOR_BayerGR2BGR_EA, - - COLOR_BayerRGGB2RGB_EA = COLOR_BayerBGGR2BGR_EA, - COLOR_BayerGRBG2RGB_EA = COLOR_BayerGBRG2BGR_EA, - COLOR_BayerBGGR2RGB_EA = COLOR_BayerRGGB2BGR_EA, - COLOR_BayerGBRG2RGB_EA = COLOR_BayerGRBG2BGR_EA, - - COLOR_BayerBG2RGB_EA = COLOR_BayerRG2BGR_EA, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2RGB_EA = COLOR_BayerGR2BGR_EA, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2RGB_EA = COLOR_BayerBG2BGR_EA, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2RGB_EA = COLOR_BayerGB2BGR_EA, //!< equivalent to GBRG Bayer pattern - - //! Demosaicing with alpha channel - COLOR_BayerBG2BGRA = 139, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2BGRA = 140, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2BGRA = 141, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2BGRA = 142, //!< equivalent to GBRG Bayer pattern - - COLOR_BayerRGGB2BGRA = COLOR_BayerBG2BGRA, - COLOR_BayerGRBG2BGRA = COLOR_BayerGB2BGRA, - COLOR_BayerBGGR2BGRA = COLOR_BayerRG2BGRA, - COLOR_BayerGBRG2BGRA = COLOR_BayerGR2BGRA, - - COLOR_BayerRGGB2RGBA = COLOR_BayerBGGR2BGRA, - COLOR_BayerGRBG2RGBA = COLOR_BayerGBRG2BGRA, - COLOR_BayerBGGR2RGBA = COLOR_BayerRGGB2BGRA, - COLOR_BayerGBRG2RGBA = COLOR_BayerGRBG2BGRA, - - COLOR_BayerBG2RGBA = COLOR_BayerRG2BGRA, //!< equivalent to RGGB Bayer pattern - COLOR_BayerGB2RGBA = COLOR_BayerGR2BGRA, //!< equivalent to GRBG Bayer pattern - COLOR_BayerRG2RGBA = COLOR_BayerBG2BGRA, //!< equivalent to BGGR Bayer pattern - COLOR_BayerGR2RGBA = COLOR_BayerGB2BGRA, //!< equivalent to GBRG Bayer pattern - - //! RGB to YUV 4:2:2 family - - COLOR_RGB2YUV_UYVY = 143, - COLOR_BGR2YUV_UYVY = 144, - COLOR_RGB2YUV_Y422 = COLOR_RGB2YUV_UYVY, - COLOR_BGR2YUV_Y422 = COLOR_BGR2YUV_UYVY, - COLOR_RGB2YUV_UYNV = COLOR_RGB2YUV_UYVY, - COLOR_BGR2YUV_UYNV = COLOR_BGR2YUV_UYVY, - - COLOR_RGBA2YUV_UYVY = 145, - COLOR_BGRA2YUV_UYVY = 146, - COLOR_RGBA2YUV_Y422 = COLOR_RGBA2YUV_UYVY, - COLOR_BGRA2YUV_Y422 = COLOR_BGRA2YUV_UYVY, - COLOR_RGBA2YUV_UYNV = COLOR_RGBA2YUV_UYVY, - COLOR_BGRA2YUV_UYNV = COLOR_BGRA2YUV_UYVY, - - COLOR_RGB2YUV_YUY2 = 147, - COLOR_BGR2YUV_YUY2 = 148, - COLOR_RGB2YUV_YVYU = 149, - COLOR_BGR2YUV_YVYU = 150, - COLOR_RGB2YUV_YUYV = COLOR_RGB2YUV_YUY2, - COLOR_BGR2YUV_YUYV = COLOR_BGR2YUV_YUY2, - COLOR_RGB2YUV_YUNV = COLOR_RGB2YUV_YUY2, - COLOR_BGR2YUV_YUNV = COLOR_BGR2YUV_YUY2, - - COLOR_RGBA2YUV_YUY2 = 151, - COLOR_BGRA2YUV_YUY2 = 152, - COLOR_RGBA2YUV_YVYU = 153, - COLOR_BGRA2YUV_YVYU = 154, - COLOR_RGBA2YUV_YUYV = COLOR_RGBA2YUV_YUY2, - COLOR_BGRA2YUV_YUYV = COLOR_BGRA2YUV_YUY2, - COLOR_RGBA2YUV_YUNV = COLOR_RGBA2YUV_YUY2, - COLOR_BGRA2YUV_YUNV = COLOR_BGRA2YUV_YUY2, - - COLOR_COLORCVT_MAX = 155 -}; - -/** Histogram comparison methods - @ingroup imgproc_hist -*/ -enum -{ - /** Correlation - \f[d(H_1,H_2) = \frac{\sum_I (H_1(I) - \bar{H_1}) (H_2(I) - \bar{H_2})}{\sqrt{\sum_I(H_1(I) - \bar{H_1})^2 \sum_I(H_2(I) - \bar{H_2})^2}}\f] - where - \f[\bar{H_k} = \frac{1}{N} \sum _J H_k(J)\f] - and \f$N\f$ is a total number of histogram bins. */ - HISTCMP_CORREL = 0, - /** Chi-Square - \f[d(H_1,H_2) = \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)}\f] */ - HISTCMP_CHISQR = 1, - /** Intersection - \f[d(H_1,H_2) = \sum _I \min (H_1(I), H_2(I))\f] */ - HISTCMP_INTERSECT = 2, - /** Bhattacharyya distance - (In fact, OpenCV computes Hellinger distance, which is related to Bhattacharyya coefficient.) - \f[d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} N^2}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}\f] */ - HISTCMP_BHATTACHARYYA = 3, - HISTCMP_HELLINGER = HISTCMP_BHATTACHARYYA, //!< Synonym for HISTCMP_BHATTACHARYYA - /** Alternative Chi-Square - \f[d(H_1,H_2) = 2 * \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)+H_2(I)}\f] - This alternative formula is regularly used for texture comparison. See e.g. @cite Puzicha1997 */ - HISTCMP_CHISQR_ALT = 4, - /** Kullback-Leibler divergence - \f[d(H_1,H_2) = \sum _I H_1(I) \log \left(\frac{H_1(I)}{H_2(I)}\right)\f] */ - HISTCMP_KL_DIV = 5 -}; - -//! Various border types, image boundaries are denoted with `|` -//! @see borderInterpolate, copyMakeBorder -enum -{ - BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i` - BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh` - BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb` - BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg` - BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba` - BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno` - Treats outliers as transparent. - - BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101 - BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101 - BORDER_ISOLATED = 16 //!< Interpolation restricted within the ROI boundaries. -}; - -enum -{ - FILTER_SCHARR = -1 -}; - -//! type of morphological operation -enum -{ - MORPH_ERODE = 0, //!< see #erode - MORPH_DILATE = 1, //!< see #dilate - MORPH_OPEN = 2, //!< an opening operation - //!< \f[\texttt{dst} = \mathrm{open} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \mathrm{erode} ( \texttt{src} , \texttt{element} ))\f] - MORPH_CLOSE = 3, //!< a closing operation - //!< \f[\texttt{dst} = \mathrm{close} ( \texttt{src} , \texttt{element} )= \mathrm{erode} ( \mathrm{dilate} ( \texttt{src} , \texttt{element} ))\f] - MORPH_GRADIENT = 4, //!< a morphological gradient - //!< \f[\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} )\f] - MORPH_TOPHAT = 5, //!< "top hat" - //!< \f[\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} )\f] - MORPH_BLACKHAT = 6, //!< "black hat" - //!< \f[\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}\f] - MORPH_HITMISS = 7 //!< "hit or miss" - //!< .- Only supported for CV_8UC1 binary images. A tutorial can be found in the documentation -}; - -//! shape of the structuring element -enum -{ - MORPH_RECT = 0, //!< a rectangular structuring element: \f[E_{ij}=1\f] - MORPH_CROSS = 1, //!< a cross-shaped structuring element: - //!< \f[E_{ij} = \begin{cases} 1 & \texttt{if } {i=\texttt{anchor.y } {or } {j=\texttt{anchor.x}}} \\0 & \texttt{otherwise} \end{cases}\f] - MORPH_ELLIPSE = 2 //!< an elliptic structuring element, that is, a filled ellipse inscribed - //!< into the rectangle Rect(0, 0, esize.width, 0.esize.height) -}; - -//! @} imgproc_filter - -//! @addtogroup imgproc_transform -//! @{ - -//! interpolation algorithm -enum -{ - /** nearest neighbor interpolation */ - INTER_NEAREST = 0, - /** bilinear interpolation */ - INTER_LINEAR = 1, - /** bicubic interpolation */ - INTER_CUBIC = 2, - /** resampling using pixel area relation. It may be a preferred method for image decimation, as - it gives moire'-free results. But when the image is zoomed, it is similar to the INTER_NEAREST - method. */ - INTER_AREA = 3, - /** Lanczos interpolation over 8x8 neighborhood */ - INTER_LANCZOS4 = 4, - /** Bit exact bilinear interpolation */ - INTER_LINEAR_EXACT = 5, - /** Bit exact nearest neighbor interpolation. This will produce same results as - the nearest neighbor method in PIL, scikit-image or Matlab. */ - INTER_NEAREST_EXACT = 6, - /** mask for interpolation codes */ - INTER_MAX = 7, - /** flag, fills all of the destination image pixels. If some of them correspond to outliers in the - source image, they are set to zero */ - WARP_FILL_OUTLIERS = 8, - /** flag, inverse transformation - - For example, #linearPolar or #logPolar transforms: - - flag is __not__ set: \f$dst( \rho , \phi ) = src(x,y)\f$ - - flag is set: \f$dst(x,y) = src( \rho , \phi )\f$ - */ - WARP_INVERSE_MAP = 16 -}; - -/** \brief Specify the polar mapping mode -@sa warpPolar -*/ -enum -{ - WARP_POLAR_LINEAR = 0, ///< Remaps an image to/from polar space. - WARP_POLAR_LOG = 256 ///< Remaps an image to/from semilog-polar space. -}; - -enum -{ - INTER_BITS = 5, - INTER_BITS2 = INTER_BITS * 2, - INTER_TAB_SIZE = 1 << INTER_BITS, - INTER_TAB_SIZE2 = INTER_TAB_SIZE * INTER_TAB_SIZE -}; - -//! @} imgproc_transform - -//! @addtogroup imgproc_misc -//! @{ - -//! Distance types for Distance Transform and M-estimators -//! @see distanceTransform, fitLine -enum -{ - DIST_USER = -1, //!< User defined distance - DIST_L1 = 1, //!< distance = |x1-x2| + |y1-y2| - DIST_L2 = 2, //!< the simple euclidean distance - DIST_C = 3, //!< distance = max(|x1-x2|,|y1-y2|) - DIST_L12 = 4, //!< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) - DIST_FAIR = 5, //!< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998 - DIST_WELSCH = 6, //!< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846 - DIST_HUBER = 7 //!< distance = |x| \texttt{thresh}\)}{0}{otherwise}\f] - THRESH_BINARY_INV = 1, //!< \f[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{maxval}}{otherwise}\f] - THRESH_TRUNC = 2, //!< \f[\texttt{dst} (x,y) = \fork{\texttt{threshold}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f] - THRESH_TOZERO = 3, //!< \f[\texttt{dst} (x,y) = \fork{\texttt{src}(x,y)}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\f] - THRESH_TOZERO_INV = 4, //!< \f[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f] - THRESH_MASK = 7, - THRESH_OTSU = 8, //!< flag, use Otsu algorithm to choose the optimal threshold value - THRESH_TRIANGLE = 16 //!< flag, use Triangle algorithm to choose the optimal threshold value -}; - -//! adaptive threshold algorithm -//! @see adaptiveThreshold -enum -{ - /** the threshold value \f$T(x,y)\f$ is a mean of the \f$\texttt{blockSize} \times - \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$ minus C */ - ADAPTIVE_THRESH_MEAN_C = 0, - /** the threshold value \f$T(x, y)\f$ is a weighted sum (cross-correlation with a Gaussian - window) of the \f$\texttt{blockSize} \times \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$ - minus C . The default sigma (standard deviation) is used for the specified blockSize . See - #getGaussianKernel*/ - ADAPTIVE_THRESH_GAUSSIAN_C = 1 -}; - -//! class of the pixel in GrabCut algorithm -enum -{ - GC_BGD = 0, //!< an obvious background pixels - GC_FGD = 1, //!< an obvious foreground (object) pixel - GC_PR_BGD = 2, //!< a possible background pixel - GC_PR_FGD = 3 //!< a possible foreground pixel -}; - -//! GrabCut algorithm flags -enum -{ - /** The function initializes the state and the mask using the provided rectangle. After that it - runs iterCount iterations of the algorithm. */ - GC_INIT_WITH_RECT = 0, - /** The function initializes the state using the provided mask. Note that GC_INIT_WITH_RECT - and GC_INIT_WITH_MASK can be combined. Then, all the pixels outside of the ROI are - automatically initialized with GC_BGD .*/ - GC_INIT_WITH_MASK = 1, - /** The value means that the algorithm should just resume. */ - GC_EVAL = 2, - /** The value means that the algorithm should just run the grabCut algorithm (a single iteration) with the fixed model */ - GC_EVAL_FREEZE_MODEL = 3 -}; - -//! distanceTransform algorithm flags -enum -{ - /** each connected component of zeros in src (as well as all the non-zero pixels closest to the - connected component) will be assigned the same label */ - DIST_LABEL_CCOMP = 0, - /** each zero pixel (and all the non-zero pixels closest to it) gets its own label. */ - DIST_LABEL_PIXEL = 1 -}; - -//! floodfill algorithm flags -enum -{ - /** If set, the difference between the current pixel and seed pixel is considered. Otherwise, - the difference between neighbor pixels is considered (that is, the range is floating). */ - FLOODFILL_FIXED_RANGE = 1 << 16, - /** If set, the function does not change the image ( newVal is ignored), and only fills the - mask with the value specified in bits 8-16 of flags as described above. This option only make - sense in function variants that have the mask parameter. */ - FLOODFILL_MASK_ONLY = 1 << 17 -}; - -//! @} imgproc_misc - -//! @addtogroup imgproc_shape -//! @{ - -//! connected components statistics -enum -{ - CC_STAT_LEFT = 0, //!< The leftmost (x) coordinate which is the inclusive start of the bounding - //!< box in the horizontal direction. - CC_STAT_TOP = 1, //!< The topmost (y) coordinate which is the inclusive start of the bounding - //!< box in the vertical direction. - CC_STAT_WIDTH = 2, //!< The horizontal size of the bounding box - CC_STAT_HEIGHT = 3, //!< The vertical size of the bounding box - CC_STAT_AREA = 4, //!< The total area (in pixels) of the connected component -#ifndef CV_DOXYGEN - CC_STAT_MAX = 5 //!< Max enumeration value. Used internally only for memory allocation -#endif -}; - -//! connected components algorithm -enum -{ - CCL_DEFAULT = -1, //!< Spaghetti @cite Bolelli2019 algorithm for 8-way connectivity, Spaghetti4C @cite Bolelli2021 algorithm for 4-way connectivity. - CCL_WU = 0, //!< SAUF @cite Wu2009 algorithm for 8-way connectivity, SAUF algorithm for 4-way connectivity. The parallel implementation described in @cite Bolelli2017 is available for SAUF. - CCL_GRANA = 1, //!< BBDT @cite Grana2010 algorithm for 8-way connectivity, SAUF algorithm for 4-way connectivity. The parallel implementation described in @cite Bolelli2017 is available for both BBDT and SAUF. - CCL_BOLELLI = 2, //!< Spaghetti @cite Bolelli2019 algorithm for 8-way connectivity, Spaghetti4C @cite Bolelli2021 algorithm for 4-way connectivity. The parallel implementation described in @cite Bolelli2017 is available for both Spaghetti and Spaghetti4C. - CCL_SAUF = 3, //!< Same as CCL_WU. It is preferable to use the flag with the name of the algorithm (CCL_SAUF) rather than the one with the name of the first author (CCL_WU). - CCL_BBDT = 4, //!< Same as CCL_GRANA. It is preferable to use the flag with the name of the algorithm (CCL_BBDT) rather than the one with the name of the first author (CCL_GRANA). - CCL_SPAGHETTI = 5, //!< Same as CCL_BOLELLI. It is preferable to use the flag with the name of the algorithm (CCL_SPAGHETTI) rather than the one with the name of the first author (CCL_BOLELLI). -}; - -//! mode of the contour retrieval algorithm -enum -{ - /** retrieves only the extreme outer contours. It sets `hierarchy[i][2]=hierarchy[i][3]=-1` for - all the contours. */ - RETR_EXTERNAL = 0, - /** retrieves all of the contours without establishing any hierarchical relationships. */ - RETR_LIST = 1, - /** retrieves all of the contours and organizes them into a two-level hierarchy. At the top - level, there are external boundaries of the components. At the second level, there are - boundaries of the holes. If there is another contour inside a hole of a connected component, it - is still put at the top level. */ - RETR_CCOMP = 2, - /** retrieves all of the contours and reconstructs a full hierarchy of nested contours.*/ - RETR_TREE = 3, - RETR_FLOODFILL = 4 //!< -}; - -//! the contour approximation algorithm -enum -{ - /** stores absolutely all the contour points. That is, any 2 subsequent points (x1,y1) and - (x2,y2) of the contour will be either horizontal, vertical or diagonal neighbors, that is, - max(abs(x1-x2),abs(y2-y1))==1. */ - CHAIN_APPROX_NONE = 1, - /** compresses horizontal, vertical, and diagonal segments and leaves only their end points. - For example, an up-right rectangular contour is encoded with 4 points. */ - CHAIN_APPROX_SIMPLE = 2, - /** applies one of the flavors of the Teh-Chin chain approximation algorithm @cite TehChin89 */ - CHAIN_APPROX_TC89_L1 = 3, - /** applies one of the flavors of the Teh-Chin chain approximation algorithm @cite TehChin89 */ - CHAIN_APPROX_TC89_KCOS = 4 -}; - -/** @brief Shape matching methods - -\f$A\f$ denotes object1,\f$B\f$ denotes object2 - -\f$\begin{array}{l} m^A_i = \mathrm{sign} (h^A_i) \cdot \log{h^A_i} \\ m^B_i = \mathrm{sign} (h^B_i) \cdot \log{h^B_i} \end{array}\f$ - -and \f$h^A_i, h^B_i\f$ are the Hu moments of \f$A\f$ and \f$B\f$ , respectively. -*/ -enum -{ - CONTOURS_MATCH_I1 = 1, //!< \f[I_1(A,B) = \sum _{i=1...7} \left | \frac{1}{m^A_i} - \frac{1}{m^B_i} \right |\f] - CONTOURS_MATCH_I2 = 2, //!< \f[I_2(A,B) = \sum _{i=1...7} \left | m^A_i - m^B_i \right |\f] - CONTOURS_MATCH_I3 = 3 //!< \f[I_3(A,B) = \max _{i=1...7} \frac{ \left| m^A_i - m^B_i \right| }{ \left| m^A_i \right| }\f] -}; - -//! @} imgproc_shape - -//! @addtogroup imgproc_feature -//! @{ - -//! Variants of a Hough transform -enum -{ - - /** classical or standard Hough transform. Every line is represented by two floating-point - numbers \f$(\rho, \theta)\f$ , where \f$\rho\f$ is a distance between (0,0) point and the line, - and \f$\theta\f$ is the angle between x-axis and the normal to the line. Thus, the matrix must - be (the created sequence will be) of CV_32FC2 type */ - HOUGH_STANDARD = 0, - /** probabilistic Hough transform (more efficient in case if the picture contains a few long - linear segments). It returns line segments rather than the whole line. Each segment is - represented by starting and ending points, and the matrix must be (the created sequence will - be) of the CV_32SC4 type. */ - HOUGH_PROBABILISTIC = 1, - /** multi-scale variant of the classical Hough transform. The lines are encoded the same way as - HOUGH_STANDARD. */ - HOUGH_MULTI_SCALE = 2, - HOUGH_GRADIENT = 3, //!< basically *21HT*, described in @cite Yuen90 - HOUGH_GRADIENT_ALT = 4, //!< variation of HOUGH_GRADIENT to get better accuracy -}; - -//! Variants of Line Segment %Detector -enum -{ - LSD_REFINE_NONE = 0, //!< No refinement applied - LSD_REFINE_STD = 1, //!< Standard refinement is applied. E.g. breaking arches into smaller straighter line approximations. - LSD_REFINE_ADV = 2 //!< Advanced refinement. Number of false alarms is calculated, lines are - //!< refined through increase of precision, decrement in size, etc. -}; - -//! @addtogroup imgproc_shape -//! @{ - -//! types of intersection between rectangles -enum -{ - INTERSECT_NONE = 0, //!< No intersection - INTERSECT_PARTIAL = 1, //!< There is a partial intersection - INTERSECT_FULL = 2 //!< One of the rectangle is fully enclosed in the other -}; - -/** types of line -@ingroup imgproc_draw -*/ -enum -{ - FILLED = -1, - LINE_4 = 4, //!< 4-connected line - LINE_8 = 8, //!< 8-connected line - LINE_AA = 16 //!< antialiased line -}; - -/** Only a subset of Hershey fonts are supported -@ingroup imgproc_draw -*/ -enum -{ - FONT_HERSHEY_SIMPLEX = 0, //!< normal size sans-serif font - FONT_HERSHEY_PLAIN = 1, //!< small size sans-serif font - FONT_HERSHEY_DUPLEX = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX) - FONT_HERSHEY_COMPLEX = 3, //!< normal size serif font - FONT_HERSHEY_TRIPLEX = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX) - FONT_HERSHEY_COMPLEX_SMALL = 5, //!< smaller version of FONT_HERSHEY_COMPLEX - FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font - FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX - FONT_ITALIC = 16 //!< flag for italic font -}; - -/** Possible set of marker types used for the cv::drawMarker function -@ingroup imgproc_draw -*/ -enum -{ - MARKER_CROSS = 0, //!< A crosshair marker shape - MARKER_TILTED_CROSS = 1, //!< A 45 degree tilted crosshair marker shape - MARKER_STAR = 2, //!< A star marker shape, combination of cross and tilted cross - MARKER_DIAMOND = 3, //!< A diamond marker shape - MARKER_SQUARE = 4, //!< A square marker shape - MARKER_TRIANGLE_UP = 5, //!< An upwards pointing triangle marker shape - MARKER_TRIANGLE_DOWN = 6 //!< A downwards pointing triangle marker shape -}; - -//! matrix decomposition types -enum -{ - /** Gaussian elimination with the optimal pivot element chosen. */ - DECOMP_LU = 0, - /** singular value decomposition (SVD) method; the system can be over-defined and/or the matrix - src1 can be singular */ - DECOMP_SVD = 1, - /** eigenvalue decomposition; the matrix src1 must be symmetrical */ - DECOMP_EIG = 2, - /** Cholesky \f$LL^T\f$ factorization; the matrix src1 must be symmetrical and positively - defined */ - DECOMP_CHOLESKY = 3, - /** QR factorization; the system can be over-defined and/or the matrix src1 can be singular */ - DECOMP_QR = 4, - /** while all the previous flags are mutually exclusive, this flag can be used together with - any of the previous; it means that the normal equations - \f$\texttt{src1}^T\cdot\texttt{src1}\cdot\texttt{dst}=\texttt{src1}^T\texttt{src2}\f$ are - solved instead of the original system - \f$\texttt{src1}\cdot\texttt{dst}=\texttt{src2}\f$ */ - DECOMP_NORMAL = 16 -}; - -/** norm types - -src1 and src2 denote input arrays. -*/ - -enum -{ - /** - \f[ - norm = \forkthree - {\|\texttt{src1}\|_{L_{\infty}} = \max _I | \texttt{src1} (I)|}{if \(\texttt{normType} = \texttt{NORM_INF}\) } - {\|\texttt{src1}-\texttt{src2}\|_{L_{\infty}} = \max _I | \texttt{src1} (I) - \texttt{src2} (I)|}{if \(\texttt{normType} = \texttt{NORM_INF}\) } - {\frac{\|\texttt{src1}-\texttt{src2}\|_{L_{\infty}} }{\|\texttt{src2}\|_{L_{\infty}} }}{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_INF}\) } - \f] - */ - NORM_INF = 1, - /** - \f[ - norm = \forkthree - {\| \texttt{src1} \| _{L_1} = \sum _I | \texttt{src1} (I)|}{if \(\texttt{normType} = \texttt{NORM_L1}\)} - { \| \texttt{src1} - \texttt{src2} \| _{L_1} = \sum _I | \texttt{src1} (I) - \texttt{src2} (I)|}{if \(\texttt{normType} = \texttt{NORM_L1}\) } - { \frac{\|\texttt{src1}-\texttt{src2}\|_{L_1} }{\|\texttt{src2}\|_{L_1}} }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L1}\) } - \f]*/ - NORM_L1 = 2, - /** - \f[ - norm = \forkthree - { \| \texttt{src1} \| _{L_2} = \sqrt{\sum_I \texttt{src1}(I)^2} }{if \(\texttt{normType} = \texttt{NORM_L2}\) } - { \| \texttt{src1} - \texttt{src2} \| _{L_2} = \sqrt{\sum_I (\texttt{src1}(I) - \texttt{src2}(I))^2} }{if \(\texttt{normType} = \texttt{NORM_L2}\) } - { \frac{\|\texttt{src1}-\texttt{src2}\|_{L_2} }{\|\texttt{src2}\|_{L_2}} }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L2}\) } - \f] - */ - NORM_L2 = 4, - /** - \f[ - norm = \forkthree - { \| \texttt{src1} \| _{L_2} ^{2} = \sum_I \texttt{src1}(I)^2} {if \(\texttt{normType} = \texttt{NORM_L2SQR}\)} - { \| \texttt{src1} - \texttt{src2} \| _{L_2} ^{2} = \sum_I (\texttt{src1}(I) - \texttt{src2}(I))^2 }{if \(\texttt{normType} = \texttt{NORM_L2SQR}\) } - { \left(\frac{\|\texttt{src1}-\texttt{src2}\|_{L_2} }{\|\texttt{src2}\|_{L_2}}\right)^2 }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L2SQR}\) } - \f] - */ - NORM_L2SQR = 5, - /** - In the case of one input array, calculates the Hamming distance of the array from zero, - In the case of two input arrays, calculates the Hamming distance between the arrays. - */ - NORM_HAMMING = 6, - /** - Similar to NORM_HAMMING, but in the calculation, each two bits of the input sequence will - be added and treated as a single bit to be used in the same calculation as NORM_HAMMING. - */ - NORM_HAMMING2 = 7, - NORM_TYPE_MASK = 7, //!< bit-mask which can be used to separate norm type from norm flags - NORM_RELATIVE = 8, //!< flag - NORM_MINMAX = 32 //!< flag -}; - -//! comparison types -enum -{ - CMP_EQ = 0, //!< src1 is equal to src2. - CMP_GT = 1, //!< src1 is greater than src2. - CMP_GE = 2, //!< src1 is greater than or equal to src2. - CMP_LT = 3, //!< src1 is less than src2. - CMP_LE = 4, //!< src1 is less than or equal to src2. - CMP_NE = 5 //!< src1 is unequal to src2. -}; - -//! generalized matrix multiplication flags -enum -{ - GEMM_1_T = 1, //!< transposes src1 - GEMM_2_T = 2, //!< transposes src2 - GEMM_3_T = 4 //!< transposes src3 -}; - -enum -{ - /** performs an inverse 1D or 2D transform instead of the default forward - transform. */ - DFT_INVERSE = 1, - /** scales the result: divide it by the number of array elements. Normally, it is - combined with DFT_INVERSE. */ - DFT_SCALE = 2, - /** performs a forward or inverse transform of every individual row of the input - matrix; this flag enables you to transform multiple vectors simultaneously and can be used to - decrease the overhead (which is sometimes several times larger than the processing itself) to - perform 3D and higher-dimensional transformations and so forth.*/ - DFT_ROWS = 4, - /** performs a forward transformation of 1D or 2D real array; the result, - though being a complex array, has complex-conjugate symmetry (*CCS*, see the function - description below for details), and such an array can be packed into a real array of the same - size as input, which is the fastest option and which is what the function does by default; - however, you may wish to get a full complex array (for simpler spectrum analysis, and so on) - - pass the flag to enable the function to produce a full-size complex output array. */ - DFT_COMPLEX_OUTPUT = 16, - /** performs an inverse transformation of a 1D or 2D complex array; the - result is normally a complex array of the same size, however, if the input array has - conjugate-complex symmetry (for example, it is a result of forward transformation with - DFT_COMPLEX_OUTPUT flag), the output is a real array; while the function itself does not - check whether the input is symmetrical or not, you can pass the flag and then the function - will assume the symmetry and produce the real output array (note that when the input is packed - into a real array and inverse transformation is executed, the function treats the input as a - packed complex-conjugate symmetrical array, and the output will also be a real array). */ - DFT_REAL_OUTPUT = 32, - /** specifies that input is complex input. If this flag is set, the input must have 2 channels. - On the other hand, for backwards compatibility reason, if input has 2 channels, input is - already considered complex. */ - DFT_COMPLEX_INPUT = 64, - /** performs an inverse 1D or 2D transform instead of the default forward transform. */ - DCT_INVERSE = DFT_INVERSE, - /** performs a forward or inverse transform of every individual row of the input - matrix. This flag enables you to transform multiple vectors simultaneously and can be used to - decrease the overhead (which is sometimes several times larger than the processing itself) to - perform 3D and higher-dimensional transforms and so forth.*/ - DCT_ROWS = DFT_ROWS -}; - -//! GNU Octave/MATLAB equivalent colormaps -enum -{ - COLORMAP_AUTUMN = 0, //!< ![autumn](pics/colormaps/colorscale_autumn.jpg) - COLORMAP_BONE = 1, //!< ![bone](pics/colormaps/colorscale_bone.jpg) - COLORMAP_JET = 2, //!< ![jet](pics/colormaps/colorscale_jet.jpg) - COLORMAP_WINTER = 3, //!< ![winter](pics/colormaps/colorscale_winter.jpg) - COLORMAP_RAINBOW = 4, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg) - COLORMAP_OCEAN = 5, //!< ![ocean](pics/colormaps/colorscale_ocean.jpg) - COLORMAP_SUMMER = 6, //!< ![summer](pics/colormaps/colorscale_summer.jpg) - COLORMAP_SPRING = 7, //!< ![spring](pics/colormaps/colorscale_spring.jpg) - COLORMAP_COOL = 8, //!< ![cool](pics/colormaps/colorscale_cool.jpg) - COLORMAP_HSV = 9, //!< ![HSV](pics/colormaps/colorscale_hsv.jpg) - COLORMAP_PINK = 10, //!< ![pink](pics/colormaps/colorscale_pink.jpg) - COLORMAP_HOT = 11, //!< ![hot](pics/colormaps/colorscale_hot.jpg) - COLORMAP_PARULA = 12, //!< ![parula](pics/colormaps/colorscale_parula.jpg) - COLORMAP_MAGMA = 13, //!< ![magma](pics/colormaps/colorscale_magma.jpg) - COLORMAP_INFERNO = 14, //!< ![inferno](pics/colormaps/colorscale_inferno.jpg) - COLORMAP_PLASMA = 15, //!< ![plasma](pics/colormaps/colorscale_plasma.jpg) - COLORMAP_VIRIDIS = 16, //!< ![viridis](pics/colormaps/colorscale_viridis.jpg) - COLORMAP_CIVIDIS = 17, //!< ![cividis](pics/colormaps/colorscale_cividis.jpg) - COLORMAP_TWILIGHT = 18, //!< ![twilight](pics/colormaps/colorscale_twilight.jpg) - COLORMAP_TWILIGHT_SHIFTED = 19, //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg) - COLORMAP_TURBO = 20, //!< ![turbo](pics/colormaps/colorscale_turbo.jpg) - COLORMAP_DEEPGREEN = 21 //!< ![deepgreen](pics/colormaps/colorscale_deepgreen.jpg) -}; - -//! Imread flags -enum -{ - IMREAD_UNCHANGED = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation. - IMREAD_GRAYSCALE = 0, //!< If set, always convert image to the single channel grayscale image (codec internal conversion). - IMREAD_COLOR = 1, //!< If set, always convert image to the 3 channel BGR color image. - IMREAD_ANYDEPTH = 2, //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit. - IMREAD_ANYCOLOR = 4, //!< If set, the image is read in any possible color format. - IMREAD_LOAD_GDAL = 8, //!< If set, use the gdal driver for loading the image. - IMREAD_REDUCED_GRAYSCALE_2 = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2. - IMREAD_REDUCED_COLOR_2 = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2. - IMREAD_REDUCED_GRAYSCALE_4 = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4. - IMREAD_REDUCED_COLOR_4 = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4. - IMREAD_REDUCED_GRAYSCALE_8 = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8. - IMREAD_REDUCED_COLOR_8 = 65, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8. - IMREAD_IGNORE_ORIENTATION = 128 //!< If set, do not rotate the image according to EXIF's orientation flag. -}; - -//! Imwrite flags -enum -{ - IMWRITE_JPEG_QUALITY = 1, //!< For JPEG, it can be a quality from 0 to 100 (the higher is the better). Default value is 95. - IMWRITE_JPEG_PROGRESSIVE = 2, //!< Enable JPEG features, 0 or 1, default is False. - IMWRITE_JPEG_OPTIMIZE = 3, //!< Enable JPEG features, 0 or 1, default is False. - IMWRITE_JPEG_RST_INTERVAL = 4, //!< JPEG restart interval, 0 - 65535, default is 0 - no restart. - IMWRITE_JPEG_LUMA_QUALITY = 5, //!< Separate luma quality level, 0 - 100, default is -1 - don't use. - IMWRITE_JPEG_CHROMA_QUALITY = 6, //!< Separate chroma quality level, 0 - 100, default is -1 - don't use. - IMWRITE_JPEG_SAMPLING_FACTOR = 7, //!< For JPEG, set sampling factor. See cv::ImwriteJPEGSamplingFactorParams. - IMWRITE_PNG_COMPRESSION = 16, //!< For PNG, it can be the compression level from 0 to 9. A higher value means a smaller size and longer compression time. If specified, strategy is changed to IMWRITE_PNG_STRATEGY_DEFAULT (Z_DEFAULT_STRATEGY). Default value is 1 (best speed setting). - IMWRITE_PNG_STRATEGY = 17, //!< One of cv::ImwritePNGFlags, default is IMWRITE_PNG_STRATEGY_RLE. - IMWRITE_PNG_BILEVEL = 18, //!< Binary level PNG, 0 or 1, default is 0. - IMWRITE_PXM_BINARY = 32, //!< For PPM, PGM, or PBM, it can be a binary format flag, 0 or 1. Default value is 1. - IMWRITE_EXR_TYPE = (3 << 4) + 0 /* 48 */, //!< override EXR storage type (FLOAT (FP32) is default) - IMWRITE_EXR_COMPRESSION = (3 << 4) + 1 /* 49 */, //!< override EXR compression type (ZIP_COMPRESSION = 3 is default) - IMWRITE_EXR_DWA_COMPRESSION_LEVEL = (3 << 4) + 2 /* 50 */, //!< override EXR DWA compression level (45 is default) - IMWRITE_WEBP_QUALITY = 64, //!< For WEBP, it can be a quality from 1 to 100 (the higher is the better). By default (without any parameter) and for quality above 100 the lossless compression is used. - IMWRITE_HDR_COMPRESSION = (5 << 4) + 0 /* 80 */, //!< specify HDR compression - IMWRITE_PAM_TUPLETYPE = 128, //!< For PAM, sets the TUPLETYPE field to the corresponding string value that is defined for the format - IMWRITE_TIFF_RESUNIT = 256, //!< For TIFF, use to specify which DPI resolution unit to set; see libtiff documentation for valid values - IMWRITE_TIFF_XDPI = 257, //!< For TIFF, use to specify the X direction DPI - IMWRITE_TIFF_YDPI = 258, //!< For TIFF, use to specify the Y direction DPI - IMWRITE_TIFF_COMPRESSION = 259, //!< For TIFF, use to specify the image compression scheme. See libtiff for integer constants corresponding to compression formats. Note, for images whose depth is CV_32F, only libtiff's SGILOG compression scheme is used. For other supported depths, the compression scheme can be specified by this flag; LZW compression is the default. - IMWRITE_JPEG2000_COMPRESSION_X1000 = 272, //!< For JPEG2000, use to specify the target compression rate (multiplied by 1000). The value can be from 0 to 1000. Default is 1000. - IMWRITE_AVIF_QUALITY = 512, //!< For AVIF, it can be a quality between 0 and 100 (the higher the better). Default is 95. - IMWRITE_AVIF_DEPTH = 513, //!< For AVIF, it can be 8, 10 or 12. If >8, it is stored/read as CV_32F. Default is 8. - IMWRITE_AVIF_SPEED = 514 //!< For AVIF, it is between 0 (slowest) and (fastest). Default is 9. -}; - -enum -{ - IMWRITE_JPEG_SAMPLING_FACTOR_411 = 0x411111, //!< 4x1,1x1,1x1 - IMWRITE_JPEG_SAMPLING_FACTOR_420 = 0x221111, //!< 2x2,1x1,1x1(Default) - IMWRITE_JPEG_SAMPLING_FACTOR_422 = 0x211111, //!< 2x1,1x1,1x1 - IMWRITE_JPEG_SAMPLING_FACTOR_440 = 0x121111, //!< 1x2,1x1,1x1 - IMWRITE_JPEG_SAMPLING_FACTOR_444 = 0x111111 //!< 1x1,1x1,1x1(No subsampling) -}; - -enum -{ - /*IMWRITE_EXR_TYPE_UNIT = 0, //!< not supported */ - IMWRITE_EXR_TYPE_HALF = 1, //!< store as HALF (FP16) - IMWRITE_EXR_TYPE_FLOAT = 2 //!< store as FP32 (default) -}; - -enum -{ - IMWRITE_EXR_COMPRESSION_NO = 0, //!< no compression - IMWRITE_EXR_COMPRESSION_RLE = 1, //!< run length encoding - IMWRITE_EXR_COMPRESSION_ZIPS = 2, //!< zlib compression, one scan line at a time - IMWRITE_EXR_COMPRESSION_ZIP = 3, //!< zlib compression, in blocks of 16 scan lines - IMWRITE_EXR_COMPRESSION_PIZ = 4, //!< piz-based wavelet compression - IMWRITE_EXR_COMPRESSION_PXR24 = 5, //!< lossy 24-bit float compression - IMWRITE_EXR_COMPRESSION_B44 = 6, //!< lossy 4-by-4 pixel block compression, fixed compression rate - IMWRITE_EXR_COMPRESSION_B44A = 7, //!< lossy 4-by-4 pixel block compression, flat fields are compressed more - IMWRITE_EXR_COMPRESSION_DWAA = 8, //!< lossy DCT based compression, in blocks of 32 scanlines. More efficient for partial buffer access. Supported since OpenEXR 2.2.0. - IMWRITE_EXR_COMPRESSION_DWAB = 9, //!< lossy DCT based compression, in blocks of 256 scanlines. More efficient space wise and faster to decode full frames than DWAA_COMPRESSION. Supported since OpenEXR 2.2.0. -}; - -//! Imwrite PNG specific flags used to tune the compression algorithm. -/** These flags will be modify the way of PNG image compression and will be passed to the underlying zlib processing stage. - -- The effect of IMWRITE_PNG_STRATEGY_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between IMWRITE_PNG_STRATEGY_DEFAULT and IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY. -- IMWRITE_PNG_STRATEGY_RLE is designed to be almost as fast as IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY, but give better compression for PNG image data. -- The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. -- IMWRITE_PNG_STRATEGY_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. -*/ -enum -{ - IMWRITE_PNG_STRATEGY_DEFAULT = 0, //!< Use this value for normal data. - IMWRITE_PNG_STRATEGY_FILTERED = 1, //!< Use this value for data produced by a filter (or predictor).Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. - IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY = 2, //!< Use this value to force Huffman encoding only (no string match). - IMWRITE_PNG_STRATEGY_RLE = 3, //!< Use this value to limit match distances to one (run-length encoding). - IMWRITE_PNG_STRATEGY_FIXED = 4 //!< Using this value prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. -}; - -//! Imwrite PAM specific tupletype flags used to define the 'TUPLETYPE' field of a PAM file. -enum -{ - IMWRITE_PAM_FORMAT_NULL = 0, - IMWRITE_PAM_FORMAT_BLACKANDWHITE = 1, - IMWRITE_PAM_FORMAT_GRAYSCALE = 2, - IMWRITE_PAM_FORMAT_GRAYSCALE_ALPHA = 3, - IMWRITE_PAM_FORMAT_RGB = 4, - IMWRITE_PAM_FORMAT_RGB_ALPHA = 5 -}; - -//! Imwrite HDR specific values for IMWRITE_HDR_COMPRESSION parameter key -enum -{ - IMWRITE_HDR_COMPRESSION_NONE = 0, - IMWRITE_HDR_COMPRESSION_RLE = 1 -}; - -enum -{ - SORT_EVERY_ROW = 0, //!< each matrix row is sorted independently - SORT_EVERY_COLUMN = 1, //!< each matrix column is sorted - //!< independently; this flag and the previous one are - //!< mutually exclusive. - SORT_ASCENDING = 0, //!< each matrix row is sorted in the ascending - //!< order. - SORT_DESCENDING = 16 //!< each matrix row is sorted in the - //!< descending order; this flag and the previous one are also - //!< mutually exclusive. -}; - -//! @} core_utils - -//! @addtogroup core -//! @{ - -//! Covariation flags -enum -{ - /** The output covariance matrix is calculated as: - \f[\texttt{scale} \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...]^T \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...],\f] - The covariance matrix will be nsamples x nsamples. Such an unusual covariance matrix is used - for fast PCA of a set of very large vectors (see, for example, the EigenFaces technique for - face recognition). Eigenvalues of this "scrambled" matrix match the eigenvalues of the true - covariance matrix. The "true" eigenvectors can be easily calculated from the eigenvectors of - the "scrambled" covariance matrix. */ - COVAR_SCRAMBLED = 0, - /**The output covariance matrix is calculated as: - \f[\texttt{scale} \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...] \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...]^T,\f] - covar will be a square matrix of the same size as the total number of elements in each input - vector. One and only one of #COVAR_SCRAMBLED and #COVAR_NORMAL must be specified.*/ - COVAR_NORMAL = 1, - /** If the flag is specified, the function does not calculate mean from - the input vectors but, instead, uses the passed mean vector. This is useful if mean has been - pre-calculated or known in advance, or if the covariance matrix is calculated by parts. In - this case, mean is not a mean vector of the input sub-set of vectors but rather the mean - vector of the whole set.*/ - COVAR_USE_AVG = 2, - /** If the flag is specified, the covariance matrix is scaled. In the - "normal" mode, scale is 1./nsamples . In the "scrambled" mode, scale is the reciprocal of the - total number of elements in each input vector. By default (if the flag is not specified), the - covariance matrix is not scaled ( scale=1 ).*/ - COVAR_SCALE = 4, - /** If the flag is - specified, all the input vectors are stored as rows of the samples matrix. mean should be a - single-row vector in this case.*/ - COVAR_ROWS = 8, - /** If the flag is - specified, all the input vectors are stored as columns of the samples matrix. mean should be a - single-column vector in this case.*/ - COVAR_COLS = 16 -}; - -//! @addtogroup core_cluster -//! @{ - -//! k-Means flags -enum -{ - /** Select random initial centers in each attempt.*/ - KMEANS_RANDOM_CENTERS = 0, - /** Use kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007].*/ - KMEANS_PP_CENTERS = 2, - /** During the first (and possibly the only) attempt, use the - user-supplied labels instead of computing them from the initial centers. For the second and - further attempts, use the random or semi-random centers. Use one of KMEANS_\*_CENTERS flag - to specify the exact method.*/ - KMEANS_USE_INITIAL_LABELS = 1 -}; - -//! @} core_cluster - -//! @addtogroup core_array -//! @{ - -enum -{ - REDUCE_SUM = 0, //!< the output is the sum of all rows/columns of the matrix. - REDUCE_AVG = 1, //!< the output is the mean vector of all rows/columns of the matrix. - REDUCE_MAX = 2, //!< the output is the maximum (column/row-wise) of all rows/columns of the matrix. - REDUCE_MIN = 3, //!< the output is the minimum (column/row-wise) of all rows/columns of the matrix. - REDUCE_SUM2 = 4 //!< the output is the sum of all squared rows/columns of the matrix. -}; -enum -{ - ROTATE_90_CLOCKWISE = 0, //!< Rotate 90 degrees clockwise - ROTATE_180 = 1, //!< Rotate 180 degrees clockwise - ROTATE_90_COUNTERCLOCKWISE = 2, //!< Rotate 270 degrees clockwise -}; -enum -{ - TERM_COUNT = 1, - TERM_MAX_ITER = TERM_COUNT, - TERM_EPS = 2 -}; - -enum -{ - RNG_DIST_UNIFORM = 0, - RNG_DIST_NORMAL = 1 -}; - -//! @addtogroup video_track -//! @{ -/* - cv::OPTFLOW_USE_INITIAL_FLOW = 4, - cv::OPTFLOW_LK_GET_MIN_EIGENVALS = 8, - cv::OPTFLOW_FARNEBACK_GAUSSIAN = 256 - For further details, please see: https://docs.opencv.org/master/dc/d6b/group__video__track.html#gga2c6cc144c9eee043575d5b311ac8af08a9d4430ac75199af0cf6fcdefba30eafe -*/ -enum -{ - OPTFLOW_USE_INITIAL_FLOW = 4, - OPTFLOW_LK_GET_MIN_EIGENVALS = 8, - OPTFLOW_FARNEBACK_GAUSSIAN = 256 -}; - -/* - cv::MOTION_TRANSLATION = 0, - cv::MOTION_EUCLIDEAN = 1, - cv::MOTION_AFFINE = 2, - cv::MOTION_HOMOGRAPHY = 3 - For further details, please see: https://docs.opencv.org/4.x/dc/d6b/group__video__track.html#ggaaedb1f94e6b143cef163622c531afd88a01106d6d20122b782ff25eaeffe9a5be -*/ -enum -{ - MOTION_TRANSLATION = 0, - MOTION_EUCLIDEAN = 1, - MOTION_AFFINE = 2, - MOTION_HOMOGRAPHY = 3 -}; - -/** @brief cv::VideoCapture API backends identifier. - -Select preferred API for a capture object. -To be used in the VideoCapture::VideoCapture() constructor or VideoCapture::open() - -@note -- Backends are available only if they have been built with your OpenCV binaries. -See @ref videoio_overview for more information. -- Microsoft Media Foundation backend tries to use hardware accelerated transformations -if possible. Environment flag "OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS" set to 0 -disables it and may improve initialization time. More details: -https://learn.microsoft.com/en-us/windows/win32/medfound/mf-readwrite-enable-hardware-transforms -*/ -enum -{ - CAP_ANY = 0, //!< Auto detect == 0 - CAP_VFW = 200, //!< Video For Windows (obsolete, removed) - CAP_V4L = 200, //!< V4L/V4L2 capturing support - CAP_V4L2 = CAP_V4L, //!< Same as CAP_V4L - CAP_FIREWIRE = 300, //!< IEEE 1394 drivers - CAP_FIREWARE = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE - CAP_IEEE1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE - CAP_DC1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE - CAP_CMU1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE - CAP_QT = 500, //!< QuickTime (obsolete, removed) - CAP_UNICAP = 600, //!< Unicap drivers (obsolete, removed) - CAP_DSHOW = 700, //!< DirectShow (via videoInput) - CAP_PVAPI = 800, //!< PvAPI, Prosilica GigE SDK - CAP_OPENNI = 900, //!< OpenNI (for Kinect) - CAP_OPENNI_ASUS = 910, //!< OpenNI (for Asus Xtion) - CAP_ANDROID = 1000, //!< MediaNDK (API Level 21+) and NDK Camera (API level 24+) for Android - CAP_XIAPI = 1100, //!< XIMEA Camera API - CAP_AVFOUNDATION = 1200, //!< AVFoundation framework for iOS (OS X Lion will have the same API) - CAP_GIGANETIX = 1300, //!< Smartek Giganetix GigEVisionSDK - CAP_MSMF = 1400, //!< Microsoft Media Foundation (via videoInput). See platform specific notes above. - CAP_WINRT = 1410, //!< Microsoft Windows Runtime using Media Foundation - CAP_INTELPERC = 1500, //!< RealSense (former Intel Perceptual Computing SDK) - CAP_REALSENSE = 1500, //!< Synonym for CAP_INTELPERC - CAP_OPENNI2 = 1600, //!< OpenNI2 (for Kinect) - CAP_OPENNI2_ASUS = 1610, //!< OpenNI2 (for Asus Xtion and Occipital Structure sensors) - CAP_OPENNI2_ASTRA = 1620, //!< OpenNI2 (for Orbbec Astra) - CAP_GPHOTO2 = 1700, //!< gPhoto2 connection - CAP_GSTREAMER = 1800, //!< GStreamer - CAP_FFMPEG = 1900, //!< Open and record video file or stream using the FFMPEG library - CAP_IMAGES = 2000, //!< OpenCV Image Sequence (e.g. img_%02d.jpg) - CAP_ARAVIS = 2100, //!< Aravis SDK - CAP_OPENCV_MJPEG = 2200, //!< Built-in OpenCV MotionJPEG codec - CAP_INTEL_MFX = 2300, //!< Intel MediaSDK - CAP_XINE = 2400, //!< XINE engine (Linux) - CAP_UEYE = 2500, //!< uEye Camera API - CAP_OBSENSOR = 2600, //!< For Orbbec 3D-Sensor device/module (Astra+, Femto, Astra2, Gemini2, Gemini2L, Gemini2XL, Femto Mega) attention: Astra2, Gemini2, and Gemini2L cameras currently only support Windows and Linux kernel versions no higher than 4.15, and higher versions of Linux kernel may have exceptions. -}; - -/** @brief cv::VideoCapture generic properties identifier. - - Reading / writing properties involves many layers. Some unexpected result might happens along this chain. - Effective behaviour depends from device hardware, driver and API Backend. - @sa videoio_flags_others, VideoCapture::get(), VideoCapture::set() -*/ -enum -{ - CAP_PROP_POS_MSEC = 0, //!< Current position of the video file in milliseconds. - CAP_PROP_POS_FRAMES = 1, //!< 0-based index of the frame to be decoded/captured next. When the index i is set in RAW mode (CAP_PROP_FORMAT == -1) this will seek to the key frame k, where k <= i. - CAP_PROP_POS_AVI_RATIO = 2, //!< Relative position of the video file: 0=start of the film, 1=end of the film. - CAP_PROP_FRAME_WIDTH = 3, //!< Width of the frames in the video stream. - CAP_PROP_FRAME_HEIGHT = 4, //!< Height of the frames in the video stream. - CAP_PROP_FPS = 5, //!< Frame rate. - CAP_PROP_FOURCC = 6, //!< 4-character code of codec. see VideoWriter::fourcc . - CAP_PROP_FRAME_COUNT = 7, //!< Number of frames in the video file. - CAP_PROP_FORMAT = 8, //!< Format of the %Mat objects (see Mat::type()) returned by VideoCapture::retrieve(). - //!< Set value -1 to fetch undecoded RAW video streams (as Mat 8UC1). - CAP_PROP_MODE = 9, //!< Backend-specific value indicating the current capture mode. - CAP_PROP_BRIGHTNESS = 10, //!< Brightness of the image (only for those cameras that support). - CAP_PROP_CONTRAST = 11, //!< Contrast of the image (only for cameras). - CAP_PROP_SATURATION = 12, //!< Saturation of the image (only for cameras). - CAP_PROP_HUE = 13, //!< Hue of the image (only for cameras). - CAP_PROP_GAIN = 14, //!< Gain of the image (only for those cameras that support). - CAP_PROP_EXPOSURE = 15, //!< Exposure (only for those cameras that support). - CAP_PROP_CONVERT_RGB = 16, //!< Boolean flags indicating whether images should be converted to RGB.
- //!< *GStreamer note*: The flag is ignored in case if custom pipeline is used. It's user responsibility to interpret pipeline output. - CAP_PROP_WHITE_BALANCE_BLUE_U = 17, //!< Currently unsupported. - CAP_PROP_RECTIFICATION = 18, //!< Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently). - CAP_PROP_MONOCHROME = 19, - CAP_PROP_SHARPNESS = 20, - CAP_PROP_AUTO_EXPOSURE = 21, //!< DC1394: exposure control done by camera, user can adjust reference level using this feature. - CAP_PROP_GAMMA = 22, - CAP_PROP_TEMPERATURE = 23, - CAP_PROP_TRIGGER = 24, - CAP_PROP_TRIGGER_DELAY = 25, - CAP_PROP_WHITE_BALANCE_RED_V = 26, - CAP_PROP_ZOOM = 27, - CAP_PROP_FOCUS = 28, - CAP_PROP_GUID = 29, - CAP_PROP_ISO_SPEED = 30, - CAP_PROP_BACKLIGHT = 32, - CAP_PROP_PAN = 33, - CAP_PROP_TILT = 34, - CAP_PROP_ROLL = 35, - CAP_PROP_IRIS = 36, - CAP_PROP_SETTINGS = 37, //!< Pop up video/camera filter dialog (note: only supported by DSHOW backend currently. The property value is ignored) - CAP_PROP_BUFFERSIZE = 38, - CAP_PROP_AUTOFOCUS = 39, - CAP_PROP_SAR_NUM = 40, //!< Sample aspect ratio: num/den (num) - CAP_PROP_SAR_DEN = 41, //!< Sample aspect ratio: num/den (den) - CAP_PROP_BACKEND = 42, //!< Current backend (enum VideoCaptureAPIs). Read-only property - CAP_PROP_CHANNEL = 43, //!< Video input or Channel Number (only for those cameras that support) - CAP_PROP_AUTO_WB = 44, //!< enable/ disable auto white-balance - CAP_PROP_WB_TEMPERATURE = 45, //!< white-balance color temperature - CAP_PROP_CODEC_PIXEL_FORMAT = 46, //!< (read-only) codec's pixel format. 4-character code - see VideoWriter::fourcc . Subset of [AV_PIX_FMT_*](https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/raw.c) or -1 if unknown - CAP_PROP_BITRATE = 47, //!< (read-only) Video bitrate in kbits/s - CAP_PROP_ORIENTATION_META = 48, //!< (read-only) Frame rotation defined by stream meta (applicable for FFmpeg and AVFoundation back-ends only) - CAP_PROP_ORIENTATION_AUTO = 49, //!< if true - rotates output frames of CvCapture considering video file's metadata (applicable for FFmpeg and AVFoundation back-ends only) (https://github.com/opencv/opencv/issues/15499) - CAP_PROP_HW_ACCELERATION = 50, //!< (**open-only**) Hardware acceleration type (see #VideoAccelerationType). Setting supported only via `params` parameter in cv::VideoCapture constructor / .open() method. Default value is backend-specific. - CAP_PROP_HW_DEVICE = 51, //!< (**open-only**) Hardware device index (select GPU if multiple available). Device enumeration is acceleration type specific. - CAP_PROP_HW_ACCELERATION_USE_OPENCL = 52, //!< (**open-only**) If non-zero, create new OpenCL context and bind it to current thread. The OpenCL context created with Video Acceleration context attached it (if not attached yet) for optimized GPU data copy between HW accelerated decoder and cv::UMat. - CAP_PROP_OPEN_TIMEOUT_MSEC = 53, //!< (**open-only**) timeout in milliseconds for opening a video capture (applicable for FFmpeg and GStreamer back-ends only) - CAP_PROP_READ_TIMEOUT_MSEC = 54, //!< (**open-only**) timeout in milliseconds for reading from a video capture (applicable for FFmpeg and GStreamer back-ends only) - CAP_PROP_STREAM_OPEN_TIME_USEC = 55, //!< (read-only) time in microseconds since Jan 1 1970 when stream was opened. Applicable for FFmpeg backend only. Useful for RTSP and other live streams - CAP_PROP_VIDEO_TOTAL_CHANNELS = 56, //!< (read-only) Number of video channels - CAP_PROP_VIDEO_STREAM = 57, //!< (**open-only**) Specify video stream, 0-based index. Use -1 to disable video stream from file or IP cameras. Default value is 0. - CAP_PROP_AUDIO_STREAM = 58, //!< (**open-only**) Specify stream in multi-language media files, -1 - disable audio processing or microphone. Default value is -1. - CAP_PROP_AUDIO_POS = 59, //!< (read-only) Audio position is measured in samples. Accurate audio sample timestamp of previous grabbed fragment. See CAP_PROP_AUDIO_SAMPLES_PER_SECOND and CAP_PROP_AUDIO_SHIFT_NSEC. - CAP_PROP_AUDIO_SHIFT_NSEC = 60, //!< (read only) Contains the time difference between the start of the audio stream and the video stream in nanoseconds. Positive value means that audio is started after the first video frame. Negative value means that audio is started before the first video frame. - CAP_PROP_AUDIO_DATA_DEPTH = 61, //!< (open, read) Alternative definition to bits-per-sample, but with clear handling of 32F / 32S - CAP_PROP_AUDIO_SAMPLES_PER_SECOND = 62, //!< (open, read) determined from file/codec input. If not specified, then selected audio sample rate is 44100 - CAP_PROP_AUDIO_BASE_INDEX = 63, //!< (read-only) Index of the first audio channel for .retrieve() calls. That audio channel number continues enumeration after video channels. - CAP_PROP_AUDIO_TOTAL_CHANNELS = 64, //!< (read-only) Number of audio channels in the selected audio stream (mono, stereo, etc) - CAP_PROP_AUDIO_TOTAL_STREAMS = 65, //!< (read-only) Number of audio streams. - CAP_PROP_AUDIO_SYNCHRONIZE = 66, //!< (open, read) Enables audio synchronization. - CAP_PROP_LRF_HAS_KEY_FRAME = 67, //!< FFmpeg back-end only - Indicates whether the Last Raw Frame (LRF), output from VideoCapture::read() when VideoCapture is initialized with VideoCapture::open(CAP_FFMPEG, {CAP_PROP_FORMAT, -1}) or VideoCapture::set(CAP_PROP_FORMAT,-1) is called before the first call to VideoCapture::read(), contains encoded data for a key frame. - CAP_PROP_CODEC_EXTRADATA_INDEX = 68, //!< Positive index indicates that returning extra data is supported by the video back end. This can be retrieved as cap.retrieve(data, ). E.g. When reading from a h264 encoded RTSP stream, the FFmpeg backend could return the SPS and/or PPS if available (if sent in reply to a DESCRIBE request), from calls to cap.retrieve(data, ). - CAP_PROP_FRAME_TYPE = 69, //!< (read-only) FFmpeg back-end only - Frame type ascii code (73 = 'I', 80 = 'P', 66 = 'B' or 63 = '?' if unknown) of the most recently read frame. - CAP_PROP_N_THREADS = 70, //!< (**open-only**) Set the maximum number of threads to use. Use 0 to use as many threads as CPU cores (applicable for FFmpeg back-end only). -#ifndef CV_DOXYGEN - CV__CAP_PROP_LATEST -#endif -}; - -/** @brief cv::VideoWriter generic properties identifier. - @sa VideoWriter::get(), VideoWriter::set() -*/ -enum -{ - VIDEOWRITER_PROP_QUALITY = 1, //!< Current quality (0..100%) of the encoded videostream. Can be adjusted dynamically in some codecs. - VIDEOWRITER_PROP_FRAMEBYTES = 2, //!< (Read-only): Size of just encoded video frame. Note that the encoding order may be different from representation order. - VIDEOWRITER_PROP_NSTRIPES = 3, //!< Number of stripes for parallel encoding. -1 for auto detection. - VIDEOWRITER_PROP_IS_COLOR = 4, //!< If it is not zero, the encoder will expect and encode color frames, otherwise it - //!< will work with grayscale frames. - VIDEOWRITER_PROP_DEPTH = 5, //!< Defaults to \ref CV_8U. - VIDEOWRITER_PROP_HW_ACCELERATION = 6, //!< (**open-only**) Hardware acceleration type (see #VideoAccelerationType). Setting supported only via `params` parameter in VideoWriter constructor / .open() method. Default value is backend-specific. - VIDEOWRITER_PROP_HW_DEVICE = 7, //!< (**open-only**) Hardware device index (select GPU if multiple available). Device enumeration is acceleration type specific. - VIDEOWRITER_PROP_HW_ACCELERATION_USE_OPENCL = 8, //!< (**open-only**) If non-zero, create new OpenCL context and bind it to current thread. The OpenCL context created with Video Acceleration context attached it (if not attached yet) for optimized GPU data copy between cv::UMat and HW accelerated encoder. - VIDEOWRITER_PROP_RAW_VIDEO = 9, //!< (**open-only**) Set to non-zero to enable encapsulation of an encoded raw video stream. Each raw encoded video frame should be passed to VideoWriter::write() as single row or column of a \ref CV_8UC1 Mat. \note If the key frame interval is not 1 then it must be manually specified by the user. This can either be performed during initialization passing \ref VIDEOWRITER_PROP_KEY_INTERVAL as one of the extra encoder params to \ref VideoWriter::VideoWriter(const String &, int, double, const Size &, const std::vector< int > ¶ms) or afterwards by setting the \ref VIDEOWRITER_PROP_KEY_FLAG with \ref VideoWriter::set() before writing each frame. FFMpeg backend only. - VIDEOWRITER_PROP_KEY_INTERVAL = 10, //!< (**open-only**) Set the key frame interval using raw video encapsulation (\ref VIDEOWRITER_PROP_RAW_VIDEO != 0). Defaults to 1 when not set. FFMpeg backend only. - VIDEOWRITER_PROP_KEY_FLAG = 11, //!< Set to non-zero to signal that the following frames are key frames or zero if not, when encapsulating raw video (\ref VIDEOWRITER_PROP_RAW_VIDEO != 0). FFMpeg backend only. -#ifndef CV_DOXYGEN - CV__VIDEOWRITER_PROP_LATEST -#endif -}; - -//! @} videoio_flags_base - -//! @addtogroup videoio_flags_others -//! @{ - -/** @name Hardware acceleration support - @{ -*/ - -/** @brief Video Acceleration type - * - * Used as value in #CAP_PROP_HW_ACCELERATION and #VIDEOWRITER_PROP_HW_ACCELERATION - * - * @note In case of FFmpeg backend, it translated to enum AVHWDeviceType (https://github.com/FFmpeg/FFmpeg/blob/master/libavutil/hwcontext.h) - */ -enum VideoAccelerationType -{ - VIDEO_ACCELERATION_NONE = 0, //!< Do not require any specific H/W acceleration, prefer software processing. - //!< Reading of this value means that special H/W accelerated handling is not added or not detected by OpenCV. - - VIDEO_ACCELERATION_ANY = 1, //!< Prefer to use H/W acceleration. If no one supported, then fallback to software processing. - //!< @note H/W acceleration may require special configuration of used environment. - //!< @note Results in encoding scenario may differ between software and hardware accelerated encoders. - - VIDEO_ACCELERATION_D3D11 = 2, //!< DirectX 11 - VIDEO_ACCELERATION_VAAPI = 3, //!< VAAPI - VIDEO_ACCELERATION_MFX = 4, //!< libmfx (Intel MediaSDK/oneVPL) -}; - -//! @} Hardware acceleration support - -/** @name IEEE 1394 drivers - @{ -*/ - -/** @brief Modes of the IEEE 1394 controlling registers -(can be: auto, manual, auto single push, absolute Latter allowed with any other mode) -every feature can have only one mode turned on at a time -*/ -enum -{ - CAP_PROP_DC1394_OFF = -4, //!< turn the feature off (not controlled manually nor automatically). - CAP_PROP_DC1394_MODE_MANUAL = -3, //!< set automatically when a value of the feature is set by the user. - CAP_PROP_DC1394_MODE_AUTO = -2, - CAP_PROP_DC1394_MODE_ONE_PUSH_AUTO = -1, - CAP_PROP_DC1394_MAX = 31 -}; - -//! @} IEEE 1394 drivers - -/** @name OpenNI (for Kinect) - @{ -*/ - -//! OpenNI map generators -enum -{ - CAP_OPENNI_DEPTH_GENERATOR = 1 << 31, - CAP_OPENNI_IMAGE_GENERATOR = 1 << 30, - CAP_OPENNI_IR_GENERATOR = 1 << 29, - CAP_OPENNI_GENERATORS_MASK = CAP_OPENNI_DEPTH_GENERATOR + CAP_OPENNI_IMAGE_GENERATOR + CAP_OPENNI_IR_GENERATOR -}; - -//! Properties of cameras available through OpenNI backend -enum -{ - CAP_PROP_OPENNI_OUTPUT_MODE = 100, - CAP_PROP_OPENNI_FRAME_MAX_DEPTH = 101, //!< In mm - CAP_PROP_OPENNI_BASELINE = 102, //!< In mm - CAP_PROP_OPENNI_FOCAL_LENGTH = 103, //!< In pixels - CAP_PROP_OPENNI_REGISTRATION = 104, //!< Flag that synchronizes the remapping depth map to image map - //!< by changing depth generator's view point (if the flag is "on") or - //!< sets this view point to its normal one (if the flag is "off"). - CAP_PROP_OPENNI_REGISTRATION_ON = CAP_PROP_OPENNI_REGISTRATION, - CAP_PROP_OPENNI_APPROX_FRAME_SYNC = 105, - CAP_PROP_OPENNI_MAX_BUFFER_SIZE = 106, - CAP_PROP_OPENNI_CIRCLE_BUFFER = 107, - CAP_PROP_OPENNI_MAX_TIME_DURATION = 108, - CAP_PROP_OPENNI_GENERATOR_PRESENT = 109, - CAP_PROP_OPENNI2_SYNC = 110, - CAP_PROP_OPENNI2_MIRROR = 111 -}; - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 5054) -#endif -//! OpenNI shortcuts -enum -{ - CAP_OPENNI_IMAGE_GENERATOR_PRESENT = CAP_OPENNI_IMAGE_GENERATOR + CAP_PROP_OPENNI_GENERATOR_PRESENT, - CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CAP_OPENNI_IMAGE_GENERATOR + CAP_PROP_OPENNI_OUTPUT_MODE, - CAP_OPENNI_DEPTH_GENERATOR_PRESENT = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_GENERATOR_PRESENT, - CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_BASELINE, - CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_FOCAL_LENGTH, - CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_REGISTRATION, - CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION_ON = CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION, - CAP_OPENNI_IR_GENERATOR_PRESENT = CAP_OPENNI_IR_GENERATOR + CAP_PROP_OPENNI_GENERATOR_PRESENT, -}; -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -//! OpenNI data given from depth generator -enum -{ - CAP_OPENNI_DEPTH_MAP = 0, //!< Depth values in mm (CV_16UC1) - CAP_OPENNI_POINT_CLOUD_MAP = 1, //!< XYZ in meters (CV_32FC3) - CAP_OPENNI_DISPARITY_MAP = 2, //!< Disparity in pixels (CV_8UC1) - CAP_OPENNI_DISPARITY_MAP_32F = 3, //!< Disparity in pixels (CV_32FC1) - CAP_OPENNI_VALID_DEPTH_MASK = 4, //!< CV_8UC1 - - CAP_OPENNI_BGR_IMAGE = 5, //!< Data given from RGB image generator - CAP_OPENNI_GRAY_IMAGE = 6, //!< Data given from RGB image generator - - CAP_OPENNI_IR_IMAGE = 7 //!< Data given from IR image generator -}; - -//! Supported output modes of OpenNI image generator -enum -{ - CAP_OPENNI_VGA_30HZ = 0, - CAP_OPENNI_SXGA_15HZ = 1, - CAP_OPENNI_SXGA_30HZ = 2, - CAP_OPENNI_QVGA_30HZ = 3, - CAP_OPENNI_QVGA_60HZ = 4 -}; - -//! @} OpenNI - -/** @name GStreamer - @{ -*/ - -enum -{ - CAP_PROP_GSTREAMER_QUEUE_LENGTH = 200 //!< Default is 1 -}; - -//! @} GStreamer - -/** @name PvAPI, Prosilica GigE SDK - @{ -*/ - -//! PVAPI -enum -{ - CAP_PROP_PVAPI_MULTICASTIP = 300, //!< IP for enable multicast master mode. 0 for disable multicast. - CAP_PROP_PVAPI_FRAMESTARTTRIGGERMODE = 301, //!< FrameStartTriggerMode: Determines how a frame is initiated. - CAP_PROP_PVAPI_DECIMATIONHORIZONTAL = 302, //!< Horizontal sub-sampling of the image. - CAP_PROP_PVAPI_DECIMATIONVERTICAL = 303, //!< Vertical sub-sampling of the image. - CAP_PROP_PVAPI_BINNINGX = 304, //!< Horizontal binning factor. - CAP_PROP_PVAPI_BINNINGY = 305, //!< Vertical binning factor. - CAP_PROP_PVAPI_PIXELFORMAT = 306 //!< Pixel format. -}; - -//! PVAPI: FrameStartTriggerMode -enum -{ - CAP_PVAPI_FSTRIGMODE_FREERUN = 0, //!< Freerun - CAP_PVAPI_FSTRIGMODE_SYNCIN1 = 1, //!< SyncIn1 - CAP_PVAPI_FSTRIGMODE_SYNCIN2 = 2, //!< SyncIn2 - CAP_PVAPI_FSTRIGMODE_FIXEDRATE = 3, //!< FixedRate - CAP_PVAPI_FSTRIGMODE_SOFTWARE = 4 //!< Software -}; - -//! PVAPI: DecimationHorizontal, DecimationVertical -enum -{ - CAP_PVAPI_DECIMATION_OFF = 1, //!< Off - CAP_PVAPI_DECIMATION_2OUTOF4 = 2, //!< 2 out of 4 decimation - CAP_PVAPI_DECIMATION_2OUTOF8 = 4, //!< 2 out of 8 decimation - CAP_PVAPI_DECIMATION_2OUTOF16 = 8 //!< 2 out of 16 decimation -}; - -//! PVAPI: PixelFormat -enum -{ - CAP_PVAPI_PIXELFORMAT_MONO8 = 1, //!< Mono8 - CAP_PVAPI_PIXELFORMAT_MONO16 = 2, //!< Mono16 - CAP_PVAPI_PIXELFORMAT_BAYER8 = 3, //!< Bayer8 - CAP_PVAPI_PIXELFORMAT_BAYER16 = 4, //!< Bayer16 - CAP_PVAPI_PIXELFORMAT_RGB24 = 5, //!< Rgb24 - CAP_PVAPI_PIXELFORMAT_BGR24 = 6, //!< Bgr24 - CAP_PVAPI_PIXELFORMAT_RGBA32 = 7, //!< Rgba32 - CAP_PVAPI_PIXELFORMAT_BGRA32 = 8, //!< Bgra32 -}; - -//! @} PvAPI - -/** @name XIMEA Camera API - @{ -*/ - -//! Properties of cameras available through XIMEA SDK backend -enum -{ - CAP_PROP_XI_DOWNSAMPLING = 400, //!< Change image resolution by binning or skipping. - CAP_PROP_XI_DATA_FORMAT = 401, //!< Output data format. - CAP_PROP_XI_OFFSET_X = 402, //!< Horizontal offset from the origin to the area of interest (in pixels). - CAP_PROP_XI_OFFSET_Y = 403, //!< Vertical offset from the origin to the area of interest (in pixels). - CAP_PROP_XI_TRG_SOURCE = 404, //!< Defines source of trigger. - CAP_PROP_XI_TRG_SOFTWARE = 405, //!< Generates an internal trigger. PRM_TRG_SOURCE must be set to TRG_SOFTWARE. - CAP_PROP_XI_GPI_SELECTOR = 406, //!< Selects general purpose input. - CAP_PROP_XI_GPI_MODE = 407, //!< Set general purpose input mode. - CAP_PROP_XI_GPI_LEVEL = 408, //!< Get general purpose level. - CAP_PROP_XI_GPO_SELECTOR = 409, //!< Selects general purpose output. - CAP_PROP_XI_GPO_MODE = 410, //!< Set general purpose output mode. - CAP_PROP_XI_LED_SELECTOR = 411, //!< Selects camera signalling LED. - CAP_PROP_XI_LED_MODE = 412, //!< Define camera signalling LED functionality. - CAP_PROP_XI_MANUAL_WB = 413, //!< Calculates White Balance(must be called during acquisition). - CAP_PROP_XI_AUTO_WB = 414, //!< Automatic white balance. - CAP_PROP_XI_AEAG = 415, //!< Automatic exposure/gain. - CAP_PROP_XI_EXP_PRIORITY = 416, //!< Exposure priority (0.5 - exposure 50%, gain 50%). - CAP_PROP_XI_AE_MAX_LIMIT = 417, //!< Maximum limit of exposure in AEAG procedure. - CAP_PROP_XI_AG_MAX_LIMIT = 418, //!< Maximum limit of gain in AEAG procedure. - CAP_PROP_XI_AEAG_LEVEL = 419, //!< Average intensity of output signal AEAG should achieve(in %). - CAP_PROP_XI_TIMEOUT = 420, //!< Image capture timeout in milliseconds. - CAP_PROP_XI_EXPOSURE = 421, //!< Exposure time in microseconds. - CAP_PROP_XI_EXPOSURE_BURST_COUNT = 422, //!< Sets the number of times of exposure in one frame. - CAP_PROP_XI_GAIN_SELECTOR = 423, //!< Gain selector for parameter Gain allows to select different type of gains. - CAP_PROP_XI_GAIN = 424, //!< Gain in dB. - CAP_PROP_XI_DOWNSAMPLING_TYPE = 426, //!< Change image downsampling type. - CAP_PROP_XI_BINNING_SELECTOR = 427, //!< Binning engine selector. - CAP_PROP_XI_BINNING_VERTICAL = 428, //!< Vertical Binning - number of vertical photo-sensitive cells to combine together. - CAP_PROP_XI_BINNING_HORIZONTAL = 429, //!< Horizontal Binning - number of horizontal photo-sensitive cells to combine together. - CAP_PROP_XI_BINNING_PATTERN = 430, //!< Binning pattern type. - CAP_PROP_XI_DECIMATION_SELECTOR = 431, //!< Decimation engine selector. - CAP_PROP_XI_DECIMATION_VERTICAL = 432, //!< Vertical Decimation - vertical sub-sampling of the image - reduces the vertical resolution of the image by the specified vertical decimation factor. - CAP_PROP_XI_DECIMATION_HORIZONTAL = 433, //!< Horizontal Decimation - horizontal sub-sampling of the image - reduces the horizontal resolution of the image by the specified vertical decimation factor. - CAP_PROP_XI_DECIMATION_PATTERN = 434, //!< Decimation pattern type. - CAP_PROP_XI_TEST_PATTERN_GENERATOR_SELECTOR = 587, //!< Selects which test pattern generator is controlled by the TestPattern feature. - CAP_PROP_XI_TEST_PATTERN = 588, //!< Selects which test pattern type is generated by the selected generator. - CAP_PROP_XI_IMAGE_DATA_FORMAT = 435, //!< Output data format. - CAP_PROP_XI_SHUTTER_TYPE = 436, //!< Change sensor shutter type(CMOS sensor). - CAP_PROP_XI_SENSOR_TAPS = 437, //!< Number of taps. - CAP_PROP_XI_AEAG_ROI_OFFSET_X = 439, //!< Automatic exposure/gain ROI offset X. - CAP_PROP_XI_AEAG_ROI_OFFSET_Y = 440, //!< Automatic exposure/gain ROI offset Y. - CAP_PROP_XI_AEAG_ROI_WIDTH = 441, //!< Automatic exposure/gain ROI Width. - CAP_PROP_XI_AEAG_ROI_HEIGHT = 442, //!< Automatic exposure/gain ROI Height. - CAP_PROP_XI_BPC = 445, //!< Correction of bad pixels. - CAP_PROP_XI_WB_KR = 448, //!< White balance red coefficient. - CAP_PROP_XI_WB_KG = 449, //!< White balance green coefficient. - CAP_PROP_XI_WB_KB = 450, //!< White balance blue coefficient. - CAP_PROP_XI_WIDTH = 451, //!< Width of the Image provided by the device (in pixels). - CAP_PROP_XI_HEIGHT = 452, //!< Height of the Image provided by the device (in pixels). - CAP_PROP_XI_REGION_SELECTOR = 589, //!< Selects Region in Multiple ROI which parameters are set by width, height, ... ,region mode. - CAP_PROP_XI_REGION_MODE = 595, //!< Activates/deactivates Region selected by Region Selector. - CAP_PROP_XI_LIMIT_BANDWIDTH = 459, //!< Set/get bandwidth(datarate)(in Megabits). - CAP_PROP_XI_SENSOR_DATA_BIT_DEPTH = 460, //!< Sensor output data bit depth. - CAP_PROP_XI_OUTPUT_DATA_BIT_DEPTH = 461, //!< Device output data bit depth. - CAP_PROP_XI_IMAGE_DATA_BIT_DEPTH = 462, //!< bitdepth of data returned by function xiGetImage. - CAP_PROP_XI_OUTPUT_DATA_PACKING = 463, //!< Device output data packing (or grouping) enabled. Packing could be enabled if output_data_bit_depth > 8 and packing capability is available. - CAP_PROP_XI_OUTPUT_DATA_PACKING_TYPE = 464, //!< Data packing type. Some cameras supports only specific packing type. - CAP_PROP_XI_IS_COOLED = 465, //!< Returns 1 for cameras that support cooling. - CAP_PROP_XI_COOLING = 466, //!< Start camera cooling. - CAP_PROP_XI_TARGET_TEMP = 467, //!< Set sensor target temperature for cooling. - CAP_PROP_XI_CHIP_TEMP = 468, //!< Camera sensor temperature. - CAP_PROP_XI_HOUS_TEMP = 469, //!< Camera housing temperature. - CAP_PROP_XI_HOUS_BACK_SIDE_TEMP = 590, //!< Camera housing back side temperature. - CAP_PROP_XI_SENSOR_BOARD_TEMP = 596, //!< Camera sensor board temperature. - CAP_PROP_XI_CMS = 470, //!< Mode of color management system. - CAP_PROP_XI_APPLY_CMS = 471, //!< Enable applying of CMS profiles to xiGetImage (see XI_PRM_INPUT_CMS_PROFILE, XI_PRM_OUTPUT_CMS_PROFILE). - CAP_PROP_XI_IMAGE_IS_COLOR = 474, //!< Returns 1 for color cameras. - CAP_PROP_XI_COLOR_FILTER_ARRAY = 475, //!< Returns color filter array type of RAW data. - CAP_PROP_XI_GAMMAY = 476, //!< Luminosity gamma. - CAP_PROP_XI_GAMMAC = 477, //!< Chromaticity gamma. - CAP_PROP_XI_SHARPNESS = 478, //!< Sharpness Strength. - CAP_PROP_XI_CC_MATRIX_00 = 479, //!< Color Correction Matrix element [0][0]. - CAP_PROP_XI_CC_MATRIX_01 = 480, //!< Color Correction Matrix element [0][1]. - CAP_PROP_XI_CC_MATRIX_02 = 481, //!< Color Correction Matrix element [0][2]. - CAP_PROP_XI_CC_MATRIX_03 = 482, //!< Color Correction Matrix element [0][3]. - CAP_PROP_XI_CC_MATRIX_10 = 483, //!< Color Correction Matrix element [1][0]. - CAP_PROP_XI_CC_MATRIX_11 = 484, //!< Color Correction Matrix element [1][1]. - CAP_PROP_XI_CC_MATRIX_12 = 485, //!< Color Correction Matrix element [1][2]. - CAP_PROP_XI_CC_MATRIX_13 = 486, //!< Color Correction Matrix element [1][3]. - CAP_PROP_XI_CC_MATRIX_20 = 487, //!< Color Correction Matrix element [2][0]. - CAP_PROP_XI_CC_MATRIX_21 = 488, //!< Color Correction Matrix element [2][1]. - CAP_PROP_XI_CC_MATRIX_22 = 489, //!< Color Correction Matrix element [2][2]. - CAP_PROP_XI_CC_MATRIX_23 = 490, //!< Color Correction Matrix element [2][3]. - CAP_PROP_XI_CC_MATRIX_30 = 491, //!< Color Correction Matrix element [3][0]. - CAP_PROP_XI_CC_MATRIX_31 = 492, //!< Color Correction Matrix element [3][1]. - CAP_PROP_XI_CC_MATRIX_32 = 493, //!< Color Correction Matrix element [3][2]. - CAP_PROP_XI_CC_MATRIX_33 = 494, //!< Color Correction Matrix element [3][3]. - CAP_PROP_XI_DEFAULT_CC_MATRIX = 495, //!< Set default Color Correction Matrix. - CAP_PROP_XI_TRG_SELECTOR = 498, //!< Selects the type of trigger. - CAP_PROP_XI_ACQ_FRAME_BURST_COUNT = 499, //!< Sets number of frames acquired by burst. This burst is used only if trigger is set to FrameBurstStart. - CAP_PROP_XI_DEBOUNCE_EN = 507, //!< Enable/Disable debounce to selected GPI. - CAP_PROP_XI_DEBOUNCE_T0 = 508, //!< Debounce time (x * 10us). - CAP_PROP_XI_DEBOUNCE_T1 = 509, //!< Debounce time (x * 10us). - CAP_PROP_XI_DEBOUNCE_POL = 510, //!< Debounce polarity (pol = 1 t0 - falling edge, t1 - rising edge). - CAP_PROP_XI_LENS_MODE = 511, //!< Status of lens control interface. This shall be set to XI_ON before any Lens operations. - CAP_PROP_XI_LENS_APERTURE_VALUE = 512, //!< Current lens aperture value in stops. Examples: 2.8, 4, 5.6, 8, 11. - CAP_PROP_XI_LENS_FOCUS_MOVEMENT_VALUE = 513, //!< Lens current focus movement value to be used by XI_PRM_LENS_FOCUS_MOVE in motor steps. - CAP_PROP_XI_LENS_FOCUS_MOVE = 514, //!< Moves lens focus motor by steps set in XI_PRM_LENS_FOCUS_MOVEMENT_VALUE. - CAP_PROP_XI_LENS_FOCUS_DISTANCE = 515, //!< Lens focus distance in cm. - CAP_PROP_XI_LENS_FOCAL_LENGTH = 516, //!< Lens focal distance in mm. - CAP_PROP_XI_LENS_FEATURE_SELECTOR = 517, //!< Selects the current feature which is accessible by XI_PRM_LENS_FEATURE. - CAP_PROP_XI_LENS_FEATURE = 518, //!< Allows access to lens feature value currently selected by XI_PRM_LENS_FEATURE_SELECTOR. - CAP_PROP_XI_DEVICE_MODEL_ID = 521, //!< Returns device model id. - CAP_PROP_XI_DEVICE_SN = 522, //!< Returns device serial number. - CAP_PROP_XI_IMAGE_DATA_FORMAT_RGB32_ALPHA = 529, //!< The alpha channel of RGB32 output image format. - CAP_PROP_XI_IMAGE_PAYLOAD_SIZE = 530, //!< Buffer size in bytes sufficient for output image returned by xiGetImage. - CAP_PROP_XI_TRANSPORT_PIXEL_FORMAT = 531, //!< Current format of pixels on transport layer. - CAP_PROP_XI_SENSOR_CLOCK_FREQ_HZ = 532, //!< Sensor clock frequency in Hz. - CAP_PROP_XI_SENSOR_CLOCK_FREQ_INDEX = 533, //!< Sensor clock frequency index. Sensor with selected frequencies have possibility to set the frequency only by this index. - CAP_PROP_XI_SENSOR_OUTPUT_CHANNEL_COUNT = 534, //!< Number of output channels from sensor used for data transfer. - CAP_PROP_XI_FRAMERATE = 535, //!< Define framerate in Hz. - CAP_PROP_XI_COUNTER_SELECTOR = 536, //!< Select counter. - CAP_PROP_XI_COUNTER_VALUE = 537, //!< Counter status. - CAP_PROP_XI_ACQ_TIMING_MODE = 538, //!< Type of sensor frames timing. - CAP_PROP_XI_AVAILABLE_BANDWIDTH = 539, //!< Calculate and returns available interface bandwidth(int Megabits). - CAP_PROP_XI_BUFFER_POLICY = 540, //!< Data move policy. - CAP_PROP_XI_LUT_EN = 541, //!< Activates LUT. - CAP_PROP_XI_LUT_INDEX = 542, //!< Control the index (offset) of the coefficient to access in the LUT. - CAP_PROP_XI_LUT_VALUE = 543, //!< Value at entry LUTIndex of the LUT. - CAP_PROP_XI_TRG_DELAY = 544, //!< Specifies the delay in microseconds (us) to apply after the trigger reception before activating it. - CAP_PROP_XI_TS_RST_MODE = 545, //!< Defines how time stamp reset engine will be armed. - CAP_PROP_XI_TS_RST_SOURCE = 546, //!< Defines which source will be used for timestamp reset. Writing this parameter will trigger settings of engine (arming). - CAP_PROP_XI_IS_DEVICE_EXIST = 547, //!< Returns 1 if camera connected and works properly. - CAP_PROP_XI_ACQ_BUFFER_SIZE = 548, //!< Acquisition buffer size in buffer_size_unit. Default bytes. - CAP_PROP_XI_ACQ_BUFFER_SIZE_UNIT = 549, //!< Acquisition buffer size unit in bytes. Default 1. E.g. Value 1024 means that buffer_size is in KiBytes. - CAP_PROP_XI_ACQ_TRANSPORT_BUFFER_SIZE = 550, //!< Acquisition transport buffer size in bytes. - CAP_PROP_XI_BUFFERS_QUEUE_SIZE = 551, //!< Queue of field/frame buffers. - CAP_PROP_XI_ACQ_TRANSPORT_BUFFER_COMMIT = 552, //!< Number of buffers to commit to low level. - CAP_PROP_XI_RECENT_FRAME = 553, //!< GetImage returns most recent frame. - CAP_PROP_XI_DEVICE_RESET = 554, //!< Resets the camera to default state. - CAP_PROP_XI_COLUMN_FPN_CORRECTION = 555, //!< Correction of column FPN. - CAP_PROP_XI_ROW_FPN_CORRECTION = 591, //!< Correction of row FPN. - CAP_PROP_XI_SENSOR_MODE = 558, //!< Current sensor mode. Allows to select sensor mode by one integer. Setting of this parameter affects: image dimensions and downsampling. - CAP_PROP_XI_HDR = 559, //!< Enable High Dynamic Range feature. - CAP_PROP_XI_HDR_KNEEPOINT_COUNT = 560, //!< The number of kneepoints in the PWLR. - CAP_PROP_XI_HDR_T1 = 561, //!< Position of first kneepoint(in % of XI_PRM_EXPOSURE). - CAP_PROP_XI_HDR_T2 = 562, //!< Position of second kneepoint (in % of XI_PRM_EXPOSURE). - CAP_PROP_XI_KNEEPOINT1 = 563, //!< Value of first kneepoint (% of sensor saturation). - CAP_PROP_XI_KNEEPOINT2 = 564, //!< Value of second kneepoint (% of sensor saturation). - CAP_PROP_XI_IMAGE_BLACK_LEVEL = 565, //!< Last image black level counts. Can be used for Offline processing to recall it. - CAP_PROP_XI_HW_REVISION = 571, //!< Returns hardware revision number. - CAP_PROP_XI_DEBUG_LEVEL = 572, //!< Set debug level. - CAP_PROP_XI_AUTO_BANDWIDTH_CALCULATION = 573, //!< Automatic bandwidth calculation. - CAP_PROP_XI_FFS_FILE_ID = 594, //!< File number. - CAP_PROP_XI_FFS_FILE_SIZE = 580, //!< Size of file. - CAP_PROP_XI_FREE_FFS_SIZE = 581, //!< Size of free camera FFS. - CAP_PROP_XI_USED_FFS_SIZE = 582, //!< Size of used camera FFS. - CAP_PROP_XI_FFS_ACCESS_KEY = 583, //!< Setting of key enables file operations on some cameras. - CAP_PROP_XI_SENSOR_FEATURE_SELECTOR = 585, //!< Selects the current feature which is accessible by XI_PRM_SENSOR_FEATURE_VALUE. - CAP_PROP_XI_SENSOR_FEATURE_VALUE = 586, //!< Allows access to sensor feature value currently selected by XI_PRM_SENSOR_FEATURE_SELECTOR. -}; - -//! @} XIMEA - -/** @name ARAVIS Camera API - @{ -*/ - -//! Properties of cameras available through ARAVIS backend -enum -{ - CAP_PROP_ARAVIS_AUTOTRIGGER = 600 //!< Automatically trigger frame capture if camera is configured with software trigger -}; - -//! @} ARAVIS - -/** @name AVFoundation framework for iOS - @{ -*/ - -//! Properties of cameras available through AVFOUNDATION backend -enum -{ - CAP_PROP_IOS_DEVICE_FOCUS = 9001, - CAP_PROP_IOS_DEVICE_EXPOSURE = 9002, - CAP_PROP_IOS_DEVICE_FLASH = 9003, - CAP_PROP_IOS_DEVICE_WHITEBALANCE = 9004, - CAP_PROP_IOS_DEVICE_TORCH = 9005 -}; - -//! @} AVFoundation framework for iOS - -/** @name Smartek Giganetix GigEVisionSDK - @{ -*/ - -//! Properties of cameras available through Smartek Giganetix Ethernet Vision backend -/* --- Vladimir Litvinenko (litvinenko.vladimir@gmail.com) --- */ -enum -{ - CAP_PROP_GIGA_FRAME_OFFSET_X = 10001, - CAP_PROP_GIGA_FRAME_OFFSET_Y = 10002, - CAP_PROP_GIGA_FRAME_WIDTH_MAX = 10003, - CAP_PROP_GIGA_FRAME_HEIGH_MAX = 10004, - CAP_PROP_GIGA_FRAME_SENS_WIDTH = 10005, - CAP_PROP_GIGA_FRAME_SENS_HEIGH = 10006 -}; - -//! @} Smartek - -/** @name Intel Perceptual Computing SDK - @{ -*/ -enum -{ - CAP_PROP_INTELPERC_PROFILE_COUNT = 11001, - CAP_PROP_INTELPERC_PROFILE_IDX = 11002, - CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE = 11003, - CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE = 11004, - CAP_PROP_INTELPERC_DEPTH_CONFIDENCE_THRESHOLD = 11005, - CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ = 11006, - CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT = 11007 -}; - -//! Intel Perceptual Streams -enum -{ - CAP_INTELPERC_DEPTH_GENERATOR = 1 << 29, - CAP_INTELPERC_IMAGE_GENERATOR = 1 << 28, - CAP_INTELPERC_IR_GENERATOR = 1 << 27, - CAP_INTELPERC_GENERATORS_MASK = - CAP_INTELPERC_DEPTH_GENERATOR + CAP_INTELPERC_IMAGE_GENERATOR + CAP_INTELPERC_IR_GENERATOR -}; - -enum -{ - CAP_INTELPERC_DEPTH_MAP = 0, //!< Each pixel is a 16-bit integer. The value indicates the distance from an object to the camera's XY plane or the Cartesian depth. - CAP_INTELPERC_UVDEPTH_MAP = 1, //!< Each pixel contains two 32-bit floating point values in the range of 0-1, representing the mapping of depth coordinates to the color coordinates. - CAP_INTELPERC_IR_MAP = 2, //!< Each pixel is a 16-bit integer. The value indicates the intensity of the reflected laser beam. - CAP_INTELPERC_IMAGE = 3 -}; - -//! @} Intel Perceptual - -/** @name gPhoto2 connection - @{ -*/ - -/** @brief gPhoto2 properties - -If `propertyId` is less than 0 then work on widget with that __additive inversed__ camera setting ID -Get IDs by using CAP_PROP_GPHOTO2_WIDGET_ENUMERATE. -@see CvCaptureCAM_GPHOTO2 for more info -*/ -enum -{ - CAP_PROP_GPHOTO2_PREVIEW = 17001, //!< Capture only preview from liveview mode. - CAP_PROP_GPHOTO2_WIDGET_ENUMERATE = 17002, //!< Readonly, returns (const char *). - CAP_PROP_GPHOTO2_RELOAD_CONFIG = 17003, //!< Trigger, only by set. Reload camera settings. - CAP_PROP_GPHOTO2_RELOAD_ON_CHANGE = 17004, //!< Reload all settings on set. - CAP_PROP_GPHOTO2_COLLECT_MSGS = 17005, //!< Collect messages with details. - CAP_PROP_GPHOTO2_FLUSH_MSGS = 17006, //!< Readonly, returns (const char *). - CAP_PROP_SPEED = 17007, //!< Exposure speed. Can be readonly, depends on camera program. - CAP_PROP_APERTURE = 17008, //!< Aperture. Can be readonly, depends on camera program. - CAP_PROP_EXPOSUREPROGRAM = 17009, //!< Camera exposure program. - CAP_PROP_VIEWFINDER = 17010 //!< Enter liveview mode. -}; - -//! @} gPhoto2 - -/** @name Images backend - @{ -*/ - -/** @brief Images backend properties - -*/ -enum -{ - CAP_PROP_IMAGES_BASE = 18000, - CAP_PROP_IMAGES_LAST = 19000 // excluding -}; - -//! @} Images - -/** @name OBSENSOR (for Orbbec 3D-Sensor device/module ) - @{ -*/ -//! OBSENSOR data given from image generator -// VideoCaptureOBSensorDataType -enum -{ - CAP_OBSENSOR_DEPTH_MAP = 0, //!< Depth values in mm (CV_16UC1) - CAP_OBSENSOR_BGR_IMAGE = 1, //!< Data given from BGR stream generator - CAP_OBSENSOR_IR_IMAGE = 2 //!< Data given from IR stream generator(CV_16UC1) -}; - -//! OBSENSOR stream generator -// VideoCaptureOBSensorGenerators -enum -{ - CAP_OBSENSOR_DEPTH_GENERATOR = 1 << 29, - CAP_OBSENSOR_IMAGE_GENERATOR = 1 << 28, - CAP_OBSENSOR_IR_GENERATOR = 1 << 27, - CAP_OBSENSOR_GENERATORS_MASK = - CAP_OBSENSOR_DEPTH_GENERATOR + CAP_OBSENSOR_IMAGE_GENERATOR + CAP_OBSENSOR_IR_GENERATOR -}; - -//! OBSENSOR properties -// VideoCaptureOBSensorProperties -enum -{ - // INTRINSIC - CAP_PROP_OBSENSOR_INTRINSIC_FX = 26001, - CAP_PROP_OBSENSOR_INTRINSIC_FY = 26002, - CAP_PROP_OBSENSOR_INTRINSIC_CX = 26003, - CAP_PROP_OBSENSOR_INTRINSIC_CY = 26004, -}; - -//! type of the template matching operation -// TemplateMatchModes -enum -{ - TM_SQDIFF = 0, /*!< \f[R(x,y)= \sum _{x',y'} (T(x',y')-I(x+x',y+y'))^2\f] - with mask: - \f[R(x,y)= \sum _{x',y'} \left( (T(x',y')-I(x+x',y+y')) \cdot - M(x',y') \right)^2\f] */ - TM_SQDIFF_NORMED = 1, /*!< \f[R(x,y)= \frac{\sum_{x',y'} (T(x',y')-I(x+x',y+y'))^2}{\sqrt{\sum_{ - x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}\f] - with mask: - \f[R(x,y)= \frac{\sum _{x',y'} \left( (T(x',y')-I(x+x',y+y')) \cdot - M(x',y') \right)^2}{\sqrt{\sum_{x',y'} \left( T(x',y') \cdot - M(x',y') \right)^2 \cdot \sum_{x',y'} \left( I(x+x',y+y') \cdot - M(x',y') \right)^2}}\f] */ - TM_CCORR = 2, /*!< \f[R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y'))\f] - with mask: - \f[R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y') \cdot M(x',y') - ^2)\f] */ - TM_CCORR_NORMED = 3, /*!< \f[R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y'))}{\sqrt{ - \sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}\f] - with mask: - \f[R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y') \cdot - M(x',y')^2)}{\sqrt{\sum_{x',y'} \left( T(x',y') \cdot M(x',y') - \right)^2 \cdot \sum_{x',y'} \left( I(x+x',y+y') \cdot M(x',y') - \right)^2}}\f] */ - TM_CCOEFF = 4, /*!< \f[R(x,y)= \sum _{x',y'} (T'(x',y') \cdot I'(x+x',y+y'))\f] - where - \f[\begin{array}{l} T'(x',y')=T(x',y') - 1/(w \cdot h) \cdot \sum _{ - x'',y''} T(x'',y'') \\ I'(x+x',y+y')=I(x+x',y+y') - 1/(w \cdot h) - \cdot \sum _{x'',y''} I(x+x'',y+y'') \end{array}\f] - with mask: - \f[\begin{array}{l} T'(x',y')=M(x',y') \cdot \left( T(x',y') - - \frac{1}{\sum _{x'',y''} M(x'',y'')} \cdot \sum _{x'',y''} - (T(x'',y'') \cdot M(x'',y'')) \right) \\ I'(x+x',y+y')=M(x',y') - \cdot \left( I(x+x',y+y') - \frac{1}{\sum _{x'',y''} M(x'',y'')} - \cdot \sum _{x'',y''} (I(x+x'',y+y'') \cdot M(x'',y'')) \right) - \end{array} \f] */ - TM_CCOEFF_NORMED = 5 /*!< \f[R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{ - \sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2} - }\f] */ -}; - -//! type of the robust estimation algorithm -enum -{ - HOMOGRAPY_ALL_POINTS = 0, - HOMOGRAPY_LMEDS = 4, - HOMOGRAPY_RANSAC = 8 -}; - -//! Edge preserving filters -enum -{ - RECURS_FILTER = 1, //!< Recursive Filtering - NORMCONV_FILTER = 2 //!< Normalized Convolution Filtering -}; - -//! @addtogroup photo_inpaint -//! @{ -//! the inpainting algorithm -enum -{ - INPAINT_NS = 0, //!< Use Navier-Stokes based method - INPAINT_TELEA = 1 //!< Use the algorithm proposed by Alexandru Telea @cite Telea04 -}; - -//! seamlessClone algorithm flags -enum -{ - /** The power of the method is fully expressed when inserting objects with complex outlines into a new background*/ - NORMAL_CLONE = 1, - /** The classic method, color-based selection and alpha masking might be time consuming and often leaves an undesirable - halo. Seamless cloning, even averaged with the original image, is not effective. Mixed seamless cloning based on a loose selection proves effective.*/ - MIXED_CLONE = 2, - /** Monochrome transfer allows the user to easily replace certain features of one object by alternative features.*/ - MONOCHROME_TRANSFER = 3 -}; - -#pragma region calib3d - -//! type of the robust estimation algorithm -enum -{ - LMEDS = 4, //!< least-median of squares algorithm - RANSAC = 8, //!< RANSAC algorithm - RHO = 16, //!< RHO algorithm - USAC_DEFAULT = 32, //!< USAC algorithm, default settings - USAC_PARALLEL = 33, //!< USAC, parallel version - USAC_FM_8PTS = 34, //!< USAC, fundamental matrix 8 points - USAC_FAST = 35, //!< USAC, fast settings - USAC_ACCURATE = 36, //!< USAC, accurate settings - USAC_PROSAC = 37, //!< USAC, sorted points, runs PROSAC - USAC_MAGSAC = 38 //!< USAC, runs MAGSAC++ -}; - -enum SolvePnPMethod -{ - SOLVEPNP_ITERATIVE = 0, //!< Pose refinement using non-linear Levenberg-Marquardt minimization scheme @cite Madsen04 @cite Eade13 \n - //!< Initial solution for non-planar "objectPoints" needs at least 6 points and uses the DLT algorithm. \n - //!< Initial solution for planar "objectPoints" needs at least 4 points and uses pose from homography decomposition. - SOLVEPNP_EPNP = 1, //!< EPnP: Efficient Perspective-n-Point Camera Pose Estimation @cite lepetit2009epnp - SOLVEPNP_P3P = 2, //!< Complete Solution Classification for the Perspective-Three-Point Problem @cite gao2003complete - SOLVEPNP_DLS = 3, //!< **Broken implementation. Using this flag will fallback to EPnP.** \n - //!< A Direct Least-Squares (DLS) Method for PnP @cite hesch2011direct - SOLVEPNP_UPNP = 4, //!< **Broken implementation. Using this flag will fallback to EPnP.** \n - //!< Exhaustive Linearization for Robust Camera Pose and Focal Length Estimation @cite penate2013exhaustive - SOLVEPNP_AP3P = 5, //!< An Efficient Algebraic Solution to the Perspective-Three-Point Problem @cite Ke17 - SOLVEPNP_IPPE = 6, //!< Infinitesimal Plane-Based Pose Estimation @cite Collins14 \n - //!< Object points must be coplanar. - SOLVEPNP_IPPE_SQUARE = 7, //!< Infinitesimal Plane-Based Pose Estimation @cite Collins14 \n - //!< This is a special case suitable for marker pose estimation.\n - //!< 4 coplanar object points must be defined in the following order: - //!< - point 0: [-squareLength / 2, squareLength / 2, 0] - //!< - point 1: [ squareLength / 2, squareLength / 2, 0] - //!< - point 2: [ squareLength / 2, -squareLength / 2, 0] - //!< - point 3: [-squareLength / 2, -squareLength / 2, 0] - SOLVEPNP_SQPNP = 8, //!< SQPnP: A Consistently Fast and Globally OptimalSolution to the Perspective-n-Point Problem @cite Terzakis2020SQPnP -#ifndef CV_DOXYGEN - SOLVEPNP_MAX_COUNT //!< Used for count -#endif -}; - -enum -{ - CALIB_CB_ADAPTIVE_THRESH = 1, - CALIB_CB_NORMALIZE_IMAGE = 2, - CALIB_CB_FILTER_QUADS = 4, - CALIB_CB_FAST_CHECK = 8, - CALIB_CB_EXHAUSTIVE = 16, - CALIB_CB_ACCURACY = 32, - CALIB_CB_LARGER = 64, - CALIB_CB_MARKER = 128, - CALIB_CB_PLAIN = 256 -}; - -enum -{ - CALIB_CB_SYMMETRIC_GRID = 1, - CALIB_CB_ASYMMETRIC_GRID = 2, - CALIB_CB_CLUSTERING = 4 -}; - -enum -{ - CALIB_NINTRINSIC = 18, - CALIB_USE_INTRINSIC_GUESS = 0x00001, - CALIB_FIX_ASPECT_RATIO = 0x00002, - CALIB_FIX_PRINCIPAL_POINT = 0x00004, - CALIB_ZERO_TANGENT_DIST = 0x00008, - CALIB_FIX_FOCAL_LENGTH = 0x00010, - CALIB_FIX_K1 = 0x00020, - CALIB_FIX_K2 = 0x00040, - CALIB_FIX_K3 = 0x00080, - CALIB_FIX_K4 = 0x00800, - CALIB_FIX_K5 = 0x01000, - CALIB_FIX_K6 = 0x02000, - CALIB_RATIONAL_MODEL = 0x04000, - CALIB_THIN_PRISM_MODEL = 0x08000, - CALIB_FIX_S1_S2_S3_S4 = 0x10000, - CALIB_TILTED_MODEL = 0x40000, - CALIB_FIX_TAUX_TAUY = 0x80000, - CALIB_USE_QR = 0x100000, //!< use QR instead of SVD decomposition for solving. Faster but potentially less precise - CALIB_FIX_TANGENT_DIST = 0x200000, - // only for stereo - CALIB_FIX_INTRINSIC = 0x00100, - CALIB_SAME_FOCAL_LENGTH = 0x00200, - // for stereo rectification - CALIB_ZERO_DISPARITY = 0x00400, - CALIB_USE_LU = (1 - << 17), //!< use LU instead of SVD decomposition for solving. much faster but potentially less precise - CALIB_USE_EXTRINSIC_GUESS = (1 << 22) //!< for stereoCalibrate -}; - -#endif // OPENCV_DART_LIBRARY_ENUMS_H diff --git a/src/core/core.cpp b/src/core/core.cpp deleted file mode 100644 index 3982991f..00000000 --- a/src/core/core.cpp +++ /dev/null @@ -1,1836 +0,0 @@ -#include "core.h" -#include "core/types.h" -#include "lut.hpp" -#include "opencv2/core/cvdef.h" -#include "vec.hpp" - -#include -#include -#include -#include -#include - -CvStatus *RotatedRect_Points(RotatedRect rect, VecPoint2f *pts) { - BEGIN_WRAP - auto r = cv::RotatedRect( - cv::Point2f(rect.center.x, rect.center.y), - cv::Size2f(rect.size.width, rect.size.height), - rect.angle - ); - std::vector pts_; - r.points(pts_); - *pts = vecpoint2f_cpp2c(pts_); - END_WRAP -} - -CvStatus *RotatedRect_BoundingRect(RotatedRect rect, Rect *rval) { - BEGIN_WRAP - auto r = cv::RotatedRect( - cv::Point2f(rect.center.x, rect.center.y), - cv::Size2f(rect.size.width, rect.size.height), - rect.angle - ); - auto rr = r.boundingRect(); - *rval = {rr.x, rr.y, rr.width, rr.height}; - END_WRAP -} - -CvStatus *RotatedRect_BoundingRect2f(RotatedRect rect, Rect2f *rval) { - BEGIN_WRAP - auto r = cv::RotatedRect( - cv::Point2f(rect.center.x, rect.center.y), - cv::Size2f(rect.size.width, rect.size.height), - rect.angle - ); - auto rr = r.boundingRect2f(); - *rval = {rr.x, rr.y, rr.width, rr.height}; - END_WRAP -} - -void CvStatus_Close(CvStatus *self) { - if (self->err != NULL) { - free(self->err); - self->err = NULL; - } - if (self->file != NULL) { - free(self->file); - self->file = NULL; - } - if (self->msg != NULL) { - free(self->msg); - self->msg = NULL; - } - if (self->func != NULL) { - free(self->func); - self->func = NULL; - } - delete self; -} - -CvStatus *Mat_New(Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat()}; - END_WRAP -} -CvStatus *Mat_NewWithSize(int rows, int cols, int type, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(rows, cols, type)}; - END_WRAP -} -CvStatus *Mat_NewWithSizes(VecI32 sizes, int type, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(sizes.length, sizes.ptr, type)}; - END_WRAP -} -CvStatus *Mat_NewWithSizesFromScalar(VecI32 sizes, int type, Scalar ar, Mat *rval) { - BEGIN_WRAP - cv::Scalar c = cv::Scalar(ar.val1, ar.val2, ar.val3, ar.val4); - *rval = {new cv::Mat(sizes.length, sizes.ptr, type, c)}; - END_WRAP -} -CvStatus *Mat_NewWithSizesFromBytes(VecI32 sizes, int type, void *buf, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(sizes.length, sizes.ptr, type, buf)}; - END_WRAP -} - -CvStatus *Mat_NewFromScalar(const Scalar ar, int rows, int cols, int type, Mat *rval) { - BEGIN_WRAP - cv::Scalar c = cv::Scalar(ar.val1, ar.val2, ar.val3, ar.val4); - *rval = {new cv::Mat(rows, cols, type, c)}; - END_WRAP -} - -CvStatus *Mat_NewFromBytes(int rows, int cols, int type, void *buf, Mat *rval) { - BEGIN_WRAP - cv::Mat m = cv::Mat(rows, cols, type); - m.create(rows, cols, type); - memcpy(m.data, buf, m.total() * m.elemSize()); - *rval = {new cv::Mat(m)}; - END_WRAP -} - -CvStatus *Mat_NewFromVecPoint(VecPoint vec, Mat *rval) { - BEGIN_WRAP - auto v = vecpoint_c2cpp(vec); - *rval = {new cv::Mat(v, true)}; - END_WRAP -} -CvStatus *Mat_NewFromVecPoint2f(VecPoint2f vec, Mat *rval) { - BEGIN_WRAP - auto v = vecpoint2f_c2cpp(vec); - *rval = {new cv::Mat(v, true)}; - END_WRAP -} -CvStatus *Mat_NewFromVecPoint3f(VecPoint3f vec, Mat *rval) { - BEGIN_WRAP - auto v = vecpoint3f_c2cpp(vec); - *rval = {new cv::Mat(v, true)}; - END_WRAP -} - -CvStatus *Mat_NewFromVecPoint3i(VecPoint3i vec, Mat *rval) { - BEGIN_WRAP - auto v = vecpoint3i_c2cpp(vec); - *rval = {new cv::Mat(v, true)}; - END_WRAP -} - -CvStatus *Mat_toVecPoint(Mat self, VecPoint *vec) { - BEGIN_WRAP - std::vector pts; - self.ptr->copyTo(pts); - *vec = vecpoint_cpp2c(pts); - END_WRAP -} - -CvStatus *Mat_toVecPoint2f(Mat self, VecPoint2f *vec) { - BEGIN_WRAP - std::vector pts; - self.ptr->copyTo(pts); - *vec = vecpoint2f_cpp2c(pts); - END_WRAP -} - -CvStatus *Mat_toVecPoint3f(Mat self, VecPoint3f *vec) { - BEGIN_WRAP - std::vector pts = (std::vector)*self.ptr; - *vec = vecpoint3f_cpp2c(pts); - END_WRAP -} - -CvStatus *Mat_toVecPoint3i(Mat self, VecPoint3i *vec) { - BEGIN_WRAP - std::vector pts = (std::vector)*self.ptr; - *vec = vecpoint3i_cpp2c(pts); - END_WRAP -} - -CvStatus *Mat_toString( - Mat self, - int fmtType, - int f16Precision, - int f32Precision, - int f64Precision, - bool multiLine, - char **rval -) { - BEGIN_WRAP - auto fmt = cv::Formatter::get(static_cast(fmtType)); - fmt->set16fPrecision(f16Precision); - fmt->set32fPrecision(f32Precision); - fmt->set64fPrecision(f64Precision); - fmt->setMultiline(multiLine); - std::string fmtStr; - fmtStr << fmt->format(*self.ptr); - *rval = strdup(fmtStr.c_str()); - END_WRAP -} - -CvStatus *Mat_FromPtr(Mat m, int rows, int cols, int type, int prows, int pcols, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(rows, cols, type, m.ptr->ptr(prows, pcols))}; - END_WRAP -} - -CvStatus *Mat_FromRange(Mat m, int rowStart, int rowEnd, int colStart, int colEnd, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(*m.ptr, cv::Range(rowStart, rowEnd), cv::Range(colStart, colEnd))}; - END_WRAP -} - -CvStatus *Mat_FromCMat(Mat m, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->clone())}; - END_WRAP -} -void Mat_Close(MatPtr m) { - m->ptr->release(); - CVD_FREE(m); -} -void Mat_CloseVoid(void *m) { - auto p = reinterpret_cast(m); - p->ptr->release(); - CVD_FREE(p); -} -CvStatus *Mat_Release(Mat *m) { - BEGIN_WRAP - m->ptr->release(); - END_WRAP -} - -int Mat_Flags(Mat m) { return (m.ptr->flags); } -bool Mat_Empty(Mat m) { return m.ptr->empty(); } -bool Mat_IsContinuous(Mat m) { return m.ptr->isContinuous(); } -bool Mat_IsSubmatrix(Mat m) { return m.ptr->isSubmatrix(); } -int Mat_Rows(Mat m) { return m.ptr->rows; } -int Mat_Cols(Mat m) { return m.ptr->cols; } -int Mat_Channels(Mat m) { return m.ptr->channels(); } -int Mat_Type(Mat m) { return m.ptr->type(); } -MatStep Mat_Step(Mat m) { - auto step = m.ptr->step; - return {{step.p[0], step.p[1], step.p[2]}}; -} -int Mat_Total(Mat m) { return m.ptr->total(); } -VecI32 *Mat_Size(Mat m) { - auto size = m.ptr->size; - int *ptr = new int[size.dims()]; - memcpy(ptr, size.p, size.dims() * sizeof(int)); - return new VecI32{ptr, static_cast(size.dims())}; -} -int Mat_ElemSize(Mat m) { return m.ptr->elemSize(); } -int Mat_ElemSize1(Mat m) { return m.ptr->elemSize1(); } - -int Mat_Dims(Mat m) { return m.ptr->dims; } - -uchar *Mat_Data(Mat m) { return (uchar *)m.ptr->data; } - -CvStatus *Mat_AdjustROI(Mat m, int dtop, int dbottom, int dleft, int dright, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->adjustROI(dtop, dbottom, dleft, dright))}; - END_WRAP -} - -CvStatus *Mat_LocateROI(Mat m, Size *wholeSize, Point *ofs) { - BEGIN_WRAP - cv::Size sz; - cv::Point pt; - m.ptr->locateROI(sz, pt); - *wholeSize = {sz.width, sz.height}; - *ofs = {pt.x, pt.y}; - END_WRAP -} - -CvStatus *Mat_Clone(Mat m, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->clone())}; - END_WRAP -} - -CvStatus *Mat_Col(Mat m, int x, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->col(x))}; - END_WRAP -} - -CvStatus *Mat_Row(Mat m, int y, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->row(y))}; - END_WRAP -} - -CvStatus *Mat_CopyTo(Mat m, Mat dst) { - BEGIN_WRAP - m.ptr->copyTo(*dst.ptr); - END_WRAP -} -CvStatus *Mat_CopyToWithMask(Mat m, Mat dst, Mat mask) { - BEGIN_WRAP - m.ptr->copyTo(*dst.ptr, *mask.ptr); - END_WRAP -} -CvStatus *Mat_ConvertTo(Mat m, Mat dst, int type) { - BEGIN_WRAP - m.ptr->convertTo(*dst.ptr, type); - END_WRAP -} -CvStatus *Mat_ConvertToWithParams(Mat m, Mat dst, int type, float alpha, float beta) { - BEGIN_WRAP - m.ptr->convertTo(*dst.ptr, type, alpha, beta); - END_WRAP -} -CvStatus *Mat_ToVecUChar(Mat m, VecUChar *rval) { - BEGIN_WRAP - if (m.ptr->isContinuous()) { - *rval = {m.ptr->data, m.ptr->total() * m.ptr->channels()}; - } else { - throw cv::Exception( - cv::Error::StsNotImplemented, "Mat is not continuous", __func__, __FILE__, __LINE__ - ); - } - END_WRAP -} - -CvStatus *Mat_ToVecChar(Mat m, VecChar *rval) { - BEGIN_WRAP - if (m.ptr->isContinuous()) { - *rval = {(char *)m.ptr->data, m.ptr->total() * m.ptr->channels()}; - } else { - throw cv::Exception( - cv::Error::StsNotImplemented, "Mat is not continuous", __func__, __FILE__, __LINE__ - ); - } - END_WRAP -} -CvStatus *Mat_Region(Mat m, Rect r, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(*m.ptr, cv::Rect(r.x, r.y, r.width, r.height))}; - END_WRAP -} -CvStatus *Mat_Reshape(Mat m, int cn, int rows, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->reshape(cn, rows))}; - END_WRAP -} - -CvStatus *Mat_ReshapeByVec(Mat m, int cn, VecI32 newshape, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->reshape(cn, vecint_c2cpp(newshape)))}; - END_WRAP -} - -CvStatus *Mat_PatchNaNs(Mat m, double val) { - BEGIN_WRAP - cv::patchNaNs(*m.ptr, val); - END_WRAP -} -CvStatus *Mat_ConvertFp16(Mat m, Mat *rval) { - BEGIN_WRAP - auto dst = cv::Mat(); - cv::convertFp16(*m.ptr, dst); - *rval = {new cv::Mat(dst)}; - END_WRAP -} -CvStatus *Mat_Mean(Mat m, Scalar *rval) { - BEGIN_WRAP - cv::Scalar c = cv::mean(*m.ptr); - *rval = Scalar{c.val[0], c.val[1], c.val[2], c.val[3]}; - END_WRAP -} -CvStatus *Mat_MeanWithMask(Mat m, Mat mask, Scalar *rval) { - BEGIN_WRAP - cv::Scalar c = cv::mean(*m.ptr, *mask.ptr); - *rval = Scalar{c.val[0], c.val[1], c.val[2], c.val[3]}; - END_WRAP -} -CvStatus *Mat_Sqrt(Mat m, Mat *rval) { - BEGIN_WRAP - auto dst = cv::Mat(); - cv::sqrt(*m.ptr, dst); - *rval = {new cv::Mat(dst)}; - END_WRAP -} - -CvStatus *Eye(int rows, int cols, int type, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(cv::Mat::eye(rows, cols, type))}; - END_WRAP -} -CvStatus *Zeros(int rows, int cols, int type, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(cv::Mat::zeros(rows, cols, type))}; - END_WRAP -} -CvStatus *Ones(int rows, int cols, int type, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(cv::Mat::ones(rows, cols, type))}; - END_WRAP -} - -uchar *Mat_Ptr_u8_1(Mat m, int i) { return m.ptr->ptr(i); } -uchar *Mat_Ptr_u8_2(Mat m, int i, int j) { return m.ptr->ptr(i, j); } -uchar *Mat_Ptr_u8_3(Mat m, int i, int j, int k) { return m.ptr->ptr(i, j, k); } - -#pragma region Mat_getter - -CvStatus *Mat_GetUChar(Mat m, int row, int col, uint8_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(row, col); - END_WRAP -} -CvStatus *Mat_GetUChar3(Mat m, int x, int y, int z, uint8_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(x, y, z); - END_WRAP -} -CvStatus *Mat_GetSChar(Mat m, int row, int col, int8_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(row, col); - END_WRAP -} -CvStatus *Mat_GetSChar3(Mat m, int x, int y, int z, int8_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(x, y, z); - END_WRAP -} -CvStatus *Mat_GetUShort(Mat m, int row, int col, uint16_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(row, col); - END_WRAP -} -CvStatus *Mat_GetUShort3(Mat m, int x, int y, int z, uint16_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(x, y, z); - END_WRAP -} -CvStatus *Mat_GetShort(Mat m, int row, int col, int16_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(row, col); - END_WRAP -} -CvStatus *Mat_GetShort3(Mat m, int x, int y, int z, int16_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(x, y, z); - END_WRAP -} -CvStatus *Mat_GetInt(Mat m, int row, int col, int32_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(row, col); - END_WRAP -} -CvStatus *Mat_GetInt3(Mat m, int x, int y, int z, int32_t *rval) { - BEGIN_WRAP - *rval = m.ptr->at(x, y, z); - END_WRAP -} -CvStatus *Mat_GetFloat(Mat m, int row, int col, float *rval) { - BEGIN_WRAP - *rval = m.ptr->at(row, col); - END_WRAP -} -CvStatus *Mat_GetFloat3(Mat m, int x, int y, int z, float *rval) { - BEGIN_WRAP - *rval = m.ptr->at(x, y, z); - END_WRAP -} -CvStatus *Mat_GetDouble(Mat m, int row, int col, double *rval) { - BEGIN_WRAP - *rval = m.ptr->at(row, col); - END_WRAP -} -CvStatus *Mat_GetDouble3(Mat m, int x, int y, int z, double *rval) { - BEGIN_WRAP - *rval = m.ptr->at(x, y, z); - END_WRAP -} - -Vec2b *Mat_GetVec2b(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec2b{v.val[0], v.val[1]}; -} -Vec3b *Mat_GetVec3b(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec3b{v.val[0], v.val[1], v.val[2]}; -} -Vec4b *Mat_GetVec4b(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec4b{v.val[0], v.val[1], v.val[2], v.val[3]}; -} -Vec2s *Mat_GetVec2s(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec2s{v.val[0], v.val[1]}; -} -Vec3s *Mat_GetVec3s(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec3s{v.val[0], v.val[1], v.val[2]}; -} -Vec4s *Mat_GetVec4s(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec4s{v.val[0], v.val[1], v.val[2], v.val[3]}; -} -Vec2w *Mat_GetVec2w(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec2w{v.val[0], v.val[1]}; -} -Vec3w *Mat_GetVec3w(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec3w{v.val[0], v.val[1], v.val[2]}; -} -Vec4w *Mat_GetVec4w(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec4w{v.val[0], v.val[1], v.val[2], v.val[3]}; -} -Vec2i *Mat_GetVec2i(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec2i{v.val[0], v.val[1]}; -} -Vec3i *Mat_GetVec3i(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec3i{v.val[0], v.val[1], v.val[2]}; -} -Vec4i *Mat_GetVec4i(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec4i{v.val[0], v.val[1], v.val[2], v.val[3]}; -} -Vec6i *Mat_GetVec6i(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec6i{v.val[0], v.val[1], v.val[2], v.val[3], v.val[4], v.val[5]}; -} -Vec8i *Mat_GetVec8i(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec8i{v.val[0], v.val[1], v.val[2], v.val[3], v.val[4], v.val[5], v.val[6], v.val[7]}; -} -Vec2f *Mat_GetVec2f(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec2f{v.val[0], v.val[1]}; -} -Vec3f *Mat_GetVec3f(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec3f{v.val[0], v.val[1], v.val[2]}; -} -Vec4f *Mat_GetVec4f(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec4f{v.val[0], v.val[1], v.val[2], v.val[3]}; -} -Vec6f *Mat_GetVec6f(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec6f{v.val[0], v.val[1], v.val[2], v.val[3], v.val[4], v.val[5]}; -} -Vec2d *Mat_GetVec2d(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec2d{v.val[0], v.val[1]}; -} -Vec3d *Mat_GetVec3d(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec3d{v.val[0], v.val[1], v.val[2]}; -} -Vec4d *Mat_GetVec4d(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec4d{v.val[0], v.val[1], v.val[2], v.val[3]}; -} -Vec6d *Mat_GetVec6d(Mat m, int row, int col) { - auto v = m.ptr->at(row, col); - return new Vec6d{v.val[0], v.val[1], v.val[2], v.val[3], v.val[4], v.val[5]}; -} - -#pragma endregion - -#pragma region Mat_setter - -CvStatus *Mat_SetTo(Mat m, Scalar value, Mat mask) { - BEGIN_WRAP - cv::Scalar c_value(value.val1, value.val2, value.val3, value.val4); - m.ptr->setTo(c_value, *mask.ptr); - END_WRAP -} -CvStatus *Mat_SetUChar(Mat m, int row, int col, uint8_t val) { - BEGIN_WRAP - m.ptr->at(row, col) = val; - END_WRAP -} -CvStatus *Mat_SetUChar3(Mat m, int x, int y, int z, uint8_t val) { - BEGIN_WRAP - m.ptr->at(x, y, z) = val; - END_WRAP -} -CvStatus *Mat_SetSChar(Mat m, int row, int col, int8_t val) { - BEGIN_WRAP - m.ptr->at(row, col) = val; - END_WRAP -} -CvStatus *Mat_SetSChar3(Mat m, int x, int y, int z, int8_t val) { - BEGIN_WRAP - m.ptr->at(x, y, z) = val; - END_WRAP -} -// Mat_SetShort set a specific row/col value from this Mat expecting -// each element to contain a short aka CV_16S. -CvStatus *Mat_SetShort(Mat m, int row, int col, int16_t val) { - BEGIN_WRAP - m.ptr->at(row, col) = val; - END_WRAP -} - -CvStatus *Mat_SetShort3(Mat m, int x, int y, int z, int16_t val) { - BEGIN_WRAP - m.ptr->at(x, y, z) = val; - END_WRAP -} - -CvStatus *Mat_SetUShort(Mat m, int row, int col, uint16_t val) { - BEGIN_WRAP - m.ptr->at(row, col) = val; - END_WRAP -} - -CvStatus *Mat_SetUShort3(Mat m, int x, int y, int z, uint16_t val) { - BEGIN_WRAP - m.ptr->at(x, y, z) = val; - END_WRAP -} - -// Mat_SetInt set a specific row/col value from this Mat expecting -// each element to contain an int aka CV_32S. -CvStatus *Mat_SetInt(Mat m, int row, int col, int32_t val) { - BEGIN_WRAP - m.ptr->at(row, col) = val; - END_WRAP -} - -CvStatus *Mat_SetInt3(Mat m, int x, int y, int z, int32_t val) { - BEGIN_WRAP - m.ptr->at(x, y, z) = val; - END_WRAP -} - -// Mat_SetFloat set a specific row/col value from this Mat expecting -// each element to contain a float aka CV_32F. -CvStatus *Mat_SetFloat(Mat m, int row, int col, float val) { - BEGIN_WRAP - m.ptr->at(row, col) = val; - END_WRAP -} - -CvStatus *Mat_SetFloat3(Mat m, int x, int y, int z, float val) { - BEGIN_WRAP - m.ptr->at(x, y, z) = val; - END_WRAP -} - -// Mat_SetDouble set a specific row/col value from this Mat expecting -// each element to contain a double aka CV_64F. -CvStatus *Mat_SetDouble(Mat m, int row, int col, double val) { - BEGIN_WRAP - m.ptr->at(row, col) = val; - END_WRAP -} - -CvStatus *Mat_SetDouble3(Mat m, int x, int y, int z, double val) { - BEGIN_WRAP - m.ptr->at(x, y, z) = val; - END_WRAP -} - -CvStatus *Mat_SetVec2b(Mat m, int row, int col, Vec2b val) { - BEGIN_WRAP - auto v = cv::Vec2b(val.val1, val.val2); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec3b(Mat m, int row, int col, Vec3b val) { - BEGIN_WRAP - auto v = cv::Vec3b(val.val1, val.val2, val.val3); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec4b(Mat m, int row, int col, Vec4b val) { - BEGIN_WRAP - auto v = cv::Vec4b(val.val1, val.val2, val.val3, val.val4); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec2s(Mat m, int row, int col, Vec2s val) { - BEGIN_WRAP - auto v = cv::Vec2s(val.val1, val.val2); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec3s(Mat m, int row, int col, Vec3s val) { - BEGIN_WRAP - auto v = cv::Vec3s(val.val1, val.val2, val.val3); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec4s(Mat m, int row, int col, Vec4s val) { - BEGIN_WRAP - auto v = cv::Vec4s(val.val1, val.val2, val.val3, val.val4); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec2w(Mat m, int row, int col, Vec2w val) { - BEGIN_WRAP - auto v = cv::Vec2w(val.val1, val.val2); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec3w(Mat m, int row, int col, Vec3w val) { - BEGIN_WRAP - auto v = cv::Vec3w(val.val1, val.val2, val.val3); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec4w(Mat m, int row, int col, Vec4w val) { - BEGIN_WRAP - auto v = cv::Vec4w(val.val1, val.val2, val.val3, val.val4); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec2i(Mat m, int row, int col, Vec2i val) { - BEGIN_WRAP - auto v = cv::Vec2i(val.val1, val.val2); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec3i(Mat m, int row, int col, Vec3i val) { - BEGIN_WRAP - auto v = cv::Vec3i(val.val1, val.val2, val.val3); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec4i(Mat m, int row, int col, Vec4i val) { - BEGIN_WRAP - auto v = cv::Vec4i(val.val1, val.val2, val.val3, val.val4); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec6i(Mat m, int row, int col, Vec6i val) { - BEGIN_WRAP - auto v = cv::Vec6i(val.val1, val.val2, val.val3, val.val4, val.val5, val.val6); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec8i(Mat m, int row, int col, Vec8i val) { - BEGIN_WRAP - auto v = - cv::Vec8i(val.val1, val.val2, val.val3, val.val4, val.val5, val.val6, val.val7, val.val8); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec2f(Mat m, int row, int col, Vec2f val) { - BEGIN_WRAP - auto v = cv::Vec2f(val.val1, val.val2); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec3f(Mat m, int row, int col, Vec3f val) { - BEGIN_WRAP - auto v = cv::Vec3f(val.val1, val.val2, val.val3); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec4f(Mat m, int row, int col, Vec4f val) { - BEGIN_WRAP - auto v = cv::Vec4f(val.val1, val.val2, val.val3, val.val4); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec6f(Mat m, int row, int col, Vec6f val) { - BEGIN_WRAP - auto v = cv::Vec6f(val.val1, val.val2, val.val3, val.val4, val.val5, val.val6); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec2d(Mat m, int row, int col, Vec2d val) { - BEGIN_WRAP - auto v = cv::Vec2d(val.val1, val.val2); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec3d(Mat m, int row, int col, Vec3d val) { - BEGIN_WRAP - auto v = cv::Vec3d(val.val1, val.val2, val.val3); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec4d(Mat m, int row, int col, Vec4d val) { - BEGIN_WRAP - auto v = cv::Vec4d(val.val1, val.val2, val.val3, val.val4); - m.ptr->at(row, col) = v; - END_WRAP -} -CvStatus *Mat_SetVec6d(Mat m, int row, int col, Vec6d val) { - BEGIN_WRAP - auto v = cv::Vec6d(val.val1, val.val2, val.val3, val.val4, val.val5, val.val6); - m.ptr->at(row, col) = v; - END_WRAP -} - -#pragma endregion Mat_setter - -#pragma region Mat_operation - -CvStatus *Mat_AddMat(Mat m, Mat val) { - BEGIN_WRAP - *m.ptr += (*val.ptr); - END_WRAP -} - -CvStatus *Mat_SubtractMat(Mat m, Mat val) { - BEGIN_WRAP - *m.ptr -= (*val.ptr); - END_WRAP -} - -// Matrix multiplication -CvStatus *Mat_MultiplyMat(Mat m, Mat val) { - BEGIN_WRAP - *m.ptr *= (*val.ptr); - END_WRAP -} - -// Performs an element-wise multiplication or division of the two matrices. -CvStatus *Mat_Mul(Mat m, Mat val, Mat *dst, double scale) { - BEGIN_WRAP - auto expr = (*m.ptr).mul(*val.ptr, scale); - *dst = {new cv::Mat(expr)}; - END_WRAP -} - -CvStatus *Mat_DivideMat(Mat m, Mat val) { - BEGIN_WRAP - *m.ptr /= (*val.ptr); - END_WRAP -} - -CvStatus *Mat_AddUChar(Mat m, uint8_t val) { - BEGIN_WRAP - *m.ptr += val; - END_WRAP -} - -CvStatus *Mat_SubtractUChar(Mat m, uint8_t val) { - BEGIN_WRAP - *m.ptr -= val; - END_WRAP -} - -CvStatus *Mat_MultiplyUChar(Mat m, uint8_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_DivideUChar(Mat m, uint8_t val) { - BEGIN_WRAP - *m.ptr /= val; - END_WRAP -} - -CvStatus *Mat_AddSChar(Mat m, int8_t val) { - BEGIN_WRAP - *m.ptr += val; - END_WRAP -} -CvStatus *Mat_SubtractSChar(Mat m, int8_t val) { - BEGIN_WRAP - *m.ptr -= val; - END_WRAP -} -CvStatus *Mat_MultiplySChar(Mat m, int8_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} -CvStatus *Mat_DivideSChar(Mat m, int8_t val) { - BEGIN_WRAP - *m.ptr /= val; - END_WRAP -} - -CvStatus *Mat_AddI16(Mat m, int16_t val) { - BEGIN_WRAP - *m.ptr += val; - END_WRAP -} - -CvStatus *Mat_SubtractI16(Mat m, int16_t val) { - BEGIN_WRAP - *m.ptr -= val; - END_WRAP -} - -CvStatus *Mat_MultiplyI16(Mat m, int16_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_DivideI16(Mat m, int16_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_AddU16(Mat m, uint16_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_SubtractU16(Mat m, uint16_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_MultiplyU16(Mat m, uint16_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_DivideU16(Mat m, uint16_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_AddI32(Mat m, int32_t val) { - BEGIN_WRAP - *m.ptr += val; - END_WRAP -} - -CvStatus *Mat_SubtractI32(Mat m, int32_t val) { - BEGIN_WRAP - *m.ptr -= val; - END_WRAP -} - -CvStatus *Mat_MultiplyI32(Mat m, int32_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_DivideI32(Mat m, int32_t val) { - BEGIN_WRAP - *m.ptr /= val; - END_WRAP -} - -CvStatus *Mat_AddFloat(Mat m, float val) { - BEGIN_WRAP - *m.ptr += val; - END_WRAP -} - -CvStatus *Mat_SubtractFloat(Mat m, float val) { - BEGIN_WRAP - *m.ptr -= val; - END_WRAP -} - -CvStatus *Mat_MultiplyFloat(Mat m, float val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_DivideFloat(Mat m, float val) { - BEGIN_WRAP - *m.ptr /= val; - END_WRAP -} - -CvStatus *Mat_AddF64(Mat m, double_t val) { - BEGIN_WRAP - *m.ptr += val; - END_WRAP -} - -CvStatus *Mat_SubtractF64(Mat m, double_t val) { - BEGIN_WRAP - *m.ptr -= val; - END_WRAP -} - -CvStatus *Mat_MultiplyF64(Mat m, double_t val) { - BEGIN_WRAP - *m.ptr *= val; - END_WRAP -} - -CvStatus *Mat_DivideF64(Mat m, double_t val) { - BEGIN_WRAP - *m.ptr /= val; - END_WRAP -} -CvStatus *Mat_MultiplyMatrix(Mat x, Mat y, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat((*x.ptr) * (*y.ptr))}; - END_WRAP -} - -CvStatus *Mat_AbsDiff(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::absdiff(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_Add(Mat src1, Mat src2, Mat dst, Mat mask, int dtype) { - BEGIN_WRAP - cv::add(*src1.ptr, *src2.ptr, *dst.ptr, *mask.ptr, dtype); - END_WRAP -} - -CvStatus * -Mat_AddWeighted(Mat src1, double alpha, Mat src2, double beta, double gamma, Mat dst, int dtype) { - BEGIN_WRAP - cv::addWeighted(*src1.ptr, alpha, *src2.ptr, beta, gamma, *dst.ptr, dtype); - END_WRAP -} - -CvStatus *Mat_BitwiseAnd(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::bitwise_and(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_BitwiseAndWithMask(Mat src1, Mat src2, Mat dst, Mat mask) { - BEGIN_WRAP - cv::bitwise_and(*src1.ptr, *src2.ptr, *dst.ptr, *mask.ptr); - END_WRAP -} - -CvStatus *Mat_BitwiseNot(Mat src1, Mat dst) { - BEGIN_WRAP - cv::bitwise_not(*src1.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_BitwiseNotWithMask(Mat src1, Mat dst, Mat mask) { - BEGIN_WRAP - cv::bitwise_not(*src1.ptr, *dst.ptr, *mask.ptr); - END_WRAP -} - -CvStatus *Mat_BitwiseOr(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::bitwise_or(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_BitwiseOrWithMask(Mat src1, Mat src2, Mat dst, Mat mask) { - BEGIN_WRAP - cv::bitwise_or(*src1.ptr, *src2.ptr, *dst.ptr, *mask.ptr); - END_WRAP -} - -CvStatus *Mat_BitwiseXor(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::bitwise_xor(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_BitwiseXorWithMask(Mat src1, Mat src2, Mat dst, Mat mask) { - BEGIN_WRAP - cv::bitwise_xor(*src1.ptr, *src2.ptr, *dst.ptr, *mask.ptr); - END_WRAP -} -CvStatus *Mat_Compare(Mat src1, Mat src2, Mat dst, int ct) { - BEGIN_WRAP - cv::compare(*src1.ptr, *src2.ptr, *dst.ptr, ct); - END_WRAP -} -CvStatus *Mat_BatchDistance( - Mat src1, - Mat src2, - Mat dist, - int dtype, - Mat nidx, - int normType, - int K, - Mat mask, - int update, - bool crosscheck -) { - BEGIN_WRAP - cv::batchDistance( - *src1.ptr, *src2.ptr, *dist.ptr, dtype, *nidx.ptr, normType, K, *mask.ptr, update, crosscheck - ); - END_WRAP -} - -CvStatus *Mat_BorderInterpolate(int p, int len, int borderType, int *rval) { - BEGIN_WRAP - *rval = cv::borderInterpolate(p, len, borderType); - END_WRAP -} - -CvStatus *Mat_CalcCovarMatrix(Mat samples, Mat covar, Mat mean, int flags, int ctype) { - BEGIN_WRAP - cv::calcCovarMatrix(*samples.ptr, *covar.ptr, *mean.ptr, flags, ctype); - END_WRAP -} - -CvStatus *Mat_CartToPolar(Mat x, Mat y, Mat magnitude, Mat angle, bool angleInDegrees) { - BEGIN_WRAP - cv::cartToPolar(*x.ptr, *y.ptr, *magnitude.ptr, *angle.ptr, angleInDegrees); - END_WRAP -} - -CvStatus *Mat_CheckRange(Mat m, bool quiet, Point *pos, double minVal, double maxVal, bool *rval) { - BEGIN_WRAP - cv::Point pos1; - *rval = cv::checkRange(*m.ptr, quiet, &pos1, minVal, maxVal); - pos->x = pos1.x; - pos->y = pos1.y; - END_WRAP -} -CvStatus *Mat_CompleteSymm(Mat m, bool lowerToUpper) { - BEGIN_WRAP - cv::completeSymm(*m.ptr, lowerToUpper); - END_WRAP -} -CvStatus *Mat_ConvertScaleAbs(Mat src, Mat dst, double alpha, double beta) { - BEGIN_WRAP - cv::convertScaleAbs(*src.ptr, *dst.ptr, alpha, beta); - END_WRAP -} -CvStatus *Mat_CopyMakeBorder( - Mat src, Mat dst, int top, int bottom, int left, int right, int borderType, Scalar value -) { - BEGIN_WRAP - cv::Scalar c_value(value.val1, value.val2, value.val3, value.val4); - cv::copyMakeBorder(*src.ptr, *dst.ptr, top, bottom, left, right, borderType, c_value); - END_WRAP -} - -int Mat_CountNonZero(Mat src) { - return cv::countNonZero(*src.ptr); -} - -CvStatus *Mat_DCT(Mat src, Mat dst, int flags) { - BEGIN_WRAP - cv::dct(*src.ptr, *dst.ptr, flags); - END_WRAP -} - -CvStatus *Mat_Determinant(Mat m, double *rval) { - BEGIN_WRAP - *rval = cv::determinant(*m.ptr); - END_WRAP -} - -CvStatus *Mat_DFT(Mat src, Mat dst, int flags, int nonzeroRows) { - BEGIN_WRAP - cv::dft(*src.ptr, *dst.ptr, flags, nonzeroRows); - END_WRAP -} - -CvStatus *Mat_Divide(Mat src1, Mat src2, Mat dst, double scale, int dtype) { - BEGIN_WRAP - cv::divide(*src1.ptr, *src2.ptr, *dst.ptr, scale, dtype); - END_WRAP -} - -CvStatus *Mat_Eigen(Mat src, Mat eigenvalues, Mat eigenvectors, bool *rval) { - BEGIN_WRAP - *rval = cv::eigen(*src.ptr, *eigenvalues.ptr, *eigenvectors.ptr); - END_WRAP -} - -CvStatus *Mat_EigenNonSymmetric(Mat src, Mat eigenvalues, Mat eigenvectors) { - BEGIN_WRAP - cv::eigenNonSymmetric(*src.ptr, *eigenvalues.ptr, *eigenvectors.ptr); - END_WRAP -} - -CvStatus *Mat_PCACompute(Mat src, Mat mean, Mat eigenvectors, Mat eigenvalues, int maxComponents) { - BEGIN_WRAP - cv::PCACompute(*src.ptr, *mean.ptr, *eigenvectors.ptr, *eigenvalues.ptr, maxComponents); - END_WRAP -} - -CvStatus *Mat_Exp(Mat src, Mat dst) { - BEGIN_WRAP - cv::exp(*src.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_ExtractChannel(Mat src, Mat dst, int coi) { - BEGIN_WRAP - cv::extractChannel(*src.ptr, *dst.ptr, coi); - END_WRAP -} - -CvStatus *Mat_FindNonZero(Mat src, Mat idx) { - BEGIN_WRAP - cv::findNonZero(*src.ptr, *idx.ptr); - END_WRAP -} - -CvStatus *Mat_Flip(Mat src, Mat dst, int flipCode) { - BEGIN_WRAP - cv::flip(*src.ptr, *dst.ptr, flipCode); - END_WRAP -} - -CvStatus *Mat_Gemm(Mat src1, Mat src2, double alpha, Mat src3, double beta, Mat dst, int flags) { - BEGIN_WRAP - cv::gemm(*src1.ptr, *src2.ptr, alpha, *src3.ptr, beta, *dst.ptr, flags); - END_WRAP -} - -CvStatus *Mat_GetOptimalDFTSize(int vecsize, int *rval) { - BEGIN_WRAP - *rval = cv::getOptimalDFTSize(vecsize); - END_WRAP -} -CvStatus *Mat_Hconcat(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::hconcat(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_Vconcat(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::vconcat(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} -CvStatus *Mat_Idct(Mat src, Mat dst, int flags) { - BEGIN_WRAP - cv::idct(*src.ptr, *dst.ptr, flags); - END_WRAP -} - -CvStatus *Mat_Idft(Mat src, Mat dst, int flags, int nonzeroRows) { - BEGIN_WRAP - cv::idft(*src.ptr, *dst.ptr, flags, nonzeroRows); - END_WRAP -} - -CvStatus *Mat_InRange(Mat src, Mat lowerb, Mat upperb, Mat dst) { - BEGIN_WRAP - cv::inRange(*src.ptr, *lowerb.ptr, *upperb.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_InRangeWithScalar(Mat src, Scalar lowerb, Scalar upperb, Mat dst) { - BEGIN_WRAP - cv::Scalar lb = cv::Scalar(lowerb.val1, lowerb.val2, lowerb.val3, lowerb.val4); - cv::Scalar ub = cv::Scalar(upperb.val1, upperb.val2, upperb.val3, upperb.val4); - cv::inRange(*src.ptr, lb, ub, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_InsertChannel(Mat src, Mat dst, int coi) { - BEGIN_WRAP - cv::insertChannel(*src.ptr, *dst.ptr, coi); - END_WRAP -} - -CvStatus *Mat_Invert(Mat src, Mat dst, int flags, double *rval) { - BEGIN_WRAP - *rval = cv::invert(*src.ptr, *dst.ptr, flags); - END_WRAP -} -CvStatus *Mat_Log(Mat src, Mat dst) { - BEGIN_WRAP - cv::log(*src.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_Magnitude(Mat x, Mat y, Mat magnitude) { - BEGIN_WRAP - cv::magnitude(*x.ptr, *y.ptr, *magnitude.ptr); - END_WRAP -} - -CvStatus *Mat_Max(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::max(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_MeanStdDev(Mat src, Scalar *dstMean, Scalar *dstStdDev) { - BEGIN_WRAP - cv::Scalar mean, sd; - cv::meanStdDev(*src.ptr, mean, sd); - *dstMean = {mean.val[0], mean.val[1], mean.val[2], mean.val[3]}; - *dstStdDev = {sd.val[0], sd.val[1], sd.val[2], sd.val[3]}; - END_WRAP -} - -CvStatus *Mat_MeanStdDevWithMask(Mat src, Scalar *dstMean, Scalar *dstStdDev, Mat mask) { - BEGIN_WRAP - cv::Scalar mean, sd; - cv::meanStdDev(*src.ptr, mean, sd, *mask.ptr); - *dstMean = {mean.val[0], mean.val[1], mean.val[2], mean.val[3]}; - *dstStdDev = {sd.val[0], sd.val[1], sd.val[2], sd.val[3]}; - END_WRAP -} - -CvStatus *Mat_Merge(VecMat vec, Mat *dst) { - BEGIN_WRAP - auto mv = vecmat_c2cpp(vec); - cv::Mat _dst; - cv::merge(mv, _dst); - *dst = {new cv::Mat(_dst)}; - END_WRAP -} - -CvStatus *Mat_Min(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::min(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_MinMaxIdx(Mat m, double *minVal, double *maxVal, int *minIdx, int *maxIdx) { - BEGIN_WRAP - cv::minMaxIdx(*m.ptr, minVal, maxVal, minIdx, maxIdx); - END_WRAP -} - -CvStatus *Mat_MinMaxLoc(Mat m, double *minVal, double *maxVal, Point *minLoc, Point *maxLoc) { - BEGIN_WRAP - cv::Point cMinLoc, cMaxLoc; - cv::minMaxLoc(*m.ptr, minVal, maxVal, &cMinLoc, &cMaxLoc); - - *minLoc = {cMinLoc.x, cMinLoc.y}; - *maxLoc = {cMaxLoc.x, cMaxLoc.y}; - END_WRAP -} - -CvStatus *Mat_MixChannels(VecMat src, VecMat dst, VecI32 fromTo) { - BEGIN_WRAP - auto _src = vecmat_c2cpp(src); - auto _dst = vecmat_c2cpp(dst); - std::vector _fromTo(fromTo.ptr, fromTo.ptr + fromTo.length); - cv::mixChannels(_src, _dst, _fromTo); - END_WRAP -} - -CvStatus *Mat_MulSpectrums(Mat a, Mat b, Mat c, int flags, bool conjB) { - BEGIN_WRAP - cv::mulSpectrums(*a.ptr, *b.ptr, *c.ptr, flags, conjB); - END_WRAP -} - -CvStatus *Mat_Multiply(Mat src1, Mat src2, Mat dst, double scale, int dtype) { - BEGIN_WRAP - cv::multiply(*src1.ptr, *src2.ptr, *dst.ptr, scale, dtype); - END_WRAP -} - -CvStatus *Mat_Normalize(Mat src, Mat dst, double alpha, double beta, int typ, int dtype, Mat mask) { - BEGIN_WRAP - cv::normalize(*src.ptr, *dst.ptr, alpha, beta, typ, dtype, *mask.ptr); - END_WRAP -} -CvStatus *Mat_PerspectiveTransform(Mat src, Mat dst, Mat tm) { - BEGIN_WRAP - cv::perspectiveTransform(*src.ptr, *dst.ptr, *tm.ptr); - END_WRAP -} - -CvStatus *Mat_Solve(Mat src1, Mat src2, Mat dst, int flags, bool *rval) { - BEGIN_WRAP - *rval = cv::solve(*src1.ptr, *src2.ptr, *dst.ptr, flags); - END_WRAP -} - -CvStatus *Mat_SolveCubic(Mat coeffs, Mat roots, int *rval) { - BEGIN_WRAP - *rval = cv::solveCubic(*coeffs.ptr, *roots.ptr); - END_WRAP -} - -CvStatus *Mat_SolvePoly(Mat coeffs, Mat roots, int maxIters, double *rval) { - BEGIN_WRAP - *rval = cv::solvePoly(*coeffs.ptr, *roots.ptr, maxIters); - END_WRAP -} - -CvStatus *Mat_Reduce(Mat src, Mat dst, int dim, int rType, int dType) { - BEGIN_WRAP - cv::reduce(*src.ptr, *dst.ptr, dim, rType, dType); - END_WRAP -} - -CvStatus *Mat_ReduceArgMax(Mat src, Mat dst, int axis, bool lastIndex) { - BEGIN_WRAP - cv::reduceArgMax(*src.ptr, *dst.ptr, axis, lastIndex); - END_WRAP -} - -CvStatus *Mat_ReduceArgMin(Mat src, Mat dst, int axis, bool lastIndex) { - BEGIN_WRAP - cv::reduceArgMin(*src.ptr, *dst.ptr, axis, lastIndex); - END_WRAP -} - -CvStatus *Mat_Repeat(Mat src, int nY, int nX, Mat dst) { - BEGIN_WRAP - cv::repeat(*src.ptr, nY, nX, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_ScaleAdd(Mat src1, double alpha, Mat src2, Mat dst) { - BEGIN_WRAP - cv::scaleAdd(*src1.ptr, alpha, *src2.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_SetIdentity(Mat src, double scalar) { - BEGIN_WRAP - cv::setIdentity(*src.ptr, scalar); - END_WRAP -} - -CvStatus *Mat_Sort(Mat src, Mat dst, int flags) { - BEGIN_WRAP - cv::sort(*src.ptr, *dst.ptr, flags); - END_WRAP -} - -CvStatus *Mat_SortIdx(Mat src, Mat dst, int flags) { - BEGIN_WRAP - cv::sortIdx(*src.ptr, *dst.ptr, flags); - END_WRAP -} - -CvStatus *Mat_Split(Mat src, VecMat *rval) { - BEGIN_WRAP - std::vector channels; - cv::split(*src.ptr, channels); - *rval = vecmat_cpp2c(channels); - END_WRAP -} - -CvStatus *Mat_Subtract(Mat src1, Mat src2, Mat dst, Mat mask, int dtype) { - BEGIN_WRAP - cv::subtract(*src1.ptr, *src2.ptr, *dst.ptr, *mask.ptr, dtype); - END_WRAP -} - -CvStatus *Mat_T(Mat x, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(x.ptr->t())}; - END_WRAP -} - -CvStatus *Mat_Trace(Mat src, Scalar *rval) { - BEGIN_WRAP - cv::Scalar c = cv::trace(*src.ptr); - Scalar scal = Scalar(); - *rval = {c.val[0], c.val[1], c.val[2], c.val[3]}; - END_WRAP -} - -CvStatus *Mat_Transform(Mat src, Mat dst, Mat tm) { - BEGIN_WRAP - cv::transform(*src.ptr, *dst.ptr, *tm.ptr); - END_WRAP -} - -CvStatus *Mat_Transpose(Mat src, Mat dst) { - BEGIN_WRAP - cv::transpose(*src.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_PolarToCart(Mat magnitude, Mat degree, Mat x, Mat y, bool angleInDegrees) { - BEGIN_WRAP - cv::polarToCart(*magnitude.ptr, *degree.ptr, *x.ptr, *y.ptr, angleInDegrees); - END_WRAP -} - -CvStatus *Mat_Pow(Mat src, double power, Mat dst) { - BEGIN_WRAP - cv::pow(*src.ptr, power, *dst.ptr); - END_WRAP -} - -CvStatus *Mat_Phase(Mat x, Mat y, Mat angle, bool angleInDegrees) { - BEGIN_WRAP - cv::phase(*x.ptr, *y.ptr, *angle.ptr, angleInDegrees); - END_WRAP -} - -CvStatus *Mat_Sum(Mat src, Scalar *rval) { - BEGIN_WRAP - cv::Scalar c = cv::sum(*src.ptr); - *rval = {c.val[0], c.val[1], c.val[2], c.val[3]}; - END_WRAP -} - -CvStatus *Mat_rowRange(Mat m, int start, int end, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->rowRange(start, end))}; - END_WRAP -} - -CvStatus *Mat_colRange(Mat m, int start, int end, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(m.ptr->colRange(start, end))}; - END_WRAP -} - -// https://docs.opencv.org/4.x/db/da5/tutorial_how_to_scan_images.html#:~:text=Goal -CvStatus *LUT(Mat src, Mat lut, Mat dst) { - BEGIN_WRAP - auto cn = src.ptr->channels(), depth = src.ptr->depth(); - if (lut.ptr->depth() != CV_16F && (depth == CV_8U || depth == CV_8S)) { - cv::LUT(*src.ptr, *lut.ptr, *dst.ptr); - } else { - int lutcn = lut.ptr->channels(), lut_depth = lut.ptr->depth(); - size_t lut_total = lut.ptr->total(), expect_total = 0; - switch (depth) { - case CV_8U: - case CV_8S: expect_total = 256; break; - case CV_16U: - case CV_16S: expect_total = 65536; break; - // TODO: can't create a mat with 4294967296 rows, maybe use vector instead - // case CV_32S: - // expect_total = 4294967296; - // break; - default: - throw cv::Exception( - cv::Error::StsNotImplemented, - "source Mat Type not supported", - __func__, - __FILE__, - __LINE__ - ); - } - - CV_Assert((lutcn == cn || lutcn == 1) && lut_total == expect_total && lut.ptr->isContinuous()); - dst.ptr->create(src.ptr->dims, src.ptr->size, CV_MAKETYPE(lut.ptr->depth(), cn)); - - const cv::Mat *arrays[] = {src.ptr, dst.ptr, 0}; - uchar *ptrs[2] = {}; - cv::NAryMatIterator it(arrays, ptrs); - int len = (int)it.size; - - switch (depth) { - case CV_8U: - cvd::LUT8u_16f( - src.ptr->ptr(), - lut.ptr->ptr(), - dst.ptr->ptr(), - len, - cn, - lutcn - ); - break; - case CV_8S: - cvd::LUT8s_16f( - src.ptr->ptr(), - lut.ptr->ptr(), - dst.ptr->ptr(), - len, - cn, - lutcn - ); - break; - - case CV_16U: - switch (lut_depth) { - case CV_8U: - cvd::LUT16u_8u( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_8S: - cvd::LUT16u_8s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_16U: - cvd::LUT16u_16u( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_16S: - cvd::LUT16u_16s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_32S: - cvd::LUT16u_32s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_32F: - cvd::LUT16u_32f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_64F: - cvd::LUT16u_64f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_16F: - cvd::LUT16u_16f( - src.ptr->ptr(), - lut.ptr->ptr(), - dst.ptr->ptr(), - len, - cn, - lutcn - ); - break; - default: - cv::String err = "lut Mat Type not supported for CV_16U"; - throw cv::Exception(cv::Error::StsNotImplemented, err, __func__, __FILE__, __LINE__); - } - break; - case CV_16S: - switch (lut_depth) { - case CV_8U: - cvd::LUT16s_8u( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_8S: - cvd::LUT16s_8s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_16U: - cvd::LUT16s_16u( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_16S: - cvd::LUT16s_16s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_32S: - cvd::LUT16s_32s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_32F: - cvd::LUT16s_32f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_64F: - cvd::LUT16s_64f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_16F: - cvd::LUT16s_16f( - src.ptr->ptr(), - lut.ptr->ptr(), - dst.ptr->ptr(), - len, - cn, - lutcn - ); - break; - default: - cv::String err = "lut Mat Type not supported for CV_16S"; - throw cv::Exception(cv::Error::StsNotImplemented, err, __func__, __FILE__, __LINE__); - } - break; - case CV_32S: - switch (lut_depth) { - case CV_32S: - cvd::LUT32s_32s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_32F: - cvd::LUT32s_32f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - case CV_64F: - cvd::LUT32s_64f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr->ptr(), len, cn, lutcn - ); - break; - default: - cv::String err = "lut Mat Type not supported for CV_32S"; - throw cv::Exception(cv::Error::StsNotImplemented, err, __func__, __FILE__, __LINE__); - } - break; - default: - cv::String err = "src Mat Type not supported"; - throw cv::Exception(cv::Error::StsNotImplemented, err, __func__, __FILE__, __LINE__); - } - } - END_WRAP -} - -CvStatus *KMeans( - Mat data, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - Mat centers, - double *rval -) { - BEGIN_WRAP - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - *rval = cv::kmeans(*data.ptr, k, *bestLabels.ptr, tc, attempts, flags, *centers.ptr); - END_WRAP -} - -CvStatus *KMeansPoints( - VecPoint2f pts, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - Mat centers, - double *rval -) { - BEGIN_WRAP - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - auto _pts = vecpoint2f_c2cpp(pts); - *rval = cv::kmeans(_pts, k, *bestLabels.ptr, tc, attempts, flags, *centers.ptr); - END_WRAP -} -CvStatus *Rotate(Mat src, Mat dst, int rotateCode) { - BEGIN_WRAP - cv::rotate(*src.ptr, *dst.ptr, rotateCode); - END_WRAP -} -CvStatus *Norm(Mat src1, int normType, Mat mask, double *rval) { - BEGIN_WRAP - *rval = cv::norm(*src1.ptr, normType, *mask.ptr); - END_WRAP -} -CvStatus *NormWithMats(Mat src1, Mat src2, int normType, Mat mask, double *rval) { - BEGIN_WRAP - *rval = cv::norm(*src1.ptr, *src2.ptr, normType, *mask.ptr); - END_WRAP -} -#pragma endregion - -#pragma region RNG - -CvStatus *Rng_New(RNG *rval) { - BEGIN_WRAP - *rval = {new cv::RNG()}; - END_WRAP -} -CvStatus *Rng_NewWithState(uint64_t state, RNG *rval) { - BEGIN_WRAP - *rval = {new cv::RNG(state)}; - END_WRAP -} -void Rng_Close(RNGPtr rng) { CVD_FREE(rng); } - -CvStatus *TheRNG(RNG *rval) { - BEGIN_WRAP - *rval = {new cv::RNG(cv::theRNG())}; - END_WRAP -} -CvStatus *SetRNGSeed(int seed) { - BEGIN_WRAP - cv::setRNGSeed(seed); - END_WRAP -} -CvStatus *RNG_Fill(RNG rng, Mat mat, int distType, double a, double b, bool saturateRange) { - BEGIN_WRAP - rng.ptr->fill(*mat.ptr, distType, a, b, saturateRange); - END_WRAP -} -CvStatus *RNG_Gaussian(RNG rng, double sigma, double *rval) { - BEGIN_WRAP - *rval = rng.ptr->gaussian(sigma); - END_WRAP -} -CvStatus *RNG_Uniform(RNG rng, int a, int b, int *rval) { - BEGIN_WRAP - *rval = rng.ptr->uniform(a, b); - END_WRAP -} -CvStatus *RNG_UniformDouble(RNG rng, double a, double b, double *rval) { - BEGIN_WRAP - *rval = rng.ptr->uniform(a, b); - END_WRAP -} -CvStatus *RNG_Next(RNG rng, uint32_t *rval) { - BEGIN_WRAP - *rval = rng.ptr->next(); - END_WRAP -} -CvStatus *RandN(Mat mat, Scalar mean, Scalar stddev) { - BEGIN_WRAP - auto c_mean = cv::Scalar(mean.val1, mean.val2, mean.val3, mean.val4); - auto c_stddev = cv::Scalar(stddev.val1, stddev.val2, stddev.val3, stddev.val4); - cv::randn(*mat.ptr, c_mean, c_stddev); - END_WRAP -} -CvStatus *RandShuffle(Mat mat) { - BEGIN_WRAP - cv::randShuffle(*mat.ptr); - END_WRAP -} -CvStatus *RandShuffleWithParams(Mat mat, double iterFactor, RNG rng) { - BEGIN_WRAP - cv::randShuffle(*mat.ptr, iterFactor, rng.ptr); - END_WRAP -} -CvStatus *RandU(Mat mat, Scalar low, Scalar high) { - BEGIN_WRAP - auto c_low = cv::Scalar(low.val1, low.val2, low.val3, low.val4); - auto c_high = cv::Scalar(high.val1, high.val2, high.val3, high.val4); - cv::randu(*mat.ptr, c_low, c_high); - END_WRAP -} -#pragma endregion - -CvStatus *GetCVTickCount(int64_t *rval) { - BEGIN_WRAP - *rval = cv::getTickCount(); - END_WRAP -} -CvStatus *GetTickFrequency(double *rval) { - BEGIN_WRAP - *rval = cv::getTickFrequency(); - END_WRAP -} -CvStatus *SetNumThreads(int n) { - BEGIN_WRAP - cv::setNumThreads(n); - END_WRAP -} -CvStatus *GetNumThreads(int *rval) { - BEGIN_WRAP - *rval = cv::getNumThreads(); - END_WRAP -} diff --git a/src/core/core.h b/src/core/core.h deleted file mode 100644 index b04beaf7..00000000 --- a/src/core/core.h +++ /dev/null @@ -1,395 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma warning(disable : 4996) -#ifndef _OPENCV3_CORE_H_ -#define _OPENCV3_CORE_H_ - -#include "types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -CvStatus *RotatedRect_Points(RotatedRect rect, VecPoint2f *pts); -CvStatus *RotatedRect_BoundingRect(RotatedRect rect, Rect *rval); -CvStatus *RotatedRect_BoundingRect2f(RotatedRect rect, Rect2f *rval); -// CvStatus *noArray(InputOutputArray *rval); - -// internal use -// VecPoint2f vecPointToVecPoint2f(VecPoint src); - -void CvStatus_Close(CvStatus *self); - -/** - * @brief Create empty Mat - - * ALL return values with a type of `Pointer of Struct`, - * e.g., Mat, the internal pointer (Mat.ptr) MUST be NULL - * otherwise the memory of mat.ptr pointed to will NOT be freed correctly. - * Mat* mat = (Mat*)malloc(sizeof(Mat)); - * CvStatus *status = Mat_New(mat); - * Mat_Close(mat); - * - * @param rval Mat* - * @return CvStatus - */ -CvStatus *Mat_New(Mat *rval); -CvStatus *Mat_NewWithSize(int rows, int cols, int type, Mat *rval); -CvStatus *Mat_NewWithSizes(VecI32 sizes, int type, Mat *rval); -CvStatus *Mat_NewWithSizesFromScalar(VecI32 sizes, int type, Scalar ar, Mat *rval); -CvStatus *Mat_NewWithSizesFromBytes(VecI32 sizes, int type, void *buf, Mat *rval); -CvStatus *Mat_NewFromScalar(const Scalar ar, int rows, int cols, int type, Mat *rval); -CvStatus *Mat_NewFromBytes(int rows, int cols, int type, void *buf, Mat *rval); -CvStatus *Mat_NewFromVecPoint(VecPoint vec, Mat *rval); -CvStatus *Mat_NewFromVecPoint2f(VecPoint2f vec, Mat *rval); -CvStatus *Mat_NewFromVecPoint3f(VecPoint3f vec, Mat *rval); -CvStatus *Mat_NewFromVecPoint3i(VecPoint3i vec, Mat *rval); - -CvStatus *Mat_toVecPoint(Mat self, VecPoint *vec); -CvStatus *Mat_toVecPoint2f(Mat self, VecPoint2f *vec); -CvStatus *Mat_toVecPoint3f(Mat self, VecPoint3f *vec); -CvStatus *Mat_toVecPoint3i(Mat self, VecPoint3i *vec); - -CvStatus *Mat_toString( - Mat self, - int fmtType, - int f16Precision, - int f32Precision, - int f64Precision, - bool multiLine, - char **rval -); - -CvStatus *Mat_FromPtr(Mat m, int rows, int cols, int type, int prows, int pcols, Mat *rval); -CvStatus *Mat_FromCMat(Mat m, Mat *rval); -CvStatus *Mat_FromRange(Mat m, int rowStart, int rowEnd, int colStart, int colEnd, Mat *rval); -void Mat_Close(MatPtr m); -void Mat_CloseVoid(void *m); -CvStatus *Mat_Release(Mat *m); - -int Mat_Flags(Mat m); -bool Mat_Empty(Mat m); -bool Mat_IsContinuous(Mat m); -bool Mat_IsSubmatrix(Mat m); -int Mat_Rows(Mat m); -int Mat_Cols(Mat m); -int Mat_Channels(Mat m); -int Mat_Type(Mat m); -MatStep Mat_Step(Mat m); -int Mat_Total(Mat m); -VecI32 *Mat_Size(Mat m); -int Mat_ElemSize(Mat m); -int Mat_ElemSize1(Mat m); -int Mat_Dims(Mat m); -uchar *Mat_Data(Mat m); -// CvStatus *Mat_DataPtr(Mat m, uchar **data, int *length); - -CvStatus *Mat_AdjustROI(Mat m, int dtop, int dbottom, int dleft, int dright, Mat *rval); -CvStatus *Mat_LocateROI(Mat m, Size *wholeSize, Point *ofs); -CvStatus *Mat_Clone(Mat m, Mat *rval); -CvStatus *Mat_Col(Mat m, int x, Mat *rval); -CvStatus *Mat_Row(Mat m, int y, Mat *rval); -CvStatus *Mat_CopyTo(Mat m, Mat dst); -CvStatus *Mat_CopyToWithMask(Mat m, Mat dst, Mat mask); -CvStatus *Mat_ConvertTo(Mat m, Mat dst, int type); -CvStatus *Mat_ConvertToWithParams(Mat m, Mat dst, int type, float alpha, float beta); -CvStatus *Mat_ToVecUChar(Mat m, VecUChar *rval); -CvStatus *Mat_ToVecChar(Mat m, VecChar *rval); -CvStatus *Mat_Region(Mat m, Rect r, Mat *rval); -CvStatus *Mat_Reshape(Mat m, int cn, int rows, Mat *rval); -CvStatus *Mat_ReshapeByVec(Mat m, int cn, VecI32 newshape, Mat *rval); -CvStatus *Mat_PatchNaNs(Mat m, double val); -CvStatus *Mat_ConvertFp16(Mat m, Mat *rval); -CvStatus *Mat_Mean(Mat m, Scalar *rval); -CvStatus *Mat_MeanWithMask(Mat m, Mat mask, Scalar *rval); -CvStatus *Mat_Sqrt(Mat m, Mat *rval); - -CvStatus *Eye(int rows, int cols, int type, Mat *rval); -CvStatus *Zeros(int rows, int cols, int type, Mat *rval); -CvStatus *Ones(int rows, int cols, int type, Mat *rval); - -uchar *Mat_Ptr_u8_1(Mat m, int i); -uchar *Mat_Ptr_u8_2(Mat m, int i, int j); -uchar *Mat_Ptr_u8_3(Mat m, int i, int j, int k); - -#pragma region Mat_getter - -CvStatus *Mat_GetUChar(Mat m, int row, int col, uint8_t *rval); -CvStatus *Mat_GetUChar3(Mat m, int x, int y, int z, uint8_t *rval); -CvStatus *Mat_GetSChar(Mat m, int row, int col, int8_t *rval); -CvStatus *Mat_GetSChar3(Mat m, int x, int y, int z, int8_t *rval); -CvStatus *Mat_GetUShort(Mat m, int row, int col, uint16_t *rval); -CvStatus *Mat_GetUShort3(Mat m, int x, int y, int z, uint16_t *rval); -CvStatus *Mat_GetShort(Mat m, int row, int col, int16_t *rval); -CvStatus *Mat_GetShort3(Mat m, int x, int y, int z, int16_t *rval); -CvStatus *Mat_GetInt(Mat m, int row, int col, int32_t *rval); -CvStatus *Mat_GetInt3(Mat m, int x, int y, int z, int32_t *rval); -CvStatus *Mat_GetFloat(Mat m, int row, int col, float *rval); -CvStatus *Mat_GetFloat3(Mat m, int x, int y, int z, float *rval); -CvStatus *Mat_GetDouble(Mat m, int row, int col, double *rval); -CvStatus *Mat_GetDouble3(Mat m, int x, int y, int z, double *rval); - -Vec2b *Mat_GetVec2b(Mat m, int row, int col); -Vec3b *Mat_GetVec3b(Mat m, int row, int col); -Vec4b *Mat_GetVec4b(Mat m, int row, int col); -Vec2s *Mat_GetVec2s(Mat m, int row, int col); -Vec3s *Mat_GetVec3s(Mat m, int row, int col); -Vec4s *Mat_GetVec4s(Mat m, int row, int col); -Vec2w *Mat_GetVec2w(Mat m, int row, int col); -Vec3w *Mat_GetVec3w(Mat m, int row, int col); -Vec4w *Mat_GetVec4w(Mat m, int row, int col); -Vec2i *Mat_GetVec2i(Mat m, int row, int col); -Vec3i *Mat_GetVec3i(Mat m, int row, int col); -Vec4i *Mat_GetVec4i(Mat m, int row, int col); -Vec6i *Mat_GetVec6i(Mat m, int row, int col); -Vec8i *Mat_GetVec8i(Mat m, int row, int col); -Vec2f *Mat_GetVec2f(Mat m, int row, int col); -Vec3f *Mat_GetVec3f(Mat m, int row, int col); -Vec4f *Mat_GetVec4f(Mat m, int row, int col); -Vec6f *Mat_GetVec6f(Mat m, int row, int col); -Vec2d *Mat_GetVec2d(Mat m, int row, int col); -Vec3d *Mat_GetVec3d(Mat m, int row, int col); -Vec4d *Mat_GetVec4d(Mat m, int row, int col); -Vec6d *Mat_GetVec6d(Mat m, int row, int col); - -#pragma endregion - -#pragma region Mat_setter - -CvStatus *Mat_SetTo(Mat m, Scalar value, Mat mask); -CvStatus *Mat_SetUChar(Mat m, int row, int col, uint8_t val); -CvStatus *Mat_SetUChar3(Mat m, int x, int y, int z, uint8_t val); -CvStatus *Mat_SetSChar(Mat m, int row, int col, int8_t val); -CvStatus *Mat_SetSChar3(Mat m, int x, int y, int z, int8_t val); -CvStatus *Mat_SetShort(Mat m, int row, int col, int16_t val); -CvStatus *Mat_SetShort3(Mat m, int x, int y, int z, int16_t val); -CvStatus *Mat_SetUShort(Mat m, int row, int col, uint16_t val); -CvStatus *Mat_SetUShort3(Mat m, int x, int y, int z, uint16_t val); -CvStatus *Mat_SetInt(Mat m, int row, int col, int32_t val); -CvStatus *Mat_SetInt3(Mat m, int x, int y, int z, int32_t val); -CvStatus *Mat_SetFloat(Mat m, int row, int col, float val); -CvStatus *Mat_SetFloat3(Mat m, int x, int y, int z, float val); -CvStatus *Mat_SetDouble(Mat m, int row, int col, double val); -CvStatus *Mat_SetDouble3(Mat m, int x, int y, int z, double val); - -CvStatus *Mat_SetVec2b(Mat m, int row, int col, Vec2b val); -CvStatus *Mat_SetVec3b(Mat m, int row, int col, Vec3b val); -CvStatus *Mat_SetVec4b(Mat m, int row, int col, Vec4b val); -CvStatus *Mat_SetVec2s(Mat m, int row, int col, Vec2s val); -CvStatus *Mat_SetVec3s(Mat m, int row, int col, Vec3s val); -CvStatus *Mat_SetVec4s(Mat m, int row, int col, Vec4s val); -CvStatus *Mat_SetVec2w(Mat m, int row, int col, Vec2w val); -CvStatus *Mat_SetVec3w(Mat m, int row, int col, Vec3w val); -CvStatus *Mat_SetVec4w(Mat m, int row, int col, Vec4w val); -CvStatus *Mat_SetVec2i(Mat m, int row, int col, Vec2i val); -CvStatus *Mat_SetVec3i(Mat m, int row, int col, Vec3i val); -CvStatus *Mat_SetVec4i(Mat m, int row, int col, Vec4i val); -CvStatus *Mat_SetVec6i(Mat m, int row, int col, Vec6i val); -CvStatus *Mat_SetVec8i(Mat m, int row, int col, Vec8i val); -CvStatus *Mat_SetVec2f(Mat m, int row, int col, Vec2f val); -CvStatus *Mat_SetVec3f(Mat m, int row, int col, Vec3f val); -CvStatus *Mat_SetVec4f(Mat m, int row, int col, Vec4f val); -CvStatus *Mat_SetVec6f(Mat m, int row, int col, Vec6f val); -CvStatus *Mat_SetVec2d(Mat m, int row, int col, Vec2d val); -CvStatus *Mat_SetVec3d(Mat m, int row, int col, Vec3d val); -CvStatus *Mat_SetVec4d(Mat m, int row, int col, Vec4d val); -CvStatus *Mat_SetVec6d(Mat m, int row, int col, Vec6d val); - -#pragma endregion Mat_setter - -#pragma region Mat_operation - -CvStatus *Mat_AddMat(Mat m, Mat val); -CvStatus *Mat_SubtractMat(Mat m, Mat val); -CvStatus *Mat_MultiplyMat(Mat m, Mat val); -CvStatus *Mat_Mul(Mat m, Mat val, Mat *dst, double scale); -CvStatus *Mat_DivideMat(Mat m, Mat val); - -CvStatus *Mat_AddUChar(Mat m, uint8_t val); -CvStatus *Mat_SubtractUChar(Mat m, uint8_t val); -CvStatus *Mat_MultiplyUChar(Mat m, uint8_t val); -CvStatus *Mat_DivideUChar(Mat m, uint8_t val); - -CvStatus *Mat_AddSChar(Mat m, int8_t val); -CvStatus *Mat_SubtractSChar(Mat m, int8_t val); -CvStatus *Mat_MultiplySChar(Mat m, int8_t val); -CvStatus *Mat_DivideSChar(Mat m, int8_t val); - -CvStatus *Mat_AddI16(Mat m, int16_t val); -CvStatus *Mat_SubtractI16(Mat m, int16_t val); -CvStatus *Mat_MultiplyI16(Mat m, int16_t val); -CvStatus *Mat_DivideI16(Mat m, int16_t val); - -CvStatus *Mat_AddU16(Mat m, uint16_t val); -CvStatus *Mat_SubtractU16(Mat m, uint16_t val); -CvStatus *Mat_MultiplyU16(Mat m, uint16_t val); -CvStatus *Mat_DivideU16(Mat m, uint16_t val); - -CvStatus *Mat_AddI32(Mat m, int32_t val); -CvStatus *Mat_SubtractI32(Mat m, int32_t val); -CvStatus *Mat_MultiplyI32(Mat m, int32_t val); -CvStatus *Mat_DivideI32(Mat m, int32_t val); - -CvStatus *Mat_AddFloat(Mat m, float_t val); -CvStatus *Mat_SubtractFloat(Mat m, float_t val); -CvStatus *Mat_MultiplyFloat(Mat m, float_t val); -CvStatus *Mat_DivideFloat(Mat m, float_t val); - -CvStatus *Mat_AddF64(Mat m, double_t val); -CvStatus *Mat_SubtractF64(Mat m, double_t val); -CvStatus *Mat_MultiplyF64(Mat m, double_t val); -CvStatus *Mat_DivideF64(Mat m, double_t val); -CvStatus *Mat_MultiplyMatrix(Mat x, Mat y, Mat *rval); - -CvStatus *Mat_AbsDiff(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_Add(Mat src1, Mat src2, Mat dst, Mat mask, int dtype); -CvStatus * -Mat_AddWeighted(Mat src1, double alpha, Mat src2, double beta, double gamma, Mat dst, int dtype); -CvStatus *Mat_BitwiseAnd(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_BitwiseAndWithMask(Mat src1, Mat src2, Mat dst, Mat mask); -CvStatus *Mat_BitwiseNot(Mat src1, Mat dst); -CvStatus *Mat_BitwiseNotWithMask(Mat src1, Mat dst, Mat mask); -CvStatus *Mat_BitwiseOr(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_BitwiseOrWithMask(Mat src1, Mat src2, Mat dst, Mat mask); -CvStatus *Mat_BitwiseXor(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_BitwiseXorWithMask(Mat src1, Mat src2, Mat dst, Mat mask); -CvStatus *Mat_Compare(Mat src1, Mat src2, Mat dst, int ct); -CvStatus *Mat_BatchDistance( - Mat src1, - Mat src2, - Mat dist, - int dtype, - Mat nidx, - int normType, - int K, - Mat mask, - int update, - bool crosscheck -); -CvStatus *Mat_BorderInterpolate(int p, int len, int borderType, int *rval); -CvStatus *Mat_CalcCovarMatrix(Mat samples, Mat covar, Mat mean, int flags, int ctype); -CvStatus *Mat_CartToPolar(Mat x, Mat y, Mat magnitude, Mat angle, bool angleInDegrees); -CvStatus *Mat_CheckRange(Mat m, bool quiet, Point *pos, double minVal, double maxVal, bool *rval); -CvStatus *Mat_CompleteSymm(Mat m, bool lowerToUpper); -CvStatus *Mat_ConvertScaleAbs(Mat src, Mat dst, double alpha, double beta); -CvStatus *Mat_CopyMakeBorder( - Mat src, Mat dst, int top, int bottom, int left, int right, int borderType, Scalar value -); -int Mat_CountNonZero(Mat src); -CvStatus *Mat_DCT(Mat src, Mat dst, int flags); -CvStatus *Mat_Determinant(Mat m, double *rval); -CvStatus *Mat_DFT(Mat src, Mat dst, int flags, int nonzeroRows); -CvStatus *Mat_Divide(Mat src1, Mat src2, Mat dst, double scale, int dtype); -CvStatus *Mat_Eigen(Mat src, Mat eigenvalues, Mat eigenvectors, bool *rval); -CvStatus *Mat_EigenNonSymmetric(Mat src, Mat eigenvalues, Mat eigenvectors); -CvStatus *Mat_PCACompute(Mat src, Mat mean, Mat eigenvectors, Mat eigenvalues, int maxComponents); -CvStatus *Mat_Exp(Mat src, Mat dst); -CvStatus *Mat_ExtractChannel(Mat src, Mat dst, int coi); -CvStatus *Mat_FindNonZero(Mat src, Mat idx); -CvStatus *Mat_Flip(Mat src, Mat dst, int flipCode); -CvStatus *Mat_Gemm(Mat src1, Mat src2, double alpha, Mat src3, double beta, Mat dst, int flags); -CvStatus *Mat_GetOptimalDFTSize(int vecsize, int *rval); -CvStatus *Mat_Hconcat(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_Vconcat(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_Idct(Mat src, Mat dst, int flags); -CvStatus *Mat_Idft(Mat src, Mat dst, int flags, int nonzeroRows); -CvStatus *Mat_InRange(Mat src, Mat lowerb, Mat upperb, Mat dst); -CvStatus *Mat_InRangeWithScalar(Mat src, const Scalar lowerb, const Scalar upperb, Mat dst); -CvStatus *Mat_InsertChannel(Mat src, Mat dst, int coi); -CvStatus *Mat_Invert(Mat src, Mat dst, int flags, double *rval); -CvStatus *Mat_Log(Mat src, Mat dst); -CvStatus *Mat_Magnitude(Mat x, Mat y, Mat magnitude); -CvStatus *Mat_Max(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_MeanStdDev(Mat src, Scalar *dstMean, Scalar *dstStdDev); -CvStatus *Mat_MeanStdDevWithMask(Mat src, Scalar *dstMean, Scalar *dstStdDev, Mat mask); -CvStatus *Mat_Merge(VecMat mats, Mat *dst); -CvStatus *Mat_Min(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_MinMaxIdx(Mat m, double *minVal, double *maxVal, int *minIdx, int *maxIdx); -CvStatus *Mat_MinMaxLoc(Mat m, double *minVal, double *maxVal, Point *minLoc, Point *maxLoc); -CvStatus *Mat_MixChannels(VecMat src, VecMat dst, VecI32 fromTo); -CvStatus *Mat_MulSpectrums(Mat a, Mat b, Mat c, int flags, bool conjB); -CvStatus *Mat_Multiply(Mat src1, Mat src2, Mat dst, double scale, int dtype); -CvStatus *Mat_Normalize(Mat src, Mat dst, double alpha, double beta, int typ, int dtype, Mat mask); -CvStatus *Mat_PerspectiveTransform(Mat src, Mat dst, Mat tm); -CvStatus *Mat_Solve(Mat src1, Mat src2, Mat dst, int flags, bool *rval); -CvStatus *Mat_SolveCubic(Mat coeffs, Mat roots, int *rval); -CvStatus *Mat_SolvePoly(Mat coeffs, Mat roots, int maxIters, double *rval); -CvStatus *Mat_Reduce(Mat src, Mat dst, int dim, int rType, int dType); -CvStatus *Mat_ReduceArgMax(Mat src, Mat dst, int axis, bool lastIndex); -CvStatus *Mat_ReduceArgMin(Mat src, Mat dst, int axis, bool lastIndex); -CvStatus *Mat_Repeat(Mat src, int nY, int nX, Mat dst); -CvStatus *Mat_ScaleAdd(Mat src1, double alpha, Mat src2, Mat dst); -CvStatus *Mat_SetIdentity(Mat src, double scalar); -CvStatus *Mat_Sort(Mat src, Mat dst, int flags); -CvStatus *Mat_SortIdx(Mat src, Mat dst, int flags); -CvStatus *Mat_Split(Mat src, VecMat *rval); -CvStatus *Mat_Subtract(Mat src1, Mat src2, Mat dst, Mat mask, int dtype); -CvStatus *Mat_T(Mat x, Mat *rval); -CvStatus *Mat_Trace(Mat src, Scalar *rval); -CvStatus *Mat_Transform(Mat src, Mat dst, Mat tm); -CvStatus *Mat_Transpose(Mat src, Mat dst); -CvStatus *Mat_PolarToCart(Mat magnitude, Mat degree, Mat x, Mat y, bool angleInDegrees); -CvStatus *Mat_Pow(Mat src, double power, Mat dst); -CvStatus *Mat_Phase(Mat x, Mat y, Mat angle, bool angleInDegrees); -CvStatus *Mat_Sum(Mat src, Scalar *rval); -CvStatus *Mat_rowRange(Mat m, int start, int end, Mat *rval); -CvStatus *Mat_colRange(Mat m, int start, int end, Mat *rval); -CvStatus *LUT(Mat src, Mat lut, Mat dst); -CvStatus *KMeans( - Mat data, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - Mat centers, - double *rval -); -CvStatus *KMeansPoints( - VecPoint2f pts, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - Mat centers, - double *rval -); -CvStatus *Rotate(Mat src, Mat dst, int rotateCode); -CvStatus *Norm(Mat src1, int normType, Mat mask, double *rval); -CvStatus *NormWithMats(Mat src1, Mat src2, int normType, Mat mask, double *rval); -#pragma endregion - -#pragma region RNG - -CvStatus *Rng_New(RNG *rval); -CvStatus *Rng_NewWithState(uint64_t state, RNG *rval); -void Rng_Close(RNGPtr rng); -CvStatus *TheRNG(RNG *rval); -CvStatus *SetRNGSeed(int seed); -CvStatus *RNG_Fill(RNG rng, Mat mat, int distType, double a, double b, bool saturateRange); -CvStatus *RNG_Gaussian(RNG rng, double sigma, double *rval); -CvStatus *RNG_Uniform(RNG rng, int a, int b, int *rval); -CvStatus *RNG_UniformDouble(RNG rng, double a, double b, double *rval); -CvStatus *RNG_Next(RNG rng, uint32_t *rval); -CvStatus *RandN(Mat mat, Scalar mean, Scalar stddev); -CvStatus *RandShuffle(Mat mat); -CvStatus *RandShuffleWithParams(Mat mat, double iterFactor, RNG rng); -CvStatus *RandU(Mat mat, Scalar low, Scalar high); -#pragma endregion - -CvStatus *GetCVTickCount(int64_t *rval); -CvStatus *GetTickFrequency(double *rval); -CvStatus *SetNumThreads(int n); -CvStatus *GetNumThreads(int *rval); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_CORE_H_ diff --git a/src/core/core_async.cpp b/src/core/core_async.cpp deleted file mode 100644 index 482e2608..00000000 --- a/src/core/core_async.cpp +++ /dev/null @@ -1,1250 +0,0 @@ -#include "core_async.h" -#include "core/types.h" -#include "lut.hpp" -#include "vec.hpp" - -#include "opencv2/core.hpp" -#include "opencv2/core/types.hpp" - -#pragma region Mat_Constructors -CvStatus *Mat_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat()}); - END_WRAP -} - -CvStatus *Mat_NewWithSize_Async(int rows, int cols, int type, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(rows, cols, type)}); - END_WRAP -} - -CvStatus *Mat_NewWithSizes_Async(VecI32 sizes, int type, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(sizes.length, sizes.ptr, type)}); - END_WRAP -} - -CvStatus *Mat_NewWithSizesScalar_Async(VecI32 sizes, int type, Scalar s, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar c = cv::Scalar(s.val1, s.val2, s.val3, s.val4); - callback(new Mat{new cv::Mat(sizes.length, sizes.ptr, type, c)}); - END_WRAP -} - -CvStatus * -Mat_NewWithSizesFromBytes_Async(VecI32 sizes, int type, VecChar buf, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(sizes.length, sizes.ptr, type, buf.ptr)}); - END_WRAP -} - -CvStatus * -Mat_NewFromScalar_Async(const Scalar s, int rows, int cols, int type, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar c = cv::Scalar(s.val1, s.val2, s.val3, s.val4); - callback(new Mat{new cv::Mat(rows, cols, type, c)}); - END_WRAP -} - -CvStatus * -Mat_NewFromBytes_Async(int rows, int cols, int type, void *buf, int step, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat m = cv::Mat(rows, cols, type); - m.create(rows, cols, type); - memcpy(m.data, buf, m.total() * m.elemSize()); - callback(new Mat{new cv::Mat(m)}); - END_WRAP -} - -CvStatus *Mat_NewFromVecPoint_Async(VecPoint vec, CvCallback_1 callback) { - BEGIN_WRAP - auto v = vecpoint_c2cpp(vec); - callback(new Mat{new cv::Mat(v, true)}); - END_WRAP -} - -CvStatus *Mat_NewFromVecPoint2f_Async(VecPoint2f vec, CvCallback_1 callback) { - BEGIN_WRAP - auto v = vecpoint2f_c2cpp(vec); - callback(new Mat{new cv::Mat(v, true)}); - END_WRAP -} - -CvStatus *Mat_NewFromVecPoint3f_Async(VecPoint3f vec, CvCallback_1 callback) { - BEGIN_WRAP - auto v = vecpoint3f_c2cpp(vec); - callback(new Mat{new cv::Mat(v, true)}); - END_WRAP -} - -CvStatus *Mat_Eye_Async(int rows, int cols, int type, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(cv::Mat::eye(rows, cols, type))}); - END_WRAP -} - -CvStatus *Mat_Zeros_Async(int rows, int cols, int type, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(cv::Mat::zeros(rows, cols, type))}); - END_WRAP -} - -CvStatus *Mat_Ones_Async(int rows, int cols, int type, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(cv::Mat::ones(rows, cols, type))}); - END_WRAP -} -#pragma endregion - -#pragma region Mat_functions - -CvStatus *Mat_Clone_Async(Mat self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->clone())}); - END_WRAP -} - -CvStatus *Mat_CopyTo_Async(Mat self, Mat dst, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->copyTo(*dst.ptr); - callback(); - END_WRAP -} - -CvStatus *Mat_CopyToWithMask_Async(Mat self, Mat dst, Mat mask, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->copyTo(*dst.ptr, *mask.ptr); - callback(); - END_WRAP -} - -CvStatus *Mat_ConvertTo_Async(Mat self, int type, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - self.ptr->convertTo(dst, type); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus * -Mat_ConvertToWithParams_Async(Mat self, int type, float alpha, float beta, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - self.ptr->convertTo(dst, type, alpha, beta); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *Mat_ToVecUChar_Async(Mat self, CvCallback_1 callback) { - BEGIN_WRAP - if (self.ptr->isContinuous()) { - callback(new VecUChar{self.ptr->data, self.ptr->total() * self.ptr->channels()}); - } else { - throw cv::Exception( - cv::Error::StsNotImplemented, "Mat is not continuous", __func__, __FILE__, __LINE__ - ); - } - END_WRAP -} - -CvStatus *Mat_ToVecChar_Async(Mat self, CvCallback_1 callback) { - BEGIN_WRAP - if (self.ptr->isContinuous()) { - callback(new VecChar{(char *)self.ptr->data, self.ptr->total() * self.ptr->channels()}); - } else { - throw cv::Exception( - cv::Error::StsNotImplemented, "Mat is not continuous", __func__, __FILE__, __LINE__ - ); - } - END_WRAP -} - -CvStatus *Mat_Region_Async(Mat self, Rect r, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(*self.ptr, cv::Rect(r.x, r.y, r.width, r.height))}); - END_WRAP -} - -CvStatus *Mat_Reshape_Async(Mat self, int cn, int rows, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->reshape(cn, rows))}); - END_WRAP -} -#pragma endregion - -CvStatus *core_PatchNaNs_Async(Mat self, double val, CvCallback_0 callback) { - BEGIN_WRAP - cv::patchNaNs(*self.ptr, val); - callback(); - END_WRAP -} -// Deprecated: -// Use Mat::convertTo with CV_16F instead. -// CvStatus *Mat_ConvertFp16_Async(Mat self, CvCallback_1 callback); -CvStatus *core_Mean_Async(Mat self, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar c = cv::mean(*self.ptr); - callback(new Scalar{c.val[0], c.val[1], c.val[2], c.val[3]}); - END_WRAP -} - -CvStatus *core_MeanWithMask_Async(Mat self, Mat mask, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar c = cv::mean(*self.ptr, *mask.ptr); - callback(new Scalar{c.val[0], c.val[1], c.val[2], c.val[3]}); - END_WRAP -} - -CvStatus *core_Sqrt_Async(Mat self, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::sqrt(*self.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_AbsDiff_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::absdiff(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Add_Async(Mat src1, Mat src2, Mat mask, int dtype, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::add(*src1.ptr, *src2.ptr, dst, *mask.ptr, dtype); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_AddWeighted_Async( - Mat src1, double alpha, Mat src2, double beta, double gamma, int dtype, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::addWeighted(*src1.ptr, alpha, *src2.ptr, beta, gamma, dst, dtype); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BitwiseAnd_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bitwise_and(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BitwiseAndWithMask_Async(Mat src1, Mat src2, Mat mask, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bitwise_and(*src1.ptr, *src2.ptr, dst, *mask.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BitwiseNot_Async(Mat src1, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bitwise_not(*src1.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BitwiseNotWithMask_Async(Mat src1, Mat mask, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bitwise_not(*src1.ptr, dst, *mask.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BitwiseOr_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bitwise_or(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BitwiseOrWithMask_Async(Mat src1, Mat src2, Mat mask, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bitwise_or(*src1.ptr, *src2.ptr, dst, *mask.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BitwiseXor_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bitwise_xor(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BitwiseXorWithMask_Async(Mat src1, Mat src2, Mat mask, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bitwise_xor(*src1.ptr, *src2.ptr, dst, *mask.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Compare_Async(Mat src1, Mat src2, int ct, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::compare(*src1.ptr, *src2.ptr, dst, ct); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_BatchDistance_Async( - Mat src1, - Mat src2, - int dtype, - int normType, - int K, - Mat mask, - int update, - bool crosscheck, - CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat dist, nidx; - cv::batchDistance( - *src1.ptr, *src2.ptr, dist, dtype, nidx, normType, K, *mask.ptr, update, crosscheck - ); - callback(new Mat{new cv::Mat(dist)}, new Mat{new cv::Mat(nidx)}); - END_WRAP -} - -CvStatus *core_BorderInterpolate_Async(int p, int len, int borderType, CvCallback_1 callback) { - BEGIN_WRAP - callback(new int(cv::borderInterpolate(p, len, borderType))); - END_WRAP -} - -CvStatus * -core_CalcCovarMatrix_Async(Mat samples, Mat mean, int flags, int ctype, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat cov; - cv::calcCovarMatrix(*samples.ptr, cov, *mean.ptr, flags, ctype); - callback(new Mat{new cv::Mat(cov)}); - END_WRAP -} - -CvStatus *core_CartToPolar_Async(Mat x, Mat y, bool angleInDegrees, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat mag, ang; - cv::cartToPolar(*x.ptr, *y.ptr, mag, ang, angleInDegrees); - callback(new Mat{new cv::Mat(mag)}, new Mat{new cv::Mat(ang)}); - END_WRAP -} - -CvStatus * -core_CheckRange_Async(Mat self, bool quiet, double minVal, double maxVal, CvCallback_2 callback) { - BEGIN_WRAP - cv::Point point; - bool rval = cv::checkRange(*self.ptr, quiet, &point, minVal, maxVal); - callback(new bool(rval), new Point{point.x, point.y}); - END_WRAP -} - -CvStatus *core_CompleteSymm_Async(Mat self, bool lowerToUpper, CvCallback_0 callback) { - BEGIN_WRAP - cv::completeSymm(*self.ptr, lowerToUpper); - callback(); - END_WRAP -} - -CvStatus *core_ConvertScaleAbs_Async(Mat src, double alpha, double beta, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::convertScaleAbs(*src.ptr, dst, alpha, beta); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_CopyMakeBorder_Async( - Mat src, - int top, - int bottom, - int left, - int right, - int borderType, - Scalar value, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::Scalar val = cv::Scalar(value.val1, value.val2, value.val3, value.val4); - cv::copyMakeBorder(*src.ptr, dst, top, bottom, left, right, borderType, val); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_CountNonZero_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - callback(new int(cv::countNonZero(*src.ptr))); - END_WRAP -} - -CvStatus *core_DCT_Async(Mat src, int flags, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::dct(*src.ptr, dst, flags); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Determinant_Async(Mat self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new double(cv::determinant(*self.ptr))); - END_WRAP -} - -CvStatus *core_DFT_Async(Mat self, int flags, int nonzeroRows, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::dft(*self.ptr, dst, flags, nonzeroRows); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Divide_Async(Mat src1, Mat src2, double scale, int dtype, CvCallback_1 callback) { - BEGIN_WRAP - cv::divide(*src1.ptr, *src2.ptr, *src1.ptr, scale, dtype); - callback(new Mat{new cv::Mat(*src1.ptr)}); - END_WRAP -} - -CvStatus *core_Eigen_Async(Mat src, CvCallback_3 callback) { - BEGIN_WRAP - cv::Mat eigenvalues, eigenvectors; - bool rval = cv::eigen(*src.ptr, eigenvalues, eigenvectors); - callback(new bool(rval), new Mat{new cv::Mat(eigenvalues)}, new Mat{new cv::Mat(eigenvectors)}); - END_WRAP -} - -CvStatus *core_EigenNonSymmetric_Async(Mat src, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat eigenvalues, eigenvectors; - cv::eigenNonSymmetric(*src.ptr, eigenvalues, eigenvectors); - callback(new Mat{new cv::Mat(eigenvalues)}, new Mat{new cv::Mat(eigenvectors)}); - END_WRAP -} - -CvStatus *core_PCABackProject_Async(Mat src, Mat mean, Mat eigenvectors, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat result; - cv::PCABackProject(*src.ptr, *mean.ptr, *eigenvectors.ptr, result); - callback(new Mat{new cv::Mat(result)}); - END_WRAP -} - -CvStatus * -core_PCACompute_3_Async(Mat src, Mat mean, double retainedVariance, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat eigenvectors; - cv::PCACompute(*src.ptr, *mean.ptr, eigenvectors, retainedVariance); - callback(new Mat{new cv::Mat(eigenvectors)}); - END_WRAP -} - -CvStatus *core_PCACompute_1_Async(Mat src, Mat mean, int maxComponents, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat eigenvectors; - cv::PCACompute(*src.ptr, *mean.ptr, eigenvectors, maxComponents); - callback(new Mat{new cv::Mat(eigenvectors)}); - END_WRAP -} - -CvStatus * -core_PCACompute_2_Async(Mat src, Mat mean, double retainedVariance, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat eigenvectors, eigenValues; - cv::PCACompute(*src.ptr, *mean.ptr, eigenvectors, eigenValues, retainedVariance); - callback(new Mat{new cv::Mat(eigenvectors)}, new Mat{new cv::Mat(eigenValues)}); - END_WRAP -} - -CvStatus *core_PCACompute_Async(Mat src, Mat mean, int maxComponents, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat eigenvectors, eigenValues; - cv::PCACompute(*src.ptr, *mean.ptr, eigenvectors, eigenValues, maxComponents); - callback(new Mat{new cv::Mat(eigenvectors)}, new Mat{new cv::Mat(eigenValues)}); - END_WRAP -} - -CvStatus *core_PCAProject_Async(Mat src, Mat mean, Mat eigenvectors, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat result; - cv::PCAProject(*src.ptr, *mean.ptr, *eigenvectors.ptr, result); - callback(new Mat{new cv::Mat(result)}); - END_WRAP -} - -CvStatus *core_Exp_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::exp(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_ExtractChannel_Async(Mat src, int coi, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::extractChannel(*src.ptr, dst, coi); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_FindNonZero_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat indices; - cv::findNonZero(*src.ptr, indices); - callback(new Mat{new cv::Mat(indices)}); - END_WRAP -} - -CvStatus *core_Flip_Async(Mat src, int flipCode, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::flip(*src.ptr, dst, flipCode); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Gemm_Async( - Mat src1, Mat src2, double alpha, Mat src3, double beta, int flags, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::gemm(*src1.ptr, *src2.ptr, alpha, *src3.ptr, beta, dst, flags); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_GetOptimalDFTSize_Async(int vecsize, CvCallback_1 callback) { - BEGIN_WRAP - callback(new int(cv::getOptimalDFTSize(vecsize))); - END_WRAP -} - -CvStatus *core_Hconcat_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::hconcat(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Vconcat_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::vconcat(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Idct_Async(Mat src, int flags, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::idct(*src.ptr, dst, flags); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Idft_Async(Mat src, int flags, int nonzeroRows, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::idft(*src.ptr, dst, flags, nonzeroRows); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_InRange_Async(Mat src, Mat lowerb, Mat upperb, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::inRange(*src.ptr, *lowerb.ptr, *upperb.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_InRangeWithScalar_Async( - Mat src, const Scalar lowerb, const Scalar upperb, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::Scalar lowb(lowerb.val1, lowerb.val2, lowerb.val3, lowerb.val4); - cv::Scalar upb(upperb.val1, upperb.val2, upperb.val3, upperb.val4); - cv::inRange(*src.ptr, lowb, upb, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_InsertChannel_Async(Mat src, Mat dst, int coi, CvCallback_0 callback) { - BEGIN_WRAP - cv::insertChannel(*src.ptr, *dst.ptr, coi); - callback(); - END_WRAP -} - -CvStatus *core_Invert_Async(Mat src, int flags, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dst; - double rval = cv::invert(*src.ptr, dst, flags); - callback(new double(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Log_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::log(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Magnitude_Async(Mat x, Mat y, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::magnitude(*x.ptr, *y.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Max_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::max(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_MeanStdDev_Async(Mat src, CvCallback_2 callback) { - BEGIN_WRAP - cv::Scalar mean, stddev; - cv::meanStdDev(*src.ptr, mean, stddev); - callback( - new Scalar{mean.val[0], mean.val[1], mean.val[2], mean.val[3]}, - new Scalar{stddev.val[0], stddev.val[1], stddev.val[2], stddev.val[3]} - ); - END_WRAP -} - -CvStatus *core_MeanStdDevWithMask_Async(Mat src, Mat mask, CvCallback_2 callback) { - BEGIN_WRAP - cv::Scalar mean, stddev; - cv::meanStdDev(*src.ptr, mean, stddev, *mask.ptr); - callback( - new Scalar{mean.val[0], mean.val[1], mean.val[2], mean.val[3]}, - new Scalar{stddev.val[0], stddev.val[1], stddev.val[2], stddev.val[3]} - ); - END_WRAP -} - -CvStatus *core_Merge_Async(VecMat mats, CvCallback_1 callback) { - BEGIN_WRAP - auto mv = vecmat_c2cpp(mats); - cv::Mat _dst; - cv::merge(mv, _dst); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -CvStatus *core_Min_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::min(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_MinMaxIdx_Async(Mat self, CvCallback_4 callback) { - BEGIN_WRAP - double minVal, maxVal; - int minLoc, maxLoc; - cv::minMaxIdx(*self.ptr, &minVal, &maxVal, &minLoc, &maxLoc); - callback(new double(minVal), new double(maxVal), new int(minLoc), new int(maxLoc)); - END_WRAP -} - -CvStatus *core_MinMaxIdx_Mask_Async(Mat self, Mat mask, CvCallback_4 callback) { - BEGIN_WRAP - double minVal, maxVal; - int minLoc, maxLoc; - cv::minMaxIdx(*self.ptr, &minVal, &maxVal, &minLoc, &maxLoc, *mask.ptr); - callback(new double(minVal), new double(maxVal), new int(minLoc), new int(maxLoc)); - END_WRAP -} - -CvStatus *core_MinMaxLoc_Async(Mat self, CvCallback_4 callback) { - BEGIN_WRAP - double minVal, maxVal; - cv::Point minLoc, maxLoc; - cv::minMaxLoc(*self.ptr, &minVal, &maxVal, &minLoc, &maxLoc); - callback( - new double(minVal), - new double(maxVal), - new Point{minLoc.x, minLoc.y}, - new Point{maxLoc.x, maxLoc.y} - ); - END_WRAP -} - -CvStatus *core_MinMaxLoc_Mask_Async(Mat self, Mat mask, CvCallback_4 callback) { - BEGIN_WRAP - double minVal, maxVal; - cv::Point minLoc, maxLoc; - cv::minMaxLoc(*self.ptr, &minVal, &maxVal, &minLoc, &maxLoc, *mask.ptr); - callback( - new double(minVal), - new double(maxVal), - new Point{minLoc.x, minLoc.y}, - new Point{maxLoc.x, maxLoc.y} - ); - END_WRAP -} - -CvStatus *core_MixChannels_Async(VecMat src, VecMat dst, VecI32 fromTo, CvCallback_0 callback) { - BEGIN_WRAP - auto _src = vecmat_c2cpp(src); - auto _dst = vecmat_c2cpp(dst); - std::vector _fromTo(fromTo.ptr, fromTo.ptr + fromTo.length); - cv::mixChannels(_src, _dst, _fromTo); - // TODO: check whether dst changed - callback(); - END_WRAP -} - -CvStatus *core_MulSpectrums_Async(Mat a, Mat b, int flags, bool conjB, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::mulSpectrums(*a.ptr, *b.ptr, dst, flags); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Multiply_Async(Mat src1, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::multiply(*src1.ptr, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus * -core_MultiplyWithParams_Async(Mat src1, Mat src2, double scale, int dtype, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::multiply(*src1.ptr, *src2.ptr, dst, scale, dtype); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Normalize_Async( - Mat src, Mat dst, double alpha, double beta, int typ, int dtype, CvCallback_0 callback -) { - BEGIN_WRAP - cv::normalize(*src.ptr, *dst.ptr, alpha, beta, typ, dtype); - callback(); - END_WRAP -} - -CvStatus *core_Normalize_Mask_Async( - Mat src, Mat dst, double alpha, double beta, int typ, int dtype, Mat mask, CvCallback_0 callback -) { - BEGIN_WRAP - cv::normalize(*src.ptr, *dst.ptr, alpha, beta, typ, dtype, *mask.ptr); - callback(); - END_WRAP -} - -CvStatus *core_PerspectiveTransform_Async(Mat src, Mat tm, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::perspectiveTransform(*src.ptr, dst, *tm.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Solve_Async(Mat src1, Mat src2, int flags, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dst; - bool rval = cv::solve(*src1.ptr, *src2.ptr, dst, flags); - callback(new bool(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_SolveCubic_Async(Mat coeffs, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dst; - int rval = cv::solveCubic(*coeffs.ptr, dst); - callback(new int(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_SolvePoly_Async(Mat coeffs, int maxIters, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dst; - double rval = cv::solvePoly(*coeffs.ptr, dst, maxIters); - callback(new double(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Reduce_Async(Mat src, int dim, int rType, int dType, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::reduce(*src.ptr, dst, dim, rType, dType); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_ReduceArgMax_Async(Mat src, int axis, bool lastIndex, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::reduceArgMax(*src.ptr, dst, axis, lastIndex); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_ReduceArgMin_Async(Mat src, int axis, bool lastIndex, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::reduceArgMin(*src.ptr, dst, axis, lastIndex); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Repeat_Async(Mat src, int nY, int nX, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::repeat(*src.ptr, nY, nX, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_ScaleAdd_Async(Mat src1, double alpha, Mat src2, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::scaleAdd(*src1.ptr, alpha, *src2.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_SetIdentity_Async(Mat src, Scalar scalar, CvCallback_0 callback) { - BEGIN_WRAP - cv::setIdentity(*src.ptr, *new cv::Scalar(scalar.val1, scalar.val2, scalar.val3, scalar.val4)); - callback(); - END_WRAP -} - -CvStatus *core_Sort_Async(Mat src, int flags, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::sort(*src.ptr, dst, flags); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_SortIdx_Async(Mat src, int flags, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::sortIdx(*src.ptr, dst, flags); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Split_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector dst; - cv::split(*src.ptr, dst); - callback(vecmat_cpp2c_p(dst)); - END_WRAP -} - -CvStatus *core_Subtract_Async(Mat src1, Mat src2, Mat mask, int dtype, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::subtract(*src1.ptr, *src2.ptr, dst, *mask.ptr, dtype); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_T_Async(Mat x, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::transpose(*x.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Trace_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar dst = cv::trace(*src.ptr); - callback(new Scalar{dst.val[0], dst.val[1], dst.val[2], dst.val[3]}); - END_WRAP -} - -CvStatus *core_Transform_Async(Mat src, Mat tm, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::transform(*src.ptr, dst, *tm.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Transpose_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::transpose(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus * -core_PolarToCart_Async(Mat magnitude, Mat degree, bool angleInDegrees, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat x, y; - cv::polarToCart(*magnitude.ptr, *degree.ptr, x, y, angleInDegrees); - callback(new Mat{new cv::Mat(x)}, new Mat{new cv::Mat(y)}); - END_WRAP -} - -CvStatus *core_Pow_Async(Mat src, double power, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::pow(*src.ptr, power, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Phase_Async(Mat x, Mat y, bool angleInDegrees, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::phase(*x.ptr, *y.ptr, dst, angleInDegrees); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Sum_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar dst = cv::sum(*src.ptr); - callback(new Scalar{dst.val[0], dst.val[1], dst.val[2], dst.val[3]}); - END_WRAP -} - -CvStatus *core_rowRange_Async(Mat self, int start, int end, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst = self.ptr->rowRange(start, end); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_colRange_Async(Mat self, int start, int end, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst = self.ptr->colRange(start, end); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_LUT_Async(Mat src, Mat lut, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - auto cn = src.ptr->channels(), depth = src.ptr->depth(); - if (depth == CV_8U || depth == CV_8S) { - cv::LUT(*src.ptr, *lut.ptr, dst); - } else { - int lutcn = lut.ptr->channels(), lut_depth = lut.ptr->depth(); - size_t lut_total = lut.ptr->total(), expect_total = 0; - switch (depth) { - case CV_8U: - case CV_8S: expect_total = 256; break; - case CV_16U: - case CV_16S: expect_total = 65536; break; - // TODO: can't create a mat with 4294967296 rows, maybe use vector instead - // case CV_32S: - // expect_total = 4294967296; - // break; - default: - throw cv::Exception( - cv::Error::StsNotImplemented, - "source Mat Type not supported", - __func__, - __FILE__, - __LINE__ - ); - } - - CV_Assert((lutcn == cn || lutcn == 1) && lut_total == expect_total && lut.ptr->isContinuous()); - dst.create(src.ptr->dims, src.ptr->size, CV_MAKETYPE(lut.ptr->depth(), cn)); - - const cv::Mat *arrays[] = {src.ptr, &dst, 0}; - uchar *ptrs[2] = {}; - cv::NAryMatIterator it(arrays, ptrs); - int len = (int)it.size; - - switch (depth) { - case CV_16U: - switch (lut_depth) { - case CV_8U: - cvd::LUT16u_8u( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_8S: - cvd::LUT16u_8s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_16U: - cvd::LUT16u_16u( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_16S: - cvd::LUT16u_16s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_32S: - cvd::LUT16u_32s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_32F: - cvd::LUT16u_32f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_64F: - cvd::LUT16u_64f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - default: - cv::String err = "lut Mat Type not supported for CV_16U"; - throw cv::Exception(cv::Error::StsNotImplemented, err, __func__, __FILE__, __LINE__); - } - break; - case CV_16S: - switch (lut_depth) { - case CV_8U: - cvd::LUT16s_8u( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_8S: - cvd::LUT16s_8s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_16U: - cvd::LUT16s_16u( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_16S: - cvd::LUT16s_16s( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_32S: - cvd::LUT16s_32s(src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn); - break; - case CV_32F: - cvd::LUT16s_32f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_64F: - cvd::LUT16s_64f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - default: - cv::String err = "lut Mat Type not supported for CV_16S"; - throw cv::Exception(cv::Error::StsNotImplemented, err, __func__, __FILE__, __LINE__); - } - break; - case CV_32S: - switch (lut_depth) { - case CV_32S: - cvd::LUT32s_32s(src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn); - break; - case CV_32F: - cvd::LUT32s_32f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - case CV_64F: - cvd::LUT32s_64f( - src.ptr->ptr(), lut.ptr->ptr(), dst.ptr(), len, cn, lutcn - ); - break; - default: - cv::String err = "lut Mat Type not supported for CV_32S"; - throw cv::Exception(cv::Error::StsNotImplemented, err, __func__, __FILE__, __LINE__); - } - break; - default: - cv::String err = "src Mat Type not supported"; - throw cv::Exception(cv::Error::StsNotImplemented, err, __func__, __FILE__, __LINE__); - } - } - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_KMeans_Async( - Mat data, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - CvCallback_2 callback -) { - BEGIN_WRAP - cv::TermCriteria tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - cv::Mat centers; - double rval = cv::kmeans(*data.ptr, k, *bestLabels.ptr, tc, attempts, flags, centers); - callback(new double(rval), new Mat{new cv::Mat(centers)}); - END_WRAP -} - -CvStatus *core_KMeans_Points_Async( - VecPoint2f pts, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - CvCallback_2 callback -) { - BEGIN_WRAP - cv::TermCriteria tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - cv::Mat centers; - auto _pts = vecpoint2f_c2cpp(pts); - double rval = cv::kmeans(_pts, k, *bestLabels.ptr, tc, attempts, flags, centers); - callback(new double(rval), new Mat{new cv::Mat(centers)}); - END_WRAP -} - -CvStatus *core_Rotate_Async(Mat src, int rotateCode, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::rotate(*src.ptr, dst, rotateCode); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *core_Norm_Async(Mat src1, int normType, CvCallback_1 callback) { - BEGIN_WRAP - double rval = cv::norm(*src1.ptr, normType); - callback(new double(rval)); - END_WRAP -} - -CvStatus *core_Norm_Mask_Async(Mat src1, int normType, Mat mask, CvCallback_1 callback) { - BEGIN_WRAP - double rval = cv::norm(*src1.ptr, normType, *mask.ptr); - callback(new double(rval)); - END_WRAP -} - -CvStatus *core_NormWithMats_Async(Mat src1, Mat src2, int normType, CvCallback_1 callback) { - BEGIN_WRAP - double rval = cv::norm(*src1.ptr, *src2.ptr, normType); - callback(new double(rval)); - END_WRAP -} -#pragma region RNG - -CvStatus *Rng_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new RNG{new cv::RNG()}); - END_WRAP -} - -CvStatus *Rng_NewWithState_Async(uint64_t state, CvCallback_1 callback) { - BEGIN_WRAP - callback(new RNG{new cv::RNG(state)}); - END_WRAP -} - -CvStatus *RNG_Fill_Async( - RNG rng, Mat mat, int distType, double a, double b, bool saturateRange, CvCallback_0 callback -) { - BEGIN_WRAP - rng.ptr->fill(*mat.ptr, distType, a, b, saturateRange); - callback(); - END_WRAP -} - -CvStatus *RNG_Gaussian_Async(RNG rng, double sigma, CvCallback_1 callback) { - BEGIN_WRAP - double rval = rng.ptr->gaussian(sigma); - callback(new double(rval)); - END_WRAP -} - -CvStatus *RNG_Uniform_Async(RNG rng, int a, int b, CvCallback_1 callback) { - BEGIN_WRAP - int rval = rng.ptr->uniform(a, b); - callback(new int(rval)); - END_WRAP -} - -CvStatus *RNG_UniformDouble_Async(RNG rng, double a, double b, CvCallback_1 callback) { - BEGIN_WRAP - double rval = rng.ptr->uniform(a, b); - callback(new double(rval)); - END_WRAP -} - -CvStatus *RNG_Next_Async(RNG rng, CvCallback_1 callback) { - BEGIN_WRAP - uint32_t rval = rng.ptr->next(); - callback(new uint32_t(rval)); - END_WRAP -} - -CvStatus *RandN_Async(Mat mat, Scalar mean, Scalar stddev, CvCallback_0 callback) { - BEGIN_WRAP - cv::Scalar mean_ = cv::Scalar(mean.val1, mean.val2, mean.val3, mean.val4); - cv::Scalar stddev_ = cv::Scalar(stddev.val1, stddev.val2, stddev.val3, stddev.val4); - cv::randn(*mat.ptr, mean_, stddev_); - callback(); - END_WRAP -} - -CvStatus *RandShuffle_Async(Mat mat, CvCallback_0 callback) { - BEGIN_WRAP - cv::randShuffle(*mat.ptr); - callback(); - END_WRAP -} - -CvStatus *RandShuffleWithParams_Async(Mat mat, double iterFactor, RNG rng, CvCallback_0 callback) { - BEGIN_WRAP - cv::randShuffle(*mat.ptr, iterFactor, rng.ptr); - callback(); - END_WRAP -} - -CvStatus *RandU_Async(Mat mat, Scalar low, Scalar high, CvCallback_0 callback) { - BEGIN_WRAP - cv::Scalar low_ = cv::Scalar(low.val1, low.val2, low.val3, low.val4); - cv::Scalar high_ = cv::Scalar(high.val1, high.val2, high.val3, high.val4); - cv::randu(*mat.ptr, low_, high_); - callback(); - END_WRAP -} -#pragma endregion diff --git a/src/core/core_async.h b/src/core/core_async.h deleted file mode 100644 index 650acfb3..00000000 --- a/src/core/core_async.h +++ /dev/null @@ -1,393 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef CVD_ASYNC_CORE_H -#define CVD_ASYNC_CORE_H - -#include "core/types.h" -#ifdef __cplusplus -extern "C" { -#endif - -#pragma region Mat_Constructors -CvStatus *Mat_New_Async(CvCallback_1 callback); -CvStatus *Mat_NewWithSize_Async(int rows, int cols, int type, CvCallback_1 callback); -CvStatus *Mat_NewWithSizes_Async(VecI32 sizes, int type, CvCallback_1 callback); -CvStatus *Mat_NewWithSizesScalar_Async(VecI32 sizes, int type, Scalar s, CvCallback_1 callback); -CvStatus * -Mat_NewWithSizesFromBytes_Async(VecI32 sizes, int type, VecChar buf, CvCallback_1 callback); -CvStatus * -Mat_NewFromScalar_Async(const Scalar s, int rows, int cols, int type, CvCallback_1 callback); -CvStatus * -Mat_NewFromBytes_Async(int rows, int cols, int type, void *buf, int step, CvCallback_1 callback); -CvStatus *Mat_NewFromVecPoint_Async(VecPoint vec, CvCallback_1 callback); -CvStatus *Mat_NewFromVecPoint2f_Async(VecPoint2f vec, CvCallback_1 callback); -CvStatus *Mat_NewFromVecPoint3f_Async(VecPoint3f vec, CvCallback_1 callback); - -CvStatus *Mat_Eye_Async(int rows, int cols, int type, CvCallback_1 callback); -CvStatus *Mat_Zeros_Async(int rows, int cols, int type, CvCallback_1 callback); -CvStatus *Mat_Ones_Async(int rows, int cols, int type, CvCallback_1 callback); - -#pragma endregion - -#pragma region Mat_functions -// CvStatus *Mat_Release_Async(MatPtr self, CvCallback_0 callback); -// CvStatus *Mat_Empty_Async(Mat self, CvCallback_1 callback); // bool *rval -// CvStatus *Mat_IsContinuous_Async(Mat self, CvCallback_1 callback); // bool *rval -CvStatus *Mat_Clone_Async(Mat self, CvCallback_1 callback); // Mat *dst -CvStatus *Mat_CopyTo_Async(Mat self, Mat dst, CvCallback_0 callback); -CvStatus *Mat_CopyToWithMask_Async(Mat self, Mat dst, Mat mask, CvCallback_0 callback); -CvStatus *Mat_ConvertTo_Async(Mat self, int type, CvCallback_1 callback); // Mat dst -CvStatus *Mat_ConvertToWithParams_Async( - Mat self, int type, float alpha, float beta, CvCallback_1 callback -); // Mat dst -CvStatus *Mat_ToVecUChar_Async(Mat self, CvCallback_1 callback); // VecUChar *rval -CvStatus *Mat_ToVecChar_Async(Mat self, CvCallback_1 callback); // VecChar *rval -CvStatus *Mat_Region_Async(Mat self, Rect r, CvCallback_1 callback); -CvStatus *Mat_Reshape_Async(Mat self, int cn, int rows, CvCallback_1 callback); -#pragma endregion - -// properties, use sync -// CvStatus *Mat_Rows_Async(Mat self, CvCallback_1 callback); // int *rval -// CvStatus *Mat_Cols_Async(Mat self, CvCallback_1 callback); -// CvStatus *Mat_Channels_Async(Mat self, CvCallback_1 callback); -// CvStatus *Mat_Type_Async(Mat self, CvCallback_1 callback); -// CvStatus *Mat_Step_Async(Mat self, int *rval); -// CvStatus *Mat_Total_Async(Mat self, int *rval); -// CvStatus *Mat_Size_Async(Mat self, VecI32 *rval); -// CvStatus *Mat_ElemSize_Async(Mat self, int *rval); -// CvStatus *Mat_Data_Async(Mat self, VecUChar *rval); -// CvStatus *Mat_DataPtr_Async(Mat self, uchar **data, int *length); - -// CvStatus *Mat_Ptr_u8_1_Async(Mat self, int i, uchar **rval); -// CvStatus *Mat_Ptr_u8_2_Async(Mat self, int i, int j, uchar **rval); -// CvStatus *Mat_Ptr_u8_3_Async(Mat self, int i, int j, int k, uchar **rval); -// CvStatus *Mat_Ptr_i8_1_Async(Mat self, int i, char **rval); -// CvStatus *Mat_Ptr_i8_2_Async(Mat self, int i, int j, char **rval); -// CvStatus *Mat_Ptr_i8_3_Async(Mat self, int i, int j, int k, char **rval); -// CvStatus *Mat_Ptr_u16_1_Async(Mat self, int i, ushort **rval); -// CvStatus *Mat_Ptr_u16_2_Async(Mat self, int i, int j, ushort **rval); -// CvStatus *Mat_Ptr_u16_3_Async(Mat self, int i, int j, int k, ushort **rval); -// CvStatus *Mat_Ptr_i16_1_Async(Mat self, int i, short **rval); -// CvStatus *Mat_Ptr_i16_2_Async(Mat self, int i, int j, short **rval); -// CvStatus *Mat_Ptr_i16_3_Async(Mat self, int i, int j, int k, short **rval); -// CvStatus *Mat_Ptr_i32_1_Async(Mat self, int i, int **rval); -// CvStatus *Mat_Ptr_i32_2_Async(Mat self, int i, int j, int **rval); -// CvStatus *Mat_Ptr_i32_3_Async(Mat self, int i, int j, int k, int **rval); -// CvStatus *Mat_Ptr_f32_1_Async(Mat self, int i, float **rval); -// CvStatus *Mat_Ptr_f32_2_Async(Mat self, int i, int j, float **rval); -// CvStatus *Mat_Ptr_f32_3_Async(Mat self, int i, int j, int k, float **rval); -// CvStatus *Mat_Ptr_f64_1_Async(Mat self, int i, double **rval); -// CvStatus *Mat_Ptr_f64_2_Async(Mat self, int i, int j, double **rval); -// CvStatus *Mat_Ptr_f64_3_Async(Mat self, int i, int j, int k, double **rval); - -// #pragma region Mat_getter - -// CvStatus *Mat_GetUChar_Async(Mat self, int row, int col, uint8_t *rval); -// CvStatus *Mat_GetUChar3_Async(Mat self, int x, int y, int z, uint8_t *rval); -// CvStatus *Mat_GetSChar_Async(Mat self, int row, int col, int8_t *rval); -// CvStatus *Mat_GetSChar3_Async(Mat self, int x, int y, int z, int8_t *rval); -// CvStatus *Mat_GetUShort_Async(Mat self, int row, int col, uint16_t *rval); -// CvStatus *Mat_GetUShort3_Async(Mat self, int x, int y, int z, uint16_t *rval); -// CvStatus *Mat_GetShort_Async(Mat self, int row, int col, int16_t *rval); -// CvStatus *Mat_GetShort3_Async(Mat self, int x, int y, int z, int16_t *rval); -// CvStatus *Mat_GetInt_Async(Mat self, int row, int col, int32_t *rval); -// CvStatus *Mat_GetInt3_Async(Mat self, int x, int y, int z, int32_t *rval); -// CvStatus *Mat_GetFloat_Async(Mat self, int row, int col, float *rval); -// CvStatus *Mat_GetFloat3_Async(Mat self, int x, int y, int z, float *rval); -// CvStatus *Mat_GetDouble_Async(Mat self, int row, int col, double *rval); -// CvStatus *Mat_GetDouble3_Async(Mat self, int x, int y, int z, double *rval); - -// CvStatus *Mat_GetVec2b_Async(Mat self, int row, int col, Vec2b *rval); -// CvStatus *Mat_GetVec3b_Async(Mat self, int row, int col, Vec3b *rval); -// CvStatus *Mat_GetVec4b_Async(Mat self, int row, int col, Vec4b *rval); -// CvStatus *Mat_GetVec2s_Async(Mat self, int row, int col, Vec2s *rval); -// CvStatus *Mat_GetVec3s_Async(Mat self, int row, int col, Vec3s *rval); -// CvStatus *Mat_GetVec4s_Async(Mat self, int row, int col, Vec4s *rval); -// CvStatus *Mat_GetVec2w_Async(Mat self, int row, int col, Vec2w *rval); -// CvStatus *Mat_GetVec3w_Async(Mat self, int row, int col, Vec3w *rval); -// CvStatus *Mat_GetVec4w_Async(Mat self, int row, int col, Vec4w *rval); -// CvStatus *Mat_GetVec2i_Async(Mat self, int row, int col, Vec2i *rval); -// CvStatus *Mat_GetVec3i_Async(Mat self, int row, int col, Vec3i *rval); -// CvStatus *Mat_GetVec4i_Async(Mat self, int row, int col, Vec4i *rval); -// CvStatus *Mat_GetVec6i_Async(Mat self, int row, int col, Vec6i *rval); -// CvStatus *Mat_GetVec8i_Async(Mat self, int row, int col, Vec8i *rval); -// CvStatus *Mat_GetVec2f_Async(Mat self, int row, int col, Vec2f *rval); -// CvStatus *Mat_GetVec3f_Async(Mat self, int row, int col, Vec3f *rval); -// CvStatus *Mat_GetVec4f_Async(Mat self, int row, int col, Vec4f *rval); -// CvStatus *Mat_GetVec6f_Async(Mat self, int row, int col, Vec6f *rval); -// CvStatus *Mat_GetVec2d_Async(Mat self, int row, int col, Vec2d *rval); -// CvStatus *Mat_GetVec3d_Async(Mat self, int row, int col, Vec3d *rval); -// CvStatus *Mat_GetVec4d_Async(Mat self, int row, int col, Vec4d *rval); -// CvStatus *Mat_GetVec6d_Async(Mat self, int row, int col, Vec6d *rval); - -// #pragma endregion - -// #pragma region Mat_setter - -// CvStatus *Mat_SetTo_Async(Mat self, Scalar value); -// CvStatus *Mat_SetUChar_Async(Mat self, int row, int col, uint8_t val); -// CvStatus *Mat_SetUChar3_Async(Mat self, int x, int y, int z, uint8_t val); -// CvStatus *Mat_SetSChar_Async(Mat self, int row, int col, int8_t val); -// CvStatus *Mat_SetSChar3_Async(Mat self, int x, int y, int z, int8_t val); -// CvStatus *Mat_SetShort_Async(Mat self, int row, int col, int16_t val); -// CvStatus *Mat_SetShort3_Async(Mat self, int x, int y, int z, int16_t val); -// CvStatus *Mat_SetUShort_Async(Mat self, int row, int col, uint16_t val); -// CvStatus *Mat_SetUShort3_Async(Mat self, int x, int y, int z, uint16_t val); -// CvStatus *Mat_SetInt_Async(Mat self, int row, int col, int32_t val); -// CvStatus *Mat_SetInt3_Async(Mat self, int x, int y, int z, int32_t val); -// CvStatus *Mat_SetFloat_Async(Mat self, int row, int col, float val); -// CvStatus *Mat_SetFloat3_Async(Mat self, int x, int y, int z, float val); -// CvStatus *Mat_SetDouble_Async(Mat self, int row, int col, double val); -// CvStatus *Mat_SetDouble3_Async(Mat self, int x, int y, int z, double val); - -// CvStatus *Mat_SetVec2b_Async(Mat self, int row, int col, Vec2b val); -// CvStatus *Mat_SetVec3b_Async(Mat self, int row, int col, Vec3b val); -// CvStatus *Mat_SetVec4b_Async(Mat self, int row, int col, Vec4b val); -// CvStatus *Mat_SetVec2s_Async(Mat self, int row, int col, Vec2s val); -// CvStatus *Mat_SetVec3s_Async(Mat self, int row, int col, Vec3s val); -// CvStatus *Mat_SetVec4s_Async(Mat self, int row, int col, Vec4s val); -// CvStatus *Mat_SetVec2w_Async(Mat self, int row, int col, Vec2w val); -// CvStatus *Mat_SetVec3w_Async(Mat self, int row, int col, Vec3w val); -// CvStatus *Mat_SetVec4w_Async(Mat self, int row, int col, Vec4w val); -// CvStatus *Mat_SetVec2i_Async(Mat self, int row, int col, Vec2i val); -// CvStatus *Mat_SetVec3i_Async(Mat self, int row, int col, Vec3i val); -// CvStatus *Mat_SetVec4i_Async(Mat self, int row, int col, Vec4i val); -// CvStatus *Mat_SetVec6i_Async(Mat self, int row, int col, Vec6i val); -// CvStatus *Mat_SetVec8i_Async(Mat self, int row, int col, Vec8i val); -// CvStatus *Mat_SetVec2f_Async(Mat self, int row, int col, Vec2f val); -// CvStatus *Mat_SetVec3f_Async(Mat self, int row, int col, Vec3f val); -// CvStatus *Mat_SetVec4f_Async(Mat self, int row, int col, Vec4f val); -// CvStatus *Mat_SetVec6f_Async(Mat self, int row, int col, Vec6f val); -// CvStatus *Mat_SetVec2d_Async(Mat self, int row, int col, Vec2d val); -// CvStatus *Mat_SetVec3d_Async(Mat self, int row, int col, Vec3d val); -// CvStatus *Mat_SetVec4d_Async(Mat self, int row, int col, Vec4d val); -// CvStatus *Mat_SetVec6d_Async(Mat self, int row, int col, Vec6d val); - -// #pragma endregion Mat_setter - -#pragma region Mat_operation - -// CvStatus *Mat_AddUChar_Async(Mat self, uint8_t val); -// CvStatus *Mat_SubtractUChar_Async(Mat self, uint8_t val); -// CvStatus *Mat_MultiplyUChar_Async(Mat self, uint8_t val); -// CvStatus *Mat_DivideUChar_Async(Mat self, uint8_t val); - -// CvStatus *Mat_AddSChar_Async(Mat self, int8_t val); -// CvStatus *Mat_SubtractSChar_Async(Mat self, int8_t val); -// CvStatus *Mat_MultiplySChar_Async(Mat self, int8_t val); -// CvStatus *Mat_DivideSChar_Async(Mat self, int8_t val); - -// CvStatus *Mat_AddI32_Async(Mat self, int32_t val); -// CvStatus *Mat_SubtractI32_Async(Mat self, int32_t val); -// CvStatus *Mat_MultiplyI32_Async(Mat self, int32_t val); -// CvStatus *Mat_DivideI32_Async(Mat self, int32_t val); - -// CvStatus *Mat_AddFloat_Async(Mat self, float_t val); -// CvStatus *Mat_SubtractFloat_Async(Mat self, float_t val); -// CvStatus *Mat_MultiplyFloat_Async(Mat self, float_t val); -// CvStatus *Mat_DivideFloat_Async(Mat self, float_t val); - -// CvStatus *Mat_AddF64_Async(Mat self, double_t val); -// CvStatus *Mat_SubtractF64_Async(Mat self, double_t val); -// CvStatus *Mat_MultiplyF64_Async(Mat self, double_t val); -// CvStatus *Mat_DivideF64_Async(Mat self, double_t val); -// CvStatus *Mat_MultiplyMatrix_Async(Mat x, Mat y, CvCallback_1 callback); - -CvStatus *core_PatchNaNs_Async(Mat self, double val, CvCallback_0 callback); -// Deprecated: -// Use Mat::convertTo with CV_16F instead. -// CvStatus *Mat_ConvertFp16_Async(Mat self, CvCallback_1 callback); -CvStatus *core_Mean_Async(Mat self, CvCallback_1 callback); // Scalar *rval -CvStatus *core_MeanWithMask_Async(Mat self, Mat mask, CvCallback_1 callback); // Scalar *rval -CvStatus *core_Sqrt_Async(Mat self, CvCallback_1 callback); -CvStatus *core_AbsDiff_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus *core_Add_Async(Mat src1, Mat src2, Mat mask, int dtype, CvCallback_1 callback); -CvStatus *core_AddWeighted_Async( - Mat src1, double alpha, Mat src2, double beta, double gamma, int dtype, CvCallback_1 callback -); -CvStatus *core_BitwiseAnd_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus *core_BitwiseAndWithMask_Async(Mat src1, Mat src2, Mat mask, CvCallback_1 callback); -CvStatus *core_BitwiseNot_Async(Mat src1, CvCallback_1 callback); -CvStatus *core_BitwiseNotWithMask_Async(Mat src1, Mat mask, CvCallback_1 callback); -CvStatus *core_BitwiseOr_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus *core_BitwiseOrWithMask_Async(Mat src1, Mat src2, Mat mask, CvCallback_1 callback); -CvStatus *core_BitwiseXor_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus *core_BitwiseXorWithMask_Async(Mat src1, Mat src2, Mat mask, CvCallback_1 callback); -CvStatus *core_Compare_Async(Mat src1, Mat src2, int ct, CvCallback_1 callback); -CvStatus *core_BatchDistance_Async( - Mat src1, - Mat src2, - int dtype, - int normType, - int K, - Mat mask, - int update, - bool crosscheck, - CvCallback_2 callback -); // Mat dist,Mat nidx, -CvStatus * -core_BorderInterpolate_Async(int p, int len, int borderType, CvCallback_1 callback); // int *rval -CvStatus *core_CalcCovarMatrix_Async( - Mat samples, Mat mean, int flags, int ctype, CvCallback_1 callback -); // Mat covar -CvStatus *core_CartToPolar_Async( - Mat x, Mat y, bool angleInDegrees, CvCallback_2 callback -); // Mat magnitude, Mat angle -CvStatus *core_CheckRange_Async( - Mat self, bool quiet, double minVal, double maxVal, CvCallback_2 callback -); // bool *rval, Point *pos -CvStatus *core_CompleteSymm_Async(Mat self, bool lowerToUpper, CvCallback_0 callback); -CvStatus *core_ConvertScaleAbs_Async(Mat src, double alpha, double beta, CvCallback_1 callback); -CvStatus *core_CopyMakeBorder_Async( - Mat src, - int top, - int bottom, - int left, - int right, - int borderType, - Scalar value, - CvCallback_1 callback -); -CvStatus *core_CountNonZero_Async(Mat src, CvCallback_1 callback); // int *rval -CvStatus *core_DCT_Async(Mat src, int flags, CvCallback_1 callback); -CvStatus *core_Determinant_Async(Mat self, CvCallback_1 callback); -CvStatus *core_DFT_Async(Mat self, int flags, int nonzeroRows, CvCallback_1 callback); -CvStatus *core_Divide_Async(Mat src1, Mat src2, double scale, int dtype, CvCallback_1 callback); -CvStatus * -core_Eigen_Async(Mat src, CvCallback_3 callback); // Mat eigenvalues, Mat eigenvectors, bool *rval -CvStatus * -core_EigenNonSymmetric_Async(Mat src, CvCallback_2 callback); // Mat eigenvalues, Mat eigenvectors - -CvStatus *core_PCABackProject_Async(Mat src, Mat mean, Mat eigenvectors, CvCallback_1 callback); -CvStatus * -core_PCACompute_3_Async(Mat src, Mat mean, double retainedVariance, CvCallback_1 callback); -CvStatus *core_PCACompute_1_Async(Mat src, Mat mean, int maxComponents, CvCallback_1 callback); -CvStatus * -core_PCACompute_2_Async(Mat src, Mat mean, double retainedVariance, CvCallback_2 callback); -CvStatus *core_PCACompute_Async(Mat src, Mat mean, int maxComponents, CvCallback_2 callback); -CvStatus *core_PCAProject_Async(Mat src, Mat mean, Mat eigenvectors, CvCallback_1 callback); - -CvStatus *core_Exp_Async(Mat src, CvCallback_1 callback); -CvStatus *core_ExtractChannel_Async(Mat src, int coi, CvCallback_1 callback); -CvStatus *core_FindNonZero_Async(Mat src, CvCallback_1 callback); -CvStatus *core_Flip_Async(Mat src, int flipCode, CvCallback_1 callback); -CvStatus *core_Gemm_Async( - Mat src1, Mat src2, double alpha, Mat src3, double beta, int flags, CvCallback_1 callback -); -CvStatus *core_GetOptimalDFTSize_Async(int vecsize, CvCallback_1 callback); -CvStatus *core_Hconcat_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus *core_Vconcat_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus *core_Idct_Async(Mat src, int flags, CvCallback_1 callback); -CvStatus *core_Idft_Async(Mat src, int flags, int nonzeroRows, CvCallback_1 callback); -CvStatus *core_InRange_Async(Mat src, Mat lowerb, Mat upperb, CvCallback_1 callback); -CvStatus *core_InRangeWithScalar_Async( - Mat src, const Scalar lowerb, const Scalar upperb, CvCallback_1 callback -); -CvStatus *core_InsertChannel_Async(Mat src, Mat dst, int coi, CvCallback_0 callback); -CvStatus *core_Invert_Async(Mat src, int flags, CvCallback_2 callback); -CvStatus *core_Log_Async(Mat src, CvCallback_1 callback); -CvStatus *core_Magnitude_Async(Mat x, Mat y, CvCallback_1 callback); -CvStatus *core_Max_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus *core_MeanStdDev_Async(Mat src, CvCallback_2 callback); // Scalar *dstMean, Scalar - // *dstStdDev -CvStatus *core_MeanStdDevWithMask_Async( - Mat src, Mat mask, CvCallback_2 callback -); // Scalar *dstMean, Scalar *dstStdDev -CvStatus *core_Merge_Async(VecMat mats, CvCallback_1 callback); -CvStatus *core_Min_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus *core_MinMaxIdx_Async( - Mat self, CvCallback_4 callback -); // double *minVal, double *maxVal, int *minIdx, int *maxIdx -CvStatus *core_MinMaxIdx_Mask_Async(Mat self, Mat mask, CvCallback_4 callback); -CvStatus *core_MinMaxLoc_Async( - Mat self, CvCallback_4 callback -); // double *minVal, double *maxVal, Point *minLoc, Point *maxLoc -CvStatus *core_MinMaxLoc_Mask_Async(Mat self, Mat mask, CvCallback_4 callback); -CvStatus *core_MixChannels_Async(VecMat src, VecMat dst, VecI32 fromTo, CvCallback_0 callback); -CvStatus *core_MulSpectrums_Async(Mat a, Mat b, int flags, bool conjB, CvCallback_1 callback); -CvStatus *core_Multiply_Async(Mat src1, Mat src2, CvCallback_1 callback); -CvStatus * -core_MultiplyWithParams_Async(Mat src1, Mat src2, double scale, int dtype, CvCallback_1 callback); -CvStatus * -core_Normalize_Async(Mat src, Mat dst, double alpha, double beta, int typ, int dtype, CvCallback_0 callback); -CvStatus *core_Normalize_Mask_Async( - Mat src, Mat dst, double alpha, double beta, int typ, int dtype, Mat mask, CvCallback_0 callback -); -CvStatus *core_PerspectiveTransform_Async(Mat src, Mat tm, CvCallback_1 callback); -CvStatus * -core_Solve_Async(Mat src1, Mat src2, int flags, CvCallback_2 callback); // bool *rval, Mat dst -CvStatus *core_SolveCubic_Async(Mat coeffs, CvCallback_2 callback); // int *rval, Mat roots -CvStatus * -core_SolvePoly_Async(Mat coeffs, int maxIters, CvCallback_2 callback); // double *rval, Mat roots -CvStatus *core_Reduce_Async(Mat src, int dim, int rType, int dType, CvCallback_1 callback); -CvStatus *core_ReduceArgMax_Async(Mat src, int axis, bool lastIndex, CvCallback_1 callback); -CvStatus *core_ReduceArgMin_Async(Mat src, int axis, bool lastIndex, CvCallback_1 callback); -CvStatus *core_Repeat_Async(Mat src, int nY, int nX, CvCallback_1 callback); -CvStatus *core_ScaleAdd_Async(Mat src1, double alpha, Mat src2, CvCallback_1 callback); -CvStatus *core_SetIdentity_Async(Mat src, Scalar scalar, CvCallback_0 callback); -CvStatus *core_Sort_Async(Mat src, int flags, CvCallback_1 callback); -CvStatus *core_SortIdx_Async(Mat src, int flags, CvCallback_1 callback); -CvStatus *core_Split_Async(Mat src, CvCallback_1 callback); // VecMat *rval -CvStatus *core_Subtract_Async(Mat src1, Mat src2, Mat mask, int dtype, CvCallback_1 callback); -CvStatus *core_T_Async(Mat x, CvCallback_1 callback); -CvStatus *core_Trace_Async(Mat src, CvCallback_1 callback); -CvStatus *core_Transform_Async(Mat src, Mat tm, CvCallback_1 callback); -CvStatus *core_Transpose_Async(Mat src, CvCallback_1 callback); -CvStatus *core_PolarToCart_Async( - Mat magnitude, Mat degree, bool angleInDegrees, CvCallback_2 callback -); // Mat x, Mat y -CvStatus *core_Pow_Async(Mat src, double power, CvCallback_1 callback); -CvStatus *core_Phase_Async(Mat x, Mat y, bool angleInDegrees, CvCallback_1 callback); // Mat angle -CvStatus *core_Sum_Async(Mat src, CvCallback_1 callback); -CvStatus *core_rowRange_Async(Mat self, int start, int end, CvCallback_1 callback); -CvStatus *core_colRange_Async(Mat self, int start, int end, CvCallback_1 callback); - -CvStatus *core_LUT_Async(Mat src, Mat lut, CvCallback_1 callback); -CvStatus *core_KMeans_Async( - Mat data, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - CvCallback_2 callback -); // double *rval, Mat centers -CvStatus *core_KMeans_Points_Async( - VecPoint2f pts, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - CvCallback_2 callback -); // double *rval, Mat centers -CvStatus *core_Rotate_Async(Mat src, int rotateCode, CvCallback_1 callback); -CvStatus *core_Norm_Async(Mat src1, int normType, CvCallback_1 callback); -CvStatus *core_Norm_Mask_Async(Mat src1, int normType, Mat mask, CvCallback_1 callback); -CvStatus *core_NormWithMats_Async(Mat src1, Mat src2, int normType, CvCallback_1 callback); -#pragma endregion - -#pragma region RNG - -CvStatus *Rng_New_Async(CvCallback_1 callback); -CvStatus *Rng_NewWithState_Async(uint64_t state, CvCallback_1 callback); -CvStatus *RNG_Fill_Async(RNG rng, Mat mat, int distType, double a, double b, bool saturateRange, CvCallback_0 callback); -CvStatus *RNG_Gaussian_Async(RNG rng, double sigma, CvCallback_1 callback); -CvStatus *RNG_Uniform_Async(RNG rng, int a, int b, CvCallback_1 callback); -CvStatus *RNG_UniformDouble_Async(RNG rng, double a, double b, CvCallback_1 callback); -CvStatus *RNG_Next_Async(RNG rng, CvCallback_1 callback); // uint32_t *rval - -CvStatus *RandN_Async(Mat mat, Scalar mean, Scalar stddev, CvCallback_0 callback); -CvStatus *RandShuffle_Async(Mat mat, CvCallback_0 callback); -CvStatus *RandShuffleWithParams_Async(Mat mat, double iterFactor, RNG rng, CvCallback_0 callback); -CvStatus *RandU_Async(Mat mat, Scalar low, Scalar high, CvCallback_0 callback); -#pragma endregion - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/core/exception.cpp b/src/core/exception.cpp deleted file mode 100644 index 8424ebc2..00000000 --- a/src/core/exception.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "exception.h" - -int ErrorCallbackProxy(int status, const char *func_name, const char *err_msg, const char *file_name, int line, void *callback) -{ - ((ErrorCallback)callback)(status, func_name, err_msg, file_name, line, nullptr); - return status; -} - -void registerErrorCallback(ErrorCallback callback) -{ - cv::redirectError(ErrorCallbackProxy, (void *)callback); -} diff --git a/src/core/exception.h b/src/core/exception.h deleted file mode 100644 index 1e4183e6..00000000 --- a/src/core/exception.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef OPENCV_DART_LIBRARY_EXCEPTION_H -#define OPENCV_DART_LIBRARY_EXCEPTION_H - -#include "core.h" - -#ifdef __cplusplus -#include -extern "C" -{ -#endif - - typedef void (*ErrorCallback)(int status, const char *func_name, - const char *err_msg, const char *file_name, - int line, void *userdata); - - void registerErrorCallback(ErrorCallback callback); - -#ifdef __cplusplus -} -#endif - -#endif // OPENCV_DART_LIBRARY_EXCEPTION_H diff --git a/src/core/logging.cpp b/src/core/logging.cpp deleted file mode 100644 index 0caf2c45..00000000 --- a/src/core/logging.cpp +++ /dev/null @@ -1,15 +0,0 @@ -/* Created by Abdelaziz Mahdy. Licensed: Apache 2.0 license. Copyright (c) 2024 Abdelaziz Mahdy. */ -#include "logging.h" -#include - -CvStatus *setLogLevel(int logLevel) { - BEGIN_WRAP - cv::utils::logging::setLogLevel(static_cast(logLevel)); - END_WRAP -} - -CvStatus *getLogLevel(int *logLevel) { - BEGIN_WRAP - *logLevel = static_cast(cv::utils::logging::getLogLevel()); - END_WRAP -} diff --git a/src/core/logging.h b/src/core/logging.h deleted file mode 100644 index 3a493f62..00000000 --- a/src/core/logging.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Created by Abdelaziz Mahdy. Licensed: Apache 2.0 license. Copyright (c) 2024 Abdelaziz Mahdy. */ -#pragma once -#ifndef _OPENCV3_LOGGING_H_ -#define _OPENCV3_LOGGING_H_ - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "core/types.h" - -CvStatus *setLogLevel(int logLevel); -CvStatus *getLogLevel(int *logLevel); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_LOGGING_H_ diff --git a/src/core/lut.hpp b/src/core/lut.hpp deleted file mode 100644 index 21494a28..00000000 --- a/src/core/lut.hpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include - -namespace cvd -{ -#define LUT_BODY \ - if (lutcn == 1) { \ - for (int i = 0; i < len * cn; i++) \ - dst[i] = lut[src[i]]; \ - } else { \ - for (int i = 0; i < len * cn; i += cn) \ - for (int k = 0; k < cn; k++) \ - dst[i + k] = lut[src[i + k] * cn + k]; \ - } - -// NOTE: opencv doesn't support LUT from CV_8U or CV_8S to CV_16F now -static void LUT8u_16f(const uchar *src, const cv::hfloat *lut, cv::hfloat *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT8s_16f(const char *src, const cv::hfloat *lut, cv::hfloat *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -// 16u -static void LUT16u_8u(const ushort *src, const uchar *lut, uchar *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} -static void LUT16u_8s(const ushort *src, const char *lut, char *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} -static void LUT16u_16u(const ushort *src, const ushort *lut, ushort *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT16u_16s(const ushort *src, const short *lut, short *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT16u_32s(const ushort *src, const int *lut, int *dst, int len, int cn, int lutcn) { LUT_BODY } - -static void LUT16u_32f(const ushort *src, const float *lut, float *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT16u_64f(const ushort *src, const double *lut, double *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT16u_16f(const ushort *src, const cv::hfloat *lut, cv::hfloat *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -// 16s -static void LUT16s_8u(const short *src, const uchar *lut, uchar *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} -static void LUT16s_8s(const short *src, const char *lut, char *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} -static void LUT16s_16u(const short *src, const ushort *lut, ushort *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT16s_16s(const short *src, const short *lut, short *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT16s_32s(const short *src, const int *lut, int *dst, int len, int cn, int lutcn) { LUT_BODY } - -static void LUT16s_32f(const short *src, const float *lut, float *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT16s_64f(const short *src, const double *lut, double *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -static void LUT16s_16f(const short *src, const cv::hfloat *lut, cv::hfloat *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -// 32s -static void LUT32s_32s(const int *src, const int *lut, int *dst, int len, int cn, int lutcn) { LUT_BODY } - -static void LUT32s_32f(const int *src, const float *lut, float *dst, int len, int cn, int lutcn) { LUT_BODY } - -static void LUT32s_64f(const int *src, const double *lut, double *dst, int len, int cn, int lutcn) -{ - LUT_BODY -} - -} // namespace cvd diff --git a/src/core/svd.cpp b/src/core/svd.cpp deleted file mode 100644 index b101affb..00000000 --- a/src/core/svd.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "svd.h" - -CvStatus *SVD_Compute(Mat src, Mat *w, Mat *u, Mat *vt, int flags) { - BEGIN_WRAP - cv::Mat _w, _u, _vt; - cv::SVD::compute(*src.ptr, _w, _u, _vt, flags); - *w = {new cv::Mat(_w)}; - *u = {new cv::Mat(_u)}; - *vt = {new cv::Mat(_vt)}; - END_WRAP -} - -CvStatus *SVD_backSubst(Mat w, Mat u, Mat vt, Mat rhs, Mat *dst) { - BEGIN_WRAP - cv::Mat _dst; - cv::SVD::backSubst(*w.ptr, *u.ptr, *vt.ptr, *rhs.ptr, _dst); - *dst = {new cv::Mat(_dst)}; - END_WRAP -} diff --git a/src/core/svd.h b/src/core/svd.h deleted file mode 100644 index 76129742..00000000 --- a/src/core/svd.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef _OPENCV3_SVD_H_ -#define _OPENCV3_SVD_H_ - -#ifdef __cplusplus -#include - -extern "C" { -#endif - -#include "core.h" - -CvStatus *SVD_Compute(Mat src, Mat *w, Mat *u, Mat *vt, int flags); -CvStatus *SVD_backSubst(Mat w, Mat u, Mat vt, Mat rhs, Mat *dst); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_SVD_H diff --git a/src/core/svd_async.cpp b/src/core/svd_async.cpp deleted file mode 100644 index 1b7733fa..00000000 --- a/src/core/svd_async.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "svd_async.h" -#include "core/types.h" - -CvStatus *SVD_Compute_Async(Mat src, int flags, CvCallback_3 callback) { - BEGIN_WRAP - cv::Mat w, u, vt; - cv::SVD::compute(*src.ptr, w, u, vt, flags); - callback(new Mat{new cv::Mat(w)}, new Mat{new cv::Mat(u)}, new Mat{new cv::Mat(vt)}); - END_WRAP -} -CvStatus *SVD_backSubst_Async(Mat w, Mat u, Mat vt, Mat rhs, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::SVD::backSubst(*w.ptr, *u.ptr, *vt.ptr, *rhs.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} diff --git a/src/core/svd_async.h b/src/core/svd_async.h deleted file mode 100644 index 38422bfe..00000000 --- a/src/core/svd_async.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef CVD_SVD_ASYNC_H_ -#define CVD_SVD_ASYNC_H_ - -#ifdef __cplusplus -#include - -extern "C" { -#endif - -#include "types.h" - -CvStatus *SVD_Compute_Async(Mat src, int flags, CvCallback_3 callback); -CvStatus *SVD_backSubst_Async(Mat w, Mat u, Mat vt, Mat rhs, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_SVD_ASYNC_H_ diff --git a/src/core/types.h b/src/core/types.h deleted file mode 100644 index e8525edd..00000000 --- a/src/core/types.h +++ /dev/null @@ -1,460 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef CVD_CORE_TYPES_H_ -#define CVD_CORE_TYPES_H_ - -#include -#include -#include -#include - -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -#define CVD_OUT - -#define BEGIN_WRAP try { -#define END_WRAP \ - CvStatus *s = new CvStatus{ \ - .code = 0, \ - .msg = strdup("success"), \ - .err = strdup(""), \ - .func = strdup(__FUNCTION__), \ - .file = strdup(__FILE__), \ - .line = __LINE__, \ - }; \ - return s; \ - } \ - catch (cv::Exception & e) { \ - CvStatus *s = new CvStatus{ \ - .code = e.code, \ - .msg = strdup(e.msg.c_str()), \ - .err = strdup(e.err.c_str()), \ - .func = strdup(e.func.c_str()), \ - .file = strdup(e.file.c_str()), \ - .line = e.line, \ - }; \ - return s; \ - } \ - catch (std::exception & e) { \ - CvStatus *s = new CvStatus{ \ - .code = 1, \ - .msg = strdup(e.what()), \ - .err = strdup(e.what()), \ - .func = strdup(__FUNCTION__), \ - .file = strdup(__FILE__), \ - .line = __LINE__, \ - }; \ - return s; \ - } \ - catch (...) { \ - CvStatus *s = new CvStatus{ \ - .code = 1, \ - .msg = strdup("Unknown error"), \ - .err = strdup("Unknown error"), \ - .func = strdup(__FUNCTION__), \ - .file = strdup(__FILE__), \ - .line = __LINE__, \ - }; \ - return s; \ - } - -#define CVD_TYPECAST_C(value) reinterpret_cast(value) -#define CVD_CALLBACK_DEF(value) typedef void (*value##Callback)(value *) - -#define CVD_TYPEDEF_VEC(TYPE, NAME) \ - typedef struct NAME { \ - TYPE *ptr; \ - size_t length; \ - } NAME; \ - typedef NAME *NAME##Ptr; - -#ifdef __cplusplus -#define CVD_TYPECAST_CPP(TYPE, value) reinterpret_cast(value->ptr) -// for test, value should not be freed here -#ifdef CVD_ENABLE_TEST -#define CVD_FREE(value) \ - delete value->ptr; \ - value->ptr = nullptr; -#else -// for dart ffi, value should be freed here or a memory leak will occur -#define CVD_FREE(value) \ - delete value->ptr; \ - value->ptr = nullptr; \ - delete value; \ - value = nullptr; -#endif - -#define CVD_TYPEDEF(TYPE, NAME) \ - typedef TYPE *NAME##_CPP; \ - typedef struct NAME { \ - TYPE *ptr; \ - } NAME; \ - typedef NAME *NAME##Ptr; \ - // CVD_CALLBACK_DEF(NAME) - -CVD_TYPEDEF(cv::Mat, Mat); -CVD_TYPEDEF(cv::_InputOutputArray, InputOutputArray); -CVD_TYPEDEF(cv::RNG, RNG); -#else -#define CVD_TYPEDEF(TYPE, NAME) \ - typedef struct NAME { \ - TYPE *ptr; \ - } NAME; \ - typedef NAME *NAME##Ptr; \ - // CVD_CALLBACK_DEF(NAME) - -typedef unsigned char uchar; -typedef unsigned short ushort; - -CVD_TYPEDEF(void, Mat); -CVD_TYPEDEF(void, InputOutputArray); -CVD_TYPEDEF(void, RNG); -#endif - -// Wrapper for an individual cv::cvPoint -typedef struct Point { - int x; - int y; -} Point; - -// Wrapper for an individual cv::Point2f -typedef struct Point2f { - float x; - float y; -} Point2f; - -typedef struct Point3f { - float x; - float y; - float z; -} Point3f; - -typedef struct Point3i { - int x; - int y; - int z; -} Point3i; - -// Wrapper for an individual cv::cvRect -typedef struct Rect { - int x; - int y; - int width; - int height; -} Rect; - -typedef struct Rect2f { - float x; - float y; - float width; - float height; -} Rect2f; - -// Wrapper for an individual cv::cvSize -typedef struct Size { - int width; - int height; -} Size; - -typedef struct Size2f { - float width; - float height; -} Size2f; - -// Wrapper for an individual cv::RotatedRect -typedef struct RotatedRect { - Point2f center; - Size2f size; - double angle; -} RotatedRect; - -// Wrapper for an individual cv::cvScalar -typedef struct Scalar { - double val1; - double val2; - double val3; - double val4; -} Scalar; - -// Wrapper for a individual cv::KeyPoint -typedef struct KeyPoint { - float x; - float y; - float size; - float angle; - float response; - int octave; - int classID; -} KeyPoint; - -// Wrapper for an individual cv::DMatch -typedef struct DMatch { - int queryIdx; - int trainIdx; - int imgIdx; - float distance; -} DMatch; - -// Wrapper for an individual cv::Moment -typedef struct Moment { - double m00; - double m10; - double m01; - double m20; - double m11; - double m02; - double m30; - double m21; - double m12; - double m03; - - double mu20; - double mu11; - double mu02; - double mu30; - double mu21; - double mu12; - double mu03; - - double nu20; - double nu11; - double nu02; - double nu30; - double nu21; - double nu12; - double nu03; -} Moment; - -typedef struct CvStatus { - int code; - char *msg; - char *err; - char *func; - char *file; - int line; -} CvStatus; - -typedef struct Vec2b { - uchar val1; - uchar val2; -} Vec2b; - -typedef struct Vec3b { - uchar val1; - uchar val2; - uchar val3; -} Vec3b; - -typedef struct Vec4b { - uchar val1; - uchar val2; - uchar val3; - uchar val4; -} Vec4b; - -typedef struct Vec2s { - short val1; - short val2; -} Vec2s; -typedef struct Vec3s { - short val1; - short val2; - short val3; -} Vec3s; - -typedef struct Vec4s { - short val1; - short val2; - short val3; - short val4; -} Vec4s; - -typedef struct Vec2w { - ushort val1; - ushort val2; -} Vec2w; - -typedef struct Vec3w { - ushort val1; - ushort val2; - ushort val3; -} Vec3w; - -typedef struct Vec4w { - ushort val1; - ushort val2; - ushort val3; - ushort val4; -} Vec4w; - -typedef struct Vec2i { - int val1; - int val2; -} Vec2i; -typedef struct Vec3i { - int val1; - int val2; - int val3; -} Vec3i; - -typedef struct Vec4i { - int val1; - int val2; - int val3; - int val4; -} Vec4i; -typedef struct Vec6i { - int val1; - int val2; - int val3; - int val4; - int val5; - int val6; -} Vec6i; - -typedef struct Vec8i { - int val1; - int val2; - int val3; - int val4; - int val5; - int val6; - int val7; - int val8; -} Vec8i; - -typedef struct Vec2f { - float val1; - float val2; -} Vec2f; - -typedef struct Vec3f { - float val1; - float val2; - float val3; -} Vec3f; - -typedef struct Vec4f { - float val1; - float val2; - float val3; - float val4; -} Vec4f; - -typedef struct Vec6f { - float val1; - float val2; - float val3; - float val4; - float val5; - float val6; -} Vec6f; - -typedef struct Vec2d { - double val1; - double val2; -} Vec2d; - -typedef struct Vec3d { - double val1; - double val2; - double val3; -} Vec3d; - -typedef struct Vec4d { - double val1; - double val2; - double val3; - double val4; -} Vec4d; - -typedef struct Vec6d { - double val1; - double val2; - double val3; - double val4; - double val5; - double val6; -} Vec6d; - -typedef struct TermCriteria { - int type; - int maxCount; - double epsilon; -} TermCriteria; - -typedef union Cv32suf_C { - int i; - unsigned u; - float f; -} Cv32suf_C; - -typedef union Cv16suf_C { - short i; - ushort u; -} Cv16suf_C; - -typedef struct MatStep { - size_t p[3]; -} MatStep; - -typedef void (*CvCallback_0)(); -typedef void (*CvCallback_1)(void *); -typedef void (*CvCallback_2)(void *, void *); -typedef void (*CvCallback_3)(void *, void *, void *); -typedef void (*CvCallback_4)(void *, void *, void *, void *); -typedef void (*CvCallback_5)(void *, void *, void *, void *, void *); -typedef void (*CvCallback_6)(void *, void *, void *, void *, void *, void *); -typedef void (*CvCallback_7)(void *, void *, void *, void *, void *, void *, void *); -typedef void (*CvCallback_8)(void *, void *, void *, void *, void *, void *, void *, void *); -typedef void (*CvCallback_9)(void *, void *, void *, void *, void *, void *, void *, void *, void *); - -CVD_TYPEDEF_VEC(uchar, VecUChar); -CVD_TYPEDEF_VEC(char, VecChar); -CVD_TYPEDEF_VEC(uint8_t, VecU8); -CVD_TYPEDEF_VEC(int8_t, VecI8); -CVD_TYPEDEF_VEC(uint16_t, VecU16); -CVD_TYPEDEF_VEC(int16_t, VecI16); -CVD_TYPEDEF_VEC(int32_t, VecI32); -CVD_TYPEDEF_VEC(float_t, VecF32); -CVD_TYPEDEF_VEC(double_t, VecF64); -CVD_TYPEDEF_VEC(uint16_t, VecF16); -CVD_TYPEDEF_VEC(VecChar, VecVecChar); -CVD_TYPEDEF_VEC(Mat, VecMat); -CVD_TYPEDEF_VEC(Point, VecPoint); -CVD_TYPEDEF_VEC(Point2f, VecPoint2f); -CVD_TYPEDEF_VEC(Point3f, VecPoint3f); -CVD_TYPEDEF_VEC(Point3i, VecPoint3i); -CVD_TYPEDEF_VEC(VecPoint, VecVecPoint); -CVD_TYPEDEF_VEC(VecPoint2f, VecVecPoint2f); -CVD_TYPEDEF_VEC(VecPoint3f, VecVecPoint3f); -CVD_TYPEDEF_VEC(VecPoint3i, VecVecPoint3i); -CVD_TYPEDEF_VEC(Rect, VecRect); -CVD_TYPEDEF_VEC(RotatedRect, VecRotatedRect); -CVD_TYPEDEF_VEC(KeyPoint, VecKeyPoint); -CVD_TYPEDEF_VEC(DMatch, VecDMatch); -CVD_TYPEDEF_VEC(VecDMatch, VecVecDMatch); -CVD_TYPEDEF_VEC(Vec4i, VecVec4i); -CVD_TYPEDEF_VEC(Vec4f, VecVec4f); -CVD_TYPEDEF_VEC(Vec6f, VecVec6f); - -// Contour is alias for Points -typedef VecPoint Contour; -typedef VecPoint2f Contour2f; -typedef VecPoint3f Contour3f; -typedef VecVecPoint Contours; -typedef VecVecPoint2f Contours2f; -typedef VecVecPoint3f Contours3f; - -#ifdef __cplusplus -} -#endif - -#endif // CVD_CORE_TYPES_H_ diff --git a/src/core/vec.hpp b/src/core/vec.hpp deleted file mode 100644 index 3e203759..00000000 --- a/src/core/vec.hpp +++ /dev/null @@ -1,537 +0,0 @@ -#ifndef CVD_VEC_UTILS_H -#define CVD_VEC_UTILS_H - -#include "types.h" -#include - -inline std::vector vecpoint_c2cpp(VecPoint v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - Point p = v.ptr[i]; - rv[i] = cv::Point(p.x, p.y); - } - return rv; -} - -inline VecPoint vecpoint_cpp2c(std::vector v) { - Point *ptr = new Point[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = Point{v[i].x, v[i].y}; } - return VecPoint{.ptr = ptr, .length = v.size()}; -} - -inline VecPoint *vecpoint_cpp2c_p(std::vector v) { - Point *ptr = new Point[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = Point{v[i].x, v[i].y}; } - return new VecPoint{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecpoint2f_c2cpp(VecPoint2f v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - Point2f p = v.ptr[i]; - rv[i] = cv::Point2f(p.x, p.y); - } - return rv; -} - -inline VecPoint2f vecpoint2f_cpp2c(std::vector v) { - Point2f *ptr = new Point2f[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = Point2f{v[i].x, v[i].y}; } - return VecPoint2f{.ptr = ptr, .length = v.size()}; -} - -inline void vecpoint2f_cpp2c(std::vector v, VecPoint2f *vv) { - if (vv->length != v.size()) { - vv->ptr = (Point2f *)realloc(vv->ptr, v.size() * sizeof(Point2f)); - vv->length = v.size(); - } - for (int i = 0; i < v.size(); i++) { vv->ptr[i] = Point2f{v[i].x, v[i].y}; } -} - -inline VecPoint2f *vecpoint2f_cpp2c_p(std::vector v) { - Point2f *ptr = new Point2f[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = Point2f{v[i].x, v[i].y}; } - return new VecPoint2f{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecpoint3f_c2cpp(VecPoint3f v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - Point3f p = v.ptr[i]; - rv[i] = cv::Point3f(p.x, p.y, p.z); - } - return rv; -} - -inline VecPoint3f vecpoint3f_cpp2c(std::vector v) { - Point3f *ptr = new Point3f[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = Point3f{v[i].x, v[i].y, v[i].z}; } - return VecPoint3f{.ptr = ptr, .length = v.size()}; -} - -inline VecPoint3f *vecpoint3f_cpp2c_p(std::vector v) { - Point3f *ptr = new Point3f[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = Point3f{v[i].x, v[i].y, v[i].z}; } - return new VecPoint3f{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecpoint3i_c2cpp(VecPoint3i v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - Point3i p = v.ptr[i]; - rv[i] = cv::Point3i(p.x, p.y, p.z); - } - return rv; -} - -inline VecPoint3i vecpoint3i_cpp2c(std::vector v) { - Point3i *ptr = new Point3i[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = Point3i{v[i].x, v[i].y, v[i].z}; } - return VecPoint3i{.ptr = ptr, .length = v.size()}; -} - -inline VecPoint3i *vecpoint3i_cpp2c_p(std::vector v) { - Point3i *ptr = new Point3i[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = Point3i{v[i].x, v[i].y, v[i].z}; } - return new VecPoint3i{.ptr = ptr, .length = v.size()}; -} - -inline std::vector> vecvecpoint_c2cpp(VecVecPoint v) { - std::vector> rv(v.length); - for (int i = 0; i < v.length; i++) { - VecPoint vp = v.ptr[i]; - std::vector pts = vecpoint_c2cpp(vp); - rv[i] = pts; - } - return rv; -} - -inline VecVecPoint vecvecpoint_cpp2c(std::vector> v) { - VecPoint *ptr = new VecPoint[v.size()]; - for (int i = 0; i < v.size(); i++) { - VecPoint vp = vecpoint_cpp2c(v[i]); - ptr[i] = vp; - } - return VecVecPoint{.ptr = ptr, .length = v.size()}; -} - -inline VecVecPoint *vecvecpoint_cpp2c_p(std::vector> v) { - VecPoint *ptr = new VecPoint[v.size()]; - for (int i = 0; i < v.size(); i++) { - VecPoint vp = vecpoint_cpp2c(v[i]); - ptr[i] = vp; - } - return new VecVecPoint{.ptr = ptr, .length = v.size()}; -} - -inline std::vector> vecvecpoint2f_c2cpp(VecVecPoint2f v) { - std::vector> rv(v.length); - for (int i = 0; i < v.length; i++) { - VecPoint2f vp = v.ptr[i]; - std::vector pts = vecpoint2f_c2cpp(vp); - rv[i] = pts; - } - return rv; -} - -inline VecVecPoint2f vecvecpoint2f_cpp2c(std::vector> v) { - VecPoint2f *ptr = new VecPoint2f[v.size()]; - for (int i = 0; i < v.size(); i++) { - VecPoint2f vp = vecpoint2f_cpp2c(v[i]); - ptr[i] = vp; - } - return VecVecPoint2f{.ptr = ptr, .length = v.size()}; -} - -inline VecVecPoint2f *vecvecpoint2f_cpp2c_p(std::vector> v) { - VecPoint2f *ptr = new VecPoint2f[v.size()]; - for (int i = 0; i < v.size(); i++) { - VecPoint2f vp = vecpoint2f_cpp2c(v[i]); - ptr[i] = vp; - } - return new VecVecPoint2f{.ptr = ptr, .length = v.size()}; -} - -inline std::vector> vecvecpoint3f_c2cpp(VecVecPoint3f v) { - std::vector> rv(v.length); - for (int i = 0; i < v.length; i++) { - VecPoint3f vp = v.ptr[i]; - std::vector pts = vecpoint3f_c2cpp(vp); - rv[i] = pts; - } - return rv; -} - -inline VecVecPoint3f vecvecpoint3f_cpp2c(std::vector> v) { - VecPoint3f *ptr = new VecPoint3f[v.size()]; - for (int i = 0; i < v.size(); i++) { - VecPoint3f vp = vecpoint3f_cpp2c(v[i]); - ptr[i] = vp; - } - return VecVecPoint3f{.ptr = ptr, .length = v.size()}; -} - -inline VecVecPoint3f *vecvecpoint3f_cpp2c_p(std::vector> v) { - VecPoint3f *ptr = new VecPoint3f[v.size()]; - for (int i = 0; i < v.size(); i++) { - VecPoint3f vp = vecpoint3f_cpp2c(v[i]); - ptr[i] = vp; - } - return new VecVecPoint3f{.ptr = ptr, .length = v.size()}; -} - -inline std::vector> vecvecpoint3i_c2cpp(VecVecPoint3i v) { - std::vector> rv(v.length); - for (int i = 0; i < v.length; i++) { - VecPoint3i vp = v.ptr[i]; - std::vector pts = vecpoint3i_c2cpp(vp); - rv[i] = pts; - } - return rv; -} - -inline VecVecPoint3i vecvecpoint3i_cpp2c(std::vector> v) { - VecPoint3i *ptr = new VecPoint3i[v.size()]; - for (int i = 0; i < v.size(); i++) { - VecPoint3i vp = vecpoint3i_cpp2c(v[i]); - ptr[i] = vp; - } - return VecVecPoint3i{.ptr = ptr, .length = v.size()}; -} - -inline VecVecPoint3i *vecvecpoint3i_cpp2c_p(std::vector> v) { - VecPoint3i *ptr = new VecPoint3i[v.size()]; - for (int i = 0; i < v.size(); i++) { - VecPoint3i vp = vecpoint3i_cpp2c(v[i]); - ptr[i] = vp; - } - return new VecVecPoint3i{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecmat_c2cpp(VecMat v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - Mat m = v.ptr[i]; - rv[i] = *m.ptr; - } - return rv; -} - -inline VecMat vecmat_cpp2c(std::vector v) { - Mat *ptr = new Mat[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = {new cv::Mat(v[i])}; } - return VecMat{.ptr = ptr, .length = v.size()}; -} - -inline VecMat *vecmat_cpp2c_p(std::vector v) { - Mat *ptr = new Mat[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = {new cv::Mat(v[i])}; } - return new VecMat{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecchar_c2cpp(VecChar v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { rv[i] = v.ptr[i]; } - return rv; -} - -inline std::string vecchar_c2cpp_s(VecChar v) { return std::string(v.ptr, v.length); } - -inline VecChar vecchar_cpp2c(std::vector v) { - char *ptr = new char[v.size()]; - std::copy(v.begin(), v.end(), ptr); - // for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return VecChar{.ptr = ptr, .length = v.size()}; -} - -inline VecChar *vecchar_cpp2c_p(std::vector v) { - char *ptr = new char[v.size()]; - std::copy(v.begin(), v.end(), ptr); - // for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return new VecChar{.ptr = ptr, .length = v.size()}; -} - -inline VecChar vecchar_cpp2c_s(std::string v) { - char *ptr = new char[v.size()]; - std::copy(v.begin(), v.end(), ptr); - // for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return VecChar{.ptr = ptr, .length = v.size()}; -} - -inline VecChar *vecchar_cpp2c_s_p(std::string v) { - char *ptr = new char[v.size()]; - std::copy(v.begin(), v.end(), ptr); - // for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return new VecChar{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecuchar_c2cpp(VecUChar v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { rv[i] = v.ptr[i]; } - return rv; -} -inline VecUChar vecuchar_cpp2c(std::vector v) { - uchar *ptr = new uchar[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return VecUChar{.ptr = ptr, .length = v.size()}; -} - -inline VecUChar *vecuchar_cpp2c_p(std::vector v) { - uchar *ptr = new uchar[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return new VecUChar{.ptr = ptr, .length = v.size()}; -} - -inline std::vector> vecvecchar_c2cpp(VecVecChar v) { - std::vector> rv(v.length); - for (int i = 0; i < v.length; i++) { - VecChar vc = v.ptr[i]; - std::vector pts = vecchar_c2cpp(vc); - rv[i] = pts; - } - return rv; -} - -inline std::vector vecvecchar_c2cpp_s(VecVecChar v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { rv[i] = vecchar_c2cpp_s(v.ptr[i]); } - return rv; -} - -inline VecVecChar vecvecchar_cpp2c(std::vector> v) { - VecChar *ptr = new VecChar[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = vecchar_cpp2c(v[i]); } - return VecVecChar{.ptr = ptr, .length = v.size()}; -} - -inline VecVecChar *vecvecchar_cpp2c_p(std::vector> v) { - VecChar *ptr = new VecChar[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = vecchar_cpp2c(v[i]); } - return new VecVecChar{.ptr = ptr, .length = v.size()}; -} - -inline VecVecChar vecvecchar_cpp2c_s(std::vector v) { - VecChar *ptr = new VecChar[v.size()]; - for (size_t i = 0; i < v.size(); i++) { ptr[i] = vecchar_cpp2c_s(v[i]); } - return VecVecChar{.ptr = ptr, .length = v.size()}; -} - -inline VecVecChar *vecvecchar_cpp2c_s_p(std::vector v) { - VecChar *ptr = new VecChar[v.size()]; - for (size_t i = 0; i < v.size(); i++) { ptr[i] = vecchar_cpp2c_s(v[i]); } - return new VecVecChar{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecint_c2cpp(VecI32 v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { rv[i] = v.ptr[i]; } - return rv; -} -inline VecI32 vecint_cpp2c(std::vector v) { - int *ptr = new int[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return VecI32{.ptr = ptr, .length = v.size()}; -} - -inline VecI32 *vecint_cpp2c_p(std::vector v) { - int *ptr = new int[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return new VecI32{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecfloat_c2cpp(VecF32 v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { rv[i] = v.ptr[i]; } - return rv; -} - -inline VecF32 vecfloat_cpp2c(std::vector v) { - float *ptr = new float[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return VecF32{.ptr = ptr, .length = v.size()}; -} - -inline VecF32 *vecfloat_cpp2c_p(std::vector v) { - float *ptr = new float[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return new VecF32{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecdouble_c2cpp(VecF64 v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { rv[i] = v.ptr[i]; } - return rv; -} - -inline VecF64 vecdouble_cpp2c(std::vector v) { - double *ptr = new double[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return VecF64{.ptr = ptr, .length = v.size()}; -} - -inline void vecdouble_cpp2c(std::vector v, VecF64 *vv) { - if (vv->length != v.size()) { - vv->ptr = (double *)realloc(vv->ptr, v.size() * sizeof(double)); - vv->length = v.size(); - } - for (int i = 0; i < v.size(); i++) { vv->ptr[i] = v[i]; } -} - -inline VecF64 *vecdouble_cpp2c_p(std::vector v) { - double *ptr = new double[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = v[i]; } - return new VecF64{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecrect_c2cpp(VecRect v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - Rect p = v.ptr[i]; - rv[i] = cv::Rect(p.x, p.y, p.width, p.height); - } - return rv; -} -inline VecRect vecrect_cpp2c(std::vector v) { - Rect *ptr = (Rect *)calloc(v.size(), sizeof(Rect)); - for (int i = 0; i < v.size(); i++) { ptr[i] = {v[i].x, v[i].y, v[i].width, v[i].height}; } - return VecRect{.ptr = ptr, .length = v.size()}; -} - -inline void vecrect_cpp2c(std::vector v, VecRect *vv) { - if (vv->length != v.size()) { - vv->ptr = (Rect *)realloc(vv->ptr, v.size() * sizeof(Rect)); - vv->length = v.size(); - } - for (int i = 0; i < v.size(); i++) { vv->ptr[i] = {v[i].x, v[i].y, v[i].width, v[i].height}; } -} - -inline VecRect *vecrect_cpp2c_p(std::vector v) { - Rect *ptr = new Rect[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = {v[i].x, v[i].y, v[i].width, v[i].height}; } - return new VecRect{.ptr = ptr, .length = v.size()}; -} - -inline std::vector veckeypoint_c2cpp(VecKeyPoint v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - KeyPoint p = v.ptr[i]; - rv[i] = cv::KeyPoint(p.x, p.y, p.size, p.angle, p.response, p.octave, p.classID); - } - return rv; -} -inline VecKeyPoint veckeypoint_cpp2c(std::vector v) { - KeyPoint *ptr = new KeyPoint[v.size()]; - for (int i = 0; i < v.size(); i++) { - auto kp = v[i]; - KeyPoint ckp = {kp.pt.x, kp.pt.y, kp.size, kp.angle, kp.response, kp.octave, kp.class_id}; - ptr[i] = ckp; - } - return VecKeyPoint{.ptr = ptr, .length = v.size()}; -} - -inline VecKeyPoint *veckeypoint_cpp2c_p(std::vector v) { - KeyPoint *ptr = new KeyPoint[v.size()]; - for (int i = 0; i < v.size(); i++) { - auto kp = v[i]; - KeyPoint ckp = {kp.pt.x, kp.pt.y, kp.size, kp.angle, kp.response, kp.octave, kp.class_id}; - ptr[i] = ckp; - } - return new VecKeyPoint{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecdmatch_c2cpp(VecDMatch v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - DMatch p = v.ptr[i]; - rv[i] = cv::DMatch(p.queryIdx, p.trainIdx, p.imgIdx, p.distance); - } - return rv; -} - -inline VecDMatch vecdmatch_cpp2c(std::vector v) { - DMatch *ptr = new DMatch[v.size()]; - for (int i = 0; i < v.size(); i++) { - ptr[i] = {v[i].queryIdx, v[i].trainIdx, v[i].imgIdx, v[i].distance}; - } - return VecDMatch{.ptr = ptr, .length = v.size()}; -} - -inline VecDMatch *vecdmatch_cpp2c_p(std::vector v) { - DMatch *ptr = new DMatch[v.size()]; - for (int i = 0; i < v.size(); i++) { - ptr[i] = {v[i].queryIdx, v[i].trainIdx, v[i].imgIdx, v[i].distance}; - } - return new VecDMatch{.ptr = ptr, .length = v.size()}; -} - -inline std::vector> vecvecdmatch_c2cpp(VecVecDMatch v) { - std::vector> rv(v.length); - for (int i = 0; i < v.length; i++) { - VecDMatch p = v.ptr[i]; - rv[i] = vecdmatch_c2cpp(p); - } - return rv; -} - -inline VecVecDMatch vecvecdmatch_cpp2c(std::vector> v) { - VecDMatch *ptr = new VecDMatch[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = vecdmatch_cpp2c(v[i]); } - return VecVecDMatch{.ptr = ptr, .length = v.size()}; -} - -inline VecVecDMatch *vecvecdmatch_cpp2c_p(std::vector> v) { - VecDMatch *ptr = new VecDMatch[v.size()]; - for (int i = 0; i < v.size(); i++) { ptr[i] = vecdmatch_cpp2c(v[i]); } - return new VecVecDMatch{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vecPointToVecPoint2f(VecPoint src) { - std::vector v(src.length); - for (int i = 0; i < src.length; i++) { v[i] = cv::Point2f(src.ptr[i].x, src.ptr[i].y); } - return v; -} - -inline std::vector vec_vec4f_c2cpp(VecVec4f v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - Vec4f p = v.ptr[i]; - rv[i] = cv::Vec4f(p.val1, p.val2, p.val3, p.val4); - } - return rv; -} - -inline VecVec4f vec_vec4f_cpp2c(std::vector v) { - Vec4f *ptr = new Vec4f[v.size()]; - for (int i = 0; i < v.size(); i++) { - ptr[i] = {v[i].val[0], v[i].val[1], v[i].val[2], v[i].val[3]}; - } - return VecVec4f{.ptr = ptr, .length = v.size()}; -} - -inline VecVec4f *vec_vec4f_cpp2c_p(std::vector v) { - Vec4f *ptr = new Vec4f[v.size()]; - for (int i = 0; i < v.size(); i++) { - ptr[i] = {v[i].val[0], v[i].val[1], v[i].val[2], v[i].val[3]}; - } - return new VecVec4f{.ptr = ptr, .length = v.size()}; -} - -inline std::vector vec_vec6f_c2cpp(VecVec6f v) { - std::vector rv(v.length); - for (int i = 0; i < v.length; i++) { - Vec6f p = v.ptr[i]; - rv[i] = cv::Vec6f(p.val1, p.val2, p.val3, p.val4, p.val5, p.val6); - } - return rv; -} - -inline VecVec6f *vec_vec6f_cpp2c_p(std::vector v) { - Vec6f *ptr = new Vec6f[v.size()]; - for (int i = 0; i < v.size(); i++) { - cv::Vec6f vec = v[i]; - ptr[i] = {vec.val[0], vec.val[1], vec.val[2], vec.val[3], vec.val[4], vec.val[5]}; - } - return new VecVec6f{.ptr = ptr, .length = v.size()}; -} - -#endif // CVD_VEC_UTILS_H diff --git a/src/core/version.cpp b/src/core/version.cpp deleted file mode 100644 index b1fa2f0d..00000000 --- a/src/core/version.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "version.h" -#include - -CvStatus *openCVVersion(const char **rval) { - BEGIN_WRAP - *rval = CV_VERSION; - END_WRAP -} - -CvStatus *openCVVersion_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new char *(strdup(CV_VERSION))); - END_WRAP -} - -CvStatus *getBuildInfo(const char **rval) { - BEGIN_WRAP - *rval = cv::getBuildInformation().c_str(); - END_WRAP -} - -CvStatus *getBuildInfo_Async(CvCallback_1 callback) { - BEGIN_WRAP - const char *info = cv::getBuildInformation().c_str(); - callback(new char *(strdup(info))); - END_WRAP -} diff --git a/src/core/version.h b/src/core/version.h deleted file mode 100644 index 4637c583..00000000 --- a/src/core/version.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef _OPENCV3_VERSION_H_ -#define _OPENCV3_VERSION_H_ - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "core/types.h" - -CvStatus *openCVVersion(const char **rval); -CvStatus *openCVVersion_Async(CvCallback_1 callback); - -CvStatus *getBuildInfo(const char **rval); -CvStatus *getBuildInfo_Async(CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_VERSION_H_ diff --git a/src/dart_api/BUILD.gn b/src/dart_api/BUILD.gn deleted file mode 100644 index 2b10262f..00000000 --- a/src/dart_api/BUILD.gn +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -# for details. All rights reserved. Use of this source code is governed by a -# BSD-style license that can be found in the LICENSE file. - -import("../../sdk_args.gni") - -# This rule copies header files to include/ -copy("copy_headers") { - visibility = [ "../../sdk:copy_headers" ] - - sources = [ - "dart_api.h", - "dart_api_dl.c", - "dart_api_dl.h", - "dart_native_api.h", - "dart_tools_api.h", - "dart_version.h", - "internal/dart_api_dl_impl.h", - ] - - outputs = - [ "$root_out_dir/$dart_sdk_output/include/{{source_target_relative}}" ] -} diff --git a/src/dart_api/analyze_snapshot_api.h b/src/dart_api/analyze_snapshot_api.h deleted file mode 100644 index 38b58e0b..00000000 --- a/src/dart_api/analyze_snapshot_api.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -#ifndef RUNTIME_INCLUDE_ANALYZE_SNAPSHOT_API_H_ -#define RUNTIME_INCLUDE_ANALYZE_SNAPSHOT_API_H_ - -#include -#include - -namespace dart { -namespace snapshot_analyzer { -typedef struct { - const uint8_t* vm_snapshot_data; - const uint8_t* vm_snapshot_instructions; - const uint8_t* vm_isolate_data; - const uint8_t* vm_isolate_instructions; -} Dart_SnapshotAnalyzerInformation; - -void Dart_DumpSnapshotInformationAsJson( - const Dart_SnapshotAnalyzerInformation& info, - char** buffer, - intptr_t* buffer_length); - -} // namespace snapshot_analyzer -} // namespace dart - -#endif // RUNTIME_INCLUDE_ANALYZE_SNAPSHOT_API_H_ diff --git a/src/dart_api/bin/dart_io_api.h b/src/dart_api/bin/dart_io_api.h deleted file mode 100644 index e863d8b9..00000000 --- a/src/dart_api/bin/dart_io_api.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -#ifndef RUNTIME_INCLUDE_BIN_DART_IO_API_H_ -#define RUNTIME_INCLUDE_BIN_DART_IO_API_H_ - -#include "../dart_tools_api.h" - -namespace dart { -namespace bin { - -// Bootstraps 'dart:io'. -void BootstrapDartIo(); - -// Cleans up 'dart:io'. -void CleanupDartIo(); - -// Lets dart:io know where the system temporary directory is located. -// Currently only wired up on Android. -void SetSystemTempDirectory(const char* system_temp); - -// Tells the system whether to capture Stdout events. -void SetCaptureStdout(bool value); - -// Tells the system whether to capture Stderr events. -void SetCaptureStderr(bool value); - -// Should Stdout events be captured? -bool ShouldCaptureStdout(); - -// Should Stderr events be captured? -bool ShouldCaptureStderr(); - -// Set the executable name used by Platform.executable. -void SetExecutableName(const char* executable_name); - -// Set the arguments used by Platform.executableArguments. -void SetExecutableArguments(int script_index, char** argv); - -// Set dart:io implementation specific fields of Dart_EmbedderInformation. -void GetIOEmbedderInformation(Dart_EmbedderInformation* info); - -// Appropriate to assign to Dart_InitializeParams.file_open/read/write/close. -void* OpenFile(const char* name, bool write); -void ReadFile(uint8_t** data, intptr_t* file_len, void* stream); -void WriteFile(const void* buffer, intptr_t num_bytes, void* stream); -void CloseFile(void* stream); - -// Generates 'length' random bytes into 'buffer'. Returns true on success -// and false on failure. This is appropriate to assign to -// Dart_InitializeParams.entropy_source. -bool GetEntropy(uint8_t* buffer, intptr_t length); - -// Performs a lookup of the I/O Dart_NativeFunction with a specified 'name' and -// 'argument_count'. Returns NULL if no I/O native function with a matching -// name and parameter count is found. -Dart_NativeFunction LookupIONative(Dart_Handle name, - int argument_count, - bool* auto_setup_scope); - -// Returns the symbol for I/O native function 'nf'. Returns NULL if 'nf' is not -// a valid I/O native function. -const uint8_t* LookupIONativeSymbol(Dart_NativeFunction nf); - -} // namespace bin -} // namespace dart - -#endif // RUNTIME_INCLUDE_BIN_DART_IO_API_H_ diff --git a/src/dart_api/bin/native_assets_api.h b/src/dart_api/bin/native_assets_api.h deleted file mode 100644 index bb0d3ac4..00000000 --- a/src/dart_api/bin/native_assets_api.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -#ifndef RUNTIME_INCLUDE_BIN_NATIVE_ASSETS_API_H_ -#define RUNTIME_INCLUDE_BIN_NATIVE_ASSETS_API_H_ - -namespace dart { -namespace bin { - -class NativeAssets { - public: - static void* DlopenAbsolute(const char* path, char** error); - static void* DlopenRelative(const char* path, - const char* script_uri, - char** error); - static void* DlopenSystem(const char* path, char** error); - static void* DlopenProcess(char** error); - static void* DlopenExecutable(char** error); - static void* Dlsym(void* handle, const char* symbol, char** error); -}; - -} // namespace bin -} // namespace dart - -#endif // RUNTIME_INCLUDE_BIN_NATIVE_ASSETS_API_H_ diff --git a/src/dart_api/dart_api.h b/src/dart_api/dart_api.h deleted file mode 100644 index 75e5edb4..00000000 --- a/src/dart_api/dart_api.h +++ /dev/null @@ -1,4154 +0,0 @@ -/* - * Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -#ifndef RUNTIME_INCLUDE_DART_API_H_ -#define RUNTIME_INCLUDE_DART_API_H_ - -/** \mainpage Dart Embedding API Reference - * - * This reference describes the Dart Embedding API, which is used to embed the - * Dart Virtual Machine within C/C++ applications. - * - * This reference is generated from the header include/dart_api.h. - */ - -/* __STDC_FORMAT_MACROS has to be defined before including to - * enable platform independent printf format specifiers. */ -#ifndef __STDC_FORMAT_MACROS -#define __STDC_FORMAT_MACROS -#endif - -#include -#include -#include - -#if defined(__Fuchsia__) -#include -#endif - -#ifdef __cplusplus -#define DART_EXTERN_C extern "C" -#else -#define DART_EXTERN_C extern -#endif - -#if defined(__CYGWIN__) -#error Tool chain and platform not supported. -#elif defined(_WIN32) -#if defined(DART_SHARED_LIB) -#define DART_EXPORT DART_EXTERN_C __declspec(dllexport) -#else -#define DART_EXPORT DART_EXTERN_C -#endif -#else -#if __GNUC__ >= 4 -#if defined(DART_SHARED_LIB) -#define DART_EXPORT \ - DART_EXTERN_C __attribute__((visibility("default"))) __attribute((used)) -#else -#define DART_EXPORT DART_EXTERN_C -#endif -#else -#error Tool chain not supported. -#endif -#endif - -#if __GNUC__ -#define DART_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#define DART_DEPRECATED(msg) __attribute__((deprecated(msg))) -#elif _MSC_VER -#define DART_WARN_UNUSED_RESULT _Check_return_ -#define DART_DEPRECATED(msg) __declspec(deprecated(msg)) -#else -#define DART_WARN_UNUSED_RESULT -#define DART_DEPRECATED(msg) -#endif - -/* - * ======= - * Handles - * ======= - */ - -/** - * An isolate is the unit of concurrency in Dart. Each isolate has - * its own memory and thread of control. No state is shared between - * isolates. Instead, isolates communicate by message passing. - * - * Each thread keeps track of its current isolate, which is the - * isolate which is ready to execute on the current thread. The - * current isolate may be NULL, in which case no isolate is ready to - * execute. Most of the Dart apis require there to be a current - * isolate in order to function without error. The current isolate is - * set by any call to Dart_CreateIsolateGroup or Dart_EnterIsolate. - */ -typedef struct _Dart_Isolate* Dart_Isolate; -typedef struct _Dart_IsolateGroup* Dart_IsolateGroup; - -/** - * An object reference managed by the Dart VM garbage collector. - * - * Because the garbage collector may move objects, it is unsafe to - * refer to objects directly. Instead, we refer to objects through - * handles, which are known to the garbage collector and updated - * automatically when the object is moved. Handles should be passed - * by value (except in cases like out-parameters) and should never be - * allocated on the heap. - * - * Most functions in the Dart Embedding API return a handle. When a - * function completes normally, this will be a valid handle to an - * object in the Dart VM heap. This handle may represent the result of - * the operation or it may be a special valid handle used merely to - * indicate successful completion. Note that a valid handle may in - * some cases refer to the null object. - * - * --- Error handles --- - * - * When a function encounters a problem that prevents it from - * completing normally, it returns an error handle (See Dart_IsError). - * An error handle has an associated error message that gives more - * details about the problem (See Dart_GetError). - * - * There are four kinds of error handles that can be produced, - * depending on what goes wrong: - * - * - Api error handles are produced when an api function is misused. - * This happens when a Dart embedding api function is called with - * invalid arguments or in an invalid context. - * - * - Unhandled exception error handles are produced when, during the - * execution of Dart code, an exception is thrown but not caught. - * Prototypically this would occur during a call to Dart_Invoke, but - * it can occur in any function which triggers the execution of Dart - * code (for example, Dart_ToString). - * - * An unhandled exception error provides access to an exception and - * stacktrace via the functions Dart_ErrorGetException and - * Dart_ErrorGetStackTrace. - * - * - Compilation error handles are produced when, during the execution - * of Dart code, a compile-time error occurs. As above, this can - * occur in any function which triggers the execution of Dart code. - * - * - Fatal error handles are produced when the system wants to shut - * down the current isolate. - * - * --- Propagating errors --- - * - * When an error handle is returned from the top level invocation of - * Dart code in a program, the embedder must handle the error as they - * see fit. Often, the embedder will print the error message produced - * by Dart_Error and exit the program. - * - * When an error is returned while in the body of a native function, - * it can be propagated up the call stack by calling - * Dart_PropagateError, Dart_SetReturnValue, or Dart_ThrowException. - * Errors should be propagated unless there is a specific reason not - * to. If an error is not propagated then it is ignored. For - * example, if an unhandled exception error is ignored, that - * effectively "catches" the unhandled exception. Fatal errors must - * always be propagated. - * - * When an error is propagated, any current scopes created by - * Dart_EnterScope will be exited. - * - * Using Dart_SetReturnValue to propagate an exception is somewhat - * more convenient than using Dart_PropagateError, and should be - * preferred for reasons discussed below. - * - * Dart_PropagateError and Dart_ThrowException do not return. Instead - * they transfer control non-locally using a setjmp-like mechanism. - * This can be inconvenient if you have resources that you need to - * clean up before propagating the error. - * - * When relying on Dart_PropagateError, we often return error handles - * rather than propagating them from helper functions. Consider the - * following contrived example: - * - * 1 Dart_Handle isLongStringHelper(Dart_Handle arg) { - * 2 intptr_t* length = 0; - * 3 result = Dart_StringLength(arg, &length); - * 4 if (Dart_IsError(result)) { - * 5 return result; - * 6 } - * 7 return Dart_NewBoolean(length > 100); - * 8 } - * 9 - * 10 void NativeFunction_isLongString(Dart_NativeArguments args) { - * 11 Dart_EnterScope(); - * 12 AllocateMyResource(); - * 13 Dart_Handle arg = Dart_GetNativeArgument(args, 0); - * 14 Dart_Handle result = isLongStringHelper(arg); - * 15 if (Dart_IsError(result)) { - * 16 FreeMyResource(); - * 17 Dart_PropagateError(result); - * 18 abort(); // will not reach here - * 19 } - * 20 Dart_SetReturnValue(result); - * 21 FreeMyResource(); - * 22 Dart_ExitScope(); - * 23 } - * - * In this example, we have a native function which calls a helper - * function to do its work. On line 5, the helper function could call - * Dart_PropagateError, but that would not give the native function a - * chance to call FreeMyResource(), causing a leak. Instead, the - * helper function returns the error handle to the caller, giving the - * caller a chance to clean up before propagating the error handle. - * - * When an error is propagated by calling Dart_SetReturnValue, the - * native function will be allowed to complete normally and then the - * exception will be propagated only once the native call - * returns. This can be convenient, as it allows the C code to clean - * up normally. - * - * The example can be written more simply using Dart_SetReturnValue to - * propagate the error. - * - * 1 Dart_Handle isLongStringHelper(Dart_Handle arg) { - * 2 intptr_t* length = 0; - * 3 result = Dart_StringLength(arg, &length); - * 4 if (Dart_IsError(result)) { - * 5 return result - * 6 } - * 7 return Dart_NewBoolean(length > 100); - * 8 } - * 9 - * 10 void NativeFunction_isLongString(Dart_NativeArguments args) { - * 11 Dart_EnterScope(); - * 12 AllocateMyResource(); - * 13 Dart_Handle arg = Dart_GetNativeArgument(args, 0); - * 14 Dart_SetReturnValue(isLongStringHelper(arg)); - * 15 FreeMyResource(); - * 16 Dart_ExitScope(); - * 17 } - * - * In this example, the call to Dart_SetReturnValue on line 14 will - * either return the normal return value or the error (potentially - * generated on line 3). The call to FreeMyResource on line 15 will - * execute in either case. - * - * --- Local and persistent handles --- - * - * Local handles are allocated within the current scope (see - * Dart_EnterScope) and go away when the current scope exits. Unless - * otherwise indicated, callers should assume that all functions in - * the Dart embedding api return local handles. - * - * Persistent handles are allocated within the current isolate. They - * can be used to store objects across scopes. Persistent handles have - * the lifetime of the current isolate unless they are explicitly - * deallocated (see Dart_DeletePersistentHandle). - * The type Dart_Handle represents a handle (both local and persistent). - * The type Dart_PersistentHandle is a Dart_Handle and it is used to - * document that a persistent handle is expected as a parameter to a call - * or the return value from a call is a persistent handle. - * - * FinalizableHandles are persistent handles which are auto deleted when - * the object is garbage collected. It is never safe to use these handles - * unless you know the object is still reachable. - * - * WeakPersistentHandles are persistent handles which are automatically set - * to point Dart_Null when the object is garbage collected. They are not auto - * deleted, so it is safe to use them after the object has become unreachable. - */ -typedef struct _Dart_Handle* Dart_Handle; -typedef Dart_Handle Dart_PersistentHandle; -typedef struct _Dart_WeakPersistentHandle* Dart_WeakPersistentHandle; -typedef struct _Dart_FinalizableHandle* Dart_FinalizableHandle; -// These structs are versioned by DART_API_DL_MAJOR_VERSION, bump the -// version when changing this struct. - -typedef void (*Dart_HandleFinalizer)(void* isolate_callback_data, void* peer); - -/** - * Is this an error handle? - * - * Requires there to be a current isolate. - */ -DART_EXPORT bool Dart_IsError(Dart_Handle handle); - -/** - * Is this an api error handle? - * - * Api error handles are produced when an api function is misused. - * This happens when a Dart embedding api function is called with - * invalid arguments or in an invalid context. - * - * Requires there to be a current isolate. - */ -DART_EXPORT bool Dart_IsApiError(Dart_Handle handle); - -/** - * Is this an unhandled exception error handle? - * - * Unhandled exception error handles are produced when, during the - * execution of Dart code, an exception is thrown but not caught. - * This can occur in any function which triggers the execution of Dart - * code. - * - * See Dart_ErrorGetException and Dart_ErrorGetStackTrace. - * - * Requires there to be a current isolate. - */ -DART_EXPORT bool Dart_IsUnhandledExceptionError(Dart_Handle handle); - -/** - * Is this a compilation error handle? - * - * Compilation error handles are produced when, during the execution - * of Dart code, a compile-time error occurs. This can occur in any - * function which triggers the execution of Dart code. - * - * Requires there to be a current isolate. - */ -DART_EXPORT bool Dart_IsCompilationError(Dart_Handle handle); - -/** - * Is this a fatal error handle? - * - * Fatal error handles are produced when the system wants to shut down - * the current isolate. - * - * Requires there to be a current isolate. - */ -DART_EXPORT bool Dart_IsFatalError(Dart_Handle handle); - -/** - * Gets the error message from an error handle. - * - * Requires there to be a current isolate. - * - * \return A C string containing an error message if the handle is - * error. An empty C string ("") if the handle is valid. This C - * String is scope allocated and is only valid until the next call - * to Dart_ExitScope. -*/ -DART_EXPORT const char* Dart_GetError(Dart_Handle handle); - -/** - * Is this an error handle for an unhandled exception? - */ -DART_EXPORT bool Dart_ErrorHasException(Dart_Handle handle); - -/** - * Gets the exception Object from an unhandled exception error handle. - */ -DART_EXPORT Dart_Handle Dart_ErrorGetException(Dart_Handle handle); - -/** - * Gets the stack trace Object from an unhandled exception error handle. - */ -DART_EXPORT Dart_Handle Dart_ErrorGetStackTrace(Dart_Handle handle); - -/** - * Produces an api error handle with the provided error message. - * - * Requires there to be a current isolate. - * - * \param error the error message. - */ -DART_EXPORT Dart_Handle Dart_NewApiError(const char* error); -DART_EXPORT Dart_Handle Dart_NewCompilationError(const char* error); - -/** - * Produces a new unhandled exception error handle. - * - * Requires there to be a current isolate. - * - * \param exception An instance of a Dart object to be thrown or - * an ApiError or CompilationError handle. - * When an ApiError or CompilationError handle is passed in - * a string object of the error message is created and it becomes - * the Dart object to be thrown. - */ -DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception); - -/** - * Propagates an error. - * - * If the provided handle is an unhandled exception error, this - * function will cause the unhandled exception to be rethrown. This - * will proceed in the standard way, walking up Dart frames until an - * appropriate 'catch' block is found, executing 'finally' blocks, - * etc. - * - * If the error is not an unhandled exception error, we will unwind - * the stack to the next C frame. Intervening Dart frames will be - * discarded; specifically, 'finally' blocks will not execute. This - * is the standard way that compilation errors (and the like) are - * handled by the Dart runtime. - * - * In either case, when an error is propagated any current scopes - * created by Dart_EnterScope will be exited. - * - * See the additional discussion under "Propagating Errors" at the - * beginning of this file. - * - * \param handle An error handle (See Dart_IsError) - * - * On success, this function does not return. On failure, the - * process is terminated. - */ -DART_EXPORT void Dart_PropagateError(Dart_Handle handle); - -/** - * Converts an object to a string. - * - * May generate an unhandled exception error. - * - * \return The converted string if no error occurs during - * the conversion. If an error does occur, an error handle is - * returned. - */ -DART_EXPORT Dart_Handle Dart_ToString(Dart_Handle object); - -/** - * Checks to see if two handles refer to identically equal objects. - * - * If both handles refer to instances, this is equivalent to using the top-level - * function identical() from dart:core. Otherwise, returns whether the two - * argument handles refer to the same object. - * - * \param obj1 An object to be compared. - * \param obj2 An object to be compared. - * - * \return True if the objects are identically equal. False otherwise. - */ -DART_EXPORT bool Dart_IdentityEquals(Dart_Handle obj1, Dart_Handle obj2); - -/** - * Allocates a handle in the current scope from a persistent handle. - */ -DART_EXPORT Dart_Handle Dart_HandleFromPersistent(Dart_PersistentHandle object); - -/** - * Allocates a handle in the current scope from a weak persistent handle. - * - * This will be a handle to Dart_Null if the object has been garbage collected. - */ -DART_EXPORT Dart_Handle -Dart_HandleFromWeakPersistent(Dart_WeakPersistentHandle object); - -/** - * Allocates a persistent handle for an object. - * - * This handle has the lifetime of the current isolate unless it is - * explicitly deallocated by calling Dart_DeletePersistentHandle. - * - * Requires there to be a current isolate. - */ -DART_EXPORT Dart_PersistentHandle Dart_NewPersistentHandle(Dart_Handle object); - -/** - * Assign value of local handle to a persistent handle. - * - * Requires there to be a current isolate. - * - * \param obj1 A persistent handle whose value needs to be set. - * \param obj2 An object whose value needs to be set to the persistent handle. - */ -DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1, - Dart_Handle obj2); - -/** - * Deallocates a persistent handle. - * - * Requires there to be a current isolate group. - */ -DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object); - -/** - * Allocates a weak persistent handle for an object. - * - * This handle has the lifetime of the current isolate. The handle can also be - * explicitly deallocated by calling Dart_DeleteWeakPersistentHandle. - * - * If the object becomes unreachable the callback is invoked with the peer as - * argument. The callback can be executed on any thread, will have a current - * isolate group, but will not have a current isolate. The callback can only - * call Dart_DeletePersistentHandle or Dart_DeleteWeakPersistentHandle. This - * gives the embedder the ability to cleanup data associated with the object. - * The handle will point to the Dart_Null object after the finalizer has been - * run. It is illegal to call into the VM with any other Dart_* functions from - * the callback. If the handle is deleted before the object becomes - * unreachable, the callback is never invoked. - * - * Requires there to be a current isolate. - * - * \param object An object with identity. - * \param peer A pointer to a native object or NULL. This value is - * provided to callback when it is invoked. - * \param external_allocation_size The number of externally allocated - * bytes for peer. Used to inform the garbage collector. - * \param callback A function pointer that will be invoked sometime - * after the object is garbage collected, unless the handle has been deleted. - * A valid callback needs to be specified it cannot be NULL. - * - * \return The weak persistent handle or NULL. NULL is returned in case of bad - * parameters. - */ -DART_EXPORT Dart_WeakPersistentHandle -Dart_NewWeakPersistentHandle(Dart_Handle object, - void* peer, - intptr_t external_allocation_size, - Dart_HandleFinalizer callback); - -/** - * Deletes the given weak persistent [object] handle. - * - * Requires there to be a current isolate group. - */ -DART_EXPORT void Dart_DeleteWeakPersistentHandle( - Dart_WeakPersistentHandle object); - -/** - * Allocates a finalizable handle for an object. - * - * This handle has the lifetime of the current isolate group unless the object - * pointed to by the handle is garbage collected, in this case the VM - * automatically deletes the handle after invoking the callback associated - * with the handle. The handle can also be explicitly deallocated by - * calling Dart_DeleteFinalizableHandle. - * - * If the object becomes unreachable the callback is invoked with the - * the peer as argument. The callback can be executed on any thread, will have - * an isolate group, but will not have a current isolate. The callback can only - * call Dart_DeletePersistentHandle or Dart_DeleteWeakPersistentHandle. - * This gives the embedder the ability to cleanup data associated with the - * object and clear out any cached references to the handle. All references to - * this handle after the callback will be invalid. It is illegal to call into - * the VM with any other Dart_* functions from the callback. If the handle is - * deleted before the object becomes unreachable, the callback is never - * invoked. - * - * Requires there to be a current isolate. - * - * \param object An object with identity. - * \param peer A pointer to a native object or NULL. This value is - * provided to callback when it is invoked. - * \param external_allocation_size The number of externally allocated - * bytes for peer. Used to inform the garbage collector. - * \param callback A function pointer that will be invoked sometime - * after the object is garbage collected, unless the handle has been deleted. - * A valid callback needs to be specified it cannot be NULL. - * - * \return The finalizable handle or NULL. NULL is returned in case of bad - * parameters. - */ -DART_EXPORT Dart_FinalizableHandle -Dart_NewFinalizableHandle(Dart_Handle object, - void* peer, - intptr_t external_allocation_size, - Dart_HandleFinalizer callback); - -/** - * Deletes the given finalizable [object] handle. - * - * The caller has to provide the actual Dart object the handle was created from - * to prove the object (and therefore the finalizable handle) is still alive. - * - * Requires there to be a current isolate. - */ -DART_EXPORT void Dart_DeleteFinalizableHandle(Dart_FinalizableHandle object, - Dart_Handle strong_ref_to_object); - -/* - * ========================== - * Initialization and Globals - * ========================== - */ - -/** - * Gets the version string for the Dart VM. - * - * The version of the Dart VM can be accessed without initializing the VM. - * - * \return The version string for the embedded Dart VM. - */ -DART_EXPORT const char* Dart_VersionString(void); - -/** - * Isolate specific flags are set when creating a new isolate using the - * Dart_IsolateFlags structure. - * - * Current version of flags is encoded in a 32-bit integer with 16 bits used - * for each part. - */ - -#define DART_FLAGS_CURRENT_VERSION (0x0000000d) - -typedef struct { - int32_t version; - bool enable_asserts; - bool use_field_guards; - bool use_osr; - bool obfuscate; - bool load_vmservice_library; - bool null_safety; - bool is_system_isolate; - bool is_service_isolate; - bool is_kernel_isolate; - bool snapshot_is_dontneed_safe; - bool branch_coverage; - bool coverage; -} Dart_IsolateFlags; - -/** - * Initialize Dart_IsolateFlags with correct version and default values. - */ -DART_EXPORT void Dart_IsolateFlagsInitialize(Dart_IsolateFlags* flags); - -/** - * An isolate creation and initialization callback function. - * - * This callback, provided by the embedder, is called when the VM - * needs to create an isolate. The callback should create an isolate - * by calling Dart_CreateIsolateGroup and load any scripts required for - * execution. - * - * This callback may be called on a different thread than the one - * running the parent isolate. - * - * When the function returns NULL, it is the responsibility of this - * function to ensure that Dart_ShutdownIsolate has been called if - * required (for example, if the isolate was created successfully by - * Dart_CreateIsolateGroup() but the root library fails to load - * successfully, then the function should call Dart_ShutdownIsolate - * before returning). - * - * When the function returns NULL, the function should set *error to - * a malloc-allocated buffer containing a useful error message. The - * caller of this function (the VM) will make sure that the buffer is - * freed. - * - * \param script_uri The uri of the main source file or snapshot to load. - * Either the URI of the parent isolate set in Dart_CreateIsolateGroup for - * Isolate.spawn, or the argument to Isolate.spawnUri canonicalized by the - * library tag handler of the parent isolate. - * The callback is responsible for loading the program by a call to - * Dart_LoadScriptFromKernel. - * \param main The name of the main entry point this isolate will - * eventually run. This is provided for advisory purposes only to - * improve debugging messages. The main function is not invoked by - * this function. - * \param package_root Ignored. - * \param package_config Uri of the package configuration file (either in format - * of .packages or .dart_tool/package_config.json) for this isolate - * to resolve package imports against. If this parameter is not passed the - * package resolution of the parent isolate should be used. - * \param flags Default flags for this isolate being spawned. Either inherited - * from the spawning isolate or passed as parameters when spawning the - * isolate from Dart code. - * \param isolate_data The isolate data which was passed to the - * parent isolate when it was created by calling Dart_CreateIsolateGroup(). - * \param error A structure into which the embedder can place a - * C string containing an error message in the case of failures. - * - * \return The embedder returns NULL if the creation and - * initialization was not successful and the isolate if successful. - */ -typedef Dart_Isolate (*Dart_IsolateGroupCreateCallback)( - const char* script_uri, - const char* main, - const char* package_root, - const char* package_config, - Dart_IsolateFlags* flags, - void* isolate_data, - char** error); - -/** - * An isolate initialization callback function. - * - * This callback, provided by the embedder, is called when the VM has created an - * isolate within an existing isolate group (i.e. from the same source as an - * existing isolate). - * - * The callback should setup native resolvers and might want to set a custom - * message handler via [Dart_SetMessageNotifyCallback] and mark the isolate as - * runnable. - * - * This callback may be called on a different thread than the one - * running the parent isolate. - * - * When the function returns `false`, it is the responsibility of this - * function to ensure that `Dart_ShutdownIsolate` has been called. - * - * When the function returns `false`, the function should set *error to - * a malloc-allocated buffer containing a useful error message. The - * caller of this function (the VM) will make sure that the buffer is - * freed. - * - * \param child_isolate_data The callback data to associate with the new - * child isolate. - * \param error A structure into which the embedder can place a - * C string containing an error message in the case the initialization fails. - * - * \return The embedder returns true if the initialization was successful and - * false otherwise (in which case the VM will terminate the isolate). - */ -typedef bool (*Dart_InitializeIsolateCallback)(void** child_isolate_data, - char** error); - -/** - * An isolate shutdown callback function. - * - * This callback, provided by the embedder, is called before the vm - * shuts down an isolate. The isolate being shutdown will be the current - * isolate. It is safe to run Dart code. - * - * This function should be used to dispose of native resources that - * are allocated to an isolate in order to avoid leaks. - * - * \param isolate_group_data The same callback data which was passed to the - * isolate group when it was created. - * \param isolate_data The same callback data which was passed to the isolate - * when it was created. - */ -typedef void (*Dart_IsolateShutdownCallback)(void* isolate_group_data, - void* isolate_data); - -/** - * An isolate cleanup callback function. - * - * This callback, provided by the embedder, is called after the vm - * shuts down an isolate. There will be no current isolate and it is *not* - * safe to run Dart code. - * - * This function should be used to dispose of native resources that - * are allocated to an isolate in order to avoid leaks. - * - * \param isolate_group_data The same callback data which was passed to the - * isolate group when it was created. - * \param isolate_data The same callback data which was passed to the isolate - * when it was created. - */ -typedef void (*Dart_IsolateCleanupCallback)(void* isolate_group_data, - void* isolate_data); - -/** - * An isolate group cleanup callback function. - * - * This callback, provided by the embedder, is called after the vm - * shuts down an isolate group. - * - * This function should be used to dispose of native resources that - * are allocated to an isolate in order to avoid leaks. - * - * \param isolate_group_data The same callback data which was passed to the - * isolate group when it was created. - * - */ -typedef void (*Dart_IsolateGroupCleanupCallback)(void* isolate_group_data); - -/** - * A thread start callback function. - * This callback, provided by the embedder, is called after a thread in the - * vm thread pool starts. - * This function could be used to adjust thread priority or attach native - * resources to the thread. - */ -typedef void (*Dart_ThreadStartCallback)(void); - -/** - * A thread death callback function. - * This callback, provided by the embedder, is called before a thread in the - * vm thread pool exits. - * This function could be used to dispose of native resources that - * are associated and attached to the thread, in order to avoid leaks. - */ -typedef void (*Dart_ThreadExitCallback)(void); - -/** - * Opens a file for reading or writing. - * - * Callback provided by the embedder for file operations. If the - * embedder does not allow file operations this callback can be - * NULL. - * - * \param name The name of the file to open. - * \param write A boolean variable which indicates if the file is to - * opened for writing. If there is an existing file it needs to truncated. - */ -typedef void* (*Dart_FileOpenCallback)(const char* name, bool write); - -/** - * Read contents of file. - * - * Callback provided by the embedder for file operations. If the - * embedder does not allow file operations this callback can be - * NULL. - * - * \param data Buffer allocated in the callback into which the contents - * of the file are read into. It is the responsibility of the caller to - * free this buffer. - * \param file_length A variable into which the length of the file is returned. - * In the case of an error this value would be -1. - * \param stream Handle to the opened file. - */ -typedef void (*Dart_FileReadCallback)(uint8_t** data, - intptr_t* file_length, - void* stream); - -/** - * Write data into file. - * - * Callback provided by the embedder for file operations. If the - * embedder does not allow file operations this callback can be - * NULL. - * - * \param data Buffer which needs to be written into the file. - * \param length Length of the buffer. - * \param stream Handle to the opened file. - */ -typedef void (*Dart_FileWriteCallback)(const void* data, - intptr_t length, - void* stream); - -/** - * Closes the opened file. - * - * Callback provided by the embedder for file operations. If the - * embedder does not allow file operations this callback can be - * NULL. - * - * \param stream Handle to the opened file. - */ -typedef void (*Dart_FileCloseCallback)(void* stream); - -typedef bool (*Dart_EntropySource)(uint8_t* buffer, intptr_t length); - -/** - * Callback provided by the embedder that is used by the vmservice isolate - * to request the asset archive. The asset archive must be an uncompressed tar - * archive that is stored in a Uint8List. - * - * If the embedder has no vmservice isolate assets, the callback can be NULL. - * - * \return The embedder must return a handle to a Uint8List containing an - * uncompressed tar archive or null. - */ -typedef Dart_Handle (*Dart_GetVMServiceAssetsArchive)(void); - -/** - * The current version of the Dart_InitializeFlags. Should be incremented every - * time Dart_InitializeFlags changes in a binary incompatible way. - */ -#define DART_INITIALIZE_PARAMS_CURRENT_VERSION (0x00000008) - -/** Forward declaration */ -struct Dart_CodeObserver; - -/** - * Callback provided by the embedder that is used by the VM to notify on code - * object creation, *before* it is invoked the first time. - * This is useful for embedders wanting to e.g. keep track of PCs beyond - * the lifetime of the garbage collected code objects. - * Note that an address range may be used by more than one code object over the - * lifecycle of a process. Clients of this function should record timestamps for - * these compilation events and when collecting PCs to disambiguate reused - * address ranges. - */ -typedef void (*Dart_OnNewCodeCallback)(struct Dart_CodeObserver* observer, - const char* name, - uintptr_t base, - uintptr_t size); - -typedef struct Dart_CodeObserver { - void* data; - - Dart_OnNewCodeCallback on_new_code; -} Dart_CodeObserver; - -/** - * Optional callback provided by the embedder that is used by the VM to - * implement registration of kernel blobs for the subsequent Isolate.spawnUri - * If no callback is provided, the registration of kernel blobs will throw - * an error. - * - * \param kernel_buffer A buffer which contains a kernel program. Callback - * should copy the contents of `kernel_buffer` as - * it may be freed immediately after registration. - * \param kernel_buffer_size The size of `kernel_buffer`. - * - * \return A C string representing URI which can be later used - * to spawn a new isolate. This C String should be scope allocated - * or owned by the embedder. - * Returns NULL if embedder runs out of memory. - */ -typedef const char* (*Dart_RegisterKernelBlobCallback)( - const uint8_t* kernel_buffer, - intptr_t kernel_buffer_size); - -/** - * Optional callback provided by the embedder that is used by the VM to - * unregister kernel blobs. - * If no callback is provided, the unregistration of kernel blobs will throw - * an error. - * - * \param kernel_blob_uri URI of the kernel blob to unregister. - */ -typedef void (*Dart_UnregisterKernelBlobCallback)(const char* kernel_blob_uri); - -/** - * Describes how to initialize the VM. Used with Dart_Initialize. - */ -typedef struct { - /** - * Identifies the version of the struct used by the client. - * should be initialized to DART_INITIALIZE_PARAMS_CURRENT_VERSION. - */ - int32_t version; - - /** - * A buffer containing snapshot data, or NULL if no snapshot is provided. - * - * If provided, the buffer must remain valid until Dart_Cleanup returns. - */ - const uint8_t* vm_snapshot_data; - - /** - * A buffer containing a snapshot of precompiled instructions, or NULL if - * no snapshot is provided. - * - * If provided, the buffer must remain valid until Dart_Cleanup returns. - */ - const uint8_t* vm_snapshot_instructions; - - /** - * A function to be called during isolate group creation. - * See Dart_IsolateGroupCreateCallback. - */ - Dart_IsolateGroupCreateCallback create_group; - - /** - * A function to be called during isolate - * initialization inside an existing isolate group. - * See Dart_InitializeIsolateCallback. - */ - Dart_InitializeIsolateCallback initialize_isolate; - - /** - * A function to be called right before an isolate is shutdown. - * See Dart_IsolateShutdownCallback. - */ - Dart_IsolateShutdownCallback shutdown_isolate; - - /** - * A function to be called after an isolate was shutdown. - * See Dart_IsolateCleanupCallback. - */ - Dart_IsolateCleanupCallback cleanup_isolate; - - /** - * A function to be called after an isolate group is - * shutdown. See Dart_IsolateGroupCleanupCallback. - */ - Dart_IsolateGroupCleanupCallback cleanup_group; - - Dart_ThreadStartCallback thread_start; - Dart_ThreadExitCallback thread_exit; - Dart_FileOpenCallback file_open; - Dart_FileReadCallback file_read; - Dart_FileWriteCallback file_write; - Dart_FileCloseCallback file_close; - Dart_EntropySource entropy_source; - - /** - * A function to be called by the service isolate when it requires the - * vmservice assets archive. See Dart_GetVMServiceAssetsArchive. - */ - Dart_GetVMServiceAssetsArchive get_service_assets; - - bool start_kernel_isolate; - - /** - * An external code observer callback function. The observer can be invoked - * as early as during the Dart_Initialize() call. - */ - Dart_CodeObserver* code_observer; - - /** - * Kernel blob registration callback function. See Dart_RegisterKernelBlobCallback. - */ - Dart_RegisterKernelBlobCallback register_kernel_blob; - - /** - * Kernel blob unregistration callback function. See Dart_UnregisterKernelBlobCallback. - */ - Dart_UnregisterKernelBlobCallback unregister_kernel_blob; - -#if defined(__Fuchsia__) - /** - * The resource needed to use zx_vmo_replace_as_executable. Can be - * ZX_HANDLE_INVALID if the process has ambient-replace-as-executable or if - * executable memory is not needed (e.g., this is an AOT runtime). - */ - zx_handle_t vmex_resource; -#endif -} Dart_InitializeParams; - -/** - * Initializes the VM. - * - * \param params A struct containing initialization information. The version - * field of the struct must be DART_INITIALIZE_PARAMS_CURRENT_VERSION. - * - * \return NULL if initialization is successful. Returns an error message - * otherwise. The caller is responsible for freeing the error message. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_Initialize( - Dart_InitializeParams* params); - -/** - * Cleanup state in the VM before process termination. - * - * \return NULL if cleanup is successful. Returns an error message otherwise. - * The caller is responsible for freeing the error message. - * - * NOTE: This function must not be called on a thread that was created by the VM - * itself. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_Cleanup(void); - -/** - * Sets command line flags. Should be called before Dart_Initialize. - * - * \param argc The length of the arguments array. - * \param argv An array of arguments. - * - * \return NULL if successful. Returns an error message otherwise. - * The caller is responsible for freeing the error message. - * - * NOTE: This call does not store references to the passed in c-strings. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_SetVMFlags(int argc, - const char** argv); - -/** - * Returns true if the named VM flag is of boolean type, specified, and set to - * true. - * - * \param flag_name The name of the flag without leading punctuation - * (example: "enable_asserts"). - */ -DART_EXPORT bool Dart_IsVMFlagSet(const char* flag_name); - -/* - * ======== - * Isolates - * ======== - */ - -/** - * Creates a new isolate. The new isolate becomes the current isolate. - * - * A snapshot can be used to restore the VM quickly to a saved state - * and is useful for fast startup. If snapshot data is provided, the - * isolate will be started using that snapshot data. Requires a core snapshot or - * an app snapshot created by Dart_CreateSnapshot or - * Dart_CreatePrecompiledSnapshot* from a VM with the same version. - * - * Requires there to be no current isolate. - * - * \param script_uri The main source file or snapshot this isolate will load. - * The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a - * child isolate is created by Isolate.spawn. The embedder should use a URI - * that allows it to load the same program into such a child isolate. - * \param name A short name for the isolate to improve debugging messages. - * Typically of the format 'foo.dart:main()'. - * \param isolate_snapshot_data Buffer containing the snapshot data of the - * isolate or NULL if no snapshot is provided. If provided, the buffer must - * remain valid until the isolate shuts down. - * \param isolate_snapshot_instructions Buffer containing the snapshot - * instructions of the isolate or NULL if no snapshot is provided. If - * provided, the buffer must remain valid until the isolate shuts down. - * \param flags Pointer to VM specific flags or NULL for default flags. - * \param isolate_group_data Embedder group data. This data can be obtained - * by calling Dart_IsolateGroupData and will be passed to the - * Dart_IsolateShutdownCallback, Dart_IsolateCleanupCallback, and - * Dart_IsolateGroupCleanupCallback. - * \param isolate_data Embedder data. This data will be passed to - * the Dart_IsolateGroupCreateCallback when new isolates are spawned from - * this parent isolate. - * \param error Returns NULL if creation is successful, an error message - * otherwise. The caller is responsible for calling free() on the error - * message. - * - * \return The new isolate on success, or NULL if isolate creation failed. - */ -DART_EXPORT Dart_Isolate -Dart_CreateIsolateGroup(const char* script_uri, - const char* name, - const uint8_t* isolate_snapshot_data, - const uint8_t* isolate_snapshot_instructions, - Dart_IsolateFlags* flags, - void* isolate_group_data, - void* isolate_data, - char** error); -/** - * Creates a new isolate inside the isolate group of [group_member]. - * - * Requires there to be no current isolate. - * - * \param group_member An isolate from the same group into which the newly created - * isolate should be born into. Other threads may not have entered / enter this - * member isolate. - * \param name A short name for the isolate for debugging purposes. - * \param shutdown_callback A callback to be called when the isolate is being - * shutdown (may be NULL). - * \param cleanup_callback A callback to be called when the isolate is being - * cleaned up (may be NULL). - * \param child_isolate_data The embedder-specific data associated with this isolate. - * \param error Set to NULL if creation is successful, set to an error - * message otherwise. The caller is responsible for calling free() on the - * error message. - * - * \return The newly created isolate on success, or NULL if isolate creation - * failed. - * - * If successful, the newly created isolate will become the current isolate. - */ -DART_EXPORT Dart_Isolate -Dart_CreateIsolateInGroup(Dart_Isolate group_member, - const char* name, - Dart_IsolateShutdownCallback shutdown_callback, - Dart_IsolateCleanupCallback cleanup_callback, - void* child_isolate_data, - char** error); - -/* TODO(turnidge): Document behavior when there is already a current - * isolate. */ - -/** - * Creates a new isolate from a Dart Kernel file. The new isolate - * becomes the current isolate. - * - * Requires there to be no current isolate. - * - * \param script_uri The main source file or snapshot this isolate will load. - * The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a - * child isolate is created by Isolate.spawn. The embedder should use a URI that - * allows it to load the same program into such a child isolate. - * \param name A short name for the isolate to improve debugging messages. - * Typically of the format 'foo.dart:main()'. - * \param kernel_buffer A buffer which contains a kernel/DIL program. Must - * remain valid until isolate shutdown. - * \param kernel_buffer_size The size of `kernel_buffer`. - * \param flags Pointer to VM specific flags or NULL for default flags. - * \param isolate_group_data Embedder group data. This data can be obtained - * by calling Dart_IsolateGroupData and will be passed to the - * Dart_IsolateShutdownCallback, Dart_IsolateCleanupCallback, and - * Dart_IsolateGroupCleanupCallback. - * \param isolate_data Embedder data. This data will be passed to - * the Dart_IsolateGroupCreateCallback when new isolates are spawned from - * this parent isolate. - * \param error Returns NULL if creation is successful, an error message - * otherwise. The caller is responsible for calling free() on the error - * message. - * - * \return The new isolate on success, or NULL if isolate creation failed. - */ -DART_EXPORT Dart_Isolate -Dart_CreateIsolateGroupFromKernel(const char* script_uri, - const char* name, - const uint8_t* kernel_buffer, - intptr_t kernel_buffer_size, - Dart_IsolateFlags* flags, - void* isolate_group_data, - void* isolate_data, - char** error); -/** - * Shuts down the current isolate. After this call, the current isolate is NULL. - * Any current scopes created by Dart_EnterScope will be exited. Invokes the - * shutdown callback and any callbacks of remaining weak persistent handles. - * - * Requires there to be a current isolate. - */ -DART_EXPORT void Dart_ShutdownIsolate(void); -/* TODO(turnidge): Document behavior when there is no current isolate. */ - -/** - * Returns the current isolate. Will return NULL if there is no - * current isolate. - */ -DART_EXPORT Dart_Isolate Dart_CurrentIsolate(void); - -/** - * Returns the callback data associated with the current isolate. This - * data was set when the isolate got created or initialized. - */ -DART_EXPORT void* Dart_CurrentIsolateData(void); - -/** - * Returns the callback data associated with the given isolate. This - * data was set when the isolate got created or initialized. - */ -DART_EXPORT void* Dart_IsolateData(Dart_Isolate isolate); - -/** - * Returns the current isolate group. Will return NULL if there is no - * current isolate group. - */ -DART_EXPORT Dart_IsolateGroup Dart_CurrentIsolateGroup(void); - -/** - * Returns the callback data associated with the current isolate group. This - * data was passed to the isolate group when it was created. - */ -DART_EXPORT void* Dart_CurrentIsolateGroupData(void); - -/** - * Gets an id that uniquely identifies current isolate group. - * - * It is the responsibility of the caller to free the returned ID. - */ -typedef int64_t Dart_IsolateGroupId; -DART_EXPORT Dart_IsolateGroupId Dart_CurrentIsolateGroupId(void); - -/** - * Returns the callback data associated with the specified isolate group. This - * data was passed to the isolate when it was created. - * The embedder is responsible for ensuring the consistency of this data - * with respect to the lifecycle of an isolate group. - */ -DART_EXPORT void* Dart_IsolateGroupData(Dart_Isolate isolate); - -/** - * Returns the debugging name for the current isolate. - * - * This name is unique to each isolate and should only be used to make - * debugging messages more comprehensible. - */ -DART_EXPORT Dart_Handle Dart_DebugName(void); - -/** - * Returns the debugging name for the current isolate. - * - * This name is unique to each isolate and should only be used to make - * debugging messages more comprehensible. - * - * The returned string is scope allocated and is only valid until the next call - * to Dart_ExitScope. - */ -DART_EXPORT const char* Dart_DebugNameToCString(void); - -/** - * Returns the ID for an isolate which is used to query the service protocol. - * - * It is the responsibility of the caller to free the returned ID. - */ -DART_EXPORT const char* Dart_IsolateServiceId(Dart_Isolate isolate); - -/** - * Enters an isolate. After calling this function, - * the current isolate will be set to the provided isolate. - * - * Requires there to be no current isolate. Multiple threads may not be in - * the same isolate at once. - */ -DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate); - -/** - * Kills the given isolate. - * - * This function has the same effect as dart:isolate's - * Isolate.kill(priority:immediate). - * It can interrupt ordinary Dart code but not native code. If the isolate is - * in the middle of a long running native function, the isolate will not be - * killed until control returns to Dart. - * - * Does not require a current isolate. It is safe to kill the current isolate if - * there is one. - */ -DART_EXPORT void Dart_KillIsolate(Dart_Isolate isolate); - -/** - * Notifies the VM that the embedder expects to be idle until |deadline|. The VM - * may use this time to perform garbage collection or other tasks to avoid - * delays during execution of Dart code in the future. - * - * |deadline| is measured in microseconds against the system's monotonic time. - * This clock can be accessed via Dart_TimelineGetMicros(). - * - * Requires there to be a current isolate. - */ -DART_EXPORT void Dart_NotifyIdle(int64_t deadline); - -typedef void (*Dart_HeapSamplingReportCallback)(void* context, void* data); - -typedef void* (*Dart_HeapSamplingCreateCallback)( - Dart_Isolate isolate, - Dart_IsolateGroup isolate_group, - const char* cls_name, - intptr_t allocation_size); -typedef void (*Dart_HeapSamplingDeleteCallback)(void* data); - -/** - * Starts the heap sampling profiler for each thread in the VM. - */ -DART_EXPORT void Dart_EnableHeapSampling(void); - -/* - * Stops the heap sampling profiler for each thread in the VM. - */ -DART_EXPORT void Dart_DisableHeapSampling(void); - -/* Registers callbacks are invoked once per sampled allocation upon object - * allocation and garbage collection. - * - * |create_callback| can be used to associate additional data with the sampled - * allocation, such as a stack trace. This data pointer will be passed to - * |delete_callback| to allow for proper disposal when the object associated - * with the allocation sample is collected. - * - * The provided callbacks must not call into the VM and should do as little - * work as possible to avoid performance penalities during object allocation and - * garbage collection. - * - * NOTE: It is a fatal error to set either callback to null once they have been - * initialized. - */ -DART_EXPORT void Dart_RegisterHeapSamplingCallback( - Dart_HeapSamplingCreateCallback create_callback, - Dart_HeapSamplingDeleteCallback delete_callback); - -/* - * Reports the surviving allocation samples for all live isolate groups in the - * VM. - * - * When the callback is invoked: - * - |context| will be the context object provided when invoking - * |Dart_ReportSurvivingAllocations|. This can be safely set to null if not - * required. - * - |heap_size| will be equal to the size of the allocated object associated - * with the sample. - * - |cls_name| will be a C String representing - * the class name of the allocated object. This string is valid for the - * duration of the call to Dart_ReportSurvivingAllocations and can be - * freed by the VM at any point after the method returns. - * - |data| will be set to the data associated with the sample by - * |Dart_HeapSamplingCreateCallback|. - * - * If |force_gc| is true, a full GC will be performed before reporting the - * allocations. - */ -DART_EXPORT void Dart_ReportSurvivingAllocations( - Dart_HeapSamplingReportCallback callback, - void* context, - bool force_gc); - -/* - * Sets the average heap sampling rate based on a number of |bytes| for each - * thread. - * - * In other words, approximately every |bytes| allocated will create a sample. - * Defaults to 512 KiB. - */ -DART_EXPORT void Dart_SetHeapSamplingPeriod(intptr_t bytes); - -/** - * Notifies the VM that the embedder expects the application's working set has - * recently shrunk significantly and is not expected to rise in the near future. - * The VM may spend O(heap-size) time performing clean up work. - * - * Requires there to be a current isolate. - */ -DART_EXPORT void Dart_NotifyDestroyed(void); - -/** - * Notifies the VM that the system is running low on memory. - * - * Does not require a current isolate. Only valid after calling Dart_Initialize. - */ -DART_EXPORT void Dart_NotifyLowMemory(void); - -typedef enum { - /** - * Balanced - */ - Dart_PerformanceMode_Default, - /** - * Optimize for low latency, at the expense of throughput and memory overhead - * by performing work in smaller batches (requiring more overhead) or by - * delaying work (requiring more memory). An embedder should not remain in - * this mode indefinitely. - */ - Dart_PerformanceMode_Latency, - /** - * Optimize for high throughput, at the expense of latency and memory overhead - * by performing work in larger batches with more intervening growth. - */ - Dart_PerformanceMode_Throughput, - /** - * Optimize for low memory, at the expensive of throughput and latency by more - * frequently performing work. - */ - Dart_PerformanceMode_Memory, -} Dart_PerformanceMode; - -/** - * Set the desired performance trade-off. - * - * Requires a current isolate. - * - * Returns the previous performance mode. - */ -DART_EXPORT Dart_PerformanceMode -Dart_SetPerformanceMode(Dart_PerformanceMode mode); - -/** - * Starts the CPU sampling profiler. - */ -DART_EXPORT void Dart_StartProfiling(void); - -/** - * Stops the CPU sampling profiler. - * - * Note that some profile samples might still be taken after this function - * returns due to the asynchronous nature of the implementation on some - * platforms. - */ -DART_EXPORT void Dart_StopProfiling(void); - -/** - * Notifies the VM that the current thread should not be profiled until a - * matching call to Dart_ThreadEnableProfiling is made. - * - * NOTE: By default, if a thread has entered an isolate it will be profiled. - * This function should be used when an embedder knows a thread is about - * to make a blocking call and wants to avoid unnecessary interrupts by - * the profiler. - */ -DART_EXPORT void Dart_ThreadDisableProfiling(void); - -/** - * Notifies the VM that the current thread should be profiled. - * - * NOTE: It is only legal to call this function *after* calling - * Dart_ThreadDisableProfiling. - * - * NOTE: By default, if a thread has entered an isolate it will be profiled. - */ -DART_EXPORT void Dart_ThreadEnableProfiling(void); - -/** - * Register symbol information for the Dart VM's profiler and crash dumps. - * - * This consumes the output of //topaz/runtime/dart/profiler_symbols, which - * should be treated as opaque. - */ -DART_EXPORT void Dart_AddSymbols(const char* dso_name, - void* buffer, - intptr_t buffer_size); - -/** - * Exits an isolate. After this call, Dart_CurrentIsolate will - * return NULL. - * - * Requires there to be a current isolate. - */ -DART_EXPORT void Dart_ExitIsolate(void); -/* TODO(turnidge): We don't want users of the api to be able to exit a - * "pure" dart isolate. Implement and document. */ - -/** - * Creates a full snapshot of the current isolate heap. - * - * A full snapshot is a compact representation of the dart vm isolate heap - * and dart isolate heap states. These snapshots are used to initialize - * the vm isolate on startup and fast initialization of an isolate. - * A Snapshot of the heap is created before any dart code has executed. - * - * Requires there to be a current isolate. Not available in the precompiled - * runtime (check Dart_IsPrecompiledRuntime). - * - * \param vm_snapshot_data_buffer Returns a pointer to a buffer containing the - * vm snapshot. This buffer is scope allocated and is only valid - * until the next call to Dart_ExitScope. - * \param vm_snapshot_data_size Returns the size of vm_snapshot_data_buffer. - * \param isolate_snapshot_data_buffer Returns a pointer to a buffer containing - * the isolate snapshot. This buffer is scope allocated and is only valid - * until the next call to Dart_ExitScope. - * \param isolate_snapshot_data_size Returns the size of - * isolate_snapshot_data_buffer. - * \param is_core Create a snapshot containing core libraries. - * Such snapshot should be agnostic to null safety mode. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_CreateSnapshot(uint8_t** vm_snapshot_data_buffer, - intptr_t* vm_snapshot_data_size, - uint8_t** isolate_snapshot_data_buffer, - intptr_t* isolate_snapshot_data_size, - bool is_core); - -/** - * Returns whether the buffer contains a kernel file. - * - * \param buffer Pointer to a buffer that might contain a kernel binary. - * \param buffer_size Size of the buffer. - * - * \return Whether the buffer contains a kernel binary (full or partial). - */ -DART_EXPORT bool Dart_IsKernel(const uint8_t* buffer, intptr_t buffer_size); - -/** - * Make isolate runnable. - * - * When isolates are spawned, this function is used to indicate that - * the creation and initialization (including script loading) of the - * isolate is complete and the isolate can start. - * This function expects there to be no current isolate. - * - * \param isolate The isolate to be made runnable. - * - * \return NULL if successful. Returns an error message otherwise. The caller - * is responsible for freeing the error message. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_IsolateMakeRunnable( - Dart_Isolate isolate); - -/* - * ================== - * Messages and Ports - * ================== - */ - -/** - * A port is used to send or receive inter-isolate messages - */ -typedef int64_t Dart_Port; -typedef struct { - int64_t port_id; - int64_t origin_id; -} Dart_PortEx; - -/** - * ILLEGAL_PORT is a port number guaranteed never to be associated with a valid - * port. - */ -#define ILLEGAL_PORT ((Dart_Port)0) - -/** - * A message notification callback. - * - * This callback allows the embedder to provide a custom wakeup mechanism for - * the delivery of inter-isolate messages. This function is called once per - * message on an arbitrary thread. It is the responsibility of the embedder to - * eventually call Dart_HandleMessage once per callback received with the - * destination isolate set as the current isolate to process the message. - */ -typedef void (*Dart_MessageNotifyCallback)(Dart_Isolate destination_isolate); - -/** - * Allows embedders to provide a custom wakeup mechanism for the delivery of - * inter-isolate messages. This setting only applies to the current isolate. - * - * This mechanism is optional: if not provided, the isolate will be scheduled on - * a VM-managed thread pool. An embedder should provide this callback if it - * wants to run an isolate on a specific thread or to interleave handling of - * inter-isolate messages with other event sources. - * - * Most embedders will only call this function once, before isolate - * execution begins. If this function is called after isolate - * execution begins, the embedder is responsible for threading issues. - */ -DART_EXPORT void Dart_SetMessageNotifyCallback( - Dart_MessageNotifyCallback message_notify_callback); -/* TODO(turnidge): Consider moving this to isolate creation so that it - * is impossible to mess up. */ - -/** - * Query the current message notify callback for the isolate. - * - * \return The current message notify callback for the isolate. - */ -DART_EXPORT Dart_MessageNotifyCallback Dart_GetMessageNotifyCallback(void); - -/** - * The VM's default message handler supports pausing an isolate before it - * processes the first message and right after the it processes the isolate's - * final message. This can be controlled for all isolates by two VM flags: - * - * `--pause-isolates-on-start` - * `--pause-isolates-on-exit` - * - * Additionally, Dart_SetShouldPauseOnStart and Dart_SetShouldPauseOnExit can be - * used to control this behaviour on a per-isolate basis. - * - * When an embedder is using a Dart_MessageNotifyCallback the embedder - * needs to cooperate with the VM so that the service protocol can report - * accurate information about isolates and so that tools such as debuggers - * work reliably. - * - * The following functions can be used to implement pausing on start and exit. - */ - -/** - * If the VM flag `--pause-isolates-on-start` was passed this will be true. - * - * \return A boolean value indicating if pause on start was requested. - */ -DART_EXPORT bool Dart_ShouldPauseOnStart(void); - -/** - * Override the VM flag `--pause-isolates-on-start` for the current isolate. - * - * \param should_pause Should the isolate be paused on start? - * - * NOTE: This must be called before Dart_IsolateMakeRunnable. - */ -DART_EXPORT void Dart_SetShouldPauseOnStart(bool should_pause); - -/** - * Is the current isolate paused on start? - * - * \return A boolean value indicating if the isolate is paused on start. - */ -DART_EXPORT bool Dart_IsPausedOnStart(void); - -/** - * Called when the embedder has paused the current isolate on start and when - * the embedder has resumed the isolate. - * - * \param paused Is the isolate paused on start? - */ -DART_EXPORT void Dart_SetPausedOnStart(bool paused); - -/** - * If the VM flag `--pause-isolates-on-exit` was passed this will be true. - * - * \return A boolean value indicating if pause on exit was requested. - */ -DART_EXPORT bool Dart_ShouldPauseOnExit(void); - -/** - * Override the VM flag `--pause-isolates-on-exit` for the current isolate. - * - * \param should_pause Should the isolate be paused on exit? - * - */ -DART_EXPORT void Dart_SetShouldPauseOnExit(bool should_pause); - -/** - * Is the current isolate paused on exit? - * - * \return A boolean value indicating if the isolate is paused on exit. - */ -DART_EXPORT bool Dart_IsPausedOnExit(void); - -/** - * Called when the embedder has paused the current isolate on exit and when - * the embedder has resumed the isolate. - * - * \param paused Is the isolate paused on exit? - */ -DART_EXPORT void Dart_SetPausedOnExit(bool paused); - -/** - * Called when the embedder has caught a top level unhandled exception error - * in the current isolate. - * - * NOTE: It is illegal to call this twice on the same isolate without first - * clearing the sticky error to null. - * - * \param error The unhandled exception error. - */ -DART_EXPORT void Dart_SetStickyError(Dart_Handle error); - -/** - * Does the current isolate have a sticky error? - */ -DART_EXPORT bool Dart_HasStickyError(void); - -/** - * Gets the sticky error for the current isolate. - * - * \return A handle to the sticky error object or null. - */ -DART_EXPORT Dart_Handle Dart_GetStickyError(void); - -/** - * Handles the next pending message for the current isolate. - * - * May generate an unhandled exception error. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_HandleMessage(void); - -/** - * Handles any pending messages for the vm service for the current - * isolate. - * - * This function may be used by an embedder at a breakpoint to avoid - * pausing the vm service. - * - * This function can indirectly cause the message notify callback to - * be called. - * - * \return true if the vm service requests the program resume - * execution, false otherwise - */ -DART_EXPORT bool Dart_HandleServiceMessages(void); - -/** - * Does the current isolate have pending service messages? - * - * \return true if the isolate has pending service messages, false otherwise. - */ -DART_EXPORT bool Dart_HasServiceMessages(void); - -/** - * Processes any incoming messages for the current isolate. - * - * This function may only be used when the embedder has not provided - * an alternate message delivery mechanism with - * Dart_SetMessageCallbacks. It is provided for convenience. - * - * This function waits for incoming messages for the current - * isolate. As new messages arrive, they are handled using - * Dart_HandleMessage. The routine exits when all ports to the - * current isolate are closed. - * - * \return A valid handle if the run loop exited successfully. If an - * exception or other error occurs while processing messages, an - * error handle is returned. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_RunLoop(void); - -/** - * Lets the VM run message processing for the isolate. - * - * This function expects there to a current isolate and the current isolate - * must not have an active api scope. The VM will take care of making the - * isolate runnable (if not already), handles its message loop and will take - * care of shutting the isolate down once it's done. - * - * \param errors_are_fatal Whether uncaught errors should be fatal. - * \param on_error_port A port to notify on uncaught errors (or ILLEGAL_PORT). - * \param on_exit_port A port to notify on exit (or ILLEGAL_PORT). - * \param error A non-NULL pointer which will hold an error message if the call - * fails. The error has to be free()ed by the caller. - * - * \return If successful the VM takes ownership of the isolate and takes care - * of its message loop. If not successful the caller retains ownership of the - * isolate. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT bool Dart_RunLoopAsync( - bool errors_are_fatal, - Dart_Port on_error_port, - Dart_Port on_exit_port, - char** error); - -/* TODO(turnidge): Should this be removed from the public api? */ - -/** - * Gets the main port id for the current isolate. - */ -DART_EXPORT Dart_Port Dart_GetMainPortId(void); - -/** - * Does the current isolate have live ReceivePorts? - * - * A ReceivePort is live when it has not been closed. - */ -DART_EXPORT bool Dart_HasLivePorts(void); - -/** - * Posts a message for some isolate. The message is a serialized - * object. - * - * Requires there to be a current isolate. - * - * For posting messages outside of an isolate see \ref Dart_PostCObject. - * - * \param port_id The destination port. - * \param object An object from the current isolate. - * - * \return True if the message was posted. - */ -DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle object); - -/** - * Returns a new SendPort with the provided port id. - * - * If there is a possibility of a port closing since port_id was acquired - * for a SendPort, one should use Dart_NewSendPortEx and - * Dart_SendPortGetIdEx. - * - * \param port_id The destination port. - * - * \return A new SendPort if no errors occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id); - -/** - * Returns a new SendPort with the provided port id and origin id. - * - * \param portex_id The destination composte port id. - * - * \return A new SendPort if no errors occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewSendPortEx(Dart_PortEx portex_id); - -/** - * Gets the SendPort id for the provided SendPort. - * \param port A SendPort object whose id is desired. - * \param port_id Returns the id of the SendPort. - * \return Success if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_SendPortGetId(Dart_Handle port, - Dart_Port* port_id); - -/** - * Gets the SendPort and Origin ids for the provided SendPort. - * \param port A SendPort object whose id is desired. - * \param portex_id Returns composite id of the SendPort. - * \return Success if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_SendPortGetIdEx(Dart_Handle port, - Dart_PortEx* portex_id); -/* - * ====== - * Scopes - * ====== - */ - -/** - * Enters a new scope. - * - * All new local handles will be created in this scope. Additionally, - * some functions may return "scope allocated" memory which is only - * valid within this scope. - * - * Requires there to be a current isolate. - */ -DART_EXPORT void Dart_EnterScope(void); - -/** - * Exits a scope. - * - * The previous scope (if any) becomes the current scope. - * - * Requires there to be a current isolate. - */ -DART_EXPORT void Dart_ExitScope(void); - -/** - * The Dart VM uses "zone allocation" for temporary structures. Zones - * support very fast allocation of small chunks of memory. The chunks - * cannot be deallocated individually, but instead zones support - * deallocating all chunks in one fast operation. - * - * This function makes it possible for the embedder to allocate - * temporary data in the VMs zone allocator. - * - * Zone allocation is possible: - * 1. when inside a scope where local handles can be allocated - * 2. when processing a message from a native port in a native port - * handler - * - * All the memory allocated this way will be reclaimed either on the - * next call to Dart_ExitScope or when the native port handler exits. - * - * \param size Size of the memory to allocate. - * - * \return A pointer to the allocated memory. NULL if allocation - * failed. Failure might due to is no current VM zone. - */ -DART_EXPORT uint8_t* Dart_ScopeAllocate(intptr_t size); - -/* - * ======= - * Objects - * ======= - */ - -/** - * Returns the null object. - * - * \return A handle to the null object. - */ -DART_EXPORT Dart_Handle Dart_Null(void); - -/** - * Is this object null? - */ -DART_EXPORT bool Dart_IsNull(Dart_Handle object); - -/** - * Returns the empty string object. - * - * \return A handle to the empty string object. - */ -DART_EXPORT Dart_Handle Dart_EmptyString(void); - -/** - * Returns types that are not classes, and which therefore cannot be looked up - * as library members by Dart_GetType. - * - * \return A handle to the dynamic, void or Never type. - */ -DART_EXPORT Dart_Handle Dart_TypeDynamic(void); -DART_EXPORT Dart_Handle Dart_TypeVoid(void); -DART_EXPORT Dart_Handle Dart_TypeNever(void); - -/** - * Checks if the two objects are equal. - * - * The result of the comparison is returned through the 'equal' - * parameter. The return value itself is used to indicate success or - * failure, not equality. - * - * May generate an unhandled exception error. - * - * \param obj1 An object to be compared. - * \param obj2 An object to be compared. - * \param equal Returns the result of the equality comparison. - * - * \return A valid handle if no error occurs during the comparison. - */ -DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, - Dart_Handle obj2, - bool* equal); - -/** - * Is this object an instance of some type? - * - * The result of the test is returned through the 'instanceof' parameter. - * The return value itself is used to indicate success or failure. - * - * \param object An object. - * \param type A type. - * \param instanceof Return true if 'object' is an instance of type 'type'. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_ObjectIsType(Dart_Handle object, - Dart_Handle type, - bool* instanceof); - -/** - * Query object type. - * - * \param object Some Object. - * - * \return true if Object is of the specified type. - */ -DART_EXPORT bool Dart_IsInstance(Dart_Handle object); -DART_EXPORT bool Dart_IsNumber(Dart_Handle object); -DART_EXPORT bool Dart_IsInteger(Dart_Handle object); -DART_EXPORT bool Dart_IsDouble(Dart_Handle object); -DART_EXPORT bool Dart_IsBoolean(Dart_Handle object); -DART_EXPORT bool Dart_IsString(Dart_Handle object); -DART_EXPORT bool Dart_IsStringLatin1(Dart_Handle object); /* (ISO-8859-1) */ -DART_EXPORT bool Dart_IsList(Dart_Handle object); -DART_EXPORT bool Dart_IsMap(Dart_Handle object); -DART_EXPORT bool Dart_IsLibrary(Dart_Handle object); -DART_EXPORT bool Dart_IsType(Dart_Handle handle); -DART_EXPORT bool Dart_IsFunction(Dart_Handle handle); -DART_EXPORT bool Dart_IsVariable(Dart_Handle handle); -DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle); -DART_EXPORT bool Dart_IsClosure(Dart_Handle object); -DART_EXPORT bool Dart_IsTypedData(Dart_Handle object); -DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle object); -DART_EXPORT bool Dart_IsFuture(Dart_Handle object); - -/* - * ========= - * Instances - * ========= - */ - -/* - * For the purposes of the embedding api, not all objects returned are - * Dart language objects. Within the api, we use the term 'Instance' - * to indicate handles which refer to true Dart language objects. - * - * TODO(turnidge): Reorganize the "Object" section above, pulling down - * any functions that more properly belong here. */ - -/** - * Gets the type of a Dart language object. - * - * \param instance Some Dart object. - * - * \return If no error occurs, the type is returned. Otherwise an - * error handle is returned. - */ -DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance); - -/** - * Returns the name for the provided class type. - * - * \return A valid string handle if no error occurs during the - * operation. - */ -DART_EXPORT Dart_Handle Dart_ClassName(Dart_Handle cls_type); - -/** - * Returns the name for the provided function or method. - * - * \return A valid string handle if no error occurs during the - * operation. - */ -DART_EXPORT Dart_Handle Dart_FunctionName(Dart_Handle function); - -/** - * Returns a handle to the owner of a function. - * - * The owner of an instance method or a static method is its defining - * class. The owner of a top-level function is its defining - * library. The owner of the function of a non-implicit closure is the - * function of the method or closure that defines the non-implicit - * closure. - * - * \return A valid handle to the owner of the function, or an error - * handle if the argument is not a valid handle to a function. - */ -DART_EXPORT Dart_Handle Dart_FunctionOwner(Dart_Handle function); - -/** - * Determines whether a function handle refers to a static function - * of method. - * - * For the purposes of the embedding API, a top-level function is - * implicitly declared static. - * - * \param function A handle to a function or method declaration. - * \param is_static Returns whether the function or method is declared static. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_FunctionIsStatic(Dart_Handle function, - bool* is_static); - -/** - * Is this object a closure resulting from a tear-off (closurized method)? - * - * Returns true for closures produced when an ordinary method is accessed - * through a getter call. Returns false otherwise, in particular for closures - * produced from local function declarations. - * - * \param object Some Object. - * - * \return true if Object is a tear-off. - */ -DART_EXPORT bool Dart_IsTearOff(Dart_Handle object); - -/** - * Retrieves the function of a closure. - * - * \return A handle to the function of the closure, or an error handle if the - * argument is not a closure. - */ -DART_EXPORT Dart_Handle Dart_ClosureFunction(Dart_Handle closure); - -/** - * Returns a handle to the library which contains class. - * - * \return A valid handle to the library with owns class, null if the class - * has no library or an error handle if the argument is not a valid handle - * to a class type. - */ -DART_EXPORT Dart_Handle Dart_ClassLibrary(Dart_Handle cls_type); - -/* - * ============================= - * Numbers, Integers and Doubles - * ============================= - */ - -/** - * Does this Integer fit into a 64-bit signed integer? - * - * \param integer An integer. - * \param fits Returns true if the integer fits into a 64-bit signed integer. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, - bool* fits); - -/** - * Does this Integer fit into a 64-bit unsigned integer? - * - * \param integer An integer. - * \param fits Returns true if the integer fits into a 64-bit unsigned integer. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, - bool* fits); - -/** - * Returns an Integer with the provided value. - * - * \param value The value of the integer. - * - * \return The Integer object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value); - -/** - * Returns an Integer with the provided value. - * - * \param value The unsigned value of the integer. - * - * \return The Integer object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewIntegerFromUint64(uint64_t value); - -/** - * Returns an Integer with the provided value. - * - * \param value The value of the integer represented as a C string - * containing a hexadecimal number. - * - * \return The Integer object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* value); - -/** - * Gets the value of an Integer. - * - * The integer must fit into a 64-bit signed integer, otherwise an error occurs. - * - * \param integer An Integer. - * \param value Returns the value of the Integer. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, - int64_t* value); - -/** - * Gets the value of an Integer. - * - * The integer must fit into a 64-bit unsigned integer, otherwise an - * error occurs. - * - * \param integer An Integer. - * \param value Returns the value of the Integer. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer, - uint64_t* value); - -/** - * Gets the value of an integer as a hexadecimal C string. - * - * \param integer An Integer. - * \param value Returns the value of the Integer as a hexadecimal C - * string. This C string is scope allocated and is only valid until - * the next call to Dart_ExitScope. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer, - const char** value); - -/** - * Returns a Double with the provided value. - * - * \param value A double. - * - * \return The Double object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewDouble(double value); - -/** - * Gets the value of a Double - * - * \param double_obj A Double - * \param value Returns the value of the Double. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, double* value); - -/** - * Returns a closure of static function 'function_name' in the class 'class_name' - * in the exported namespace of specified 'library'. - * - * \param library Library object - * \param cls_type Type object representing a Class - * \param function_name Name of the static function in the class - * - * \return A valid Dart instance if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_GetStaticMethodClosure(Dart_Handle library, - Dart_Handle cls_type, - Dart_Handle function_name); - -/* - * ======== - * Booleans - * ======== - */ - -/** - * Returns the True object. - * - * Requires there to be a current isolate. - * - * \return A handle to the True object. - */ -DART_EXPORT Dart_Handle Dart_True(void); - -/** - * Returns the False object. - * - * Requires there to be a current isolate. - * - * \return A handle to the False object. - */ -DART_EXPORT Dart_Handle Dart_False(void); - -/** - * Returns a Boolean with the provided value. - * - * \param value true or false. - * - * \return The Boolean object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewBoolean(bool value); - -/** - * Gets the value of a Boolean - * - * \param boolean_obj A Boolean - * \param value Returns the value of the Boolean. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj, bool* value); - -/* - * ======= - * Strings - * ======= - */ - -/** - * Gets the length of a String. - * - * \param str A String. - * \param length Returns the length of the String. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* length); - -/** - * Gets the length of UTF-8 encoded representation for a string. - * - * \param str A String. - * \param length Returns the length of UTF-8 encoded representation for string. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_StringUTF8Length(Dart_Handle str, - intptr_t* length); - -/** - * Returns a String built from the provided C string - * (There is an implicit assumption that the C string passed in contains - * UTF-8 encoded characters and '\0' is considered as a termination - * character). - * - * \param str A C String - * - * \return The String object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str); -/* TODO(turnidge): Document what happens when we run out of memory - * during this call. */ - -/** - * Returns a String built from an array of UTF-8 encoded characters. - * - * \param utf8_array An array of UTF-8 encoded characters. - * \param length The length of the codepoints array. - * - * \return The String object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array, - intptr_t length); - -/** - * Returns a String built from an array of UTF-16 encoded characters. - * - * \param utf16_array An array of UTF-16 encoded characters. - * \param length The length of the codepoints array. - * - * \return The String object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array, - intptr_t length); - -/** - * Returns a String built from an array of UTF-32 encoded characters. - * - * \param utf32_array An array of UTF-32 encoded characters. - * \param length The length of the codepoints array. - * - * \return The String object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array, - intptr_t length); - -/** - * Gets the C string representation of a String. - * (It is a sequence of UTF-8 encoded values with a '\0' termination.) - * - * \param str A string. - * \param cstr Returns the String represented as a C string. - * This C string is scope allocated and is only valid until - * the next call to Dart_ExitScope. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle str, - const char** cstr); - -/** - * Gets a UTF-8 encoded representation of a String. - * - * Any unpaired surrogate code points in the string will be converted as - * replacement characters (U+FFFD, 0xEF 0xBF 0xBD in UTF-8). If you need - * to preserve unpaired surrogates, use the Dart_StringToUTF16 function. - * - * \param str A string. - * \param utf8_array Returns the String represented as UTF-8 code - * units. This UTF-8 array is scope allocated and is only valid - * until the next call to Dart_ExitScope. - * \param length Used to return the length of the array which was - * actually used. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str, - uint8_t** utf8_array, - intptr_t* length); - -/** - * Copies the UTF-8 encoded representation of a String into specified buffer. - * - * Any unpaired surrogate code points in the string will be converted as - * replacement characters (U+FFFD, 0xEF 0xBF 0xBD in UTF-8). - * - * \param str A string. - * \param utf8_array Buffer into which the UTF-8 encoded representation of - * the string is copied into. - * The buffer is allocated and managed by the caller. - * \param length Specifies the length of the buffer passed in. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_CopyUTF8EncodingOfString(Dart_Handle str, - uint8_t* utf8_array, - intptr_t length); - -/** - * Gets the data corresponding to the string object. This function returns - * the data only for Latin-1 (ISO-8859-1) string objects. For all other - * string objects it returns an error. - * - * \param str A string. - * \param latin1_array An array allocated by the caller, used to return - * the string data. - * \param length Used to pass in the length of the provided array. - * Used to return the length of the array which was actually used. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_StringToLatin1(Dart_Handle str, - uint8_t* latin1_array, - intptr_t* length); - -/** - * Gets the UTF-16 encoded representation of a string. - * - * \param str A string. - * \param utf16_array An array allocated by the caller, used to return - * the array of UTF-16 encoded characters. - * \param length Used to pass in the length of the provided array. - * Used to return the length of the array which was actually used. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str, - uint16_t* utf16_array, - intptr_t* length); - -/** - * Gets the storage size in bytes of a String. - * - * \param str A String. - * \param size Returns the storage size in bytes of the String. - * This is the size in bytes needed to store the String. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_StringStorageSize(Dart_Handle str, intptr_t* size); - -/** - * Retrieves some properties associated with a String. - * Properties retrieved are: - * - character size of the string (one or two byte) - * - length of the string - * - peer pointer of string if it is an external string. - * \param str A String. - * \param char_size Returns the character size of the String. - * \param str_len Returns the length of the String. - * \param peer Returns the peer pointer associated with the String or 0 if - * there is no peer pointer for it. - * \return Success if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle str, - intptr_t* char_size, - intptr_t* str_len, - void** peer); - -/* - * ===== - * Lists - * ===== - */ - -/** - * Returns a List of the desired length. - * - * \param length The length of the list. - * - * \return The List object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewList(intptr_t length); - -/** - * Returns a List of the desired length with the desired element type. - * - * \param element_type Handle to a nullable type object. E.g., from - * Dart_GetType or Dart_GetNullableType. - * - * \param length The length of the list. - * - * \return The List object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewListOfType(Dart_Handle element_type, - intptr_t length); - -/** - * Returns a List of the desired length with the desired element type, filled - * with the provided object. - * - * \param element_type Handle to a type object. E.g., from Dart_GetType. - * - * \param fill_object Handle to an object of type 'element_type' that will be - * used to populate the list. This parameter can only be Dart_Null() if the - * length of the list is 0 or 'element_type' is a nullable type. - * - * \param length The length of the list. - * - * \return The List object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewListOfTypeFilled(Dart_Handle element_type, - Dart_Handle fill_object, - intptr_t length); - -/** - * Gets the length of a List. - * - * May generate an unhandled exception error. - * - * \param list A List. - * \param length Returns the length of the List. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_ListLength(Dart_Handle list, intptr_t* length); - -/** - * Gets the Object at some index of a List. - * - * If the index is out of bounds, an error occurs. - * - * May generate an unhandled exception error. - * - * \param list A List. - * \param index A valid index into the List. - * - * \return The Object in the List at the specified index if no error - * occurs. Otherwise returns an error handle. - */ -DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index); - -/** -* Gets a range of Objects from a List. -* -* If any of the requested index values are out of bounds, an error occurs. -* -* May generate an unhandled exception error. -* -* \param list A List. -* \param offset The offset of the first item to get. -* \param length The number of items to get. -* \param result A pointer to fill with the objects. -* -* \return Success if no error occurs during the operation. -*/ -DART_EXPORT Dart_Handle Dart_ListGetRange(Dart_Handle list, - intptr_t offset, - intptr_t length, - Dart_Handle* result); - -/** - * Sets the Object at some index of a List. - * - * If the index is out of bounds, an error occurs. - * - * May generate an unhandled exception error. - * - * \param list A List. - * \param index A valid index into the List. - * \param value The Object to put in the List. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, - intptr_t index, - Dart_Handle value); - -/** - * May generate an unhandled exception error. - */ -DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list, - intptr_t offset, - uint8_t* native_array, - intptr_t length); - -/** - * May generate an unhandled exception error. - */ -DART_EXPORT Dart_Handle Dart_ListSetAsBytes(Dart_Handle list, - intptr_t offset, - const uint8_t* native_array, - intptr_t length); - -/* - * ==== - * Maps - * ==== - */ - -/** - * Gets the Object at some key of a Map. - * - * May generate an unhandled exception error. - * - * \param map A Map. - * \param key An Object. - * - * \return The value in the map at the specified key, null if the map does not - * contain the key, or an error handle. - */ -DART_EXPORT Dart_Handle Dart_MapGetAt(Dart_Handle map, Dart_Handle key); - -/** - * Returns whether the Map contains a given key. - * - * May generate an unhandled exception error. - * - * \param map A Map. - * - * \return A handle on a boolean indicating whether map contains the key. - * Otherwise returns an error handle. - */ -DART_EXPORT Dart_Handle Dart_MapContainsKey(Dart_Handle map, Dart_Handle key); - -/** - * Gets the list of keys of a Map. - * - * May generate an unhandled exception error. - * - * \param map A Map. - * - * \return The list of key Objects if no error occurs. Otherwise returns an - * error handle. - */ -DART_EXPORT Dart_Handle Dart_MapKeys(Dart_Handle map); - -/* - * ========== - * Typed Data - * ========== - */ - -typedef enum { - Dart_TypedData_kByteData = 0, - Dart_TypedData_kInt8, - Dart_TypedData_kUint8, - Dart_TypedData_kUint8Clamped, - Dart_TypedData_kInt16, - Dart_TypedData_kUint16, - Dart_TypedData_kInt32, - Dart_TypedData_kUint32, - Dart_TypedData_kInt64, - Dart_TypedData_kUint64, - Dart_TypedData_kFloat32, - Dart_TypedData_kFloat64, - Dart_TypedData_kInt32x4, - Dart_TypedData_kFloat32x4, - Dart_TypedData_kFloat64x2, - Dart_TypedData_kInvalid -} Dart_TypedData_Type; - -/** - * Return type if this object is a TypedData object. - * - * \return kInvalid if the object is not a TypedData object or the appropriate - * Dart_TypedData_Type. - */ -DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object); - -/** - * Return type if this object is an external TypedData object. - * - * \return kInvalid if the object is not an external TypedData object or - * the appropriate Dart_TypedData_Type. - */ -DART_EXPORT Dart_TypedData_Type -Dart_GetTypeOfExternalTypedData(Dart_Handle object); - -/** - * Returns a TypedData object of the desired length and type. - * - * \param type The type of the TypedData object. - * \param length The length of the TypedData object (length in type units). - * - * \return The TypedData object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewTypedData(Dart_TypedData_Type type, - intptr_t length); - -/** - * Returns a TypedData object which references an external data array. - * - * \param type The type of the data array. - * \param data A data array. This array must not move. - * \param length The length of the data array (length in type units). - * - * \return The TypedData object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewExternalTypedData(Dart_TypedData_Type type, - void* data, - intptr_t length); - -/** - * Returns a TypedData object which references an external data array. - * - * \param type The type of the data array. - * \param data A data array. This array must not move. - * \param length The length of the data array (length in type units). - * \param peer A pointer to a native object or NULL. This value is - * provided to callback when it is invoked. - * \param external_allocation_size The number of externally allocated - * bytes for peer. Used to inform the garbage collector. - * \param callback A function pointer that will be invoked sometime - * after the object is garbage collected, unless the handle has been deleted. - * A valid callback needs to be specified it cannot be NULL. - * - * \return The TypedData object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle -Dart_NewExternalTypedDataWithFinalizer(Dart_TypedData_Type type, - void* data, - intptr_t length, - void* peer, - intptr_t external_allocation_size, - Dart_HandleFinalizer callback); -DART_EXPORT Dart_Handle Dart_NewUnmodifiableExternalTypedDataWithFinalizer( - Dart_TypedData_Type type, - const void* data, - intptr_t length, - void* peer, - intptr_t external_allocation_size, - Dart_HandleFinalizer callback); - -/** - * Returns a ByteBuffer object for the typed data. - * - * \param typed_data The TypedData object. - * - * \return The ByteBuffer object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data); - -/** - * Acquires access to the internal data address of a TypedData object. - * - * \param object The typed data object whose internal data address is to - * be accessed. - * \param type The type of the object is returned here. - * \param data The internal data address is returned here. - * \param len Size of the typed array is returned here. - * - * Notes: - * When the internal address of the object is acquired any calls to a - * Dart API function that could potentially allocate an object or run - * any Dart code will return an error. - * - * Any Dart API functions for accessing the data should not be called - * before the corresponding release. In particular, the object should - * not be acquired again before its release. This leads to undefined - * behavior. - * - * \return Success if the internal data address is acquired successfully. - * Otherwise, returns an error handle. - */ -DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, - Dart_TypedData_Type* type, - void** data, - intptr_t* len); - -/** - * Releases access to the internal data address that was acquired earlier using - * Dart_TypedDataAcquireData. - * - * \param object The typed data object whose internal data address is to be - * released. - * - * \return Success if the internal data address is released successfully. - * Otherwise, returns an error handle. - */ -DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object); - -/** - * Returns the TypedData object associated with the ByteBuffer object. - * - * \param byte_buffer The ByteBuffer object. - * - * \return The TypedData object if no error occurs. Otherwise returns - * an error handle. - */ -DART_EXPORT Dart_Handle Dart_GetDataFromByteBuffer(Dart_Handle byte_buffer); - -/* - * ============================================================ - * Invoking Constructors, Methods, Closures and Field accessors - * ============================================================ - */ - -/** - * Invokes a constructor, creating a new object. - * - * This function allows hidden constructors (constructors with leading - * underscores) to be called. - * - * \param type Type of object to be constructed. - * \param constructor_name The name of the constructor to invoke. Use - * Dart_Null() or Dart_EmptyString() to invoke the unnamed constructor. - * This name should not include the name of the class. - * \param number_of_arguments Size of the arguments array. - * \param arguments An array of arguments to the constructor. - * - * \return If the constructor is called and completes successfully, - * then the new object. If an error occurs during execution, then an - * error handle is returned. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_New(Dart_Handle type, - Dart_Handle constructor_name, - int number_of_arguments, - Dart_Handle* arguments); - -/** - * Allocate a new object without invoking a constructor. - * - * \param type The type of an object to be allocated. - * - * \return The new object. If an error occurs during execution, then an - * error handle is returned. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_Allocate(Dart_Handle type); - -/** - * Allocate a new object without invoking a constructor, and sets specified - * native fields. - * - * \param type The type of an object to be allocated. - * \param num_native_fields The number of native fields to set. - * \param native_fields An array containing the value of native fields. - * - * \return The new object. If an error occurs during execution, then an - * error handle is returned. - */ -DART_EXPORT Dart_Handle -Dart_AllocateWithNativeFields(Dart_Handle type, - intptr_t num_native_fields, - const intptr_t* native_fields); - -/** - * Invokes a method or function. - * - * The 'target' parameter may be an object, type, or library. If - * 'target' is an object, then this function will invoke an instance - * method. If 'target' is a type, then this function will invoke a - * static method. If 'target' is a library, then this function will - * invoke a top-level function from that library. - * NOTE: This API call cannot be used to invoke methods of a type object. - * - * This function ignores visibility (leading underscores in names). - * - * May generate an unhandled exception error. - * - * \param target An object, type, or library. - * \param name The name of the function or method to invoke. - * \param number_of_arguments Size of the arguments array. - * \param arguments An array of arguments to the function. - * - * \return If the function or method is called and completes - * successfully, then the return value is returned. If an error - * occurs during execution, then an error handle is returned. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_Invoke(Dart_Handle target, - Dart_Handle name, - int number_of_arguments, - Dart_Handle* arguments); -/* TODO(turnidge): Document how to invoke operators. */ - -/** - * Invokes a Closure with the given arguments. - * - * May generate an unhandled exception error. - * - * \return If no error occurs during execution, then the result of - * invoking the closure is returned. If an error occurs during - * execution, then an error handle is returned. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_InvokeClosure(Dart_Handle closure, - int number_of_arguments, - Dart_Handle* arguments); - -/** - * Invokes a Generative Constructor on an object that was previously - * allocated using Dart_Allocate/Dart_AllocateWithNativeFields. - * - * The 'object' parameter must be an object. - * - * This function ignores visibility (leading underscores in names). - * - * May generate an unhandled exception error. - * - * \param object An object. - * \param name The name of the constructor to invoke. - * Use Dart_Null() or Dart_EmptyString() to invoke the unnamed constructor. - * \param number_of_arguments Size of the arguments array. - * \param arguments An array of arguments to the function. - * - * \return If the constructor is called and completes - * successfully, then the object is returned. If an error - * occurs during execution, then an error handle is returned. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_InvokeConstructor(Dart_Handle object, - Dart_Handle name, - int number_of_arguments, - Dart_Handle* arguments); - -/** - * Gets the value of a field. - * - * The 'container' parameter may be an object, type, or library. If - * 'container' is an object, then this function will access an - * instance field. If 'container' is a type, then this function will - * access a static field. If 'container' is a library, then this - * function will access a top-level variable. - * NOTE: This API call cannot be used to access fields of a type object. - * - * This function ignores field visibility (leading underscores in names). - * - * May generate an unhandled exception error. - * - * \param container An object, type, or library. - * \param name A field name. - * - * \return If no error occurs, then the value of the field is - * returned. Otherwise an error handle is returned. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_GetField(Dart_Handle container, Dart_Handle name); - -/** - * Sets the value of a field. - * - * The 'container' parameter may actually be an object, type, or - * library. If 'container' is an object, then this function will - * access an instance field. If 'container' is a type, then this - * function will access a static field. If 'container' is a library, - * then this function will access a top-level variable. - * NOTE: This API call cannot be used to access fields of a type object. - * - * This function ignores field visibility (leading underscores in names). - * - * May generate an unhandled exception error. - * - * \param container An object, type, or library. - * \param name A field name. - * \param value The new field value. - * - * \return A valid handle if no error occurs. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_SetField(Dart_Handle container, Dart_Handle name, Dart_Handle value); - -/* - * ========== - * Exceptions - * ========== - */ - -/* - * TODO(turnidge): Remove these functions from the api and replace all - * uses with Dart_NewUnhandledExceptionError. */ - -/** - * Throws an exception. - * - * This function causes a Dart language exception to be thrown. This - * will proceed in the standard way, walking up Dart frames until an - * appropriate 'catch' block is found, executing 'finally' blocks, - * etc. - * - * If an error handle is passed into this function, the error is - * propagated immediately. See Dart_PropagateError for a discussion - * of error propagation. - * - * If successful, this function does not return. Note that this means - * that the destructors of any stack-allocated C++ objects will not be - * called. If there are no Dart frames on the stack, an error occurs. - * - * \return An error handle if the exception was not thrown. - * Otherwise the function does not return. - */ -DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception); - -/** - * Rethrows an exception. - * - * Rethrows an exception, unwinding all dart frames on the stack. If - * successful, this function does not return. Note that this means - * that the destructors of any stack-allocated C++ objects will not be - * called. If there are no Dart frames on the stack, an error occurs. - * - * \return An error handle if the exception was not thrown. - * Otherwise the function does not return. - */ -DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, - Dart_Handle stacktrace); - -/* - * =========================== - * Native fields and functions - * =========================== - */ - -/** - * Gets the number of native instance fields in an object. - */ -DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj, - int* count); - -/** - * Gets the value of a native field. - * - * TODO(turnidge): Document. - */ -DART_EXPORT Dart_Handle Dart_GetNativeInstanceField(Dart_Handle obj, - int index, - intptr_t* value); - -/** - * Sets the value of a native field. - * - * TODO(turnidge): Document. - */ -DART_EXPORT Dart_Handle Dart_SetNativeInstanceField(Dart_Handle obj, - int index, - intptr_t value); - -/** - * The arguments to a native function. - * - * This object is passed to a native function to represent its - * arguments and return value. It allows access to the arguments to a - * native function by index. It also allows the return value of a - * native function to be set. - */ -typedef struct _Dart_NativeArguments* Dart_NativeArguments; - -/** - * Extracts current isolate group data from the native arguments structure. - */ -DART_EXPORT void* Dart_GetNativeIsolateGroupData(Dart_NativeArguments args); - -typedef enum { - Dart_NativeArgument_kBool = 0, - Dart_NativeArgument_kInt32, - Dart_NativeArgument_kUint32, - Dart_NativeArgument_kInt64, - Dart_NativeArgument_kUint64, - Dart_NativeArgument_kDouble, - Dart_NativeArgument_kString, - Dart_NativeArgument_kInstance, - Dart_NativeArgument_kNativeFields, -} Dart_NativeArgument_Type; - -typedef struct _Dart_NativeArgument_Descriptor { - uint8_t type; - uint8_t index; -} Dart_NativeArgument_Descriptor; - -typedef union _Dart_NativeArgument_Value { - bool as_bool; - int32_t as_int32; - uint32_t as_uint32; - int64_t as_int64; - uint64_t as_uint64; - double as_double; - struct { - Dart_Handle dart_str; - void* peer; - } as_string; - struct { - intptr_t num_fields; - intptr_t* values; - } as_native_fields; - Dart_Handle as_instance; -} Dart_NativeArgument_Value; - -enum { - kNativeArgNumberPos = 0, - kNativeArgNumberSize = 8, - kNativeArgTypePos = kNativeArgNumberPos + kNativeArgNumberSize, - kNativeArgTypeSize = 8, -}; - -#define BITMASK(size) ((1 << size) - 1) -#define DART_NATIVE_ARG_DESCRIPTOR(type, position) \ - (((type & BITMASK(kNativeArgTypeSize)) << kNativeArgTypePos) | \ - (position & BITMASK(kNativeArgNumberSize))) - -/** - * Gets the native arguments based on the types passed in and populates - * the passed arguments buffer with appropriate native values. - * - * \param args the Native arguments block passed into the native call. - * \param num_arguments length of argument descriptor array and argument - * values array passed in. - * \param arg_descriptors an array that describes the arguments that - * need to be retrieved. For each argument to be retrieved the descriptor - * contains the argument number (0, 1 etc.) and the argument type - * described using Dart_NativeArgument_Type, e.g: - * DART_NATIVE_ARG_DESCRIPTOR(Dart_NativeArgument_kBool, 1) indicates - * that the first argument is to be retrieved and it should be a boolean. - * \param arg_values array into which the native arguments need to be - * extracted into, the array is allocated by the caller (it could be - * stack allocated to avoid the malloc/free performance overhead). - * - * \return Success if all the arguments could be extracted correctly, - * returns an error handle if there were any errors while extracting the - * arguments (mismatched number of arguments, incorrect types, etc.). - */ -DART_EXPORT Dart_Handle -Dart_GetNativeArguments(Dart_NativeArguments args, - int num_arguments, - const Dart_NativeArgument_Descriptor* arg_descriptors, - Dart_NativeArgument_Value* arg_values); - -/** - * Gets the native argument at some index. - */ -DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, - int index); -/* TODO(turnidge): Specify the behavior of an out-of-bounds access. */ - -/** - * Gets the number of native arguments. - */ -DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args); - -/** - * Gets all the native fields of the native argument at some index. - * \param args Native arguments structure. - * \param arg_index Index of the desired argument in the structure above. - * \param num_fields size of the intptr_t array 'field_values' passed in. - * \param field_values intptr_t array in which native field values are returned. - * \return Success if the native fields where copied in successfully. Otherwise - * returns an error handle. On success the native field values are copied - * into the 'field_values' array, if the argument at 'arg_index' is a - * null object then 0 is copied as the native field values into the - * 'field_values' array. - */ -DART_EXPORT Dart_Handle -Dart_GetNativeFieldsOfArgument(Dart_NativeArguments args, - int arg_index, - int num_fields, - intptr_t* field_values); - -/** - * Gets the native field of the receiver. - */ -DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args, - intptr_t* value); - -/** - * Gets a string native argument at some index. - * \param args Native arguments structure. - * \param arg_index Index of the desired argument in the structure above. - * \param peer Returns the peer pointer if the string argument has one. - * \return Success if the string argument has a peer, if it does not - * have a peer then the String object is returned. Otherwise returns - * an error handle (argument is not a String object). - */ -DART_EXPORT Dart_Handle Dart_GetNativeStringArgument(Dart_NativeArguments args, - int arg_index, - void** peer); - -/** - * Gets an integer native argument at some index. - * \param args Native arguments structure. - * \param index Index of the desired argument in the structure above. - * \param value Returns the integer value if the argument is an Integer. - * \return Success if no error occurs. Otherwise returns an error handle. - */ -DART_EXPORT Dart_Handle Dart_GetNativeIntegerArgument(Dart_NativeArguments args, - int index, - int64_t* value); - -/** - * Gets a boolean native argument at some index. - * \param args Native arguments structure. - * \param index Index of the desired argument in the structure above. - * \param value Returns the boolean value if the argument is a Boolean. - * \return Success if no error occurs. Otherwise returns an error handle. - */ -DART_EXPORT Dart_Handle Dart_GetNativeBooleanArgument(Dart_NativeArguments args, - int index, - bool* value); - -/** - * Gets a double native argument at some index. - * \param args Native arguments structure. - * \param index Index of the desired argument in the structure above. - * \param value Returns the double value if the argument is a double. - * \return Success if no error occurs. Otherwise returns an error handle. - */ -DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args, - int index, - double* value); - -/** - * Sets the return value for a native function. - * - * If retval is an Error handle, then error will be propagated once - * the native functions exits. See Dart_PropagateError for a - * discussion of how different types of errors are propagated. - */ -DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, - Dart_Handle retval); - -DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args, - Dart_WeakPersistentHandle rval); - -DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, - bool retval); - -DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, - int64_t retval); - -DART_EXPORT void Dart_SetDoubleReturnValue(Dart_NativeArguments args, - double retval); - -/** - * A native function. - */ -typedef void (*Dart_NativeFunction)(Dart_NativeArguments arguments); - -/** - * Native entry resolution callback. - * - * For libraries and scripts which have native functions, the embedder - * can provide a native entry resolver. This callback is used to map a - * name/arity to a Dart_NativeFunction. If no function is found, the - * callback should return NULL. - * - * The parameters to the native resolver function are: - * \param name a Dart string which is the name of the native function. - * \param num_of_arguments is the number of arguments expected by the - * native function. - * \param auto_setup_scope is a boolean flag that can be set by the resolver - * to indicate if this function needs a Dart API scope (see Dart_EnterScope/ - * Dart_ExitScope) to be setup automatically by the VM before calling into - * the native function. By default most native functions would require this - * to be true but some light weight native functions which do not call back - * into the VM through the Dart API may not require a Dart scope to be - * setup automatically. - * - * \return A valid Dart_NativeFunction which resolves to a native entry point - * for the native function. - * - * See Dart_SetNativeResolver. - */ -typedef Dart_NativeFunction (*Dart_NativeEntryResolver)(Dart_Handle name, - int num_of_arguments, - bool* auto_setup_scope); -/* TODO(turnidge): Consider renaming to NativeFunctionResolver or - * NativeResolver. */ - -/** - * Native entry symbol lookup callback. - * - * For libraries and scripts which have native functions, the embedder - * can provide a callback for mapping a native entry to a symbol. This callback - * maps a native function entry PC to the native function name. If no native - * entry symbol can be found, the callback should return NULL. - * - * The parameters to the native reverse resolver function are: - * \param nf A Dart_NativeFunction. - * - * \return A const UTF-8 string containing the symbol name or NULL. - * - * See Dart_SetNativeResolver. - */ -typedef const uint8_t* (*Dart_NativeEntrySymbol)(Dart_NativeFunction nf); - -/** - * FFI Native C function pointer resolver callback. - * - * See Dart_SetFfiNativeResolver. - */ -typedef void* (*Dart_FfiNativeResolver)(const char* name, uintptr_t args_n); - -/* - * =========== - * Environment - * =========== - */ - -/** - * An environment lookup callback function. - * - * \param name The name of the value to lookup in the environment. - * - * \return A valid handle to a string if the name exists in the - * current environment or Dart_Null() if not. - */ -typedef Dart_Handle (*Dart_EnvironmentCallback)(Dart_Handle name); - -/** - * Sets the environment callback for the current isolate. This - * callback is used to lookup environment values by name in the - * current environment. This enables the embedder to supply values for - * the const constructors bool.fromEnvironment, int.fromEnvironment - * and String.fromEnvironment. - */ -DART_EXPORT Dart_Handle -Dart_SetEnvironmentCallback(Dart_EnvironmentCallback callback); - -/** - * Sets the callback used to resolve native functions for a library. - * - * \param library A library. - * \param resolver A native entry resolver. - * - * \return A valid handle if the native resolver was set successfully. - */ -DART_EXPORT Dart_Handle -Dart_SetNativeResolver(Dart_Handle library, - Dart_NativeEntryResolver resolver, - Dart_NativeEntrySymbol symbol); -/* TODO(turnidge): Rename to Dart_LibrarySetNativeResolver? */ - -/** - * Returns the callback used to resolve native functions for a library. - * - * \param library A library. - * \param resolver a pointer to a Dart_NativeEntryResolver - * - * \return A valid handle if the library was found. - */ -DART_EXPORT Dart_Handle -Dart_GetNativeResolver(Dart_Handle library, Dart_NativeEntryResolver* resolver); - -/** - * Returns the callback used to resolve native function symbols for a library. - * - * \param library A library. - * \param resolver a pointer to a Dart_NativeEntrySymbol. - * - * \return A valid handle if the library was found. - */ -DART_EXPORT Dart_Handle Dart_GetNativeSymbol(Dart_Handle library, - Dart_NativeEntrySymbol* resolver); - -/** - * Sets the callback used to resolve FFI native functions for a library. - * The resolved functions are expected to be a C function pointer of the - * correct signature (as specified in the `@Native()` function - * annotation in Dart code). - * - * NOTE: This is an experimental feature and might change in the future. - * - * \param library A library. - * \param resolver A native function resolver. - * - * \return A valid handle if the native resolver was set successfully. - */ -DART_EXPORT Dart_Handle -Dart_SetFfiNativeResolver(Dart_Handle library, Dart_FfiNativeResolver resolver); - -/** - * Callback provided by the embedder that is used by the VM to resolve asset - * paths. - * If no callback is provided, using `@Native`s with `native_asset.yaml`s will - * fail. - * - * The VM is responsible for looking up the asset path with the asset id in the - * kernel mapping. - * The embedder is responsible for providing the asset mapping during kernel - * compilation and using the asset path to return a library handle in this - * function. - * - * \param path The string in the asset path as passed in native_assets.yaml - * during kernel compilation. - * - * \param error Returns NULL if creation is successful, an error message - * otherwise. The caller is responsible for calling free() on the error - * message. - * - * \return The library handle. If |error| is not-null, the return value is - * undefined. - */ -typedef void* (*Dart_NativeAssetsDlopenCallback)(const char* path, - char** error); -typedef void* (*Dart_NativeAssetsDlopenCallbackNoPath)(char** error); - -/** - * Callback provided by the embedder that is used by the VM to lookup symbols - * in native code assets. - * If no callback is provided, using `@Native`s with `native_asset.yaml`s will - * fail. - * - * \param handle The library handle returned from a - * `Dart_NativeAssetsDlopenCallback` or - * `Dart_NativeAssetsDlopenCallbackNoPath`. - * - * \param symbol The symbol to look up. Is a string. - * - * \param error Returns NULL if creation is successful, an error message - * otherwise. The caller is responsible for calling free() on the error - * message. - * - * \return The symbol address. If |error| is not-null, the return value is - * undefined. - */ -typedef void* (*Dart_NativeAssetsDlsymCallback)(void* handle, - const char* symbol, - char** error); - -typedef struct { - Dart_NativeAssetsDlopenCallback dlopen_absolute; - Dart_NativeAssetsDlopenCallback dlopen_relative; - Dart_NativeAssetsDlopenCallback dlopen_system; - Dart_NativeAssetsDlopenCallbackNoPath dlopen_process; - Dart_NativeAssetsDlopenCallbackNoPath dlopen_executable; - Dart_NativeAssetsDlsymCallback dlsym; -} NativeAssetsApi; - -/** - * Initializes native asset resolution for the current isolate group. - * - * The caller is responsible for ensuring this is called right after isolate - * group creation, and before running any dart code (or spawning isolates). - * - * @param native_assets_api The callbacks used by native assets resolution. - * The VM does not take ownership of the parameter, - * it can be freed immediately after the call. - */ -DART_EXPORT void Dart_InitializeNativeAssetsResolver( - NativeAssetsApi* native_assets_api); - -/* - * ===================== - * Scripts and Libraries - * ===================== - */ - -typedef enum { - Dart_kCanonicalizeUrl = 0, - Dart_kImportTag, - Dart_kKernelTag, -} Dart_LibraryTag; - -/** - * The library tag handler is a multi-purpose callback provided by the - * embedder to the Dart VM. The embedder implements the tag handler to - * provide the ability to load Dart scripts and imports. - * - * -- TAGS -- - * - * Dart_kCanonicalizeUrl - * - * This tag indicates that the embedder should canonicalize 'url' with - * respect to 'library'. For most embedders, this is resolving the `url` - * relative to the `library`s url (see `Dart_LibraryUrl`). - * - * Dart_kImportTag - * - * This tag is used to load a library from IsolateMirror.loadUri. The embedder - * should call Dart_LoadLibraryFromKernel to provide the library to the VM. The - * return value should be an error or library (the result from - * Dart_LoadLibraryFromKernel). - * - * Dart_kKernelTag - * - * This tag is used to load the intermediate file (kernel) generated by - * the Dart front end. This tag is typically used when a 'hot-reload' - * of an application is needed and the VM is 'use dart front end' mode. - * The dart front end typically compiles all the scripts, imports and part - * files into one intermediate file hence we don't use the source/import or - * script tags. The return value should be an error or a TypedData containing - * the kernel bytes. - * - */ -typedef Dart_Handle (*Dart_LibraryTagHandler)( - Dart_LibraryTag tag, - Dart_Handle library_or_package_map_url, - Dart_Handle url); - -/** - * Sets library tag handler for the current isolate. This handler is - * used to handle the various tags encountered while loading libraries - * or scripts in the isolate. - * - * \param handler Handler code to be used for handling the various tags - * encountered while loading libraries or scripts in the isolate. - * - * \return If no error occurs, the handler is set for the isolate. - * Otherwise an error handle is returned. - * - * TODO(turnidge): Document. - */ -DART_EXPORT Dart_Handle -Dart_SetLibraryTagHandler(Dart_LibraryTagHandler handler); - -/** - * Handles deferred loading requests. When this handler is invoked, it should - * eventually load the deferred loading unit with the given id and call - * Dart_DeferredLoadComplete or Dart_DeferredLoadCompleteError. It is - * recommended that the loading occur asynchronously, but it is permitted to - * call Dart_DeferredLoadComplete or Dart_DeferredLoadCompleteError before the - * handler returns. - * - * If an error is returned, it will be propagated through - * `prefix.loadLibrary()`. This is useful for synchronous - * implementations, which must propagate any unwind errors from - * Dart_DeferredLoadComplete or Dart_DeferredLoadComplete. Otherwise the handler - * should return a non-error such as `Dart_Null()`. - */ -typedef Dart_Handle (*Dart_DeferredLoadHandler)(intptr_t loading_unit_id); - -/** - * Sets the deferred load handler for the current isolate. This handler is - * used to handle loading deferred imports in an AppJIT or AppAOT program. - */ -DART_EXPORT Dart_Handle -Dart_SetDeferredLoadHandler(Dart_DeferredLoadHandler handler); - -/** - * Notifies the VM that a deferred load completed successfully. This function - * will eventually cause the corresponding `prefix.loadLibrary()` futures to - * complete. - * - * Requires the current isolate to be the same current isolate during the - * invocation of the Dart_DeferredLoadHandler. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_DeferredLoadComplete(intptr_t loading_unit_id, - const uint8_t* snapshot_data, - const uint8_t* snapshot_instructions); - -/** - * Notifies the VM that a deferred load failed. This function - * will eventually cause the corresponding `prefix.loadLibrary()` futures to - * complete with an error. - * - * If `transient` is true, future invocations of `prefix.loadLibrary()` will - * trigger new load requests. If false, futures invocation will complete with - * the same error. - * - * Requires the current isolate to be the same current isolate during the - * invocation of the Dart_DeferredLoadHandler. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_DeferredLoadCompleteError(intptr_t loading_unit_id, - const char* error_message, - bool transient); - -/** - * Loads the root library for the current isolate. - * - * Requires there to be no current root library. - * - * \param kernel_buffer A buffer which contains a kernel binary (see - * pkg/kernel/binary.md). Must remain valid until isolate group shutdown. - * \param kernel_size Length of the passed in buffer. - * - * \return A handle to the root library, or an error. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_LoadScriptFromKernel(const uint8_t* kernel_buffer, intptr_t kernel_size); - -/** - * Gets the library for the root script for the current isolate. - * - * If the root script has not yet been set for the current isolate, - * this function returns Dart_Null(). This function never returns an - * error handle. - * - * \return Returns the root Library for the current isolate or Dart_Null(). - */ -DART_EXPORT Dart_Handle Dart_RootLibrary(void); - -/** - * Sets the root library for the current isolate. - * - * \return Returns an error handle if `library` is not a library handle. - */ -DART_EXPORT Dart_Handle Dart_SetRootLibrary(Dart_Handle library); - -/** - * Lookup or instantiate a legacy type by name and type arguments from a - * Library. - * - * \param library The library containing the class or interface. - * \param class_name The class name for the type. - * \param number_of_type_arguments Number of type arguments. - * For non parametric types the number of type arguments would be 0. - * \param type_arguments Pointer to an array of type arguments. - * For non parametric types a NULL would be passed in for this argument. - * - * \return If no error occurs, the type is returned. - * Otherwise an error handle is returned. - */ -DART_EXPORT Dart_Handle Dart_GetType(Dart_Handle library, - Dart_Handle class_name, - intptr_t number_of_type_arguments, - Dart_Handle* type_arguments); - -/** - * Lookup or instantiate a nullable type by name and type arguments from - * Library. - * - * \param library The library containing the class or interface. - * \param class_name The class name for the type. - * \param number_of_type_arguments Number of type arguments. - * For non parametric types the number of type arguments would be 0. - * \param type_arguments Pointer to an array of type arguments. - * For non parametric types a NULL would be passed in for this argument. - * - * \return If no error occurs, the type is returned. - * Otherwise an error handle is returned. - */ -DART_EXPORT Dart_Handle Dart_GetNullableType(Dart_Handle library, - Dart_Handle class_name, - intptr_t number_of_type_arguments, - Dart_Handle* type_arguments); - -/** - * Lookup or instantiate a non-nullable type by name and type arguments from - * Library. - * - * \param library The library containing the class or interface. - * \param class_name The class name for the type. - * \param number_of_type_arguments Number of type arguments. - * For non parametric types the number of type arguments would be 0. - * \param type_arguments Pointer to an array of type arguments. - * For non parametric types a NULL would be passed in for this argument. - * - * \return If no error occurs, the type is returned. - * Otherwise an error handle is returned. - */ -DART_EXPORT Dart_Handle -Dart_GetNonNullableType(Dart_Handle library, - Dart_Handle class_name, - intptr_t number_of_type_arguments, - Dart_Handle* type_arguments); - -/** - * Creates a nullable version of the provided type. - * - * \param type The type to be converted to a nullable type. - * - * \return If no error occurs, a nullable type is returned. - * Otherwise an error handle is returned. - */ -DART_EXPORT Dart_Handle Dart_TypeToNullableType(Dart_Handle type); - -/** - * Creates a non-nullable version of the provided type. - * - * \param type The type to be converted to a non-nullable type. - * - * \return If no error occurs, a non-nullable type is returned. - * Otherwise an error handle is returned. - */ -DART_EXPORT Dart_Handle Dart_TypeToNonNullableType(Dart_Handle type); - -/** - * A type's nullability. - * - * \param type A Dart type. - * \param result An out parameter containing the result of the check. True if - * the type is of the specified nullability, false otherwise. - * - * \return Returns an error handle if type is not of type Type. - */ -DART_EXPORT Dart_Handle Dart_IsNullableType(Dart_Handle type, bool* result); -DART_EXPORT Dart_Handle Dart_IsNonNullableType(Dart_Handle type, bool* result); - -/** - * Lookup a class or interface by name from a Library. - * - * \param library The library containing the class or interface. - * \param class_name The name of the class or interface. - * - * \return If no error occurs, the class or interface is - * returned. Otherwise an error handle is returned. - */ -DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library, - Dart_Handle class_name); -/* TODO(asiva): The above method needs to be removed once all uses - * of it are removed from the embedder code. */ - -/** - * Returns an import path to a Library, such as "file:///test.dart" or - * "dart:core". - */ -DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library); - -/** - * Returns a URL from which a Library was loaded. - */ -DART_EXPORT Dart_Handle Dart_LibraryResolvedUrl(Dart_Handle library); - -/** - * \return An array of libraries. - */ -DART_EXPORT Dart_Handle Dart_GetLoadedLibraries(void); - -DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url); -/* TODO(turnidge): Consider returning Dart_Null() when the library is - * not found to distinguish that from a true error case. */ - -/** - * Report an loading error for the library. - * - * \param library The library that failed to load. - * \param error The Dart error instance containing the load error. - * - * \return If the VM handles the error, the return value is - * a null handle. If it doesn't handle the error, the error - * object is returned. - */ -DART_EXPORT Dart_Handle Dart_LibraryHandleError(Dart_Handle library, - Dart_Handle error); - -/** - * Called by the embedder to load a partial program. Does not set the root - * library. - * - * \param kernel_buffer A buffer which contains a kernel binary (see - * pkg/kernel/binary.md). Must remain valid until isolate shutdown. - * \param kernel_buffer_size Length of the passed in buffer. - * - * \return A handle to the main library of the compilation unit, or an error. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_LoadLibraryFromKernel(const uint8_t* kernel_buffer, - intptr_t kernel_buffer_size); -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_LoadLibrary(Dart_Handle kernel_buffer); - -/** - * Indicates that all outstanding load requests have been satisfied. - * This finalizes all the new classes loaded and optionally completes - * deferred library futures. - * - * Requires there to be a current isolate. - * - * \param complete_futures Specify true if all deferred library - * futures should be completed, false otherwise. - * - * \return Success if all classes have been finalized and deferred library - * futures are completed. Otherwise, returns an error. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_FinalizeLoading(bool complete_futures); - -/* - * ===== - * Peers - * ===== - */ - -/** - * The peer field is a lazily allocated field intended for storage of - * an uncommonly used values. Most instances types can have a peer - * field allocated. The exceptions are subtypes of Null, num, and - * bool. - */ - -/** - * Returns the value of peer field of 'object' in 'peer'. - * - * \param object An object. - * \param peer An out parameter that returns the value of the peer - * field. - * - * \return Returns an error if 'object' is a subtype of Null, num, or - * bool. - */ -DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer); - -/** - * Sets the value of the peer field of 'object' to the value of - * 'peer'. - * - * \param object An object. - * \param peer A value to store in the peer field. - * - * \return Returns an error if 'object' is a subtype of Null, num, or - * bool. - */ -DART_EXPORT Dart_Handle Dart_SetPeer(Dart_Handle object, void* peer); - -/* - * ====== - * Kernel - * ====== - */ - -/** - * Experimental support for Dart to Kernel parser isolate. - * - * TODO(hausner): Document finalized interface. - * - */ - -// TODO(33433): Remove kernel service from the embedding API. - -typedef enum { - Dart_KernelCompilationStatus_Unknown = -1, - Dart_KernelCompilationStatus_Ok = 0, - Dart_KernelCompilationStatus_Error = 1, - Dart_KernelCompilationStatus_Crash = 2, - Dart_KernelCompilationStatus_MsgFailed = 3, -} Dart_KernelCompilationStatus; - -typedef struct { - Dart_KernelCompilationStatus status; - char* error; - uint8_t* kernel; - intptr_t kernel_size; -} Dart_KernelCompilationResult; - -typedef enum { - Dart_KernelCompilationVerbosityLevel_Error = 0, - Dart_KernelCompilationVerbosityLevel_Warning, - Dart_KernelCompilationVerbosityLevel_Info, - Dart_KernelCompilationVerbosityLevel_All, -} Dart_KernelCompilationVerbosityLevel; - -DART_EXPORT bool Dart_IsKernelIsolate(Dart_Isolate isolate); -DART_EXPORT bool Dart_KernelIsolateIsRunning(void); -DART_EXPORT Dart_Port Dart_KernelPort(void); - -/** - * Compiles the given `script_uri` to a kernel file. - * - * \param platform_kernel A buffer containing the kernel of the platform (e.g. - * `vm_platform_strong.dill`). The VM does not take ownership of this memory. - * - * \param platform_kernel_size The length of the platform_kernel buffer. - * - * \param snapshot_compile Set to `true` when the compilation is for a snapshot. - * This is used by the frontend to determine if compilation related information - * should be printed to console (e.g., null safety mode). - * - * \param embed_sources Set to `true` when sources should be embedded in the - * kernel file. - * - * \param verbosity Specifies the logging behavior of the kernel compilation - * service. - * - * \return Returns the result of the compilation. - * - * On a successful compilation the returned [Dart_KernelCompilationResult] has - * a status of [Dart_KernelCompilationStatus_Ok] and the `kernel`/`kernel_size` - * fields are set. The caller takes ownership of the malloc()ed buffer. - * - * On a failed compilation the `error` might be set describing the reason for - * the failed compilation. The caller takes ownership of the malloc()ed - * error. - * - * Requires there to be a current isolate. - */ -DART_EXPORT Dart_KernelCompilationResult -Dart_CompileToKernel(const char* script_uri, - const uint8_t* platform_kernel, - const intptr_t platform_kernel_size, - bool incremental_compile, - bool snapshot_compile, - bool embed_sources, - const char* package_config, - Dart_KernelCompilationVerbosityLevel verbosity); - -typedef struct { - const char* uri; - const char* source; -} Dart_SourceFile; - -DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies(void); - -/** - * Sets the kernel buffer which will be used to load Dart SDK sources - * dynamically at runtime. - * - * \param platform_kernel A buffer containing kernel which has sources for the - * Dart SDK populated. Note: The VM does not take ownership of this memory. - * - * \param platform_kernel_size The length of the platform_kernel buffer. - */ -DART_EXPORT void Dart_SetDartLibrarySourcesKernel( - const uint8_t* platform_kernel, - const intptr_t platform_kernel_size); - -/** - * Always return true as the VM only supports strong null safety. - */ -DART_EXPORT bool Dart_DetectNullSafety(const char* script_uri, - const char* package_config, - const char* original_working_directory, - const uint8_t* snapshot_data, - const uint8_t* snapshot_instructions, - const uint8_t* kernel_buffer, - intptr_t kernel_buffer_size); - -#define DART_KERNEL_ISOLATE_NAME "kernel-service" - -/* - * ======= - * Service - * ======= - */ - -#define DART_VM_SERVICE_ISOLATE_NAME "vm-service" - -/** - * Returns true if isolate is the service isolate. - * - * \param isolate An isolate - * - * \return Returns true if 'isolate' is the service isolate. - */ -DART_EXPORT bool Dart_IsServiceIsolate(Dart_Isolate isolate); - -/** - * Writes the CPU profile to the timeline as a series of 'instant' events. - * - * Note that this is an expensive operation. - * - * \param main_port The main port of the Isolate whose profile samples to write. - * \param error An optional error, must be free()ed by caller. - * - * \return Returns true if the profile is successfully written and false - * otherwise. - */ -DART_EXPORT bool Dart_WriteProfileToTimeline(Dart_Port main_port, char** error); - -/* - * ============== - * Precompilation - * ============== - */ - -/** - * Compiles all functions reachable from entry points and marks - * the isolate to disallow future compilation. - * - * Entry points should be specified using `@pragma("vm:entry-point")` - * annotation. - * - * \return An error handle if a compilation error or runtime error running const - * constructors was encountered. - */ -DART_EXPORT Dart_Handle Dart_Precompile(void); - -typedef void (*Dart_CreateLoadingUnitCallback)( - void* callback_data, - intptr_t loading_unit_id, - void** write_callback_data, - void** write_debug_callback_data); -typedef void (*Dart_StreamingWriteCallback)(void* callback_data, - const uint8_t* buffer, - intptr_t size); -typedef void (*Dart_StreamingCloseCallback)(void* callback_data); - -DART_EXPORT Dart_Handle Dart_LoadingUnitLibraryUris(intptr_t loading_unit_id); - -// On Darwin systems, 'dlsym' adds an '_' to the beginning of the symbol name. -// Use the '...CSymbol' definitions for resolving through 'dlsym'. The actual -// symbol names in the objects are given by the '...AsmSymbol' definitions. -#if defined(__APPLE__) -#define kSnapshotBuildIdCSymbol "kDartSnapshotBuildId" -#define kVmSnapshotDataCSymbol "kDartVmSnapshotData" -#define kVmSnapshotInstructionsCSymbol "kDartVmSnapshotInstructions" -#define kVmSnapshotBssCSymbol "kDartVmSnapshotBss" -#define kIsolateSnapshotDataCSymbol "kDartIsolateSnapshotData" -#define kIsolateSnapshotInstructionsCSymbol "kDartIsolateSnapshotInstructions" -#define kIsolateSnapshotBssCSymbol "kDartIsolateSnapshotBss" -#else -#define kSnapshotBuildIdCSymbol "_kDartSnapshotBuildId" -#define kVmSnapshotDataCSymbol "_kDartVmSnapshotData" -#define kVmSnapshotInstructionsCSymbol "_kDartVmSnapshotInstructions" -#define kVmSnapshotBssCSymbol "_kDartVmSnapshotBss" -#define kIsolateSnapshotDataCSymbol "_kDartIsolateSnapshotData" -#define kIsolateSnapshotInstructionsCSymbol "_kDartIsolateSnapshotInstructions" -#define kIsolateSnapshotBssCSymbol "_kDartIsolateSnapshotBss" -#endif - -#define kSnapshotBuildIdAsmSymbol "_kDartSnapshotBuildId" -#define kVmSnapshotDataAsmSymbol "_kDartVmSnapshotData" -#define kVmSnapshotInstructionsAsmSymbol "_kDartVmSnapshotInstructions" -#define kVmSnapshotBssAsmSymbol "_kDartVmSnapshotBss" -#define kIsolateSnapshotDataAsmSymbol "_kDartIsolateSnapshotData" -#define kIsolateSnapshotInstructionsAsmSymbol \ - "_kDartIsolateSnapshotInstructions" -#define kIsolateSnapshotBssAsmSymbol "_kDartIsolateSnapshotBss" - -/** - * Creates a precompiled snapshot. - * - A root library must have been loaded. - * - Dart_Precompile must have been called. - * - * Outputs an assembly file defining the symbols listed in the definitions - * above. - * - * The assembly should be compiled as a static or shared library and linked or - * loaded by the embedder. Running this snapshot requires a VM compiled with - * DART_PRECOMPILED_SNAPSHOT. The kDartVmSnapshotData and - * kDartVmSnapshotInstructions should be passed to Dart_Initialize. The - * kDartIsolateSnapshotData and kDartIsolateSnapshotInstructions should be - * passed to Dart_CreateIsolateGroup. - * - * The callback will be invoked one or more times to provide the assembly code. - * - * If stripped is true, then the assembly code will not include DWARF - * debugging sections. - * - * If debug_callback_data is provided, debug_callback_data will be used with - * the callback to provide separate debugging information. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_CreateAppAOTSnapshotAsAssembly(Dart_StreamingWriteCallback callback, - void* callback_data, - bool stripped, - void* debug_callback_data); -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_CreateAppAOTSnapshotAsAssemblies( - Dart_CreateLoadingUnitCallback next_callback, - void* next_callback_data, - bool stripped, - Dart_StreamingWriteCallback write_callback, - Dart_StreamingCloseCallback close_callback); - -/** - * Creates a precompiled snapshot. - * - A root library must have been loaded. - * - Dart_Precompile must have been called. - * - * Outputs an ELF shared library defining the symbols - * - _kDartVmSnapshotData - * - _kDartVmSnapshotInstructions - * - _kDartIsolateSnapshotData - * - _kDartIsolateSnapshotInstructions - * - * The shared library should be dynamically loaded by the embedder. - * Running this snapshot requires a VM compiled with DART_PRECOMPILED_SNAPSHOT. - * The kDartVmSnapshotData and kDartVmSnapshotInstructions should be passed to - * Dart_Initialize. The kDartIsolateSnapshotData and - * kDartIsolateSnapshotInstructions should be passed to Dart_CreateIsolate. - * - * The callback will be invoked one or more times to provide the binary output. - * - * If stripped is true, then the binary output will not include DWARF - * debugging sections. - * - * If debug_callback_data is provided, debug_callback_data will be used with - * the callback to provide separate debugging information. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_CreateAppAOTSnapshotAsElf(Dart_StreamingWriteCallback callback, - void* callback_data, - bool stripped, - void* debug_callback_data); -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_CreateAppAOTSnapshotAsElfs(Dart_CreateLoadingUnitCallback next_callback, - void* next_callback_data, - bool stripped, - Dart_StreamingWriteCallback write_callback, - Dart_StreamingCloseCallback close_callback); - -/** - * Like Dart_CreateAppAOTSnapshotAsAssembly, but only includes - * kDartVmSnapshotData and kDartVmSnapshotInstructions. It also does - * not strip DWARF information from the generated assembly or allow for - * separate debug information. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_CreateVMAOTSnapshotAsAssembly(Dart_StreamingWriteCallback callback, - void* callback_data); - -/** - * Sorts the class-ids in depth first traversal order of the inheritance - * tree. This is a costly operation, but it can make method dispatch - * more efficient and is done before writing snapshots. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_SortClasses(void); - -/** - * Creates a snapshot that caches compiled code and type feedback for faster - * startup and quicker warmup in a subsequent process. - * - * Outputs a snapshot in two pieces. The pieces should be passed to - * Dart_CreateIsolateGroup in a VM using the same VM snapshot pieces used in the - * current VM. The instructions piece must be loaded with read and execute - * permissions; the data piece may be loaded as read-only. - * - * - Requires the VM to have not been started with --precompilation. - * - Not supported when targeting IA32. - * - The VM writing the snapshot and the VM reading the snapshot must be the - * same version, must be built in the same DEBUG/RELEASE/PRODUCT mode, must - * be targeting the same architecture, and must both be in checked mode or - * both in unchecked mode. - * - * The buffers are scope allocated and are only valid until the next call to - * Dart_ExitScope. - * - * \return A valid handle if no error occurs during the operation. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_CreateAppJITSnapshotAsBlobs(uint8_t** isolate_snapshot_data_buffer, - intptr_t* isolate_snapshot_data_size, - uint8_t** isolate_snapshot_instructions_buffer, - intptr_t* isolate_snapshot_instructions_size); - -/** - * Get obfuscation map for precompiled code. - * - * Obfuscation map is encoded as a JSON array of pairs (original name, - * obfuscated name). - * - * \return Returns an error handler if the VM was built in a mode that does not - * support obfuscation. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle -Dart_GetObfuscationMap(uint8_t** buffer, intptr_t* buffer_length); - -/** - * Returns whether the VM only supports running from precompiled snapshots and - * not from any other kind of snapshot or from source (that is, the VM was - * compiled with DART_PRECOMPILED_RUNTIME). - */ -DART_EXPORT bool Dart_IsPrecompiledRuntime(void); - -/** - * Print a native stack trace. Used for crash handling. - * - * If context is NULL, prints the current stack trace. Otherwise, context - * should be a CONTEXT* (Windows) or ucontext_t* (POSIX) from a signal handler - * running on the current thread. - */ -DART_EXPORT void Dart_DumpNativeStackTrace(void* context); - -/** - * Indicate that the process is about to abort, and the Dart VM should not - * attempt to cleanup resources. - */ -DART_EXPORT void Dart_PrepareToAbort(void); - -/** - * Callback provided by the embedder that is used by the VM to - * produce footnotes appended to DWARF stack traces. - * - * Whenever VM formats a stack trace as a string it would call this callback - * passing raw program counters for each frame in the stack trace. - * - * Embedder can then return a string which if not-null will be appended to the - * formatted stack trace. - * - * Returned string is expected to be `malloc()` allocated. VM takes ownership - * of the returned string and will `free()` it. - * - * \param addresses raw program counter addresses for each frame - * \param count number of elements in the addresses array - */ -typedef char* (*Dart_DwarfStackTraceFootnoteCallback)(void* addresses[], - intptr_t count); - -/** - * Configure DWARF stack trace footnote callback. - */ -DART_EXPORT void Dart_SetDwarfStackTraceFootnoteCallback( - Dart_DwarfStackTraceFootnoteCallback callback); - -#endif /* INCLUDE_DART_API_H_ */ /* NOLINT */ diff --git a/src/dart_api/dart_api_dl.c b/src/dart_api/dart_api_dl.c deleted file mode 100644 index 48fb54e7..00000000 --- a/src/dart_api/dart_api_dl.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -#include "dart_api_dl.h" /* NOLINT */ -#include "dart_version.h" /* NOLINT */ -#include "internal/dart_api_dl_impl.h" /* NOLINT */ - -#include -#include - -#define DART_API_DL_DEFINITIONS(name, R, A) name##_Type name##_DL = NULL; - -DART_API_ALL_DL_SYMBOLS(DART_API_DL_DEFINITIONS) -DART_API_DEPRECATED_DL_SYMBOLS(DART_API_DL_DEFINITIONS) - -#undef DART_API_DL_DEFINITIONS - -typedef void* DartApiEntry_function; - -DartApiEntry_function FindFunctionPointer(const DartApiEntry* entries, - const char* name) { - while (entries->name != NULL) { - if (strcmp(entries->name, name) == 0) return entries->function; - entries++; - } - return NULL; -} - -DART_EXPORT void Dart_UpdateExternalSize_Deprecated( - Dart_WeakPersistentHandle object, intptr_t external_size) { - printf("Dart_UpdateExternalSize is a nop, it has been deprecated\n"); -} - -DART_EXPORT void Dart_UpdateFinalizableExternalSize_Deprecated( - Dart_FinalizableHandle object, - Dart_Handle strong_ref_to_object, - intptr_t external_allocation_size) { - printf("Dart_UpdateFinalizableExternalSize is a nop, " - "it has been deprecated\n"); -} - -intptr_t Dart_InitializeApiDL(void* data) { - DartApi* dart_api_data = (DartApi*)data; - - if (dart_api_data->major != DART_API_DL_MAJOR_VERSION) { - // If the DartVM we're running on does not have the same version as this - // file was compiled against, refuse to initialize. The symbols are not - // compatible. - return -1; - } - // Minor versions are allowed to be different. - // If the DartVM has a higher minor version, it will provide more symbols - // than we initialize here. - // If the DartVM has a lower minor version, it will not provide all symbols. - // In that case, we leave the missing symbols un-initialized. Those symbols - // should not be used by the Dart and native code. The client is responsible - // for checking the minor version number himself based on which symbols it - // is using. - // (If we would error out on this case, recompiling native code against a - // newer SDK would break all uses on older SDKs, which is too strict.) - - const DartApiEntry* dart_api_function_pointers = dart_api_data->functions; - -#define DART_API_DL_INIT(name, R, A) \ - name##_DL = \ - (name##_Type)(FindFunctionPointer(dart_api_function_pointers, #name)); - DART_API_ALL_DL_SYMBOLS(DART_API_DL_INIT) -#undef DART_API_DL_INIT - -#define DART_API_DEPRECATED_DL_INIT(name, R, A) \ - name##_DL = name##_Deprecated; - DART_API_DEPRECATED_DL_SYMBOLS(DART_API_DEPRECATED_DL_INIT) -#undef DART_API_DEPRECATED_DL_INIT - - return 0; -} diff --git a/src/dart_api/dart_api_dl.h b/src/dart_api/dart_api_dl.h deleted file mode 100644 index 2b4c8d4f..00000000 --- a/src/dart_api/dart_api_dl.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -#ifndef RUNTIME_INCLUDE_DART_API_DL_H_ -#define RUNTIME_INCLUDE_DART_API_DL_H_ - -#include "dart_api.h" /* NOLINT */ -#include "dart_native_api.h" /* NOLINT */ - -/** \mainpage Dynamically Linked Dart API - * - * This exposes a subset of symbols from dart_api.h and dart_native_api.h - * available in every Dart embedder through dynamic linking. - * - * All symbols are postfixed with _DL to indicate that they are dynamically - * linked and to prevent conflicts with the original symbol. - * - * Link `dart_api_dl.c` file into your library and invoke - * `Dart_InitializeApiDL` with `NativeApi.initializeApiDLData`. - * - * Returns 0 on success. - */ - -DART_EXPORT intptr_t Dart_InitializeApiDL(void* data); - -// ============================================================================ -// IMPORTANT! Never update these signatures without properly updating -// DART_API_DL_MAJOR_VERSION and DART_API_DL_MINOR_VERSION. -// -// Verbatim copy of `dart_native_api.h` and `dart_api.h` symbol names and types -// to trigger compile-time errors if the symbols in those files are updated -// without updating these. -// -// Function return and argument types, and typedefs are carbon copied. Structs -// are typechecked nominally in C/C++, so they are not copied, instead a -// comment is added to their definition. -typedef int64_t Dart_Port_DL; -typedef struct { - int64_t port_id; - int64_t origin_id; -} Dart_PortEx_DL; - -typedef void (*Dart_NativeMessageHandler_DL)(Dart_Port_DL dest_port_id, - Dart_CObject* message); - -// dart_native_api.h symbols can be called on any thread. -#define DART_NATIVE_API_DL_SYMBOLS(F) \ - /***** dart_native_api.h *****/ \ - /* Dart_Port */ \ - F(Dart_PostCObject, bool, (Dart_Port_DL port_id, Dart_CObject * message)) \ - F(Dart_PostInteger, bool, (Dart_Port_DL port_id, int64_t message)) \ - F(Dart_NewNativePort, Dart_Port_DL, \ - (const char* name, Dart_NativeMessageHandler_DL handler, \ - bool handle_concurrently)) \ - F(Dart_CloseNativePort, bool, (Dart_Port_DL native_port_id)) - -// dart_api.h symbols can only be called on Dart threads. -#define DART_API_DL_SYMBOLS(F) \ - /***** dart_api.h *****/ \ - /* Errors */ \ - F(Dart_IsError, bool, (Dart_Handle handle)) \ - F(Dart_IsApiError, bool, (Dart_Handle handle)) \ - F(Dart_IsUnhandledExceptionError, bool, (Dart_Handle handle)) \ - F(Dart_IsCompilationError, bool, (Dart_Handle handle)) \ - F(Dart_IsFatalError, bool, (Dart_Handle handle)) \ - F(Dart_GetError, const char*, (Dart_Handle handle)) \ - F(Dart_ErrorHasException, bool, (Dart_Handle handle)) \ - F(Dart_ErrorGetException, Dart_Handle, (Dart_Handle handle)) \ - F(Dart_ErrorGetStackTrace, Dart_Handle, (Dart_Handle handle)) \ - F(Dart_NewApiError, Dart_Handle, (const char* error)) \ - F(Dart_NewCompilationError, Dart_Handle, (const char* error)) \ - F(Dart_NewUnhandledExceptionError, Dart_Handle, (Dart_Handle exception)) \ - F(Dart_PropagateError, void, (Dart_Handle handle)) \ - /* Dart_Handle, Dart_PersistentHandle, Dart_WeakPersistentHandle */ \ - F(Dart_HandleFromPersistent, Dart_Handle, (Dart_PersistentHandle object)) \ - F(Dart_HandleFromWeakPersistent, Dart_Handle, \ - (Dart_WeakPersistentHandle object)) \ - F(Dart_NewPersistentHandle, Dart_PersistentHandle, (Dart_Handle object)) \ - F(Dart_SetPersistentHandle, void, \ - (Dart_PersistentHandle obj1, Dart_Handle obj2)) \ - F(Dart_DeletePersistentHandle, void, (Dart_PersistentHandle object)) \ - F(Dart_NewWeakPersistentHandle, Dart_WeakPersistentHandle, \ - (Dart_Handle object, void* peer, intptr_t external_allocation_size, \ - Dart_HandleFinalizer callback)) \ - F(Dart_DeleteWeakPersistentHandle, void, (Dart_WeakPersistentHandle object)) \ - F(Dart_NewFinalizableHandle, Dart_FinalizableHandle, \ - (Dart_Handle object, void* peer, intptr_t external_allocation_size, \ - Dart_HandleFinalizer callback)) \ - F(Dart_DeleteFinalizableHandle, void, \ - (Dart_FinalizableHandle object, Dart_Handle strong_ref_to_object)) \ - /* Isolates */ \ - F(Dart_CurrentIsolate, Dart_Isolate, (void)) \ - F(Dart_ExitIsolate, void, (void)) \ - F(Dart_EnterIsolate, void, (Dart_Isolate)) \ - /* Dart_Port */ \ - F(Dart_Post, bool, (Dart_Port_DL port_id, Dart_Handle object)) \ - F(Dart_NewSendPort, Dart_Handle, (Dart_Port_DL port_id)) \ - F(Dart_NewSendPortEx, Dart_Handle, (Dart_PortEx_DL portex_id)) \ - F(Dart_SendPortGetId, Dart_Handle, \ - (Dart_Handle port, Dart_Port_DL * port_id)) \ - F(Dart_SendPortGetIdEx, Dart_Handle, \ - (Dart_Handle port, Dart_PortEx_DL * portex_id)) \ - /* Scopes */ \ - F(Dart_EnterScope, void, (void)) \ - F(Dart_ExitScope, void, (void)) \ - /* Objects */ \ - F(Dart_IsNull, bool, (Dart_Handle)) \ - F(Dart_Null, Dart_Handle, (void)) - -// dart_api.h symbols that have been deprecated but are retained here -// until we can make a breaking change bumping the major version number -// (DART_API_DL_MAJOR_VERSION) -#define DART_API_DEPRECATED_DL_SYMBOLS(F) \ - F(Dart_UpdateExternalSize, void, \ - (Dart_WeakPersistentHandle object, intptr_t external_allocation_size)) \ - F(Dart_UpdateFinalizableExternalSize, void, \ - (Dart_FinalizableHandle object, Dart_Handle strong_ref_to_object, \ - intptr_t external_allocation_size)) - -#define DART_API_ALL_DL_SYMBOLS(F) \ - DART_NATIVE_API_DL_SYMBOLS(F) \ - DART_API_DL_SYMBOLS(F) -// IMPORTANT! Never update these signatures without properly updating -// DART_API_DL_MAJOR_VERSION and DART_API_DL_MINOR_VERSION. -// -// End of verbatim copy. -// ============================================================================ - -// Copy of definition of DART_EXPORT without 'used' attribute. -// -// The 'used' attribute cannot be used with DART_API_ALL_DL_SYMBOLS because -// they are not function declarations, but variable declarations with a -// function pointer type. -// -// The function pointer variables are initialized with the addresses of the -// functions in the VM. If we were to use function declarations instead, we -// would need to forward the call to the VM adding indirection. -#if defined(__CYGWIN__) -#error Tool chain and platform not supported. -#elif defined(_WIN32) -#if defined(DART_SHARED_LIB) -#define DART_EXPORT_DL DART_EXTERN_C __declspec(dllexport) -#else -#define DART_EXPORT_DL DART_EXTERN_C -#endif -#else -#if __GNUC__ >= 4 -#if defined(DART_SHARED_LIB) -#define DART_EXPORT_DL DART_EXTERN_C __attribute__((visibility("default"))) -#else -#define DART_EXPORT_DL DART_EXTERN_C -#endif -#else -#error Tool chain not supported. -#endif -#endif - -#define DART_API_DL_DECLARATIONS(name, R, A) \ - typedef R(*name##_Type) A; \ - DART_EXPORT_DL name##_Type name##_DL; - -DART_API_ALL_DL_SYMBOLS(DART_API_DL_DECLARATIONS) -DART_API_DEPRECATED_DL_SYMBOLS(DART_API_DL_DECLARATIONS) - -#undef DART_API_DL_DECLARATIONS - -#undef DART_EXPORT_DL - -#endif /* RUNTIME_INCLUDE_DART_API_DL_H_ */ /* NOLINT */ diff --git a/src/dart_api/dart_embedder_api.h b/src/dart_api/dart_embedder_api.h deleted file mode 100644 index bc037734..00000000 --- a/src/dart_api/dart_embedder_api.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -#ifndef RUNTIME_INCLUDE_DART_EMBEDDER_API_H_ -#define RUNTIME_INCLUDE_DART_EMBEDDER_API_H_ - -#include "include/dart_api.h" -#include "include/dart_tools_api.h" - -namespace dart { -namespace embedder { - -// Initialize all subsystems of the embedder. -// -// Must be called before the `Dart_Initialize()` call to initialize the -// Dart VM. -// -// Returns true on success and false otherwise, in which case error would -// contain error message. -DART_WARN_UNUSED_RESULT bool InitOnce(char** error); - -// Cleans up all subsystems of the embedder. -// -// Must be called after the `Dart_Cleanup()` call to initialize the -// Dart VM. -void Cleanup(); - -// Common arguments that are passed to isolate creation callback and to -// API methods that create isolates. -struct IsolateCreationData { - // URI for the main script that will be running in the isolate. - const char* script_uri; - - // Advisory name of the main method that will be run by isolate. - // Only used for error messages. - const char* main; - - // Isolate creation flags. Might be absent. - Dart_IsolateFlags* flags; - - // Isolate group callback data. - void* isolate_group_data; - - // Isolate callback data. - void* isolate_data; -}; - -// Create and initialize kernel-service isolate. This method should be used -// when VM invokes isolate creation callback with DART_KERNEL_ISOLATE_NAME as -// script_uri. -// The isolate is created from the given snapshot (might be kernel data or -// app-jit snapshot). -DART_WARN_UNUSED_RESULT Dart_Isolate -CreateKernelServiceIsolate(const IsolateCreationData& data, - const uint8_t* buffer, - intptr_t buffer_size, - char** error); - -// Service isolate configuration. -struct VmServiceConfiguration { - enum { kBindHttpServerToAFreePort = 0, kDoNotAutoStartHttpServer = -1 }; - - // Address to which HTTP server will be bound. - const char* ip; - - // Default port. See enum above for special values. - int port; - - // If non-null, connection information for the VM service will be output to a - // file in JSON format at the location specified. - const char* write_service_info_filename; - - // TODO(vegorov) document these ones. - bool dev_mode; - bool deterministic; - bool disable_auth_codes; -}; - -// Create and initialize vm-service isolate from the given AOT snapshot, which -// is expected to contain all necessary 'vm-service' libraries. -// This method should be used when VM invokes isolate creation callback with -// DART_VM_SERVICE_ISOLATE_NAME as script_uri. -DART_WARN_UNUSED_RESULT Dart_Isolate -CreateVmServiceIsolate(const IsolateCreationData& data, - const VmServiceConfiguration& config, - const uint8_t* isolate_data, - const uint8_t* isolate_instr, - char** error); - -// Create and initialize vm-service isolate from the given kernel binary, which -// is expected to contain all necessary 'vm-service' libraries. -// This method should be used when VM invokes isolate creation callback with -// DART_VM_SERVICE_ISOLATE_NAME as script_uri. -DART_WARN_UNUSED_RESULT Dart_Isolate -CreateVmServiceIsolateFromKernel(const IsolateCreationData& data, - const VmServiceConfiguration& config, - const uint8_t* kernel_buffer, - intptr_t kernel_buffer_size, - char** error); - -} // namespace embedder -} // namespace dart - -#endif // RUNTIME_INCLUDE_DART_EMBEDDER_API_H_ diff --git a/src/dart_api/dart_native_api.h b/src/dart_api/dart_native_api.h deleted file mode 100644 index 79194e03..00000000 --- a/src/dart_api/dart_native_api.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -#ifndef RUNTIME_INCLUDE_DART_NATIVE_API_H_ -#define RUNTIME_INCLUDE_DART_NATIVE_API_H_ - -#include "dart_api.h" /* NOLINT */ - -/* - * ========================================== - * Message sending/receiving from native code - * ========================================== - */ - -/** - * A Dart_CObject is used for representing Dart objects as native C - * data outside the Dart heap. These objects are totally detached from - * the Dart heap. Only a subset of the Dart objects have a - * representation as a Dart_CObject. - * - * The string encoding in the 'value.as_string' is UTF-8. - * - * All the different types from dart:typed_data are exposed as type - * kTypedData. The specific type from dart:typed_data is in the type - * field of the as_typed_data structure. The length in the - * as_typed_data structure is always in bytes. - * - * The data for kTypedData is copied on message send and ownership remains with - * the caller. The ownership of data for kExternalTyped is passed to the VM on - * message send and returned when the VM invokes the - * Dart_HandleFinalizer callback; a non-NULL callback must be provided. - * - * Note that Dart_CObject_kNativePointer is intended for internal use by - * dart:io implementation and has no connection to dart:ffi Pointer class. - * It represents a pointer to a native resource of a known type. - * The receiving side will only see this pointer as an integer and will not - * see the specified finalizer. - * The specified finalizer will only be invoked if the message is not delivered. - */ -typedef enum { - Dart_CObject_kNull = 0, - Dart_CObject_kBool, - Dart_CObject_kInt32, - Dart_CObject_kInt64, - Dart_CObject_kDouble, - Dart_CObject_kString, - Dart_CObject_kArray, - Dart_CObject_kTypedData, - Dart_CObject_kExternalTypedData, - Dart_CObject_kSendPort, - Dart_CObject_kCapability, - Dart_CObject_kNativePointer, - Dart_CObject_kUnsupported, - Dart_CObject_kUnmodifiableExternalTypedData, - Dart_CObject_kNumberOfTypes -} Dart_CObject_Type; -// This enum is versioned by DART_API_DL_MAJOR_VERSION, only add at the end -// and bump the DART_API_DL_MINOR_VERSION. - -typedef struct _Dart_CObject { - Dart_CObject_Type type; - union { - bool as_bool; - int32_t as_int32; - int64_t as_int64; - double as_double; - const char* as_string; - struct { - Dart_Port id; - Dart_Port origin_id; - } as_send_port; - struct { - int64_t id; - } as_capability; - struct { - intptr_t length; - struct _Dart_CObject** values; - } as_array; - struct { - Dart_TypedData_Type type; - intptr_t length; /* in elements, not bytes */ - const uint8_t* values; - } as_typed_data; - struct { - Dart_TypedData_Type type; - intptr_t length; /* in elements, not bytes */ - uint8_t* data; - void* peer; - Dart_HandleFinalizer callback; - } as_external_typed_data; - struct { - intptr_t ptr; - intptr_t size; - Dart_HandleFinalizer callback; - } as_native_pointer; - } value; -} Dart_CObject; -// This struct is versioned by DART_API_DL_MAJOR_VERSION, bump the version when -// changing this struct. - -/** - * Posts a message on some port. The message will contain the Dart_CObject - * object graph rooted in 'message'. - * - * While the message is being sent the state of the graph of Dart_CObject - * structures rooted in 'message' should not be accessed, as the message - * generation will make temporary modifications to the data. When the message - * has been sent the graph will be fully restored. - * - * If true is returned, the message was enqueued, and finalizers for external - * typed data will eventually run, even if the receiving isolate shuts down - * before processing the message. If false is returned, the message was not - * enqueued and ownership of external typed data in the message remains with the - * caller. - * - * This function may be called on any thread when the VM is running (that is, - * after Dart_Initialize has returned and before Dart_Cleanup has been called). - * - * \param port_id The destination port. - * \param message The message to send. - * - * \return True if the message was posted. - */ -DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message); - -/** - * Posts a message on some port. The message will contain the integer 'message'. - * - * \param port_id The destination port. - * \param message The message to send. - * - * \return True if the message was posted. - */ -DART_EXPORT bool Dart_PostInteger(Dart_Port port_id, int64_t message); - -/** - * A native message handler. - * - * This handler is associated with a native port by calling - * Dart_NewNativePort. - * - * The message received is decoded into the message structure. The - * lifetime of the message data is controlled by the caller. All the - * data references from the message are allocated by the caller and - * will be reclaimed when returning to it. - */ -typedef void (*Dart_NativeMessageHandler)(Dart_Port dest_port_id, - Dart_CObject* message); - -/** - * Creates a new native port. When messages are received on this - * native port, then they will be dispatched to the provided native - * message handler. - * - * \param name The name of this port in debugging messages. - * \param handler The C handler to run when messages arrive on the port. - * \param handle_concurrently Is it okay to process requests on this - * native port concurrently? - * - * \return If successful, returns the port id for the native port. In - * case of error, returns ILLEGAL_PORT. - */ -DART_EXPORT Dart_Port Dart_NewNativePort(const char* name, - Dart_NativeMessageHandler handler, - bool handle_concurrently); -/* TODO(turnidge): Currently handle_concurrently is ignored. */ - -/** - * Closes the native port with the given id. - * - * The port must have been allocated by a call to Dart_NewNativePort. - * - * \param native_port_id The id of the native port to close. - * - * \return Returns true if the port was closed successfully. - */ -DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id); - -/* - * ================== - * Verification Tools - * ================== - */ - -/** - * Forces all loaded classes and functions to be compiled eagerly in - * the current isolate.. - * - * TODO(turnidge): Document. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll(void); - -/** - * Finalizes all classes. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_FinalizeAllClasses(void); - -/* This function is intentionally undocumented. - * - * It should not be used outside internal tests. - */ -DART_EXPORT void* Dart_ExecuteInternalCommand(const char* command, void* arg); - -#endif /* INCLUDE_DART_NATIVE_API_H_ */ /* NOLINT */ diff --git a/src/dart_api/dart_tools_api.h b/src/dart_api/dart_tools_api.h deleted file mode 100644 index c118bc46..00000000 --- a/src/dart_api/dart_tools_api.h +++ /dev/null @@ -1,627 +0,0 @@ -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -#ifndef RUNTIME_INCLUDE_DART_TOOLS_API_H_ -#define RUNTIME_INCLUDE_DART_TOOLS_API_H_ - -#include "dart_api.h" /* NOLINT */ - -/** \mainpage Dart Tools Embedding API Reference - * - * This reference describes the Dart embedding API for tools. Tools include - * a debugger, service protocol, and timeline. - * - * NOTE: The APIs described in this file are unstable and subject to change. - * - * This reference is generated from the header include/dart_tools_api.h. - */ - -/* - * ======== - * Debugger - * ======== - */ - -/** - * ILLEGAL_ISOLATE_ID is a number guaranteed never to be associated with a - * valid isolate. - */ -#define ILLEGAL_ISOLATE_ID ILLEGAL_PORT - -/** - * ILLEGAL_ISOLATE_GROUP_ID is a number guaranteed never to be associated with a - * valid isolate group. - */ -#define ILLEGAL_ISOLATE_GROUP_ID 0 - -/* - * ======= - * Service - * ======= - */ - -/** - * A service request callback function. - * - * These callbacks, registered by the embedder, are called when the VM receives - * a service request it can't handle and the service request command name - * matches one of the embedder registered handlers. - * - * The return value of the callback indicates whether the response - * should be used as a regular result or an error result. - * Specifically, if the callback returns true, a regular JSON-RPC - * response is built in the following way: - * - * { - * "jsonrpc": "2.0", - * "result": , - * "id": , - * } - * - * If the callback returns false, a JSON-RPC error is built like this: - * - * { - * "jsonrpc": "2.0", - * "error": , - * "id": , - * } - * - * \param method The rpc method name. - * \param param_keys Service requests can have key-value pair parameters. The - * keys and values are flattened and stored in arrays. - * \param param_values The values associated with the keys. - * \param num_params The length of the param_keys and param_values arrays. - * \param user_data The user_data pointer registered with this handler. - * \param result A C string containing a valid JSON object. The returned - * pointer will be freed by the VM by calling free. - * - * \return True if the result is a regular JSON-RPC response, false if the - * result is a JSON-RPC error. - */ -typedef bool (*Dart_ServiceRequestCallback)(const char* method, - const char** param_keys, - const char** param_values, - intptr_t num_params, - void* user_data, - const char** json_object); - -/** - * Register a Dart_ServiceRequestCallback to be called to handle - * requests for the named rpc on a specific isolate. The callback will - * be invoked with the current isolate set to the request target. - * - * \param method The name of the method that this callback is responsible for. - * \param callback The callback to invoke. - * \param user_data The user data passed to the callback. - * - * NOTE: If multiple callbacks with the same name are registered, only - * the last callback registered will be remembered. - */ -DART_EXPORT void Dart_RegisterIsolateServiceRequestCallback( - const char* method, - Dart_ServiceRequestCallback callback, - void* user_data); - -/** - * Register a Dart_ServiceRequestCallback to be called to handle - * requests for the named rpc. The callback will be invoked without a - * current isolate. - * - * \param method The name of the command that this callback is responsible for. - * \param callback The callback to invoke. - * \param user_data The user data passed to the callback. - * - * NOTE: If multiple callbacks with the same name are registered, only - * the last callback registered will be remembered. - */ -DART_EXPORT void Dart_RegisterRootServiceRequestCallback( - const char* method, - Dart_ServiceRequestCallback callback, - void* user_data); - -/** - * Embedder information which can be requested by the VM for internal or - * reporting purposes. - * - * The pointers in this structure are not going to be cached or freed by the VM. - */ - -#define DART_EMBEDDER_INFORMATION_CURRENT_VERSION (0x00000001) - -typedef struct { - int32_t version; - const char* name; // [optional] The name of the embedder - int64_t current_rss; // [optional] the current RSS of the embedder - int64_t max_rss; // [optional] the maximum RSS of the embedder -} Dart_EmbedderInformation; - -/** - * Callback provided by the embedder that is used by the VM to request - * information. - * - * \return Returns a pointer to a Dart_EmbedderInformation structure. - * The embedder keeps the ownership of the structure and any field in it. - * The embedder must ensure that the structure will remain valid until the - * next invocation of the callback. - */ -typedef void (*Dart_EmbedderInformationCallback)( - Dart_EmbedderInformation* info); - -/** - * Register a Dart_ServiceRequestCallback to be called to handle - * requests for the named rpc. The callback will be invoked without a - * current isolate. - * - * \param method The name of the command that this callback is responsible for. - * \param callback The callback to invoke. - * \param user_data The user data passed to the callback. - * - * NOTE: If multiple callbacks are registered, only the last callback registered - * will be remembered. - */ -DART_EXPORT void Dart_SetEmbedderInformationCallback( - Dart_EmbedderInformationCallback callback); - -/** - * Invoke a vm-service method and wait for its result. - * - * \param request_json The utf8-encoded json-rpc request. - * \param request_json_length The length of the json-rpc request. - * - * \param response_json The returned utf8-encoded json response, must be - * free()ed by caller. - * \param response_json_length The length of the returned json response. - * \param error An optional error, must be free()ed by caller. - * - * \return Whether the call was successfully performed. - * - * NOTE: This method does not need a current isolate and must not have the - * vm-isolate being the current isolate. It must be called after - * Dart_Initialize() and before Dart_Cleanup(). - */ -DART_EXPORT bool Dart_InvokeVMServiceMethod(uint8_t* request_json, - intptr_t request_json_length, - uint8_t** response_json, - intptr_t* response_json_length, - char** error); - -/* - * ======== - * Event Streams - * ======== - */ - -/** - * A callback invoked when the VM service gets a request to listen to - * some stream. - * - * \return Returns true iff the embedder supports the named stream id. - */ -typedef bool (*Dart_ServiceStreamListenCallback)(const char* stream_id); - -/** - * A callback invoked when the VM service gets a request to cancel - * some stream. - */ -typedef void (*Dart_ServiceStreamCancelCallback)(const char* stream_id); - -/** - * Adds VM service stream callbacks. - * - * \param listen_callback A function pointer to a listen callback function. - * A listen callback function should not be already set when this function - * is called. A NULL value removes the existing listen callback function - * if any. - * - * \param cancel_callback A function pointer to a cancel callback function. - * A cancel callback function should not be already set when this function - * is called. A NULL value removes the existing cancel callback function - * if any. - * - * \return Success if the callbacks were added. Otherwise, returns an - * error handle. - */ -DART_EXPORT char* Dart_SetServiceStreamCallbacks( - Dart_ServiceStreamListenCallback listen_callback, - Dart_ServiceStreamCancelCallback cancel_callback); - -/** - * Sends a data event to clients of the VM Service. - * - * A data event is used to pass an array of bytes to subscribed VM - * Service clients. For example, in the standalone embedder, this is - * function used to provide WriteEvents on the Stdout and Stderr - * streams. - * - * If the embedder passes in a stream id for which no client is - * subscribed, then the event is ignored. - * - * \param stream_id The id of the stream on which to post the event. - * - * \param event_kind A string identifying what kind of event this is. - * For example, 'WriteEvent'. - * - * \param bytes A pointer to an array of bytes. - * - * \param bytes_length The length of the byte array. - * - * \return NULL if the arguments are well formed. Otherwise, returns an - * error string. The caller is responsible for freeing the error message. - */ -DART_EXPORT char* Dart_ServiceSendDataEvent(const char* stream_id, - const char* event_kind, - const uint8_t* bytes, - intptr_t bytes_length); - -/* - * ======== - * Reload support - * ======== - * - * These functions are used to implement reloading in the Dart VM. - * This is an experimental feature, so embedders should be prepared - * for these functions to change. - */ - -/** - * A callback which determines whether the file at some url has been - * modified since some time. If the file cannot be found, true should - * be returned. - */ -typedef bool (*Dart_FileModifiedCallback)(const char* url, int64_t since); - -DART_EXPORT char* Dart_SetFileModifiedCallback( - Dart_FileModifiedCallback file_modified_callback); - -/** - * Returns true if isolate is currently reloading. - */ -DART_EXPORT bool Dart_IsReloading(); - -/* - * ======== - * Timeline - * ======== - */ - -/** - * Enable tracking of specified timeline category. This is operational - * only when systrace timeline functionality is turned on. - * - * \param categories A comma separated list of categories that need to - * be enabled, the categories are - * "all" : All categories - * "API" - Execution of Dart C API functions - * "Compiler" - Execution of Dart JIT compiler - * "CompilerVerbose" - More detailed Execution of Dart JIT compiler - * "Dart" - Execution of Dart code - * "Debugger" - Execution of Dart debugger - * "Embedder" - Execution of Dart embedder code - * "GC" - Execution of Dart Garbage Collector - * "Isolate" - Dart Isolate lifecycle execution - * "VM" - Execution in Dart VM runtime code - * "" - None - * - * When "all" is specified all the categories are enabled. - * When a comma separated list of categories is specified, the categories - * that are specified will be enabled and the rest will be disabled. - * When "" is specified all the categories are disabled. - * The category names are case sensitive. - * eg: Dart_EnableTimelineCategory("all"); - * Dart_EnableTimelineCategory("GC,API,Isolate"); - * Dart_EnableTimelineCategory("GC,Debugger,Dart"); - * - * \return True if the categories were successfully enabled, False otherwise. - */ -DART_EXPORT bool Dart_SetEnabledTimelineCategory(const char* categories); - -/** - * Returns a timestamp in microseconds. This timestamp is suitable for - * passing into the timeline system, and uses the same monotonic clock - * as dart:developer's Timeline.now. - * - * \return A timestamp that can be passed to the timeline system. - */ -DART_EXPORT int64_t Dart_TimelineGetMicros(); - -/** - * Returns a raw timestamp in from the monotonic clock. - * - * \return A raw timestamp from the monotonic clock. - */ -DART_EXPORT int64_t Dart_TimelineGetTicks(); - -/** - * Returns the frequency of the monotonic clock. - * - * \return The frequency of the monotonic clock. - */ -DART_EXPORT int64_t Dart_TimelineGetTicksFrequency(); - -typedef enum { - Dart_Timeline_Event_Begin, // Phase = 'B'. - Dart_Timeline_Event_End, // Phase = 'E'. - Dart_Timeline_Event_Instant, // Phase = 'i'. - Dart_Timeline_Event_Duration, // Phase = 'X'. - Dart_Timeline_Event_Async_Begin, // Phase = 'b'. - Dart_Timeline_Event_Async_End, // Phase = 'e'. - Dart_Timeline_Event_Async_Instant, // Phase = 'n'. - Dart_Timeline_Event_Counter, // Phase = 'C'. - Dart_Timeline_Event_Flow_Begin, // Phase = 's'. - Dart_Timeline_Event_Flow_Step, // Phase = 't'. - Dart_Timeline_Event_Flow_End, // Phase = 'f'. -} Dart_Timeline_Event_Type; - -/** - * Add a timeline event to the embedder stream. - * - * Note regarding flow events: events must be associated with flow IDs in two - * different ways to allow flow events to be serialized correctly in both - * Chrome's JSON trace event format and Perfetto's proto trace format. Events - * of type |Dart_Timeline_Event_Flow_Begin|, |Dart_Timeline_Event_Flow_Step|, - * and |Dart_Timeline_Event_Flow_End| must be reported to support serialization - * in Chrome's trace format. The |flow_ids| argument must be supplied when - * reporting events of type |Dart_Timeline_Event_Begin|, - * |Dart_Timeline_Event_Duration|, |Dart_Timeline_Event_Instant|, - * |Dart_Timeline_Event_Async_Begin|, and |Dart_Timeline_Event_Async_Instant| to - * support serialization in Perfetto's proto format. - * - * The Dart VM can use various underlying recorders depending on configuration - * and operating system. Many recorders do not support all event types; - * unsupported event types are siliently dropped. Some recorders do not accept - * timestamps as input, instead implicitly using the time the event is recorded. - * For maximum compatibility, record events with the Begin and End types as they - * occur instead of using the Duration type or buffering. - * - * \param label The name of the event. Its lifetime must extend at least until - * Dart_Cleanup. - * \param timestamp0 The first timestamp of the event. - * \param timestamp1_or_id When reporting an event of type - * |Dart_Timeline_Event_Duration|, the second (end) timestamp of the event - * should be passed through |timestamp1_or_id|. When reporting an event of - * type |Dart_Timeline_Event_Async_Begin|, |Dart_Timeline_Event_Async_End|, - * or |Dart_Timeline_Event_Async_Instant|, the async ID associated with the - * event should be passed through |timestamp1_or_id|. When reporting an - * event of type |Dart_Timeline_Event_Flow_Begin|, - * |Dart_Timeline_Event_Flow_Step|, or |Dart_Timeline_Event_Flow_End|, the - * flow ID associated with the event should be passed through - * |timestamp1_or_id|. When reporting an event of type - * |Dart_Timeline_Event_Begin| or |Dart_Timeline_Event_End|, the event ID - * associated with the event should be passed through |timestamp1_or_id|. - * Note that this event ID will only be used by the MacOS recorder. The - * argument to |timestamp1_or_id| will not be used when reporting events of - * other types. - * \param flow_id_count The number of flow IDs associated with this event. - * \param flow_ids An array of flow IDs associated with this event. The array - * may be reclaimed when this call returns. - * \param argument_count The number of argument names and values. - * \param argument_names An array of names of the arguments. The lifetime of the - * names must extend at least until Dart_Cleanup. The array may be reclaimed - * when this call returns. - * \param argument_values An array of values of the arguments. The values and - * the array may be reclaimed when this call returns. - */ -DART_EXPORT void Dart_RecordTimelineEvent(const char* label, - int64_t timestamp0, - int64_t timestamp1_or_id, - intptr_t flow_id_count, - const int64_t* flow_ids, - Dart_Timeline_Event_Type type, - intptr_t argument_count, - const char** argument_names, - const char** argument_values); - -/** - * Associates a name with the current thread. This name will be used to name - * threads in the timeline. Can only be called after a call to Dart_Initialize. - * - * \param name The name of the thread. - */ -DART_EXPORT void Dart_SetThreadName(const char* name); - -typedef struct { - const char* name; - const char* value; -} Dart_TimelineRecorderEvent_Argument; - -#define DART_TIMELINE_RECORDER_CURRENT_VERSION (0x00000002) - -typedef struct { - /* Set to DART_TIMELINE_RECORDER_CURRENT_VERSION */ - int32_t version; - - /* The event's type / phase. */ - Dart_Timeline_Event_Type type; - - /* The event's timestamp according to the same clock as - * Dart_TimelineGetMicros. For a duration event, this is the beginning time. - */ - int64_t timestamp0; - - /** - * For a duration event, this is the end time. For an async event, this is the - * async ID. For a flow event, this is the flow ID. For a begin or end event, - * this is the event ID (which is only referenced by the MacOS recorder). - */ - int64_t timestamp1_or_id; - - /* The current isolate of the event, as if by Dart_GetMainPortId, or - * ILLEGAL_PORT if the event had no current isolate. */ - Dart_Port isolate; - - /* The current isolate group of the event, as if by - * Dart_CurrentIsolateGroupId, or ILLEGAL_PORT if the event had no current - * isolate group. */ - Dart_IsolateGroupId isolate_group; - - /* The callback data associated with the isolate if any. */ - void* isolate_data; - - /* The callback data associated with the isolate group if any. */ - void* isolate_group_data; - - /* The name / label of the event. */ - const char* label; - - /* The stream / category of the event. */ - const char* stream; - - intptr_t argument_count; - Dart_TimelineRecorderEvent_Argument* arguments; -} Dart_TimelineRecorderEvent; - -/** - * Callback provided by the embedder to handle the completion of timeline - * events. - * - * \param event A timeline event that has just been completed. The VM keeps - * ownership of the event and any field in it (i.e., the embedder should copy - * any values it needs after the callback returns). - */ -typedef void (*Dart_TimelineRecorderCallback)( - Dart_TimelineRecorderEvent* event); - -/** - * Register a `Dart_TimelineRecorderCallback` to be called as timeline events - * are completed. - * - * The callback will be invoked without a current isolate. - * - * The callback will be invoked on the thread completing the event. Because - * `Dart_RecordTimelineEvent` may be called by any thread, the callback may be - * called on any thread. - * - * The callback may be invoked at any time after `Dart_Initialize` is called and - * before `Dart_Cleanup` returns. - * - * If multiple callbacks are registered, only the last callback registered - * will be remembered. Providing a NULL callback will clear the registration - * (i.e., a NULL callback produced a no-op instead of a crash). - * - * Setting a callback is insufficient to receive events through the callback. The - * VM flag `timeline_recorder` must also be set to `callback`. - */ -DART_EXPORT void Dart_SetTimelineRecorderCallback( - Dart_TimelineRecorderCallback callback); - -/* - * ======= - * Metrics - * ======= - */ - -/** - * Return metrics gathered for the VM and individual isolates. - */ -DART_EXPORT int64_t -Dart_IsolateGroupHeapOldUsedMetric(Dart_IsolateGroup group); // Byte -DART_EXPORT int64_t -Dart_IsolateGroupHeapOldCapacityMetric(Dart_IsolateGroup group); // Byte -DART_EXPORT int64_t -Dart_IsolateGroupHeapOldExternalMetric(Dart_IsolateGroup group); // Byte -DART_EXPORT int64_t -Dart_IsolateGroupHeapNewUsedMetric(Dart_IsolateGroup group); // Byte -DART_EXPORT int64_t -Dart_IsolateGroupHeapNewCapacityMetric(Dart_IsolateGroup group); // Byte -DART_EXPORT int64_t -Dart_IsolateGroupHeapNewExternalMetric(Dart_IsolateGroup group); // Byte - -/* - * ======== - * UserTags - * ======== - */ - -/* - * Gets the current isolate's currently set UserTag instance. - * - * \return The currently set UserTag instance. - */ -DART_EXPORT Dart_Handle Dart_GetCurrentUserTag(); - -/* - * Gets the current isolate's default UserTag instance. - * - * \return The default UserTag with label 'Default' - */ -DART_EXPORT Dart_Handle Dart_GetDefaultUserTag(); - -/* - * Creates a new UserTag instance. - * - * \param label The name of the new UserTag. - * - * \return The newly created UserTag instance or an error handle. - */ -DART_EXPORT Dart_Handle Dart_NewUserTag(const char* label); - -/* - * Updates the current isolate's UserTag to a new value. - * - * \param user_tag The UserTag to be set as the current UserTag. - * - * \return The previously set UserTag instance or an error handle. - */ -DART_EXPORT Dart_Handle Dart_SetCurrentUserTag(Dart_Handle user_tag); - -/* - * Returns the label of a given UserTag instance. - * - * \param user_tag The UserTag from which the label will be retrieved. - * - * \return The UserTag's label. NULL if the user_tag is invalid. The caller is - * responsible for freeing the returned label. - */ -DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_GetUserTagLabel( - Dart_Handle user_tag); - -/* - * ======= - * Heap Snapshot - * ======= - */ - -/** - * Callback provided by the caller of `Dart_WriteHeapSnapshot` which is - * used to write out chunks of the requested heap snapshot. - * - * \param context An opaque context which was passed to `Dart_WriteHeapSnapshot` - * together with this callback. - * - * \param buffer Pointer to the buffer containing a chunk of the snapshot. - * The callback owns the buffer and needs to `free` it. - * - * \param size Number of bytes in the `buffer` to be written. - * - * \param is_last Set to `true` for the last chunk. The callback will not - * be invoked again after it was invoked once with `is_last` set to `true`. - */ -typedef void (*Dart_HeapSnapshotWriteChunkCallback)(void* context, - uint8_t* buffer, - intptr_t size, - bool is_last); - -/** - * Generate heap snapshot of the current isolate group and stream it into the - * given `callback`. VM would produce snapshot in chunks and send these chunks - * one by one back to the embedder by invoking the provided `callback`. - * - * This API enables embedder to stream snapshot into a file or socket without - * allocating a buffer to hold the whole snapshot in memory. - * - * The isolate group will be paused for the duration of this operation. - * - * \param write Callback used to write chunks of the heap snapshot. - * - * \param context Opaque context which would be passed on each invocation of - * `write` callback. - * - * \returns `nullptr` if the operation is successful otherwise error message. - * Caller owns error message string and needs to `free` it. - */ -DART_EXPORT char* Dart_WriteHeapSnapshot( - Dart_HeapSnapshotWriteChunkCallback write, - void* context); - -#endif // RUNTIME_INCLUDE_DART_TOOLS_API_H_ diff --git a/src/dart_api/dart_version.h b/src/dart_api/dart_version.h deleted file mode 100644 index 5ca0b683..00000000 --- a/src/dart_api/dart_version.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -#ifndef RUNTIME_INCLUDE_DART_VERSION_H_ -#define RUNTIME_INCLUDE_DART_VERSION_H_ - -// On breaking changes the major version is increased. -// On backwards compatible changes the minor version is increased. -// The versioning covers the symbols exposed in dart_api_dl.h -#define DART_API_DL_MAJOR_VERSION 2 -#define DART_API_DL_MINOR_VERSION 5 - -#endif /* RUNTIME_INCLUDE_DART_VERSION_H_ */ /* NOLINT */ diff --git a/src/dart_api/internal/dart_api_dl_impl.h b/src/dart_api/internal/dart_api_dl_impl.h deleted file mode 100644 index e4a56893..00000000 --- a/src/dart_api/internal/dart_api_dl_impl.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file - * for details. All rights reserved. Use of this source code is governed by a - * BSD-style license that can be found in the LICENSE file. - */ - -#ifndef RUNTIME_INCLUDE_INTERNAL_DART_API_DL_IMPL_H_ -#define RUNTIME_INCLUDE_INTERNAL_DART_API_DL_IMPL_H_ - -typedef struct { - const char* name; - void (*function)(void); -} DartApiEntry; - -typedef struct { - const int major; - const int minor; - const DartApiEntry* const functions; -} DartApi; - -#endif /* RUNTIME_INCLUDE_INTERNAL_DART_API_DL_IMPL_H_ */ /* NOLINT */ diff --git a/src/dnn/asyncarray.cpp b/src/dnn/asyncarray.cpp deleted file mode 100644 index e21e51e9..00000000 --- a/src/dnn/asyncarray.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "asyncarray.h" -#include - -// AsyncArray_New creates a new empty AsyncArray -CvStatus *AsyncArray_New(AsyncArray *rval) -{ - BEGIN_WRAP - *rval = {new cv::AsyncArray()}; - END_WRAP -} - -// AsyncArray_Close deletes an existing AsyncArray -void AsyncArray_Close(AsyncArrayPtr a) { CVD_FREE(a); } - -CvStatus *AsyncArray_Get(AsyncArray async_out, Mat out) -{ - BEGIN_WRAP - async_out.ptr->get(*out.ptr); - END_WRAP -} - -CvStatus *Net_forwardAsync(Net net, const char *outputName, AsyncArray *rval) -{ - BEGIN_WRAP - auto arr = net.ptr->forwardAsync(); - *rval = {&arr}; - END_WRAP -} diff --git a/src/dnn/asyncarray.h b/src/dnn/asyncarray.h deleted file mode 100644 index 1ebc112d..00000000 --- a/src/dnn/asyncarray.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "dnn.h" - -#ifdef __cplusplus -CVD_TYPEDEF(cv::AsyncArray, AsyncArray); -#else -CVD_TYPEDEF(void, AsyncArray); -#endif - -CvStatus *AsyncArray_New(AsyncArray *rval); -CvStatus *AsyncArray_Get(AsyncArray async_out, Mat out); -CvStatus *Net_forwardAsync(Net net, const char *outputName, AsyncArray *rval); -void AsyncArray_Close(AsyncArrayPtr a); - -#ifdef __cplusplus -} -#endif diff --git a/src/dnn/dnn.cpp b/src/dnn/dnn.cpp deleted file mode 100644 index b8475f87..00000000 --- a/src/dnn/dnn.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "dnn.h" -#include "core/vec.hpp" -#include -#include - -CvStatus *Net_Create(Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net()}; - END_WRAP -} -CvStatus *Net_FromNet(Net net, Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net(*net.ptr)}; - END_WRAP -} -CvStatus *Net_ReadNet(const char *model, const char *config, const char *framework, Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net(cv_dnn::readNet(model, config, framework))}; - END_WRAP -} -CvStatus *Net_ReadNetBytes(const char *framework, VecUChar model, VecUChar config, Net *rval) { - BEGIN_WRAP - auto _model = vecuchar_c2cpp(model); - auto _config = vecuchar_c2cpp(config); - *rval = {new cv_dnn::Net(cv_dnn::readNet(framework, _model, _config))}; - END_WRAP -} -CvStatus *Net_ReadNetFromCaffe(const char *prototxt, const char *caffeModel, Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net(cv_dnn::readNetFromCaffe(prototxt, caffeModel))}; - END_WRAP -} -CvStatus *Net_ReadNetFromCaffeBytes(VecUChar prototxt, VecUChar caffeModel, Net *rval) { - BEGIN_WRAP - auto _prototxt = vecuchar_c2cpp(prototxt); - auto _caffeModel = vecuchar_c2cpp(caffeModel); - *rval = {new cv_dnn::Net(cv_dnn::readNetFromCaffe(_prototxt, _caffeModel))}; - END_WRAP -} -CvStatus *Net_ReadNetFromTensorflow(const char *model, const char *config, Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net(cv_dnn::readNetFromTensorflow(model, config))}; - END_WRAP -} -CvStatus *Net_ReadNetFromTensorflowBytes(VecUChar model, VecUChar config, Net *rval) { - BEGIN_WRAP - auto _model = vecuchar_c2cpp(model); - auto _config = vecuchar_c2cpp(config); - *rval = {new cv_dnn::Net(cv_dnn::readNetFromTensorflow(_model, _config))}; - END_WRAP -} -CvStatus *Net_ReadNetFromTFLite(const char *model, Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net(cv_dnn::readNetFromTFLite(model))}; - END_WRAP -} -CvStatus *Net_ReadNetFromTFLiteBytes(VecUChar bufferModel, Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net(cv_dnn::readNetFromTFLite((char *)bufferModel.ptr, bufferModel.length))}; - END_WRAP -} -CvStatus *Net_ReadNetFromTorch(const char *model, bool isBinary, bool evaluate, Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net(cv_dnn::readNetFromTorch(model, isBinary, evaluate))}; - END_WRAP -} -CvStatus *Net_ReadNetFromONNX(const char *model, Net *rval) { - BEGIN_WRAP - *rval = {new cv_dnn::Net(cv_dnn::readNetFromONNX(model))}; - END_WRAP -} -CvStatus *Net_ReadNetFromONNXBytes(VecUChar model, Net *rval) { - BEGIN_WRAP - auto _model = vecuchar_c2cpp(model); - *rval = {new cv_dnn::Net(cv_dnn::readNetFromONNX(_model))}; - END_WRAP -} - -void Net_Close(NetPtr net) { CVD_FREE(net); } - -CvStatus *Net_BlobFromImage( - Mat image, - Mat blob, - double scalefactor, - Size size, - Scalar mean, - bool swapRB, - bool crop, - int ddepth -) { - BEGIN_WRAP - cv::Size sz(size.width, size.height); - cv::Scalar cm(mean.val1, mean.val2, mean.val3, mean.val4); - cv_dnn::blobFromImage(*image.ptr, *blob.ptr, scalefactor, sz, cm, swapRB, crop, ddepth); - END_WRAP -} - -CvStatus *Net_BlobFromImages( - VecMat images, - Mat blob, - double scalefactor, - Size size, - Scalar mean, - bool swapRB, - bool crop, - int ddepth -) { - BEGIN_WRAP - cv::Size sz(size.width, size.height); - cv::Scalar cm = cv::Scalar(mean.val1, mean.val2, mean.val3, mean.val4); - auto _images = vecmat_c2cpp(images); - cv_dnn::blobFromImages(_images, *blob.ptr, scalefactor, sz, cm, swapRB, crop, ddepth); - END_WRAP -} - -CvStatus *Net_ImagesFromBlob(Mat blob, VecMat *rval) { - BEGIN_WRAP - std::vector imgs; - cv_dnn::imagesFromBlob(*blob.ptr, imgs); - *rval = vecmat_cpp2c(imgs); - END_WRAP -} - -CvStatus *Net_Empty(Net net, bool *rval) { - BEGIN_WRAP - *rval = net.ptr->empty(); - END_WRAP -} - -CvStatus *Net_Dump(Net net, char **rval) { - BEGIN_WRAP - auto ss = net.ptr->dump(); - *rval = strdup(ss.c_str()); - END_WRAP -} - -CvStatus *Net_SetInput(Net net, Mat blob, const char *name) { - BEGIN_WRAP - net.ptr->setInput(*blob.ptr, name); - END_WRAP -} - -CvStatus *Net_Forward(Net net, const char *outputName, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(net.ptr->forward(outputName))}; - END_WRAP -} - -CvStatus *Net_ForwardLayers(Net net, VecMat *outputBlobs, VecVecChar outBlobNames) { - BEGIN_WRAP - std::vector blobs; - - auto names = vecvecchar_c2cpp_s(outBlobNames); - net.ptr->forward(blobs, names); - *outputBlobs = vecmat_cpp2c(blobs); - END_WRAP -} - -CvStatus *Net_SetPreferableBackend(Net net, int backend) { - BEGIN_WRAP - net.ptr->setPreferableBackend(backend); - END_WRAP -} - -CvStatus *Net_SetPreferableTarget(Net net, int target) { - BEGIN_WRAP - net.ptr->setPreferableTarget(target); - END_WRAP -} - -CvStatus *Net_GetPerfProfile(Net net, int64_t *rval) { - BEGIN_WRAP - std::vector layersTimes; - *rval = net.ptr->getPerfProfile(layersTimes); - END_WRAP -} - -CvStatus *Net_GetUnconnectedOutLayers(Net net, VecI32 *rval) { - BEGIN_WRAP - *rval = vecint_cpp2c(net.ptr->getUnconnectedOutLayers()); - END_WRAP -} - -CvStatus *Net_GetLayerNames(Net net, VecVecChar *rval) { - BEGIN_WRAP - std::vector cstrs = net.ptr->getLayerNames(); - *rval = vecvecchar_cpp2c_s(cstrs); - END_WRAP -} - -CvStatus *Net_GetInputDetails(Net net, VecF32 *scales, VecI32 *zeropoints) { - BEGIN_WRAP - std::vector sc; - std::vector zp; - net.ptr->getInputDetails(sc, zp); - *scales = vecfloat_cpp2c(sc); - *zeropoints = vecint_cpp2c(zp); - END_WRAP -} - -CvStatus *Net_GetBlobChannel(Mat blob, int imgidx, int chnidx, Mat *rval) { - BEGIN_WRAP - size_t w = blob.ptr->size[3]; - size_t h = blob.ptr->size[2]; - *rval = {new cv::Mat(h, w, CV_32F, blob.ptr->ptr(imgidx, chnidx))}; - END_WRAP -} - -CvStatus *Net_GetBlobSize(Mat blob, Scalar *rval) { - BEGIN_WRAP - *rval = { - (double)(blob.ptr->size[0]), - (double)(blob.ptr->size[1]), - (double)(blob.ptr->size[2]), - (double)(blob.ptr->size[3]), - }; - END_WRAP -} - -CvStatus *Net_GetLayer(Net net, int layerid, Layer *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(net.ptr->getLayer(layerid))}; - END_WRAP -} - -CvStatus *Layer_InputNameToIndex(Layer layer, const char *name, int *rval) { - BEGIN_WRAP - *rval = (*layer.ptr)->inputNameToIndex(name); - END_WRAP -} - -CvStatus *Layer_OutputNameToIndex(Layer layer, const char *name, int *rval) { - BEGIN_WRAP - *rval = (*layer.ptr)->outputNameToIndex(name); - END_WRAP -} - -CvStatus *Layer_GetName(Layer layer, char **rval) { - BEGIN_WRAP - auto ss = (*layer.ptr)->name; - *rval = strdup(ss.c_str()); - END_WRAP -} - -CvStatus *Layer_GetType(Layer layer, char **rval) { - BEGIN_WRAP - auto ss = (*layer.ptr)->type; - *rval = strdup(ss.c_str()); - END_WRAP -} - -void Layer_Close(LayerPtr layer) { - layer->ptr->reset(); - CVD_FREE(layer); -} - -CvStatus *NMSBoxes( - VecRect bboxes, VecF32 scores, float score_threshold, float nms_threshold, VecI32 *indices -) { - BEGIN_WRAP - std::vector v; - auto _bboxes = vecrect_c2cpp(bboxes); - auto _scores = vecfloat_c2cpp(scores); - cv_dnn::NMSBoxes(_bboxes, _scores, score_threshold, nms_threshold, v, 1.f, 0); - *indices = vecint_cpp2c(v); - END_WRAP -} - -CvStatus *NMSBoxesWithParams( - VecRect bboxes, - VecF32 scores, - const float score_threshold, - const float nms_threshold, - VecI32 *indices, - const float eta, - const int top_k -) { - BEGIN_WRAP - std::vector v; - auto _bboxes = vecrect_c2cpp(bboxes); - auto _scores = vecfloat_c2cpp(scores); - cv_dnn::NMSBoxes(_bboxes, _scores, score_threshold, nms_threshold, v, eta, top_k); - *indices = vecint_cpp2c(v); - END_WRAP -} diff --git a/src/dnn/dnn.h b/src/dnn/dnn.h deleted file mode 100644 index adc7c218..00000000 --- a/src/dnn/dnn.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef _OPENCV3_DNN_H_ -#define _OPENCV3_DNN_H_ - -#include - -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -#include "core/core.h" - -#ifdef __cplusplus -namespace cv_dnn = cv::dnn::dnn4_v20240521; -CVD_TYPEDEF(cv_dnn::Net, Net); -CVD_TYPEDEF(cv::Ptr, Layer); -#else -CVD_TYPEDEF(void, Net); -CVD_TYPEDEF(void, Layer); -#endif - -CvStatus *Net_Create(CVD_OUT Net *rval); -CvStatus *Net_FromNet(Net net, CVD_OUT Net *rval); -CvStatus *Net_ReadNet(const char *model, const char *config, const char *framework, CVD_OUT Net *rval); -CvStatus *Net_ReadNetBytes(const char *framework, VecUChar model, VecUChar config, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromCaffe(const char *prototxt, const char *caffeModel, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromCaffeBytes(VecUChar prototxt, VecUChar caffeModel, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromTensorflow(const char *model, const char *config, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromTensorflowBytes(VecUChar model, VecUChar config, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromTFLite(const char *model, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromTFLiteBytes(VecUChar bufferModel, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromTorch(const char *model, bool isBinary, bool evaluate, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromONNX(const char *model, CVD_OUT Net *rval); -CvStatus *Net_ReadNetFromONNXBytes(VecUChar model, CVD_OUT Net *rval); -void Net_Close(NetPtr net); - -CvStatus *Net_BlobFromImage(Mat image, CVD_OUT Mat blob, double scalefactor, Size size, Scalar mean, - bool swapRB, bool crop, int ddepth); -CvStatus *Net_BlobFromImages(VecMat images, CVD_OUT Mat blob, double scalefactor, Size size, Scalar mean, - bool swapRB, bool crop, int ddepth); -CvStatus *Net_ImagesFromBlob(Mat blob, CVD_OUT VecMat *rval); -CvStatus *Net_Empty(Net net, CVD_OUT bool *rval); -CvStatus *Net_Dump(Net net, CVD_OUT char **rval); -CvStatus *Net_SetInput(Net net, Mat blob, const char *name); -CvStatus *Net_Forward(Net net, const char *outputName, CVD_OUT Mat *rval); -CvStatus *Net_ForwardLayers(Net net, CVD_OUT VecMat *outputBlobs, VecVecChar outBlobNames); -CvStatus *Net_SetPreferableBackend(Net net, int backend); -CvStatus *Net_SetPreferableTarget(Net net, int target); -CvStatus *Net_GetPerfProfile(Net net, CVD_OUT int64_t *rval); -CvStatus *Net_GetUnconnectedOutLayers(Net net, CVD_OUT VecI32 *rval); -CvStatus *Net_GetLayerNames(Net net, CVD_OUT VecVecChar *rval); -CvStatus *Net_GetInputDetails(Net net, CVD_OUT VecF32 *scales, CVD_OUT VecI32 *zeropoints); - -CvStatus *Net_GetBlobChannel(Mat blob, int imgidx, int chnidx, CVD_OUT Mat *rval); -CvStatus *Net_GetBlobSize(Mat blob, CVD_OUT Scalar *rval); - -CvStatus *Net_GetLayer(Net net, int layerid, CVD_OUT Layer *rval); -CvStatus *Layer_InputNameToIndex(Layer layer, const char *name, CVD_OUT int *rval); -CvStatus *Layer_OutputNameToIndex(Layer layer, const char *name, CVD_OUT int *rval); -CvStatus *Layer_GetName(Layer layer, CVD_OUT char **rval); -CvStatus *Layer_GetType(Layer layer, CVD_OUT char **rval); -void Layer_Close(LayerPtr layer); - -CvStatus *NMSBoxes(VecRect bboxes, VecF32 scores, float score_threshold, float nms_threshold, - CVD_OUT VecI32 *indices); -CvStatus *NMSBoxesWithParams(VecRect bboxes, VecF32 scores, const float score_threshold, - const float nms_threshold, CVD_OUT VecI32 *indices, const float eta, - const int top_k); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_DNN_H_ diff --git a/src/dnn/dnn_async.cpp b/src/dnn/dnn_async.cpp deleted file mode 100644 index 1bbcb684..00000000 --- a/src/dnn/dnn_async.cpp +++ /dev/null @@ -1,321 +0,0 @@ -#include "dnn_async.h" -#include "core/types.h" -#include "core/vec.hpp" - -// Asynchronous functions for Net -CvStatus *Net_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new Net{new cv_dnn::Net()}); - END_WRAP -} - -CvStatus *Net_FromNet_Async(Net net, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Net{new cv_dnn::Net(*net.ptr)}); - END_WRAP -} - -CvStatus *Net_ReadNet_Async( - const char *model, const char *config, const char *framework, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new Net{new cv_dnn::Net(cv_dnn::readNet(model, config, framework))}); - END_WRAP -} - -CvStatus *Net_ReadNetBytes_Async( - const char *framework, VecUChar model, VecUChar config, CvCallback_1 callback -) { - BEGIN_WRAP - auto _model = vecuchar_c2cpp(model); - auto _config = vecuchar_c2cpp(config); - callback(new Net{new cv_dnn::Net(cv_dnn::readNet(framework, _model, _config))}); - END_WRAP -} - -CvStatus * -Net_ReadNetFromCaffe_Async(const char *prototxt, const char *caffeModel, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromCaffe(prototxt, caffeModel))}); - END_WRAP -} - -CvStatus * -Net_ReadNetFromCaffeBytes_Async(VecUChar prototxt, VecUChar caffeModel, CvCallback_1 callback) { - BEGIN_WRAP - auto _prototxt = vecuchar_c2cpp(prototxt); - auto _Model = vecuchar_c2cpp(caffeModel); - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromCaffe(_prototxt, _Model))}); - END_WRAP -} - -CvStatus * -Net_ReadNetFromTensorflow_Async(const char *model, const char *config, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromTensorflow(model, config))}); - END_WRAP -} - -CvStatus * -Net_ReadNetFromTensorflowBytes_Async(VecUChar model, VecUChar config, CvCallback_1 callback) { - BEGIN_WRAP - auto _model = vecuchar_c2cpp(model); - auto _config = vecuchar_c2cpp(config); - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromTensorflow(_model, _config))}); - END_WRAP -} - -CvStatus *Net_ReadNetFromTFLite_Async(const char *model, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromTFLite(model))}); - END_WRAP -} - -CvStatus *Net_ReadNetFromTFLiteBytes_Async(VecUChar bufferModel, CvCallback_1 callback) { - BEGIN_WRAP - auto _Model = vecuchar_c2cpp(bufferModel); - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromTFLite(_Model))}); - END_WRAP -} - -CvStatus * -Net_ReadNetFromTorch_Async(const char *model, bool isBinary, bool evaluate, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromTorch(model, isBinary, evaluate))}); - END_WRAP -} - -CvStatus *Net_ReadNetFromONNX_Async(const char *model, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromONNX(model))}); - END_WRAP -} - -CvStatus *Net_ReadNetFromONNXBytes_Async(VecUChar model, CvCallback_1 callback) { - BEGIN_WRAP - auto _model = vecuchar_c2cpp(model); - callback(new Net{new cv_dnn::Net(cv_dnn::readNetFromONNX(_model))}); - END_WRAP -} - -void Net_Close_Async(NetPtr net, CvCallback_0 callback) { - CVD_FREE(net); - callback(); -} - -CvStatus *Net_BlobFromImage_Async( - Mat image, - double scalefactor, - Size size, - Scalar mean, - bool swapRB, - bool crop, - int ddepth, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Size sz(size.width, size.height); - cv::Scalar cm(mean.val1, mean.val2, mean.val3, mean.val4); - Mat *blob = new Mat{new cv::Mat()}; - cv_dnn::blobFromImage(*image.ptr, *blob->ptr, scalefactor, sz, cm, swapRB, crop, ddepth); - callback(blob); - END_WRAP -} - -CvStatus *Net_BlobFromImages_Async( - VecMat images, - double scalefactor, - Size size, - Scalar mean, - bool swapRB, - bool crop, - int ddepth, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Size sz(size.width, size.height); - cv::Scalar cm = cv::Scalar(mean.val1, mean.val2, mean.val3, mean.val4); - cv::Mat blob; - auto _images = vecmat_c2cpp(images); - cv_dnn::blobFromImages(_images, blob, scalefactor, sz, cm, swapRB, crop, ddepth); - callback(new Mat{new cv::Mat(blob)}); - END_WRAP -} - -CvStatus *Net_ImagesFromBlob_Async(Mat blob, CvCallback_1 callback) { - BEGIN_WRAP - std::vector imgs; - cv_dnn::imagesFromBlob(*blob.ptr, imgs); - callback(vecmat_cpp2c_p(imgs)); - END_WRAP -} - -CvStatus *Net_Empty_Async(Net net, CvCallback_1 callback) { - BEGIN_WRAP - bool rval = net.ptr->empty(); - callback(new bool(rval)); - END_WRAP -} - -CvStatus *Net_Dump_Async(Net net, CvCallback_1 callback) { - BEGIN_WRAP - auto ss = net.ptr->dump(); - callback(new char *(strdup(ss.c_str()))); - END_WRAP -} - -CvStatus *Net_SetInput_Async(Net net, Mat blob, const char *name, CvCallback_0 callback) { - BEGIN_WRAP - net.ptr->setInput(*blob.ptr, name); - callback(); - END_WRAP -} - -CvStatus *Net_Forward_Async(Net net, const char *outputName, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(net.ptr->forward(outputName))}); - END_WRAP -} - -CvStatus *Net_ForwardLayers_Async(Net net, VecVecChar outBlobNames, CvCallback_1 callback) { - BEGIN_WRAP - std::vector blobs; - std::vector names = vecvecchar_c2cpp_s(outBlobNames); - net.ptr->forward(blobs, names); - callback(vecmat_cpp2c_p(blobs)); - END_WRAP -} - -CvStatus *Net_SetPreferableBackend_Async(Net net, int backend, CvCallback_0 callback) { - BEGIN_WRAP - net.ptr->setPreferableBackend(backend); - callback(); - END_WRAP -} - -CvStatus *Net_SetPreferableTarget_Async(Net net, int target, CvCallback_0 callback) { - BEGIN_WRAP - net.ptr->setPreferableTarget(target); - callback(); - END_WRAP -} - -CvStatus *Net_GetPerfProfile_Async(Net net, CvCallback_1 callback) { - BEGIN_WRAP - std::vector layersTimes; - int64_t rval = net.ptr->getPerfProfile(layersTimes); - callback(new int64_t(rval)); - END_WRAP -} - -CvStatus *Net_GetUnconnectedOutLayers_Async(Net net, CvCallback_1 callback) { - BEGIN_WRAP - std::vector layers = net.ptr->getUnconnectedOutLayers(); - callback(vecint_cpp2c_p(layers)); - END_WRAP -} - -CvStatus *Net_GetLayerNames_Async(Net net, CvCallback_1 callback) { - BEGIN_WRAP - std::vector cstrs = net.ptr->getLayerNames(); - callback(vecvecchar_cpp2c_s_p(cstrs)); - END_WRAP -} - -CvStatus *Net_GetInputDetails_Async(Net net, CvCallback_2 callback) { - BEGIN_WRAP - std::vector sc; - std::vector zp; - net.ptr->getInputDetails(sc, zp); - callback(vecfloat_cpp2c_p(sc), vecint_cpp2c_p(zp)); - END_WRAP -} - -CvStatus *Net_GetBlobChannel_Async(Mat blob, int imgidx, int chnidx, CvCallback_1 callback) { - BEGIN_WRAP - size_t w = blob.ptr->size[3]; - size_t h = blob.ptr->size[2]; - callback(new Mat{new cv::Mat(h, w, CV_32F, blob.ptr->ptr(imgidx, chnidx))}); - END_WRAP -} - -CvStatus *Net_GetBlobSize_Async(Mat blob, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Scalar{ - (double)(blob.ptr->size[0]), - (double)(blob.ptr->size[1]), - (double)(blob.ptr->size[2]), - (double)(blob.ptr->size[3]) - }); - END_WRAP -} - -CvStatus *Net_GetLayer_Async(Net net, int layerid, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Layer{new cv::Ptr(net.ptr->getLayer(layerid))}); - END_WRAP -} - -CvStatus *Layer_InputNameToIndex_Async(Layer layer, const char *name, CvCallback_1 callback) { - BEGIN_WRAP - int rval = (*layer.ptr)->inputNameToIndex(name); - callback(new int(rval)); - END_WRAP -} - -CvStatus *Layer_OutputNameToIndex_Async(Layer layer, const char *name, CvCallback_1 callback) { - BEGIN_WRAP - int rval = (*layer.ptr)->outputNameToIndex(name); - callback(new int(rval)); - END_WRAP -} - -CvStatus *Layer_GetName_Async(Layer layer, CvCallback_1 callback) { - BEGIN_WRAP - auto ss = (*layer.ptr)->name; - callback(new char *(strdup(ss.c_str()))); - END_WRAP -} - -CvStatus *Layer_GetType_Async(Layer layer, CvCallback_1 callback) { - BEGIN_WRAP - auto ss = (*layer.ptr)->type; - callback(new char *(strdup(ss.c_str()))); - END_WRAP -} - -void Layer_Close_Async(LayerPtr layer, CvCallback_0 callback) { - layer->ptr->reset(); - CVD_FREE(layer); - callback(); -} - -CvStatus *NMSBoxes_Async( - VecRect bboxes, VecF32 scores, float score_threshold, float nms_threshold, CvCallback_1 callback -) { - BEGIN_WRAP - std::vector v; - auto _bboxes = vecrect_c2cpp(bboxes); - auto _scores = vecfloat_c2cpp(scores); - cv_dnn::NMSBoxes(_bboxes, _scores, score_threshold, nms_threshold, v, 1.f, 0); - callback(vecint_cpp2c_p(v)); - END_WRAP -} - -CvStatus *NMSBoxesWithParams_Async( - VecRect bboxes, - VecF32 scores, - const float score_threshold, - const float nms_threshold, - const float eta, - const int top_k, - CvCallback_1 callback -) { - BEGIN_WRAP - std::vector v; - auto _bboxes = vecrect_c2cpp(bboxes); - auto _scores = vecfloat_c2cpp(scores); - cv_dnn::NMSBoxes(_bboxes, _scores, score_threshold, nms_threshold, v, eta, top_k); - callback(vecint_cpp2c_p(v)); - END_WRAP -} diff --git a/src/dnn/dnn_async.h b/src/dnn/dnn_async.h deleted file mode 100644 index d952a33b..00000000 --- a/src/dnn/dnn_async.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef CVD_DNN_ASYNC_H_ -#define CVD_DNN_ASYNC_H_ - -#include "dnn.h" -#include "core/types.h" -#include - -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -// Asynchronous functions for Net -CvStatus *Net_Create_Async(CvCallback_1 callback); -CvStatus *Net_FromNet_Async(Net net, CvCallback_1 callback); -CvStatus *Net_ReadNet_Async(const char *model, const char *config, const char *framework, CvCallback_1 callback); -CvStatus *Net_ReadNetBytes_Async(const char *framework, VecUChar model, VecUChar config, CvCallback_1 callback); -CvStatus *Net_ReadNetFromCaffe_Async(const char *prototxt, const char *caffeModel, CvCallback_1 callback); -CvStatus *Net_ReadNetFromCaffeBytes_Async(VecUChar prototxt, VecUChar caffeModel, CvCallback_1 callback); -CvStatus *Net_ReadNetFromTensorflow_Async(const char *model, const char *config, CvCallback_1 callback); -CvStatus *Net_ReadNetFromTensorflowBytes_Async(VecUChar model, VecUChar config, CvCallback_1 callback); -CvStatus *Net_ReadNetFromTFLite_Async(const char *model, CvCallback_1 callback); -CvStatus *Net_ReadNetFromTFLiteBytes_Async(VecUChar bufferModel, CvCallback_1 callback); -CvStatus *Net_ReadNetFromTorch_Async(const char *model, bool isBinary, bool evaluate, CvCallback_1 callback); -CvStatus *Net_ReadNetFromONNX_Async(const char *model, CvCallback_1 callback); -CvStatus *Net_ReadNetFromONNXBytes_Async(VecUChar model, CvCallback_1 callback); -void Net_Close_Async(NetPtr net, CvCallback_0 callback); -CvStatus *Net_BlobFromImage_Async(Mat image, double scalefactor, Size size, Scalar mean, bool swapRB, bool crop, int ddepth, CvCallback_1 callback); -CvStatus *Net_BlobFromImages_Async(VecMat images, double scalefactor, Size size, Scalar mean, bool swapRB, bool crop, int ddepth, CvCallback_1 callback); -CvStatus *Net_ImagesFromBlob_Async(Mat blob, CvCallback_1 callback); -CvStatus *Net_Empty_Async(Net net, CvCallback_1 callback); -CvStatus *Net_Dump_Async(Net net, CvCallback_1 callback); -CvStatus *Net_SetInput_Async(Net net, Mat blob, const char *name, CvCallback_0 callback); -CvStatus *Net_Forward_Async(Net net, const char *outputName, CvCallback_1 callback); -CvStatus *Net_ForwardLayers_Async(Net net, VecVecChar outBlobNames, CvCallback_1 callback); -CvStatus *Net_SetPreferableBackend_Async(Net net, int backend, CvCallback_0 callback); -CvStatus *Net_SetPreferableTarget_Async(Net net, int target, CvCallback_0 callback); -CvStatus *Net_GetPerfProfile_Async(Net net, CvCallback_1 callback); -CvStatus *Net_GetUnconnectedOutLayers_Async(Net net, CvCallback_1 callback); -CvStatus *Net_GetLayerNames_Async(Net net, CvCallback_1 callback); -CvStatus *Net_GetInputDetails_Async(Net net, CvCallback_2 callback); -CvStatus *Net_GetBlobChannel_Async(Mat blob, int imgidx, int chnidx, CvCallback_1 callback); -CvStatus *Net_GetBlobSize_Async(Mat blob, CvCallback_1 callback); -CvStatus *Net_GetLayer_Async(Net net, int layerid, CvCallback_1 callback); -CvStatus *Layer_InputNameToIndex_Async(Layer layer, const char *name, CvCallback_1 callback); -CvStatus *Layer_OutputNameToIndex_Async(Layer layer, const char *name, CvCallback_1 callback); -CvStatus *Layer_GetName_Async(Layer layer, CvCallback_1 callback); -CvStatus *Layer_GetType_Async(Layer layer, CvCallback_1 callback); -void Layer_Close_Async(LayerPtr layer, CvCallback_0 callback); -CvStatus *NMSBoxes_Async(VecRect bboxes, VecF32 scores, float score_threshold, float nms_threshold, CvCallback_1 callback); -CvStatus *NMSBoxesWithParams_Async(VecRect bboxes, VecF32 scores, const float score_threshold, const float nms_threshold, const float eta, const int top_k, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_DNN_ASYNC_H_ diff --git a/src/extra/aruco.cpp b/src/extra/aruco.cpp deleted file mode 100644 index a2ac108a..00000000 --- a/src/extra/aruco.cpp +++ /dev/null @@ -1,442 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#include "aruco.h" -#include "core/vec.hpp" - -CvStatus *ArucoDetectorParameters_Create(ArucoDetectorParameters *rval) { - BEGIN_WRAP - *rval = {new cv::aruco::DetectorParameters()}; - END_WRAP -} -void ArucoDetectorParameters_Close(ArucoDetectorParametersPtr ap) { CVD_FREE(ap); } - -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin( - ArucoDetectorParameters ap, int adaptiveThreshWinSizeMin -) { - BEGIN_WRAP - ap.ptr->adaptiveThreshWinSizeMin = adaptiveThreshWinSizeMin; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->adaptiveThreshWinSizeMin; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax( - ArucoDetectorParameters ap, int adaptiveThreshWinSizeMax -) { - BEGIN_WRAP - ap.ptr->adaptiveThreshWinSizeMax = adaptiveThreshWinSizeMax; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->adaptiveThreshWinSizeMax; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep( - ArucoDetectorParameters ap, int adaptiveThreshWinSizeStep -) { - BEGIN_WRAP - ap.ptr->adaptiveThreshWinSizeStep = adaptiveThreshWinSizeStep; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->adaptiveThreshWinSizeStep; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshConstant( - ArucoDetectorParameters ap, double adaptiveThreshConstant -) { - BEGIN_WRAP - ap.ptr->adaptiveThreshConstant = adaptiveThreshConstant; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetAdaptiveThreshConstant(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->adaptiveThreshConstant; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetMinMarkerPerimeterRate( - ArucoDetectorParameters ap, double minMarkerPerimeterRate -) { - BEGIN_WRAP - ap.ptr->minMarkerPerimeterRate = minMarkerPerimeterRate; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetMinMarkerPerimeterRate(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->minMarkerPerimeterRate; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetMaxMarkerPerimeterRate( - ArucoDetectorParameters ap, double maxMarkerPerimeterRate -) { - BEGIN_WRAP - ap.ptr->maxMarkerPerimeterRate = maxMarkerPerimeterRate; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetMaxMarkerPerimeterRate(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->maxMarkerPerimeterRate; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetPolygonalApproxAccuracyRate( - ArucoDetectorParameters ap, double polygonalApproxAccuracyRate -) { - BEGIN_WRAP - ap.ptr->polygonalApproxAccuracyRate = polygonalApproxAccuracyRate; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetPolygonalApproxAccuracyRate(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->polygonalApproxAccuracyRate; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetMinCornerDistanceRate( - ArucoDetectorParameters ap, double minCornerDistanceRate -) { - BEGIN_WRAP - ap.ptr->minCornerDistanceRate = minCornerDistanceRate; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetMinCornerDistanceRate(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->minCornerDistanceRate; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetMinDistanceToBorder( - ArucoDetectorParameters ap, int minDistanceToBorder -) { - BEGIN_WRAP - ap.ptr->minDistanceToBorder = minDistanceToBorder; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetMinDistanceToBorder(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->minDistanceToBorder; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetMinMarkerDistanceRate( - ArucoDetectorParameters ap, double minMarkerDistanceRate -) { - BEGIN_WRAP - ap.ptr->minMarkerDistanceRate = minMarkerDistanceRate; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetMinMarkerDistanceRate(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->minMarkerDistanceRate; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetCornerRefinementMethod( - ArucoDetectorParameters ap, int cornerRefinementMethod -) { - BEGIN_WRAP - ap.ptr->cornerRefinementMethod = cornerRefinementMethod; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetCornerRefinementMethod(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->cornerRefinementMethod; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetCornerRefinementWinSize( - ArucoDetectorParameters ap, int cornerRefinementWinSize -) { - BEGIN_WRAP - ap.ptr->cornerRefinementWinSize = cornerRefinementWinSize; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetCornerRefinementWinSize(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->cornerRefinementWinSize; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetCornerRefinementMaxIterations( - ArucoDetectorParameters ap, int cornerRefinementMaxIterations -) { - BEGIN_WRAP - ap.ptr->cornerRefinementMaxIterations = cornerRefinementMaxIterations; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetCornerRefinementMaxIterations(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->cornerRefinementMaxIterations; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetCornerRefinementMinAccuracy( - ArucoDetectorParameters ap, double cornerRefinementMinAccuracy -) { - BEGIN_WRAP - ap.ptr->cornerRefinementMinAccuracy = cornerRefinementMinAccuracy; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetCornerRefinementMinAccuracy(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->cornerRefinementMinAccuracy; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_SetMarkerBorderBits(ArucoDetectorParameters ap, int markerBorderBits) { - BEGIN_WRAP - ap.ptr->markerBorderBits = markerBorderBits; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetMarkerBorderBits(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->markerBorderBits; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell( - ArucoDetectorParameters ap, int perspectiveRemovePixelPerCell -) { - BEGIN_WRAP - ap.ptr->perspectiveRemovePixelPerCell = perspectiveRemovePixelPerCell; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->perspectiveRemovePixelPerCell; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell( - ArucoDetectorParameters ap, double perspectiveRemoveIgnoredMarginPerCell -) { - BEGIN_WRAP - ap.ptr->perspectiveRemoveIgnoredMarginPerCell = perspectiveRemoveIgnoredMarginPerCell; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell( - ArucoDetectorParameters ap, double *rval -) { - BEGIN_WRAP - *rval = ap.ptr->perspectiveRemoveIgnoredMarginPerCell; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate( - ArucoDetectorParameters ap, double maxErroneousBitsInBorderRate -) { - BEGIN_WRAP - ap.ptr->maxErroneousBitsInBorderRate = maxErroneousBitsInBorderRate; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->maxErroneousBitsInBorderRate; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_SetMinOtsuStdDev(ArucoDetectorParameters ap, double minOtsuStdDev) { - BEGIN_WRAP - ap.ptr->minOtsuStdDev = minOtsuStdDev; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetMinOtsuStdDev(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->minOtsuStdDev; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetErrorCorrectionRate( - ArucoDetectorParameters ap, double errorCorrectionRate -) { - BEGIN_WRAP - ap.ptr->errorCorrectionRate = errorCorrectionRate; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetErrorCorrectionRate(ArucoDetectorParameters ap, double *rval) { - BEGIN_WRAP - *rval = ap.ptr->errorCorrectionRate; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetAprilTagQuadDecimate( - ArucoDetectorParameters ap, float aprilTagQuadDecimate -) { - BEGIN_WRAP - ap.ptr->aprilTagQuadDecimate = aprilTagQuadDecimate; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetAprilTagQuadDecimate(ArucoDetectorParameters ap, float *rval) { - BEGIN_WRAP - *rval = ap.ptr->aprilTagQuadDecimate; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_SetAprilTagQuadSigma(ArucoDetectorParameters ap, float aprilTagQuadSigma) { - BEGIN_WRAP - ap.ptr->aprilTagQuadSigma = aprilTagQuadSigma; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetAprilTagQuadSigma(ArucoDetectorParameters ap, float *rval) { - BEGIN_WRAP - *rval = ap.ptr->aprilTagQuadSigma; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetAprilTagMinClusterPixels( - ArucoDetectorParameters ap, int aprilTagMinClusterPixels -) { - BEGIN_WRAP - ap.ptr->aprilTagMinClusterPixels = aprilTagMinClusterPixels; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetAprilTagMinClusterPixels(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->aprilTagMinClusterPixels; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_SetAprilTagMaxNmaxima(ArucoDetectorParameters ap, int aprilTagMaxNmaxima) { - BEGIN_WRAP - ap.ptr->aprilTagMaxNmaxima = aprilTagMaxNmaxima; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetAprilTagMaxNmaxima(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->aprilTagMaxNmaxima; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetAprilTagCriticalRad( - ArucoDetectorParameters ap, float aprilTagCriticalRad -) { - BEGIN_WRAP - ap.ptr->aprilTagCriticalRad = aprilTagCriticalRad; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetAprilTagCriticalRad(ArucoDetectorParameters ap, float *rval) { - BEGIN_WRAP - *rval = ap.ptr->aprilTagCriticalRad; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetAprilTagMaxLineFitMse( - ArucoDetectorParameters ap, float aprilTagMaxLineFitMse -) { - BEGIN_WRAP - ap.ptr->aprilTagMaxLineFitMse = aprilTagMaxLineFitMse; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetAprilTagMaxLineFitMse(ArucoDetectorParameters ap, float *rval) { - BEGIN_WRAP - *rval = ap.ptr->aprilTagMaxLineFitMse; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff( - ArucoDetectorParameters ap, int aprilTagMinWhiteBlackDiff -) { - BEGIN_WRAP - ap.ptr->aprilTagMinWhiteBlackDiff = aprilTagMinWhiteBlackDiff; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->aprilTagMinWhiteBlackDiff; - END_WRAP -} -CvStatus * -ArucoDetectorParameters_SetAprilTagDeglitch(ArucoDetectorParameters ap, int aprilTagDeglitch) { - BEGIN_WRAP - ap.ptr->aprilTagDeglitch = aprilTagDeglitch; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetAprilTagDeglitch(ArucoDetectorParameters ap, int *rval) { - BEGIN_WRAP - *rval = ap.ptr->aprilTagDeglitch; - END_WRAP -} -CvStatus *ArucoDetectorParameters_SetDetectInvertedMarker( - ArucoDetectorParameters ap, bool detectInvertedMarker -) { - BEGIN_WRAP - ap.ptr->detectInvertedMarker = detectInvertedMarker; - END_WRAP -} -CvStatus *ArucoDetectorParameters_GetDetectInvertedMarker(ArucoDetectorParameters ap, bool *rval) { - BEGIN_WRAP - *rval = ap.ptr->detectInvertedMarker; - END_WRAP -} - -CvStatus *getPredefinedDictionary(int dictionaryId, ArucoDictionary *rval) { - BEGIN_WRAP - *rval = {new cv::aruco::Dictionary(cv::aruco::getPredefinedDictionary(dictionaryId))}; - END_WRAP -} -void ArucoDictionary_Close(ArucoDictionaryPtr self) { CVD_FREE(self); } - -CvStatus *ArucoDetector_New(ArucoDetector *rval) { - BEGIN_WRAP - *rval = {new cv::aruco::ArucoDetector()}; - END_WRAP -} -CvStatus *ArucoDetector_NewWithParams( - ArucoDictionary dictionary, ArucoDetectorParameters params, ArucoDetector *rval -) { - BEGIN_WRAP - *rval = {new cv::aruco::ArucoDetector(*dictionary.ptr, *params.ptr)}; - END_WRAP -} -void ArucoDetector_Close(ArucoDetectorPtr ad) { CVD_FREE(ad); } - -CvStatus *ArucoDetector_DetectMarkers( - ArucoDetector ad, - Mat inputArr, - VecVecPoint2f *markerCorners, - VecI32 *markerIds, - VecVecPoint2f *rejectedCandidates -) { - BEGIN_WRAP - std::vector> _markerCorners; - std::vector _markerIds; - std::vector> _rejectedCandidates; - ad.ptr->detectMarkers(*inputArr.ptr, _markerCorners, _markerIds, _rejectedCandidates); - *markerCorners = vecvecpoint2f_cpp2c(_markerCorners); - *markerIds = vecint_cpp2c(_markerIds); - if (rejectedCandidates != NULL) { - *rejectedCandidates = vecvecpoint2f_cpp2c(_rejectedCandidates); - } - END_WRAP -} - -CvStatus *ArucoDrawDetectedMarkers( - Mat image, VecVecPoint2f markerCorners, VecI32 markerIds, Scalar borderColor -) { - BEGIN_WRAP - cv::Scalar _borderColor = - cv::Scalar(borderColor.val1, borderColor.val2, borderColor.val3, borderColor.val4); - auto _markerCorners = vecvecpoint2f_c2cpp(markerCorners); - auto _markerIds = vecint_c2cpp(markerIds); - cv::aruco::drawDetectedMarkers(*image.ptr, _markerCorners, _markerIds, _borderColor); - END_WRAP -} - -CvStatus * -ArucoGenerateImageMarker(int dictionaryId, int id, int sidePixels, int borderBits, Mat *img) { - BEGIN_WRAP - cv::aruco::Dictionary dict = cv::aruco::getPredefinedDictionary(dictionaryId); - cv::Mat dst; - cv::aruco::generateImageMarker(dict, id, sidePixels, dst, borderBits); - *img = {new cv::Mat(dst)}; - END_WRAP -} diff --git a/src/extra/aruco.h b/src/extra/aruco.h deleted file mode 100644 index f56ee7fe..00000000 --- a/src/extra/aruco.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef _OPENCV3_ARUCO_H_ -#define _OPENCV3_ARUCO_H_ - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "core/core.h" - -#ifdef __cplusplus -CVD_TYPEDEF(cv::aruco::Dictionary, ArucoDictionary); -CVD_TYPEDEF(cv::aruco::DetectorParameters, ArucoDetectorParameters); -CVD_TYPEDEF(cv::aruco::ArucoDetector, ArucoDetector); -#else -CVD_TYPEDEF(void, ArucoDictionary); -CVD_TYPEDEF(void, ArucoDetectorParameters); -CVD_TYPEDEF(void, ArucoDetector); -#endif - -CvStatus *ArucoDetectorParameters_Create(ArucoDetectorParameters *rval); -void ArucoDetectorParameters_Close(ArucoDetectorParametersPtr ap); -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin(ArucoDetectorParameters ap, - int adaptiveThreshWinSizeMin); -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax(ArucoDetectorParameters ap, - int adaptiveThreshWinSizeMax); -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep(ArucoDetectorParameters ap, - int adaptiveThreshWinSizeStep); -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshConstant(ArucoDetectorParameters ap, - double adaptiveThreshConstant); -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshConstant(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetMinMarkerPerimeterRate(ArucoDetectorParameters ap, - double minMarkerPerimeterRate); -CvStatus *ArucoDetectorParameters_GetMinMarkerPerimeterRate(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetMaxMarkerPerimeterRate(ArucoDetectorParameters ap, - double maxMarkerPerimeterRate); -CvStatus *ArucoDetectorParameters_GetMaxMarkerPerimeterRate(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetPolygonalApproxAccuracyRate(ArucoDetectorParameters ap, - double polygonalApproxAccuracyRate); -CvStatus *ArucoDetectorParameters_GetPolygonalApproxAccuracyRate(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetMinCornerDistanceRate(ArucoDetectorParameters ap, - double minCornerDistanceRate); -CvStatus *ArucoDetectorParameters_GetMinCornerDistanceRate(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetMinDistanceToBorder(ArucoDetectorParameters ap, int minDistanceToBorder); -CvStatus *ArucoDetectorParameters_GetMinDistanceToBorder(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetMinMarkerDistanceRate(ArucoDetectorParameters ap, - double minMarkerDistanceRate); -CvStatus *ArucoDetectorParameters_GetMinMarkerDistanceRate(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetCornerRefinementMethod(ArucoDetectorParameters ap, - int cornerRefinementMethod); -CvStatus *ArucoDetectorParameters_GetCornerRefinementMethod(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetCornerRefinementWinSize(ArucoDetectorParameters ap, - int cornerRefinementWinSize); -CvStatus *ArucoDetectorParameters_GetCornerRefinementWinSize(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetCornerRefinementMaxIterations(ArucoDetectorParameters ap, - int cornerRefinementMaxIterations); -CvStatus *ArucoDetectorParameters_GetCornerRefinementMaxIterations(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetCornerRefinementMinAccuracy(ArucoDetectorParameters ap, - double cornerRefinementMinAccuracy); -CvStatus *ArucoDetectorParameters_GetCornerRefinementMinAccuracy(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetMarkerBorderBits(ArucoDetectorParameters ap, int markerBorderBits); -CvStatus *ArucoDetectorParameters_GetMarkerBorderBits(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell(ArucoDetectorParameters ap, - int perspectiveRemovePixelPerCell); -CvStatus *ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell( - ArucoDetectorParameters ap, double perspectiveRemoveIgnoredMarginPerCell); -CvStatus *ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell(ArucoDetectorParameters ap, - double *rval); -CvStatus *ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate(ArucoDetectorParameters ap, - double maxErroneousBitsInBorderRate); -CvStatus *ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetMinOtsuStdDev(ArucoDetectorParameters ap, double minOtsuStdDev); -CvStatus *ArucoDetectorParameters_GetMinOtsuStdDev(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetErrorCorrectionRate(ArucoDetectorParameters ap, - double errorCorrectionRate); -CvStatus *ArucoDetectorParameters_GetErrorCorrectionRate(ArucoDetectorParameters ap, double *rval); -CvStatus *ArucoDetectorParameters_SetAprilTagQuadDecimate(ArucoDetectorParameters ap, - float aprilTagQuadDecimate); -CvStatus *ArucoDetectorParameters_GetAprilTagQuadDecimate(ArucoDetectorParameters ap, float *rval); -CvStatus *ArucoDetectorParameters_SetAprilTagQuadSigma(ArucoDetectorParameters ap, float aprilTagQuadSigma); -CvStatus *ArucoDetectorParameters_GetAprilTagQuadSigma(ArucoDetectorParameters ap, float *rval); -CvStatus *ArucoDetectorParameters_SetAprilTagMinClusterPixels(ArucoDetectorParameters ap, - int aprilTagMinClusterPixels); -CvStatus *ArucoDetectorParameters_GetAprilTagMinClusterPixels(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetAprilTagMaxNmaxima(ArucoDetectorParameters ap, int aprilTagMaxNmaxima); -CvStatus *ArucoDetectorParameters_GetAprilTagMaxNmaxima(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetAprilTagCriticalRad(ArucoDetectorParameters ap, - float aprilTagCriticalRad); -CvStatus *ArucoDetectorParameters_GetAprilTagCriticalRad(ArucoDetectorParameters ap, float *rval); -CvStatus *ArucoDetectorParameters_SetAprilTagMaxLineFitMse(ArucoDetectorParameters ap, - float aprilTagMaxLineFitMse); -CvStatus *ArucoDetectorParameters_GetAprilTagMaxLineFitMse(ArucoDetectorParameters ap, float *rval); -CvStatus *ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff(ArucoDetectorParameters ap, - int aprilTagMinWhiteBlackDiff); -CvStatus *ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetAprilTagDeglitch(ArucoDetectorParameters ap, int aprilTagDeglitch); -CvStatus *ArucoDetectorParameters_GetAprilTagDeglitch(ArucoDetectorParameters ap, int *rval); -CvStatus *ArucoDetectorParameters_SetDetectInvertedMarker(ArucoDetectorParameters ap, - bool detectInvertedMarker); -CvStatus *ArucoDetectorParameters_GetDetectInvertedMarker(ArucoDetectorParameters ap, bool *rval); - -CvStatus *getPredefinedDictionary(int dictionaryId, ArucoDictionary *rval); -void ArucoDictionary_Close(ArucoDictionaryPtr self); - -CvStatus *ArucoDetector_New(ArucoDetector *rval); -CvStatus *ArucoDetector_NewWithParams(ArucoDictionary dictionary, ArucoDetectorParameters params, - ArucoDetector *rval); -void ArucoDetector_Close(ArucoDetectorPtr ad); -CvStatus *ArucoDetector_DetectMarkers(ArucoDetector ad, Mat inputArr, VecVecPoint2f *markerCorners, - VecI32 *markerIds, VecVecPoint2f *rejectedCandidates); - -CvStatus *ArucoDrawDetectedMarkers(Mat image, VecVecPoint2f markerCorners, VecI32 markerIds, - Scalar borderColor); -CvStatus *ArucoGenerateImageMarker(int dictionaryId, int id, int sidePixels, int borderBits, Mat *img); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_ARUCO_H_ diff --git a/src/extra/aruco_async.cpp b/src/extra/aruco_async.cpp deleted file mode 100644 index c4e0b4b4..00000000 --- a/src/extra/aruco_async.cpp +++ /dev/null @@ -1,598 +0,0 @@ -#include "aruco_async.h" -#include "core/types.h" -#include "core/vec.hpp" - -// Asynchronous functions for ArucoDetectorParameters -CvStatus *ArucoDetectorParameters_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - auto params = new cv::aruco::DetectorParameters(); - callback(new ArucoDetectorParameters{params}); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_Async( - ArucoDetectorParameters ap, int adaptiveThreshWinSizeMin, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->adaptiveThreshWinSizeMin = adaptiveThreshWinSizeMin; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->adaptiveThreshWinSizeMin; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_Async( - ArucoDetectorParameters ap, int adaptiveThreshWinSizeMax, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->adaptiveThreshWinSizeMax = adaptiveThreshWinSizeMax; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->adaptiveThreshWinSizeMax; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_Async( - ArucoDetectorParameters ap, int adaptiveThreshWinSizeStep, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->adaptiveThreshWinSizeStep = adaptiveThreshWinSizeStep; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->adaptiveThreshWinSizeStep; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshConstant_Async( - ArucoDetectorParameters ap, double adaptiveThreshConstant, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->adaptiveThreshConstant = adaptiveThreshConstant; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshConstant_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->adaptiveThreshConstant; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetMinMarkerPerimeterRate_Async( - ArucoDetectorParameters ap, double minMarkerPerimeterRate, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->minMarkerPerimeterRate = minMarkerPerimeterRate; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetMinMarkerPerimeterRate_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->minMarkerPerimeterRate; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetMaxMarkerPerimeterRate_Async( - ArucoDetectorParameters ap, double maxMarkerPerimeterRate, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->maxMarkerPerimeterRate = maxMarkerPerimeterRate; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetMaxMarkerPerimeterRate_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->maxMarkerPerimeterRate; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_Async( - ArucoDetectorParameters ap, double polygonalApproxAccuracyRate, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->polygonalApproxAccuracyRate = polygonalApproxAccuracyRate; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->polygonalApproxAccuracyRate; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetMinCornerDistanceRate_Async( - ArucoDetectorParameters ap, double minCornerDistanceRate, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->minCornerDistanceRate = minCornerDistanceRate; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetMinCornerDistanceRate_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->minCornerDistanceRate; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetMinDistanceToBorder_Async( - ArucoDetectorParameters ap, int minDistanceToBorder, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->minDistanceToBorder = minDistanceToBorder; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetMinDistanceToBorder_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->minDistanceToBorder; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetMinMarkerDistanceRate_Async( - ArucoDetectorParameters ap, double minMarkerDistanceRate, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->minMarkerDistanceRate = minMarkerDistanceRate; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetMinMarkerDistanceRate_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->minMarkerDistanceRate; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetCornerRefinementMethod_Async( - ArucoDetectorParameters ap, int cornerRefinementMethod, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->cornerRefinementMethod = cornerRefinementMethod; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetCornerRefinementMethod_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->cornerRefinementMethod; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetCornerRefinementWinSize_Async( - ArucoDetectorParameters ap, int cornerRefinementWinSize, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->cornerRefinementWinSize = cornerRefinementWinSize; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetCornerRefinementWinSize_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->cornerRefinementWinSize; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetCornerRefinementMaxIterations_Async( - ArucoDetectorParameters ap, int cornerRefinementMaxIterations, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->cornerRefinementMaxIterations = cornerRefinementMaxIterations; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetCornerRefinementMaxIterations_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->cornerRefinementMaxIterations; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetCornerRefinementMinAccuracy_Async( - ArucoDetectorParameters ap, double cornerRefinementMinAccuracy, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->cornerRefinementMinAccuracy = cornerRefinementMinAccuracy; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetCornerRefinementMinAccuracy_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->cornerRefinementMinAccuracy; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetMarkerBorderBits_Async( - ArucoDetectorParameters ap, int markerBorderBits, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->markerBorderBits = markerBorderBits; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetMarkerBorderBits_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->markerBorderBits; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_Async( - ArucoDetectorParameters ap, int perspectiveRemovePixelPerCell, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->perspectiveRemovePixelPerCell = perspectiveRemovePixelPerCell; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->perspectiveRemovePixelPerCell; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_Async( - ArucoDetectorParameters ap, double perspectiveRemoveIgnoredMarginPerCell, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->perspectiveRemoveIgnoredMarginPerCell = perspectiveRemoveIgnoredMarginPerCell; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->perspectiveRemoveIgnoredMarginPerCell; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_Async( - ArucoDetectorParameters ap, double maxErroneousBitsInBorderRate, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->maxErroneousBitsInBorderRate = maxErroneousBitsInBorderRate; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->maxErroneousBitsInBorderRate; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetMinOtsuStdDev_Async( - ArucoDetectorParameters ap, double minOtsuStdDev, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->minOtsuStdDev = minOtsuStdDev; - callback(); - END_WRAP -} - -CvStatus * -ArucoDetectorParameters_GetMinOtsuStdDev_Async(ArucoDetectorParameters ap, CvCallback_1 callback) { - BEGIN_WRAP - double value = ap.ptr->minOtsuStdDev; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetErrorCorrectionRate_Async( - ArucoDetectorParameters ap, double errorCorrectionRate, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->errorCorrectionRate = errorCorrectionRate; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetErrorCorrectionRate_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - double value = ap.ptr->errorCorrectionRate; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAprilTagQuadDecimate_Async( - ArucoDetectorParameters ap, float aprilTagQuadDecimate, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->aprilTagQuadDecimate = aprilTagQuadDecimate; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAprilTagQuadDecimate_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - float value = ap.ptr->aprilTagQuadDecimate; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAprilTagQuadSigma_Async( - ArucoDetectorParameters ap, float aprilTagQuadSigma, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->aprilTagQuadSigma = aprilTagQuadSigma; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAprilTagQuadSigma_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - float value = ap.ptr->aprilTagQuadSigma; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAprilTagMinClusterPixels_Async( - ArucoDetectorParameters ap, int aprilTagMinClusterPixels, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->aprilTagMinClusterPixels = aprilTagMinClusterPixels; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAprilTagMinClusterPixels_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->aprilTagMinClusterPixels; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAprilTagMaxNmaxima_Async( - ArucoDetectorParameters ap, int aprilTagMaxNmaxima, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->aprilTagMaxNmaxima = aprilTagMaxNmaxima; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAprilTagMaxNmaxima_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->aprilTagMaxNmaxima; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAprilTagCriticalRad_Async( - ArucoDetectorParameters ap, float aprilTagCriticalRad, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->aprilTagCriticalRad = aprilTagCriticalRad; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAprilTagCriticalRad_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - float value = ap.ptr->aprilTagCriticalRad; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAprilTagMaxLineFitMse_Async( - ArucoDetectorParameters ap, float aprilTagMaxLineFitMse, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->aprilTagMaxLineFitMse = aprilTagMaxLineFitMse; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAprilTagMaxLineFitMse_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - float value = ap.ptr->aprilTagMaxLineFitMse; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_Async( - ArucoDetectorParameters ap, int aprilTagMinWhiteBlackDiff, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->aprilTagMinWhiteBlackDiff = aprilTagMinWhiteBlackDiff; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->aprilTagMinWhiteBlackDiff; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetAprilTagDeglitch_Async( - ArucoDetectorParameters ap, int aprilTagDeglitch, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->aprilTagDeglitch = aprilTagDeglitch; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetAprilTagDeglitch_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - int value = ap.ptr->aprilTagDeglitch; - callback(&value); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_SetDetectInvertedMarker_Async( - ArucoDetectorParameters ap, bool detectInvertedMarker, CvCallback_0 callback -) { - BEGIN_WRAP - ap.ptr->detectInvertedMarker = detectInvertedMarker; - callback(); - END_WRAP -} - -CvStatus *ArucoDetectorParameters_GetDetectInvertedMarker_Async( - ArucoDetectorParameters ap, CvCallback_1 callback -) { - BEGIN_WRAP - bool value = ap.ptr->detectInvertedMarker; - callback(&value); - END_WRAP -} - -// Detector -CvStatus *ArucoDetector_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - auto detector = new cv::aruco::ArucoDetector(); - callback(new ArucoDetector{detector}); - END_WRAP -} - -CvStatus *ArucoDetector_NewWithParams_Async( - ArucoDictionary dictionary, ArucoDetectorParameters params, CvCallback_1 callback -) { - BEGIN_WRAP - auto detector = new cv::aruco::ArucoDetector(*dictionary.ptr, *params.ptr); - callback(new ArucoDetector{detector}); - END_WRAP -} - -CvStatus *ArucoDetector_DetectMarkers_Async(ArucoDetector ad, Mat inputArr, CvCallback_3 callback) { - BEGIN_WRAP - std::vector> markerCorners; - std::vector markerIds; - std::vector> rejectedCandidates; - ad.ptr->detectMarkers(*inputArr.ptr, markerCorners, markerIds, rejectedCandidates); - callback( - vecvecpoint2f_cpp2c_p(markerCorners), - vecint_cpp2c_p(markerIds), - vecvecpoint2f_cpp2c_p(rejectedCandidates) - ); - END_WRAP -} - -// Utility Functions -CvStatus *ArucoDrawDetectedMarkers_Async( - Mat image, - VecVecPoint2f markerCorners, - VecI32 markerIds, - Scalar borderColor, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::Scalar _borderColor = cv::Scalar(borderColor.val1, borderColor.val2, borderColor.val3); - auto _markerCorners = vecvecpoint2f_c2cpp(markerCorners); - auto _markerIds = vecint_c2cpp(markerIds); - cv::aruco::drawDetectedMarkers(*image.ptr, _markerCorners, _markerIds, _borderColor); - callback(); - END_WRAP -} - -CvStatus *ArucoGenerateImageMarker_Async( - int dictionaryId, int id, int sidePixels, int borderBits, CvCallback_1 callback -) { - BEGIN_WRAP - cv::aruco::Dictionary dict = cv::aruco::getPredefinedDictionary(dictionaryId); - cv::Mat dst; - cv::aruco::generateImageMarker(dict, id, sidePixels, dst, borderBits); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *getPredefinedDictionary_Async(int dictionaryId, CvCallback_1 callback) { - BEGIN_WRAP - auto dict = new cv::aruco::Dictionary(cv::aruco::getPredefinedDictionary(dictionaryId)); - callback(new ArucoDictionary{dict}); - END_WRAP -} diff --git a/src/extra/aruco_async.h b/src/extra/aruco_async.h deleted file mode 100644 index 3a07404b..00000000 --- a/src/extra/aruco_async.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once -#include "core/types.h" -#include "aruco.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Detector Parameters -CvStatus *ArucoDetectorParameters_Create_Async(CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_Async(ArucoDetectorParameters ap, int adaptiveThreshWinSizeMin, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_Async(ArucoDetectorParameters ap, int adaptiveThreshWinSizeMax, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_Async(ArucoDetectorParameters ap, int adaptiveThreshWinSizeStep, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAdaptiveThreshConstant_Async(ArucoDetectorParameters ap, double adaptiveThreshConstant, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAdaptiveThreshConstant_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetMinMarkerPerimeterRate_Async(ArucoDetectorParameters ap, double minMarkerPerimeterRate, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetMinMarkerPerimeterRate_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetMaxMarkerPerimeterRate_Async(ArucoDetectorParameters ap, double maxMarkerPerimeterRate, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetMaxMarkerPerimeterRate_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_Async(ArucoDetectorParameters ap, double polygonalApproxAccuracyRate, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetMinCornerDistanceRate_Async(ArucoDetectorParameters ap, double minCornerDistanceRate, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetMinCornerDistanceRate_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetMinDistanceToBorder_Async(ArucoDetectorParameters ap, int minDistanceToBorder, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetMinDistanceToBorder_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetMinMarkerDistanceRate_Async(ArucoDetectorParameters ap, double minMarkerDistanceRate, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetMinMarkerDistanceRate_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetCornerRefinementMethod_Async(ArucoDetectorParameters ap, int cornerRefinementMethod, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetCornerRefinementMethod_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetCornerRefinementWinSize_Async(ArucoDetectorParameters ap, int cornerRefinementWinSize, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetCornerRefinementWinSize_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetCornerRefinementMaxIterations_Async(ArucoDetectorParameters ap, int cornerRefinementMaxIterations, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetCornerRefinementMaxIterations_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetCornerRefinementMinAccuracy_Async(ArucoDetectorParameters ap, double cornerRefinementMinAccuracy, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetCornerRefinementMinAccuracy_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetMarkerBorderBits_Async(ArucoDetectorParameters ap, int markerBorderBits, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetMarkerBorderBits_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_Async(ArucoDetectorParameters ap, int perspectiveRemovePixelPerCell, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_Async(ArucoDetectorParameters ap, double perspectiveRemoveIgnoredMarginPerCell, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_Async(ArucoDetectorParameters ap, double maxErroneousBitsInBorderRate, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetMinOtsuStdDev_Async(ArucoDetectorParameters ap, double minOtsuStdDev, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetMinOtsuStdDev_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetErrorCorrectionRate_Async(ArucoDetectorParameters ap, double errorCorrectionRate, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetErrorCorrectionRate_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAprilTagQuadDecimate_Async(ArucoDetectorParameters ap, float aprilTagQuadDecimate, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAprilTagQuadDecimate_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAprilTagQuadSigma_Async(ArucoDetectorParameters ap, float aprilTagQuadSigma, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAprilTagQuadSigma_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAprilTagMinClusterPixels_Async(ArucoDetectorParameters ap, int aprilTagMinClusterPixels, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAprilTagMinClusterPixels_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAprilTagMaxNmaxima_Async(ArucoDetectorParameters ap, int aprilTagMaxNmaxima, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAprilTagMaxNmaxima_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAprilTagCriticalRad_Async(ArucoDetectorParameters ap, float aprilTagCriticalRad, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAprilTagCriticalRad_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAprilTagMaxLineFitMse_Async(ArucoDetectorParameters ap, float aprilTagMaxLineFitMse, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAprilTagMaxLineFitMse_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_Async(ArucoDetectorParameters ap, int aprilTagMinWhiteBlackDiff, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetAprilTagDeglitch_Async(ArucoDetectorParameters ap, int aprilTagDeglitch, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetAprilTagDeglitch_Async(ArucoDetectorParameters ap, CvCallback_1 callback); -CvStatus *ArucoDetectorParameters_SetDetectInvertedMarker_Async(ArucoDetectorParameters ap, bool detectInvertedMarker, CvCallback_0 callback); -CvStatus *ArucoDetectorParameters_GetDetectInvertedMarker_Async(ArucoDetectorParameters ap, CvCallback_1 callback); - -// Detector -CvStatus *ArucoDetector_New_Async(CvCallback_1 callback); -CvStatus *ArucoDetector_NewWithParams_Async(ArucoDictionary dictionary, ArucoDetectorParameters params, CvCallback_1 callback); -CvStatus *ArucoDetector_DetectMarkers_Async(ArucoDetector ad, Mat inputArr, CvCallback_3 callback); - -// Utility Functions -CvStatus *ArucoDrawDetectedMarkers_Async(Mat image, VecVecPoint2f markerCorners, VecI32 markerIds, Scalar borderColor, CvCallback_0 callback); -CvStatus *ArucoGenerateImageMarker_Async(int dictionaryId, int id, int sidePixels, int borderBits, CvCallback_1 callback); -CvStatus *getPredefinedDictionary_Async(int dictionaryId, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif diff --git a/src/extra/img_hash.cpp b/src/extra/img_hash.cpp deleted file mode 100644 index feaf3fdc..00000000 --- a/src/extra/img_hash.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include "img_hash.h" - -CvStatus *pHashCompute(Mat inputArr, Mat *outputArr) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::pHash(*inputArr.ptr, dst); - *outputArr = {new cv::Mat(dst)}; - END_WRAP -} -CvStatus *pHashCompare(Mat a, Mat b, double *rval) { - BEGIN_WRAP - *rval = cv::img_hash::PHash::create()->compare(*a.ptr, *b.ptr); - END_WRAP -} - -CvStatus *averageHashCompute(Mat inputArr, Mat *outputArr) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::averageHash(*inputArr.ptr, dst); - *outputArr = {new cv::Mat(dst)}; - END_WRAP -} -CvStatus *averageHashCompare(Mat a, Mat b, double *rval) { - BEGIN_WRAP - *rval = cv::img_hash::AverageHash::create()->compare(*a.ptr, *b.ptr); - END_WRAP -} - -CvStatus *BlockMeanHash_Create(int mode, BlockMeanHash *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::img_hash::BlockMeanHash::create(mode))}; - END_WRAP -} -CvStatus *BlockMeanHash_GetMean(BlockMeanHash self, double **rval, int *length) { - BEGIN_WRAP - auto m = (*self.ptr)->getMean(); - *rval = m.data(); - *length = m.size(); - END_WRAP -} -CvStatus *BlockMeanHash_SetMode(BlockMeanHash self, int mode) { - BEGIN_WRAP(*self.ptr)->setMode(mode); - END_WRAP -} - -void BlockMeanHash_Close(BlockMeanHashPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *BlockMeanHash_Compute(BlockMeanHash self, Mat inputArr, Mat *outputArr) { - BEGIN_WRAP - cv::Mat dst; - (self.ptr)->get()->compute(*inputArr.ptr, dst); - *outputArr = {new cv::Mat(dst)}; - END_WRAP -} -CvStatus *BlockMeanHash_Compare(BlockMeanHash self, Mat hashOne, Mat hashTwo, double *rval) { - BEGIN_WRAP - *rval = (self.ptr)->get()->compare(*hashOne.ptr, *hashTwo.ptr); - END_WRAP -} - -CvStatus *colorMomentHashCompute(Mat inputArr, Mat *outputArr) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::colorMomentHash(*inputArr.ptr, dst); - *outputArr = {new cv::Mat(dst)}; - END_WRAP -} -CvStatus *colorMomentHashCompare(Mat a, Mat b, double *rval) { - BEGIN_WRAP - *rval = cv::img_hash::ColorMomentHash::create()->compare(*a.ptr, *b.ptr); - END_WRAP -} - -CvStatus *marrHildrethHashCompute(Mat inputArr, Mat *outputArr, float alpha, float scale) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::marrHildrethHash(*inputArr.ptr, dst, alpha, scale); - *outputArr = {new cv::Mat(dst)}; - END_WRAP -} -CvStatus *marrHildrethHashCompare(Mat a, Mat b, float alpha, float scale, double *rval) { - BEGIN_WRAP - *rval = cv::img_hash::MarrHildrethHash::create(alpha, scale)->compare(*a.ptr, *b.ptr); - END_WRAP -} - -CvStatus * -radialVarianceHashCompute(Mat inputArr, Mat *outputArr, double sigma, int numOfAngleLine) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::radialVarianceHash(*inputArr.ptr, dst, sigma, numOfAngleLine); - *outputArr = {new cv::Mat(dst)}; - END_WRAP -} -CvStatus *radialVarianceHashCompare(Mat a, Mat b, double sigma, int numOfAngleLine, double *rval) { - BEGIN_WRAP - *rval = cv::img_hash::RadialVarianceHash::create(sigma, numOfAngleLine)->compare(*a.ptr, *b.ptr); - END_WRAP -} diff --git a/src/extra/img_hash.h b/src/extra/img_hash.h deleted file mode 100644 index bf91b505..00000000 --- a/src/extra/img_hash.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - Created by mdeleau. - Licensed: Apache 2.0 license. Copyright (c) 2024 mdeleau. - - Modified by rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 rainyl. -*/ -#ifndef OCV_DART_IMG_HASH_H -#define OCV_DART_IMG_HASH_H - -#include "../core/core.h" -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -#ifdef __cplusplus -// typedef cv::Ptr *PHash; -// typedef cv::Ptr *AverageHash; -CVD_TYPEDEF(cv::Ptr, BlockMeanHash); -// typedef cv::Ptr *ColorMomentHash; -// typedef cv::Ptr *MarrHildrethHash; -// typedef cv::Ptr *RadialVarianceHash; -#else -// typedef void *PHash; -// typedef void *AverageHash; -CVD_TYPEDEF(void, BlockMeanHash); -// typedef void *ColorMomentHash; -// typedef void *MarrHildrethHash; -// typedef void *RadialVarianceHash; -#endif - -enum { - /** use fewer block and generate 16*16/8 uchar hash value */ - BLOCK_MEAN_HASH_MODE_0 = 0, - /** use block blocks(step sizes/2), generate 31*31/8 + 1 uchar hash value */ - BLOCK_MEAN_HASH_MODE_1 = 1 -}; - -CvStatus *pHashCompute(Mat inputArr, Mat *outputArr); -CvStatus *pHashCompare(Mat a, Mat b, double *rval); - -CvStatus *averageHashCompute(Mat inputArr, Mat *outputArr); -CvStatus *averageHashCompare(Mat a, Mat b, double *rval); - -CvStatus *BlockMeanHash_Create(int mode, BlockMeanHash *rval); -CvStatus *BlockMeanHash_GetMean(BlockMeanHash self, double **rval, int *length); -CvStatus *BlockMeanHash_SetMode(BlockMeanHash self, int mode); -void BlockMeanHash_Close(BlockMeanHashPtr self); -CvStatus *BlockMeanHash_Compute(BlockMeanHash self, Mat inputArr, Mat *outputArr); -CvStatus *BlockMeanHash_Compare(BlockMeanHash self, Mat hashOne, Mat hashTwo, double *rval); - -CvStatus *colorMomentHashCompute(Mat inputArr, Mat *outputArr); -CvStatus *colorMomentHashCompare(Mat a, Mat b, double *rval); - -CvStatus *marrHildrethHashCompute(Mat inputArr, Mat *outputArr, float alpha, float scale); -CvStatus *marrHildrethHashCompare(Mat a, Mat b, float alpha, float scale, double *rval); - -CvStatus *radialVarianceHashCompute(Mat inputArr, Mat *outputArr, double sigma, int numOfAngleLine); -CvStatus *radialVarianceHashCompare(Mat a, Mat b, double sigma, int numOfAngleLine, double *rval); - -#ifdef __cplusplus -} -#endif - -#endif // OCV_DART_IMG_HASH_H diff --git a/src/extra/img_hash_async.cpp b/src/extra/img_hash_async.cpp deleted file mode 100644 index efeb4072..00000000 --- a/src/extra/img_hash_async.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include "img_hash_async.h" -#include "core/types.h" -#include "core/vec.hpp" - -// Asynchronous functions for Image Hashing - -CvStatus *pHashCompute_Async(Mat inputArr, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::pHash(*inputArr.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *pHashCompare_Async(Mat a, Mat b, CvCallback_1 callback) { - BEGIN_WRAP - double result = cv::img_hash::PHash::create()->compare(*a.ptr, *b.ptr); - callback(new double(result)); - END_WRAP -} - -CvStatus *averageHashCompute_Async(Mat inputArr, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::averageHash(*inputArr.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *averageHashCompare_Async(Mat a, Mat b, CvCallback_1 callback) { - BEGIN_WRAP - double result = cv::img_hash::AverageHash::create()->compare(*a.ptr, *b.ptr); - callback(new double(result)); - END_WRAP -} - -CvStatus *BlockMeanHash_Create_Async(int mode, CvCallback_1 callback) { - BEGIN_WRAP - auto hash = new cv::Ptr(cv::img_hash::BlockMeanHash::create(mode)); - callback(new BlockMeanHash{hash}); - END_WRAP -} - -CvStatus *BlockMeanHash_GetMean_Async(BlockMeanHash self, CvCallback_1 callback) { - BEGIN_WRAP - auto vec = self.ptr->get()->getMean(); - callback(vecdouble_cpp2c_p(vec)); - END_WRAP -} - -CvStatus *BlockMeanHash_SetMode_Async(BlockMeanHash self, int mode, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setMode(mode); - callback(); - END_WRAP -} - -CvStatus *BlockMeanHash_Compute_Async(BlockMeanHash self, Mat inputArr, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - self.ptr->get()->compute(*inputArr.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus * -BlockMeanHash_Compare_Async(BlockMeanHash self, Mat hashOne, Mat hashTwo, CvCallback_1 callback) { - BEGIN_WRAP - double result = self.ptr->get()->compare(*hashOne.ptr, *hashTwo.ptr); - callback(new double(result)); - END_WRAP -} - -CvStatus *colorMomentHashCompute_Async(Mat inputArr, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::colorMomentHash(*inputArr.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *colorMomentHashCompare_Async(Mat a, Mat b, CvCallback_1 callback) { - BEGIN_WRAP - double result = cv::img_hash::ColorMomentHash::create()->compare(*a.ptr, *b.ptr); - callback(new double(result)); - END_WRAP -} - -CvStatus * -marrHildrethHashCompute_Async(Mat inputArr, float alpha, float scale, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::marrHildrethHash(*inputArr.ptr, dst, alpha, scale); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus * -marrHildrethHashCompare_Async(Mat a, Mat b, float alpha, float scale, CvCallback_1 callback) { - BEGIN_WRAP - double result = cv::img_hash::MarrHildrethHash::create(alpha, scale)->compare(*a.ptr, *b.ptr); - callback(new double(result)); - END_WRAP -} - -CvStatus *radialVarianceHashCompute_Async( - Mat inputArr, double sigma, int numOfAngleLine, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::img_hash::radialVarianceHash(*inputArr.ptr, dst, sigma, numOfAngleLine); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *radialVarianceHashCompare_Async( - Mat a, Mat b, double sigma, int numOfAngleLine, CvCallback_1 callback -) { - BEGIN_WRAP - double result = - cv::img_hash::RadialVarianceHash::create(sigma, numOfAngleLine)->compare(*a.ptr, *b.ptr); - callback(new double(result)); - END_WRAP -} diff --git a/src/extra/img_hash_async.h b/src/extra/img_hash_async.h deleted file mode 100644 index 55961a85..00000000 --- a/src/extra/img_hash_async.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include "core/types.h" -#include "img_hash.h" - -#ifdef __cplusplus -extern "C" { -#endif - -CvStatus *pHashCompute_Async(Mat inputArr, CvCallback_1 callback); -CvStatus *pHashCompare_Async(Mat a, Mat b, CvCallback_1 callback); -CvStatus *averageHashCompute_Async(Mat inputArr, CvCallback_1 callback); -CvStatus *averageHashCompare_Async(Mat a, Mat b, CvCallback_1 callback); - -CvStatus *BlockMeanHash_Create_Async(int mode, CvCallback_1 callback); -CvStatus *BlockMeanHash_GetMean_Async(BlockMeanHash self, CvCallback_1 callback); -CvStatus *BlockMeanHash_SetMode_Async(BlockMeanHash self, int mode, CvCallback_0 callback); -CvStatus *BlockMeanHash_Compute_Async(BlockMeanHash self, Mat inputArr, CvCallback_1 callback); -CvStatus *BlockMeanHash_Compare_Async(BlockMeanHash self, Mat hashOne, Mat hashTwo, CvCallback_1 callback); - -CvStatus *colorMomentHashCompute_Async(Mat inputArr, CvCallback_1 callback); -CvStatus *colorMomentHashCompare_Async(Mat a, Mat b, CvCallback_1 callback); -CvStatus *marrHildrethHashCompute_Async(Mat inputArr, float alpha, float scale, CvCallback_1 callback); -CvStatus *marrHildrethHashCompare_Async(Mat a, Mat b, float alpha, float scale, CvCallback_1 callback); -CvStatus *radialVarianceHashCompute_Async(Mat inputArr, double sigma, int numOfAngleLine, CvCallback_1 callback); -CvStatus *radialVarianceHashCompare_Async(Mat a, Mat b, double sigma, int numOfAngleLine, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif diff --git a/src/extra/quality.cpp b/src/extra/quality.cpp deleted file mode 100644 index 0e3eb7e1..00000000 --- a/src/extra/quality.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include "quality.h" -#include "core/types.h" -#include "opencv2/quality/qualitybrisque.hpp" - -CvStatus *QualityBRISQUE_create(char *model_file, char *range_file, QualityBRISQUE *rval) { - BEGIN_WRAP - rval->ptr = new cv::Ptr( - cv::quality::QualityBRISQUE::create(model_file, range_file) - ); - END_WRAP -} - -void QualityBRISQUE_close(QualityBRISQUEPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *QualityBRISQUE_compute(QualityBRISQUE self, Mat img, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*img.ptr); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -CvStatus *QualityBRISQUE_compute_static(Mat img, char *model_file, char *range_file, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualityBRISQUE::compute(*img.ptr, model_file, range_file); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -CvStatus *QualityBRISQUE_computeFeatures_static(Mat img, Mat features) { - BEGIN_WRAP - cv::quality::QualityBRISQUE::computeFeatures(*img.ptr, *features.ptr); - END_WRAP -} - -CvStatus *QualityGMSD_create(Mat ref, QualityGMSD *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::quality::QualityGMSD::create(*ref.ptr))}; - END_WRAP -} - -void QualityGMSD_close(QualityGMSDPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *QualityGMSD_compute(QualityGMSD self, Mat cmp, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*cmp.ptr); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -CvStatus *QualityGMSD_compute_static(Mat ref, Mat cmp, Mat qualityMap, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualityGMSD::compute(*ref.ptr, *cmp.ptr, *qualityMap.ptr); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -CvStatus *QualityMSE_create(Mat ref, QualityMSE *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::quality::QualityMSE::create(*ref.ptr))}; - END_WRAP -} - -void QualityMSE_close(QualityMSEPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *QualityMSE_compute(QualityMSE self, Mat cmpImgs, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*cmpImgs.ptr); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -CvStatus *QualityMSE_compute_static(Mat ref, Mat cmp, Mat qualityMap, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualityMSE::compute(*ref.ptr, *cmp.ptr, *qualityMap.ptr); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -CvStatus *QualityPSNR_create(Mat ref, double maxPixelValue, QualityPSNR *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::quality::QualityPSNR::create(*ref.ptr, maxPixelValue) - )}; - END_WRAP -} - -void QualityPSNR_close(QualityPSNRPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *QualityPSNR_compute(QualityPSNR self, Mat cmp, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*cmp.ptr); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -CvStatus * -QualityPSNR_compute_static(Mat ref, Mat cmp, double maxPixelValue, Mat qualityMap, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualityPSNR::compute(*ref.ptr, *cmp.ptr, *qualityMap.ptr, maxPixelValue); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -double QualityPSNR_getMaxPixelValue(QualityPSNR self) { return (*self.ptr)->getMaxPixelValue(); } - -void QualityPSNR_setMaxPixelValue(QualityPSNR self, double maxPixelValue) { - (*self.ptr)->setMaxPixelValue(maxPixelValue); -} - -CvStatus *QualitySSIM_create(Mat ref, QualitySSIM *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::quality::QualitySSIM::create(*ref.ptr))}; - END_WRAP -} - -void QualitySSIM_close(QualitySSIMPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *QualitySSIM_compute(QualitySSIM self, Mat cmp, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*cmp.ptr); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} - -CvStatus *QualitySSIM_compute_static(Mat ref, Mat cmp, Mat qualityMap, Scalar *rval) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualitySSIM::compute(*ref.ptr, *cmp.ptr, *qualityMap.ptr); - *rval = {r.val[0], r.val[1], r.val[2], r.val[3]}; - END_WRAP -} diff --git a/src/extra/quality.h b/src/extra/quality.h deleted file mode 100644 index ed70dcc5..00000000 --- a/src/extra/quality.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef CVD_QUALITY_H -#define CVD_QUALITY_H - -#include "core/types.h" - -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -#ifdef __cplusplus -CVD_TYPEDEF(cv::Ptr, QualityBRISQUE); -CVD_TYPEDEF(cv::Ptr, QualityGMSD); -CVD_TYPEDEF(cv::Ptr, QualityMSE); -CVD_TYPEDEF(cv::Ptr, QualityPSNR); -CVD_TYPEDEF(cv::Ptr, QualitySSIM); - -#else -CVD_TYPEDEF(void, QualityBRISQUE); -CVD_TYPEDEF(void, QualityGMSD); -CVD_TYPEDEF(void, QualityMSE); -CVD_TYPEDEF(void, QualityPSNR); -CVD_TYPEDEF(void, QualitySSIM); - -#endif - -CvStatus *QualityBRISQUE_create(char *model_file, char *range_file, QualityBRISQUE *rval); -void QualityBRISQUE_close(QualityBRISQUEPtr self); -CvStatus *QualityBRISQUE_compute(QualityBRISQUE self, Mat img, Scalar *rval); -CvStatus *QualityBRISQUE_compute_static(Mat img, char *model_file, char *range_file, Scalar *rval); -CvStatus *QualityBRISQUE_computeFeatures_static(Mat img, Mat features); - -CvStatus *QualityGMSD_create(Mat ref, QualityGMSD *rval); -void QualityGMSD_close(QualityGMSDPtr self); -CvStatus *QualityGMSD_compute(QualityGMSD self, Mat cmp, Scalar *rval); -CvStatus *QualityGMSD_compute_static(Mat ref, Mat cmp, Mat qualityMap, Scalar *rval); - -CvStatus *QualityMSE_create(Mat ref, QualityMSE *rval); -void QualityMSE_close(QualityMSEPtr self); -CvStatus *QualityMSE_compute(QualityMSE self, Mat cmpImgs, Scalar *rval); -CvStatus *QualityMSE_compute_static(Mat ref, Mat cmp, Mat qualityMap, Scalar *rval); - -CvStatus *QualityPSNR_create(Mat ref, double maxPixelValue, QualityPSNR *rval); -void QualityPSNR_close(QualityPSNRPtr self); -CvStatus *QualityPSNR_compute(QualityPSNR self, Mat cmp, Scalar *rval); -CvStatus * -QualityPSNR_compute_static(Mat ref, Mat cmp, double maxPixelValue, Mat qualityMap, Scalar *rval); -double QualityPSNR_getMaxPixelValue(QualityPSNR self); -void QualityPSNR_setMaxPixelValue(QualityPSNR self, double maxPixelValue); - -CvStatus *QualitySSIM_create(Mat ref, QualitySSIM *rval); -void QualitySSIM_close(QualitySSIMPtr self); -CvStatus *QualitySSIM_compute(QualitySSIM self, Mat cmp, Scalar *rval); -CvStatus *QualitySSIM_compute_static(Mat ref, Mat cmp, Mat qualityMap, Scalar *rval); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_QUALITY_H diff --git a/src/extra/quality_async.cpp b/src/extra/quality_async.cpp deleted file mode 100644 index 24ad9432..00000000 --- a/src/extra/quality_async.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "quality_async.h" - -CvStatus *QualityBRISQUE_compute_async(QualityBRISQUE self, Mat img, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*img.ptr); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus *QualityBRISQUE_compute_static_async( - Mat img, char *model_file, char *range_file, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualityBRISQUE::compute(*img.ptr, model_file, range_file); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus * -QualityBRISQUE_computeFeatures_static_async(Mat img, Mat features, CvCallback_0 callback) { - BEGIN_WRAP - cv::quality::QualityBRISQUE::computeFeatures(*img.ptr, *features.ptr); - callback(); - END_WRAP -} - -CvStatus *QualityGMSD_compute_async(QualityGMSD self, Mat cmp, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*cmp.ptr); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus * -QualityGMSD_compute_static_async(Mat ref, Mat cmp, Mat qualityMap, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualityGMSD::compute(*ref.ptr, *cmp.ptr, *qualityMap.ptr); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus *QualityMSE_compute_async(QualityMSE self, Mat cmpImgs, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*cmpImgs.ptr); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus *QualityMSE_compute_static_async(Mat ref, Mat cmp, Mat qualityMap, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualityMSE::compute(*ref.ptr, *cmp.ptr, *qualityMap.ptr); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus *QualityPSNR_compute_async(QualityPSNR self, Mat cmp, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*cmp.ptr); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus *QualityPSNR_compute_static_async( - Mat ref, Mat cmp, double maxPixelValue, Mat qualityMap, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Scalar r = - cv::quality::QualityPSNR::compute(*ref.ptr, *cmp.ptr, *qualityMap.ptr, maxPixelValue); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus *QualitySSIM_compute_async(QualitySSIM self, Mat cmp, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar r = (*self.ptr)->compute(*cmp.ptr); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} - -CvStatus * -QualitySSIM_compute_static_async(Mat ref, Mat cmp, Mat qualityMap, CvCallback_1 callback) { - BEGIN_WRAP - cv::Scalar r = cv::quality::QualitySSIM::compute(*ref.ptr, *cmp.ptr, *qualityMap.ptr); - callback(new Scalar{r.val[0], r.val[1], r.val[2], r.val[3]}); - END_WRAP -} diff --git a/src/extra/quality_async.h b/src/extra/quality_async.h deleted file mode 100644 index ef9c35a6..00000000 --- a/src/extra/quality_async.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef CVD_QUALITY_ASYNC_H -#define CVD_QUALITY_ASYNC_H - -#include "core/types.h" -#include "quality.h" - -#ifdef __cplusplus -#include -extern "C" { -#endif - -CvStatus *QualityBRISQUE_compute_async(QualityBRISQUE self, Mat img, CvCallback_1 callback); -CvStatus *QualityBRISQUE_compute_static_async(Mat img, char *model_file, char *range_file, CvCallback_1 callback); -CvStatus *QualityBRISQUE_computeFeatures_static_async(Mat img, Mat features, CvCallback_0 callback); - -CvStatus *QualityGMSD_compute_async(QualityGMSD self, Mat cmp, CvCallback_1 callback); -CvStatus *QualityGMSD_compute_static_async(Mat ref, Mat cmp, Mat qualityMap, CvCallback_1 callback); - -CvStatus *QualityMSE_compute_async(QualityMSE self, Mat cmpImgs, CvCallback_1 callback); -CvStatus *QualityMSE_compute_static_async(Mat ref, Mat cmp, Mat qualityMap, CvCallback_1 callback); - -CvStatus *QualityPSNR_compute_async(QualityPSNR self, Mat cmp, CvCallback_1 callback); -CvStatus * -QualityPSNR_compute_static_async(Mat ref, Mat cmp, double maxPixelValue, Mat qualityMap, CvCallback_1 callback); - -CvStatus *QualitySSIM_compute_async(QualitySSIM self, Mat cmp, CvCallback_1 callback); -CvStatus *QualitySSIM_compute_static_async(Mat ref, Mat cmp, Mat qualityMap, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_QUALITY_ASYNC_H diff --git a/src/extra/wechat_qrcode.cpp b/src/extra/wechat_qrcode.cpp deleted file mode 100644 index f1c06ace..00000000 --- a/src/extra/wechat_qrcode.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "wechat_qrcode.h" -#include "core/core.h" -#include "core/vec.hpp" -#include - -CvStatus *WeChatQRCode_New(WeChatQRCode *qrcode) -{ - BEGIN_WRAP - *qrcode = {new cv::wechat_qrcode::WeChatQRCode()}; - END_WRAP -} -CvStatus *WeChatQRCode_NewWithParams(const char *detector_prototxt_path, - const char *detector_caffe_model_path, - const char *super_resolution_prototxt_path, - const char *super_resolution_caffe_model_path, WeChatQRCode *qrcode) -{ - BEGIN_WRAP - *qrcode = {new cv::wechat_qrcode::WeChatQRCode(detector_prototxt_path, detector_caffe_model_path, - super_resolution_prototxt_path, - super_resolution_caffe_model_path)}; - END_WRAP -} -void WeChatQRCode_Close(WeChatQRCodePtr self) { CVD_FREE(self); } - -CvStatus *WeChatQRCode_DetectAndDecode(WeChatQRCode *self, Mat img, VecMat *points, VecVecChar *rval) -{ - BEGIN_WRAP - std::vector pts; - - auto strings = self->ptr->detectAndDecode(*img.ptr, pts); - *points = vecmat_cpp2c(pts); - - std::vector> cstrings; - cstrings.reserve(strings.size()); - for (int i = 0; i < strings.size(); i++) { - auto s = strings.at(i); - cstrings.push_back(std::vector(s.begin(), s.end())); - } - *rval = vecvecchar_cpp2c(cstrings); - - END_WRAP -} -CvStatus *WeChatQRCode_GetScaleFactor(WeChatQRCode *self, float *rval) -{ - BEGIN_WRAP - *rval = self->ptr->getScaleFactor(); - END_WRAP -} -CvStatus *WeChatQRCode_SetScaleFactor(WeChatQRCode *self, float scale_factor) -{ - BEGIN_WRAP - self->ptr->setScaleFactor(scale_factor); - END_WRAP -} diff --git a/src/extra/wechat_qrcode.h b/src/extra/wechat_qrcode.h deleted file mode 100644 index 80ef77be..00000000 --- a/src/extra/wechat_qrcode.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef WECHAT_QRCODE_H -#define WECHAT_QRCODE_H - -#include "core/core.h" - -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -// Main Content Start -#ifdef __cplusplus -CVD_TYPEDEF(cv::wechat_qrcode::WeChatQRCode, WeChatQRCode); -#else -CVD_TYPEDEF(void, WeChatQRCode); -#endif - -CvStatus *WeChatQRCode_New(WeChatQRCode *qrcode); -CvStatus *WeChatQRCode_NewWithParams(const char *detector_prototxt_path, - const char *detector_caffe_model_path, - const char *super_resolution_prototxt_path, - const char *super_resolution_caffe_model_path, WeChatQRCode *qrcode); -void WeChatQRCode_Close(WeChatQRCodePtr self); -CvStatus *WeChatQRCode_DetectAndDecode(WeChatQRCode *self, Mat img, VecMat *points, VecVecChar *rval); -CvStatus *WeChatQRCode_GetScaleFactor(WeChatQRCode *self, float *rval); -CvStatus *WeChatQRCode_SetScaleFactor(WeChatQRCode *self, float scale_factor); - -// Main Content End - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/extra/wechat_qrcode_async.cpp b/src/extra/wechat_qrcode_async.cpp deleted file mode 100644 index 00d5dbc2..00000000 --- a/src/extra/wechat_qrcode_async.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "wechat_qrcode_async.h" -#include "core/types.h" -#include "core/vec.hpp" - -CvStatus *WeChatQRCode_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - auto qrcode = new cv::wechat_qrcode::WeChatQRCode(); - callback(new WeChatQRCode{qrcode}); - END_WRAP -} - -CvStatus *WeChatQRCode_NewWithParams_Async( - const char *detector_prototxt_path, - const char *detector_caffe_model_path, - const char *super_resolution_prototxt_path, - const char *super_resolution_caffe_model_path, - CvCallback_1 callback -) { - BEGIN_WRAP - auto qrcode = new cv::wechat_qrcode::WeChatQRCode( - detector_prototxt_path, - detector_caffe_model_path, - super_resolution_prototxt_path, - super_resolution_caffe_model_path - ); - callback(new WeChatQRCode{qrcode}); - END_WRAP -} - -CvStatus *WeChatQRCode_DetectAndDecode_Async(WeChatQRCode *self, Mat img, CvCallback_2 callback) { - BEGIN_WRAP - std::vector points; - auto strings = self->ptr->detectAndDecode(*img.ptr, points); - std::vector> cstrings; - cstrings.reserve(strings.size()); - for (const auto &s : strings) { cstrings.push_back(std::vector(s.begin(), s.end())); } - callback(vecvecchar_cpp2c_p(cstrings), vecmat_cpp2c_p(points)); - END_WRAP -} - -CvStatus *WeChatQRCode_GetScaleFactor_Async(WeChatQRCode *self, CvCallback_1 callback) { - BEGIN_WRAP - float value = self->ptr->getScaleFactor(); - callback(&value); - END_WRAP -} - -CvStatus * -WeChatQRCode_SetScaleFactor_Async(WeChatQRCode *self, float scale_factor, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->setScaleFactor(scale_factor); - callback(); - END_WRAP -} diff --git a/src/extra/wechat_qrcode_async.h b/src/extra/wechat_qrcode_async.h deleted file mode 100644 index 050d64ed..00000000 --- a/src/extra/wechat_qrcode_async.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include "core/types.h" -#include "wechat_qrcode.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - CvStatus *WeChatQRCode_New_Async(CvCallback_1 callback); - CvStatus *WeChatQRCode_NewWithParams_Async(const char *detector_prototxt_path, const char *detector_caffe_model_path, const char *super_resolution_prototxt_path, const char *super_resolution_caffe_model_path, CvCallback_1 callback); - CvStatus *WeChatQRCode_DetectAndDecode_Async(WeChatQRCode *self, Mat img, CvCallback_2 callback); - CvStatus *WeChatQRCode_GetScaleFactor_Async(WeChatQRCode *self, CvCallback_1 callback); - CvStatus *WeChatQRCode_SetScaleFactor_Async(WeChatQRCode *self, float scale_factor, CvCallback_0 callback); - -#ifdef __cplusplus -} -#endif diff --git a/src/extra/ximgproc.cpp b/src/extra/ximgproc.cpp deleted file mode 100644 index 0bec6085..00000000 --- a/src/extra/ximgproc.cpp +++ /dev/null @@ -1,396 +0,0 @@ -#include "ximgproc.h" -#include "core/types.h" -#include "core/vec.hpp" - -CvStatus * -ximgproc_anisotropicDiffusion(Mat src, CVD_OUT Mat *dst, float alpha, float K, int niters) { - BEGIN_WRAP - cv::Mat *_dst = new cv::Mat(); - cv::ximgproc::anisotropicDiffusion(*src.ptr, *_dst, alpha, K, niters); - *dst = {_dst}; - END_WRAP -} -CvStatus *ximgproc_edgePreservingFilter(Mat src, CVD_OUT Mat *dst, int d, double threshold) { - BEGIN_WRAP - cv::Mat *_dst = new cv::Mat(); - cv::ximgproc::edgePreservingFilter(*src.ptr, *_dst, d, threshold); - *dst = {_dst}; - END_WRAP -} -CvStatus *ximgproc_findEllipses( - Mat image, - CVD_OUT Mat *ellipses, - float scoreThreshold, - float reliabilityThreshold, - float centerDistanceThreshold -) { - BEGIN_WRAP - cv::Mat *_ellipses = new cv::Mat(); - cv::ximgproc::findEllipses( - *image.ptr, *_ellipses, scoreThreshold, reliabilityThreshold, centerDistanceThreshold - ); - *ellipses = {_ellipses}; - END_WRAP -} -CvStatus *ximgproc_niBlackThreshold( - Mat src, - CVD_OUT Mat *dst, - double maxValue, - int type, - int blockSize, - double k, - int binarizationMethod, - double r -) { - BEGIN_WRAP - cv::Mat *_dst = new cv::Mat(); - cv::ximgproc::niBlackThreshold( - *src.ptr, *_dst, maxValue, type, blockSize, k, binarizationMethod, r - ); - *dst = {_dst}; - END_WRAP -} -CvStatus *ximgproc_PeiLinNormalization(Mat I, CVD_OUT Mat *dst) { - BEGIN_WRAP - cv::Mat *_dst = new cv::Mat(); - cv::ximgproc::PeiLinNormalization(*I.ptr, *_dst); - *dst = {_dst}; - END_WRAP -} -CvStatus *ximgproc_thinning(Mat src, Mat *dst, int thinningType) { - BEGIN_WRAP - cv::Mat *_dst = new cv::Mat(); - cv::ximgproc::thinning(*src.ptr, *_dst, thinningType); - *dst = {_dst}; - END_WRAP -} - -// RFFeatureGetter -CvStatus *ximgproc_RFFeatureGetter_Create(CVD_OUT RFFeatureGetter *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::ximgproc::createRFFeatureGetter())}; - END_WRAP -} -void ximgproc_RFFeatureGetter_Close(RFFeatureGetterPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} -CvStatus *ximgproc_RFFeatureGetter_getFeatures( - RFFeatureGetter self, - Mat src, - CVD_OUT Mat *features, - int gnrmRad, - int gsmthRad, - int shrink, - int outNum, - int gradNum -) { - BEGIN_WRAP - cv::Mat _features; - (*self.ptr)->getFeatures(*src.ptr, _features, gnrmRad, gsmthRad, shrink, outNum, gradNum); - *features = {new cv::Mat(_features)}; - END_WRAP -} -CvStatus *ximgproc_RFFeatureGetter_Clear(RFFeatureGetter self) { - BEGIN_WRAP(*self.ptr)->clear(); - END_WRAP -} -CvStatus *ximgproc_RFFeatureGetter_Empty(RFFeatureGetter self, bool *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->empty(); - END_WRAP -} - -// StructuredEdgeDetection -CvStatus * -ximgproc_StructuredEdgeDetection_Create(char *model, CVD_OUT StructuredEdgeDetection *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::ximgproc::createStructuredEdgeDetection(model) - )}; - END_WRAP -} -CvStatus *ximgproc_StructuredEdgeDetection_Create_1( - char *model, RFFeatureGetter howToGetFeatures, CVD_OUT StructuredEdgeDetection *rval -) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::ximgproc::createStructuredEdgeDetection(model, *howToGetFeatures.ptr) - )}; - END_WRAP -} -void ximgproc_StructuredEdgeDetection_Close(StructuredEdgeDetectionPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} -CvStatus *ximgproc_StructuredEdgeDetection_computeOrientation( - StructuredEdgeDetection self, Mat src, CVD_OUT Mat *dst -) { - BEGIN_WRAP - cv::Mat _dst; - (*self.ptr)->computeOrientation(*src.ptr, _dst); - *dst = {new cv::Mat(_dst)}; - END_WRAP -} -CvStatus *ximgproc_StructuredEdgeDetection_detectEdges( - StructuredEdgeDetection self, Mat src, CVD_OUT Mat *dst -) { - BEGIN_WRAP - cv::Mat _dst; - (*self.ptr)->detectEdges(*src.ptr, _dst); - *dst = {new cv::Mat(_dst)}; - END_WRAP -} -CvStatus *ximgproc_StructuredEdgeDetection_edgesNms( - StructuredEdgeDetection self, - Mat edge_image, - Mat orientation_image, - CVD_OUT Mat *dst, - int r, - int s, - float m, - bool isParallel -) { - BEGIN_WRAP - cv::Mat _dst; - (*self.ptr)->edgesNms(*edge_image.ptr, *orientation_image.ptr, _dst, r, s, m, isParallel); - *dst = {new cv::Mat(_dst)}; - END_WRAP -} - -// EdgeBoxes -CvStatus *ximgproc_EdgeBoxes_getBoundingBoxes( - EdgeBoxes self, - Mat edge_map, - Mat orientation_map, - CVD_OUT VecRect *boxes, - CVD_OUT VecF32 *scores -) { - BEGIN_WRAP - std::vector _scores; - std::vector _boxes; - auto _self = cv::ximgproc::createEdgeBoxes( - self.alpha, - self.beta, - self.eta, - self.minScore, - self.maxBoxes, - self.edgeMinMag, - self.edgeMergeThr, - self.clusterMinMag, - self.maxAspectRatio, - self.minBoxArea, - self.gamma, - self.kappa - ); - _self->getBoundingBoxes(*edge_map.ptr, *orientation_map.ptr, _boxes, _scores); - *boxes = vecrect_cpp2c(_boxes); - *scores = vecfloat_cpp2c(_scores); - END_WRAP -} - -// GraphSegmentation -CvStatus * -ximgproc_GraphSegmentation_Create(float sigma, float k, int min_size, GraphSegmentation *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::ximgproc::segmentation::createGraphSegmentation(sigma, k, min_size) - )}; - END_WRAP -} -void ximgproc_GraphSegmentation_Close(GraphSegmentationPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} -CvStatus *ximgproc_GraphSegmentation_getK(GraphSegmentation self, float *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->getK(); - END_WRAP -} -CvStatus *ximgproc_GraphSegmentation_getMinSize(GraphSegmentation self, int *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->getMinSize(); - END_WRAP -} -CvStatus *ximgproc_GraphSegmentation_getSigma(GraphSegmentation self, double *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->getSigma(); - END_WRAP -} -CvStatus * -ximgproc_GraphSegmentation_processImage(GraphSegmentation self, Mat src, CVD_OUT Mat *dst) { - BEGIN_WRAP - cv::Mat _dst; - (*self.ptr)->processImage(*src.ptr, _dst); - *dst = {new cv::Mat(_dst)}; - END_WRAP -} -CvStatus *ximgproc_GraphSegmentation_setK(GraphSegmentation self, float val) { - BEGIN_WRAP(*self.ptr)->setK(val); - END_WRAP -} -CvStatus *ximgproc_GraphSegmentation_setMinSize(GraphSegmentation self, int val) { - BEGIN_WRAP(*self.ptr)->setMinSize(val); - END_WRAP -} -CvStatus *ximgproc_GraphSegmentation_setSigma(GraphSegmentation self, double val) { - BEGIN_WRAP(*self.ptr)->setSigma(val); - END_WRAP -} - -// EdgeDrawing -CvStatus *ximgproc_EdgeDrawing_Create(EdgeDrawing *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::ximgproc::createEdgeDrawing())}; - END_WRAP -} -void ximgproc_EdgeDrawing_Close(EdgeDrawingPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} -CvStatus *ximgproc_EdgeDrawing_detectEdges(EdgeDrawing self, Mat src) { - BEGIN_WRAP(*self.ptr)->detectEdges(*src.ptr); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_detectEllipses(EdgeDrawing self, Mat *ellipses) { - BEGIN_WRAP - cv::Mat _ellipses; - (*self.ptr)->detectEllipses(_ellipses); - *ellipses = {new cv::Mat(_ellipses)}; - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_detectLines(EdgeDrawing self, Mat *lines) { - BEGIN_WRAP - cv::Mat _lines; - (*self.ptr)->detectLines(_lines); - *lines = {new cv::Mat(_lines)}; - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_getEdgeImage(EdgeDrawing self, Mat *dst) { - BEGIN_WRAP - cv::Mat _dst; - (*self.ptr)->getEdgeImage(_dst); - *dst = {new cv::Mat(_dst)}; - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_getGradientImage(EdgeDrawing self, Mat *dst) { - BEGIN_WRAP - cv::Mat _dst; - (*self.ptr)->getGradientImage(_dst); - *dst = {new cv::Mat(_dst)}; - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_getSegmentIndicesOfLines(EdgeDrawing self, VecI32 *rval) { - BEGIN_WRAP - std::vector _rval = (*self.ptr)->getSegmentIndicesOfLines(); - *rval = vecint_cpp2c(_rval); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_getSegments(EdgeDrawing self, VecVecPoint *rval) { - BEGIN_WRAP - std::vector> _rval = (*self.ptr)->getSegments(); - *rval = vecvecpoint_cpp2c(_rval); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_setParams(EdgeDrawing self, EdgeDrawingParams params) { - BEGIN_WRAP - cv::ximgproc::EdgeDrawing::Params _params; - _params.AnchorThresholdValue = params.AnchorThresholdValue; - _params.EdgeDetectionOperator = params.EdgeDetectionOperator; - _params.GradientThresholdValue = params.GradientThresholdValue; - _params.LineFitErrorThreshold = params.LineFitErrorThreshold; - _params.MaxDistanceBetweenTwoLines = params.MaxDistanceBetweenTwoLines; - _params.MaxErrorThreshold = params.MaxErrorThreshold; - _params.MinLineLength = params.MinLineLength; - _params.MinPathLength = params.MinPathLength; - _params.NFAValidation = params.NFAValidation; - _params.PFmode = params.PFmode; - _params.ScanInterval = params.ScanInterval; - _params.Sigma = params.Sigma; - _params.SumFlag = params.SumFlag; - (*self.ptr)->setParams(_params); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_getParams(EdgeDrawing self, EdgeDrawingParams *params) { - BEGIN_WRAP - cv::ximgproc::EdgeDrawing::Params _params = (*self.ptr)->params; - *params = { - _params.AnchorThresholdValue, - _params.EdgeDetectionOperator, - _params.GradientThresholdValue, - _params.LineFitErrorThreshold, - _params.MaxDistanceBetweenTwoLines, - _params.MaxErrorThreshold, - _params.MinLineLength, - _params.MinPathLength, - _params.NFAValidation, - _params.PFmode, - _params.ScanInterval, - _params.Sigma, - _params.SumFlag, - }; - END_WRAP -} - -// Binary morphology on run-length encoded image -CvStatus *ximgproc_rl_createRLEImage(const VecPoint3i runs, Mat *res, Size size) { - BEGIN_WRAP - cv::Mat _res; - auto _runs = vecpoint3i_c2cpp(runs); - cv::ximgproc::rl::createRLEImage(_runs, _res, cv::Size(size.width, size.height)); - *res = {new cv::Mat(_res)}; - END_WRAP -} -CvStatus *ximgproc_rl_dilate(Mat rlSrc, Mat *rlDest, Mat rlKernel, Point anchor) { - BEGIN_WRAP - cv::Mat _rlDest; - cv::ximgproc::rl::dilate(*rlSrc.ptr, _rlDest, *rlKernel.ptr, cv::Point(anchor.x, anchor.y)); - *rlDest = {new cv::Mat(_rlDest)}; - END_WRAP -} -CvStatus *ximgproc_rl_erode(Mat rlSrc, Mat *rlDest, Mat rlKernel, bool bBoundaryOn, Point anchor) { - BEGIN_WRAP - cv::Mat _rlDest; - cv::ximgproc::rl::erode( - *rlSrc.ptr, _rlDest, *rlKernel.ptr, bBoundaryOn, cv::Point(anchor.x, anchor.y) - ); - *rlDest = {new cv::Mat(_rlDest)}; - END_WRAP -} -CvStatus *ximgproc_rl_getStructuringElement(int shape, Size ksize, Mat *rval) { - BEGIN_WRAP - cv::Mat _rval = - cv::ximgproc::rl::getStructuringElement(shape, cv::Size(ksize.width, ksize.height)); - *rval = {new cv::Mat(_rval)}; - END_WRAP -} -CvStatus *ximgproc_rl_isRLMorphologyPossible(Mat rlStructuringElement, bool *rval) { - BEGIN_WRAP - *rval = cv::ximgproc::rl::isRLMorphologyPossible(*rlStructuringElement.ptr); - END_WRAP -} -CvStatus *ximgproc_rl_morphologyEx( - Mat rlSrc, Mat *rlDest, int op, Mat rlKernel, bool bBoundaryOnForErosion, Point anchor -) { - BEGIN_WRAP - cv::Mat _rlDest; - cv::ximgproc::rl::morphologyEx( - *rlSrc.ptr, _rlDest, op, *rlKernel.ptr, bBoundaryOnForErosion, cv::Point(anchor.x, anchor.y) - ); - *rlDest = {new cv::Mat(_rlDest)}; - END_WRAP -} -CvStatus *ximgproc_rl_paint(Mat image, Mat rlSrc, const Scalar value) { - BEGIN_WRAP - cv::ximgproc::rl::paint( - *image.ptr, *rlSrc.ptr, cv::Scalar(value.val1, value.val2, value.val3, value.val4) - ); - END_WRAP -} -CvStatus *ximgproc_rl_threshold(Mat src, Mat *rlDest, double thresh, int type) { - BEGIN_WRAP - cv::Mat _rlDest; - cv::ximgproc::rl::threshold(*src.ptr, _rlDest, thresh, type); - *rlDest = {new cv::Mat(_rlDest)}; - END_WRAP -} diff --git a/src/extra/ximgproc.h b/src/extra/ximgproc.h deleted file mode 100644 index 69ef3a66..00000000 --- a/src/extra/ximgproc.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - Created by rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 rainyl. -*/ -#ifndef CVD_XIMGPROC_H -#define CVD_XIMGPROC_H - -#include "../core/core.h" -#include "core/types.h" -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -#ifdef __cplusplus -CVD_TYPEDEF(cv::Ptr, RFFeatureGetter) -CVD_TYPEDEF(cv::Ptr, StructuredEdgeDetection) -CVD_TYPEDEF(cv::Ptr, GraphSegmentation) -CVD_TYPEDEF(cv::Ptr, EdgeDrawing) - -#else -CVD_TYPEDEF(void *, RFFeatureGetter) -CVD_TYPEDEF(void *, StructuredEdgeDetection) -CVD_TYPEDEF(void *, GraphSegmentation) -CVD_TYPEDEF(void *, EdgeDrawing) -#endif - -CvStatus * -ximgproc_anisotropicDiffusion(Mat src, CVD_OUT Mat *dst, float alpha, float K, int niters); -CvStatus *ximgproc_edgePreservingFilter(Mat src, CVD_OUT Mat *dst, int d, double threshold); -CvStatus *ximgproc_findEllipses( - Mat image, - CVD_OUT Mat *ellipses, - float scoreThreshold, - float reliabilityThreshold, - float centerDistanceThreshold -); -CvStatus *ximgproc_niBlackThreshold( - Mat src, - CVD_OUT Mat *dst, - double maxValue, - int type, - int blockSize, - double k, - int binarizationMethod, - double r -); -CvStatus *ximgproc_PeiLinNormalization(Mat I, CVD_OUT Mat *dst); -CvStatus *ximgproc_thinning(Mat src, Mat *dst, int thinningType); - -// RFFeatureGetter -CvStatus *ximgproc_RFFeatureGetter_Create(CVD_OUT RFFeatureGetter *rval); -void ximgproc_RFFeatureGetter_Close(RFFeatureGetterPtr self); -CvStatus *ximgproc_RFFeatureGetter_getFeatures( - RFFeatureGetter self, - Mat src, - CVD_OUT Mat *features, - int gnrmRad, - int gsmthRad, - int shrink, - int outNum, - int gradNum -); -CvStatus *ximgproc_RFFeatureGetter_Clear(RFFeatureGetter self); -CvStatus *ximgproc_RFFeatureGetter_Empty(RFFeatureGetter self, bool *rval); - -// StructuredEdgeDetection -CvStatus * -ximgproc_StructuredEdgeDetection_Create(char *model, CVD_OUT StructuredEdgeDetection *rval); -CvStatus *ximgproc_StructuredEdgeDetection_Create_1( - char *model, RFFeatureGetter howToGetFeatures, CVD_OUT StructuredEdgeDetection *rval -); -void ximgproc_StructuredEdgeDetection_Close(StructuredEdgeDetectionPtr self); -CvStatus *ximgproc_StructuredEdgeDetection_computeOrientation( - StructuredEdgeDetection self, Mat src, CVD_OUT Mat *dst -); -CvStatus *ximgproc_StructuredEdgeDetection_detectEdges( - StructuredEdgeDetection self, Mat src, CVD_OUT Mat *dst -); -CvStatus *ximgproc_StructuredEdgeDetection_edgesNms( - StructuredEdgeDetection self, - Mat edge_image, - Mat orientation_image, - CVD_OUT Mat *dst, - int r, - int s, - float m, - bool isParallel -); - -// Box, EdgeBoxes -typedef struct Box { - int h; - float score; - int w; - int x; - int y; -} Box; - -typedef struct EdgeBoxes { - float alpha; - float beta; - float eta; - float minScore; - int maxBoxes; - float edgeMinMag; - float edgeMergeThr; - float clusterMinMag; - float maxAspectRatio; - float minBoxArea; - float gamma; - float kappa; -} EdgeBoxes; - -CvStatus *ximgproc_EdgeBoxes_getBoundingBoxes( - EdgeBoxes self, - Mat edge_map, - Mat orientation_map, - CVD_OUT VecRect *boxes, - CVD_OUT VecF32 *scores -); - -// GraphSegmentation -CvStatus * -ximgproc_GraphSegmentation_Create(float sigma, float k, int min_size, GraphSegmentation *rval); -void ximgproc_GraphSegmentation_Close(GraphSegmentationPtr self); -CvStatus *ximgproc_GraphSegmentation_getK(GraphSegmentation self, float *rval); -CvStatus *ximgproc_GraphSegmentation_getMinSize(GraphSegmentation self, int *rval); -CvStatus *ximgproc_GraphSegmentation_getSigma(GraphSegmentation self, double *rval); -CvStatus * -ximgproc_GraphSegmentation_processImage(GraphSegmentation self, Mat src, CVD_OUT Mat *dst); -CvStatus *ximgproc_GraphSegmentation_setK(GraphSegmentation self, float val); -CvStatus *ximgproc_GraphSegmentation_setMinSize(GraphSegmentation self, int val); -CvStatus *ximgproc_GraphSegmentation_setSigma(GraphSegmentation self, double val); - -// EdgeDrawing -typedef struct EdgeDrawingParams { - int AnchorThresholdValue; - int EdgeDetectionOperator; - int GradientThresholdValue; - double LineFitErrorThreshold; - double MaxDistanceBetweenTwoLines; - double MaxErrorThreshold; - int MinLineLength; - int MinPathLength; - bool NFAValidation; - bool PFmode; - int ScanInterval; - float Sigma; - bool SumFlag; -} EdgeDrawingParams; - -CvStatus *ximgproc_EdgeDrawing_Create(EdgeDrawing *rval); -void ximgproc_EdgeDrawing_Close(EdgeDrawingPtr self); -CvStatus *ximgproc_EdgeDrawing_detectEdges(EdgeDrawing self, Mat src); -CvStatus *ximgproc_EdgeDrawing_detectEllipses(EdgeDrawing self, Mat *ellipses); -CvStatus *ximgproc_EdgeDrawing_detectLines(EdgeDrawing self, Mat *lines); -CvStatus *ximgproc_EdgeDrawing_getEdgeImage(EdgeDrawing self, Mat *dst); -CvStatus *ximgproc_EdgeDrawing_getGradientImage(EdgeDrawing self, Mat *dst); -CvStatus *ximgproc_EdgeDrawing_getSegmentIndicesOfLines(EdgeDrawing self, VecI32 *rval); -CvStatus *ximgproc_EdgeDrawing_getSegments(EdgeDrawing self, VecVecPoint *rval); -CvStatus *ximgproc_EdgeDrawing_setParams(EdgeDrawing self, EdgeDrawingParams params); -CvStatus *ximgproc_EdgeDrawing_getParams(EdgeDrawing self, EdgeDrawingParams *params); - -// Binary morphology on run-length encoded image -CvStatus *ximgproc_rl_createRLEImage(const VecPoint3i runs, Mat *res, Size size); -CvStatus *ximgproc_rl_dilate(Mat rlSrc, Mat *rlDest, Mat rlKernel, Point anchor); -CvStatus *ximgproc_rl_erode(Mat rlSrc, Mat *rlDest, Mat rlKernel, bool bBoundaryOn, Point anchor); -CvStatus *ximgproc_rl_getStructuringElement(int shape, Size ksize, Mat *rval); -CvStatus *ximgproc_rl_isRLMorphologyPossible(Mat rlStructuringElement, bool *rval); -CvStatus *ximgproc_rl_morphologyEx( - Mat rlSrc, Mat *rlDest, int op, Mat rlKernel, bool bBoundaryOnForErosion, Point anchor -); -CvStatus *ximgproc_rl_paint(Mat image, Mat rlSrc, const Scalar value); -CvStatus *ximgproc_rl_threshold(Mat src, Mat *rlDest, double thresh, int type); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_XIMGPROC_H diff --git a/src/extra/ximgproc_async.cpp b/src/extra/ximgproc_async.cpp deleted file mode 100644 index d40afdd1..00000000 --- a/src/extra/ximgproc_async.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/* - Created by rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 rainyl. -*/ -#include "ximgproc_async.h" -#include "core/types.h" -#include "core/vec.hpp" -#include "opencv2/core/types.hpp" -#include "opencv2/ximgproc.hpp" -#include "opencv2/ximgproc/structured_edge_detection.hpp" - -CvStatus *ximgproc_anisotropicDiffusion_Async( - Mat src, float alpha, float K, int niters, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::anisotropicDiffusion(*src.ptr, dst, alpha, K, niters); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus * -ximgproc_edgePreservingFilter_Async(Mat src, int d, double threshold, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::edgePreservingFilter(*src.ptr, dst, d, threshold); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_findEllipses_Async( - Mat image, - float scoreThreshold, - float reliabilityThreshold, - float centerDistanceThreshold, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::findEllipses(*image.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_niBlackThreshold_Async( - Mat src, - double maxValue, - int type, - int blockSize, - double k, - int binarizationMethod, - double r, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::niBlackThreshold( - *src.ptr, dst, maxValue, type, blockSize, k, binarizationMethod, r - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_PeiLinNormalization_Async(Mat I, CvCallback_1 callback) { - BEGIN_WRAP - auto dst = cv::ximgproc::PeiLinNormalization(*I.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_thinning_Async(Mat src, int thinningType, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::thinning(*src.ptr, dst, thinningType); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -// RFFeatureGetter -CvStatus *ximgproc_RFFeatureGetter_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new RFFeatureGetter{ - new cv::Ptr(cv::ximgproc::createRFFeatureGetter()) - }); - END_WRAP -} -// void ximgproc_RFFeatureGetter_Close_Async(RFFeatureGetterPtr self); -CvStatus *ximgproc_RFFeatureGetter_getFeatures_Async( - RFFeatureGetter self, - Mat src, - int gnrmRad, - int gsmthRad, - int shrink, - int outNum, - int gradNum, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->getFeatures(*src.ptr, dst, gnrmRad, gsmthRad, shrink, outNum, gradNum); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -// StructuredEdgeDetection -CvStatus *ximgproc_StructuredEdgeDetection_Create_Async( - char *model, RFFeatureGetter howToGetFeatures, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new StructuredEdgeDetection{new cv::Ptr( - cv::ximgproc::createStructuredEdgeDetection(model, *howToGetFeatures.ptr) - )}); - END_WRAP -} -// void ximgproc_StructuredEdgeDetection_Close_Async(StructuredEdgeDetectionPtr self); -CvStatus *ximgproc_StructuredEdgeDetection_computeOrientation_Async( - StructuredEdgeDetection self, Mat src, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->computeOrientation(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_StructuredEdgeDetection_detectEdges_Async( - StructuredEdgeDetection self, Mat src, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->detectEdges(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_StructuredEdgeDetection_edgesNms_Async( - StructuredEdgeDetection self, - Mat edge_image, - Mat orientation_image, - int r, - int s, - float m, - bool isParallel, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->edgesNms(*edge_image.ptr, *orientation_image.ptr, dst, r, s, m, isParallel); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -// GraphSegmentation -CvStatus * -ximgproc_GraphSegmentation_Create_Async(float sigma, float k, int min_size, CvCallback_1 callback) { - BEGIN_WRAP - callback(new GraphSegmentation{new cv::Ptr( - cv::ximgproc::segmentation::createGraphSegmentation(sigma, k, min_size) - )}); - END_WRAP -} -// void ximgproc_GraphSegmentation_Close_Async(GraphSegmentationPtr self); -CvStatus *ximgproc_GraphSegmentation_processImage_Async( - GraphSegmentation self, Mat src, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->processImage(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -// EdgeDrawing -CvStatus *ximgproc_EdgeDrawing_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new EdgeDrawing{new cv::Ptr(cv::ximgproc::createEdgeDrawing()) - }); - END_WRAP -} -// void ximgproc_EdgeDrawing_Close_Async(EdgeDrawingPtr self); -CvStatus *ximgproc_EdgeDrawing_detectEdges_Async(EdgeDrawing self, Mat src, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->detectEdges(*src.ptr); - callback(); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_detectEllipses_Async(EdgeDrawing self, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->detectEllipses(dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_detectLines_Async(EdgeDrawing self, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->detectLines(dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_getEdgeImage_Async(EdgeDrawing self, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->getEdgeImage(dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_getGradientImage_Async(EdgeDrawing self, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->getGradientImage(dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus * -ximgproc_EdgeDrawing_getSegmentIndicesOfLines_Async(EdgeDrawing self, CvCallback_1 callback) { - BEGIN_WRAP - auto dst = (*self.ptr)->getSegmentIndicesOfLines(); - callback(vecint_cpp2c_p(dst)); - END_WRAP -} -CvStatus *ximgproc_EdgeDrawing_getSegments_Async(EdgeDrawing self, CvCallback_1 callback) { - BEGIN_WRAP - auto dst = (*self.ptr)->getSegments(); - callback(vecvecpoint_cpp2c_p(dst)); - END_WRAP -} - -// Binary morphology on run-length encoded image -CvStatus * -ximgproc_rl_createRLEImage_Async(const VecPoint3i runs, Size size, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - auto _runs = vecpoint3i_c2cpp(runs); - cv::ximgproc::rl::createRLEImage(_runs, dst, cv::Size(size.width, size.height)); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_rl_dilate_Async(Mat rlSrc, Mat rlKernel, Point anchor, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::rl::dilate(*rlSrc.ptr, dst, *rlKernel.ptr, cv::Point(anchor.x, anchor.y)); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_rl_erode_Async( - Mat rlSrc, Mat rlKernel, bool bBoundaryOn, Point anchor, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::rl::erode( - *rlSrc.ptr, dst, *rlKernel.ptr, bBoundaryOn, cv::Point(anchor.x, anchor.y) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_rl_getStructuringElement_Async(int shape, Size ksize, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst = cv::ximgproc::rl::getStructuringElement(shape, cv::Size(ksize.width, ksize.height)); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus * -ximgproc_rl_isRLMorphologyPossible_Async(Mat rlStructuringElement, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool{cv::ximgproc::rl::isRLMorphologyPossible(*rlStructuringElement.ptr)}); - END_WRAP -} -CvStatus *ximgproc_rl_morphologyEx_Async( - Mat rlSrc, int op, Mat rlKernel, bool bBoundaryOnForErosion, Point anchor, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::rl::morphologyEx( - *rlSrc.ptr, dst, op, *rlKernel.ptr, bBoundaryOnForErosion, cv::Point(anchor.x, anchor.y) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *ximgproc_rl_paint_Async(Mat image, Mat rlSrc, const Scalar value, CvCallback_0 callback) { - BEGIN_WRAP - cv::Scalar val = cv::Scalar(value.val1, value.val2, value.val3, value.val4); - cv::ximgproc::rl::paint(*image.ptr, *rlSrc.ptr, val); - callback(); - END_WRAP -} -CvStatus *ximgproc_rl_threshold_Async(Mat src, double thresh, int type, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::ximgproc::rl::threshold(*src.ptr, dst, thresh, type); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} diff --git a/src/extra/ximgproc_async.h b/src/extra/ximgproc_async.h deleted file mode 100644 index abaa0049..00000000 --- a/src/extra/ximgproc_async.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - Created by rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 rainyl. -*/ -#ifndef CVD_XIMGPROC_ASYNC_H -#define CVD_XIMGPROC_ASYNC_H - -#include "../core/types.h" -#include "ximgproc.h" -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -CvStatus *ximgproc_anisotropicDiffusion_Async( - Mat src, float alpha, float K, int niters, CvCallback_1 callback -); -CvStatus * -ximgproc_edgePreservingFilter_Async(Mat src, int d, double threshold, CvCallback_1 callback); -CvStatus *ximgproc_findEllipses_Async( - Mat image, - float scoreThreshold, - float reliabilityThreshold, - float centerDistanceThreshold, - CvCallback_1 callback -); -CvStatus *ximgproc_niBlackThreshold_Async( - Mat src, - double maxValue, - int type, - int blockSize, - double k, - int binarizationMethod, - double r, - CvCallback_1 callback -); -CvStatus *ximgproc_PeiLinNormalization_Async(Mat I, CvCallback_1 callback); -CvStatus *ximgproc_thinning_Async(Mat src, int thinningType, CvCallback_1 callback); - -// RFFeatureGetter -CvStatus *ximgproc_RFFeatureGetter_Create_Async(CvCallback_1 callback); -// void ximgproc_RFFeatureGetter_Close_Async(RFFeatureGetterPtr self); -CvStatus *ximgproc_RFFeatureGetter_getFeatures_Async( - RFFeatureGetter self, - Mat src, - int gnrmRad, - int gsmthRad, - int shrink, - int outNum, - int gradNum, - CvCallback_1 callback -); - -// StructuredEdgeDetection -CvStatus *ximgproc_StructuredEdgeDetection_Create_Async( - char *model, RFFeatureGetter howToGetFeatures, CvCallback_1 callback -); -// void ximgproc_StructuredEdgeDetection_Close_Async(StructuredEdgeDetectionPtr self); -CvStatus *ximgproc_StructuredEdgeDetection_computeOrientation_Async( - StructuredEdgeDetection self, Mat src, CvCallback_1 callback -); -CvStatus *ximgproc_StructuredEdgeDetection_detectEdges_Async( - StructuredEdgeDetection self, Mat src, CvCallback_1 callback -); -CvStatus *ximgproc_StructuredEdgeDetection_edgesNms_Async( - StructuredEdgeDetection self, - Mat edge_image, - Mat orientation_image, - int r, - int s, - float m, - bool isParallel, - CvCallback_1 callback -); - -// GraphSegmentation -CvStatus * -ximgproc_GraphSegmentation_Create_Async(float sigma, float k, int min_size, CvCallback_1 callback); -// void ximgproc_GraphSegmentation_Close_Async(GraphSegmentationPtr self); -CvStatus *ximgproc_GraphSegmentation_processImage_Async( - GraphSegmentation self, Mat src, CvCallback_1 callback -); - -// EdgeDrawing -CvStatus *ximgproc_EdgeDrawing_Create_Async(CvCallback_1 callback); -// void ximgproc_EdgeDrawing_Close_Async(EdgeDrawingPtr self); -CvStatus *ximgproc_EdgeDrawing_detectEdges_Async(EdgeDrawing self, Mat src, CvCallback_0 callback); -CvStatus *ximgproc_EdgeDrawing_detectEllipses_Async(EdgeDrawing self, CvCallback_1 callback); -CvStatus *ximgproc_EdgeDrawing_detectLines_Async(EdgeDrawing self, CvCallback_1 callback); -CvStatus *ximgproc_EdgeDrawing_getEdgeImage_Async(EdgeDrawing self, CvCallback_1 callback); -CvStatus *ximgproc_EdgeDrawing_getGradientImage_Async(EdgeDrawing self, CvCallback_1 callback); -CvStatus * -ximgproc_EdgeDrawing_getSegmentIndicesOfLines_Async(EdgeDrawing self, CvCallback_1 callback); -CvStatus *ximgproc_EdgeDrawing_getSegments_Async(EdgeDrawing self, CvCallback_1 callback); - -// Binary morphology on run-length encoded image -CvStatus *ximgproc_rl_createRLEImage_Async(const VecPoint3i runs, Size size, CvCallback_1 callback); -CvStatus *ximgproc_rl_dilate_Async(Mat rlSrc, Mat rlKernel, Point anchor, CvCallback_1 callback); -CvStatus *ximgproc_rl_erode_Async( - Mat rlSrc, Mat rlKernel, bool bBoundaryOn, Point anchor, CvCallback_1 callback -); -CvStatus *ximgproc_rl_getStructuringElement_Async(int shape, Size ksize, CvCallback_1 callback); -CvStatus *ximgproc_rl_isRLMorphologyPossible_Async(Mat rlStructuringElement, CvCallback_1 callback); -CvStatus *ximgproc_rl_morphologyEx_Async( - Mat rlSrc, int op, Mat rlKernel, bool bBoundaryOnForErosion, Point anchor, CvCallback_1 callback -); -CvStatus *ximgproc_rl_paint_Async(Mat image, Mat rlSrc, const Scalar value, CvCallback_0 callback); -CvStatus *ximgproc_rl_threshold_Async(Mat src, double thresh, int type, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_XIMGPROC_ASYNC_H diff --git a/src/extra/xobjdetect.cpp b/src/extra/xobjdetect.cpp deleted file mode 100644 index 9c951e62..00000000 --- a/src/extra/xobjdetect.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "xobjdetect.h" -#include "core/core.h" -#include "core/vec.hpp" - -CvStatus *WBDetector_Create(PtrWBDetector *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::xobjdetect::WBDetector::create())}; - END_WRAP -} -void WBDetector_Close(PtrWBDetectorPtr self) { - self->ptr = nullptr; - CVD_FREE(self); -} -CvStatus *WBDetector_Detect( - PtrWBDetector *self, Mat img, CVD_OUT VecRect *bbox, CVD_OUT VecF64 *confidences -) { - - BEGIN_WRAP - std::vector _bboxes; - std::vector _confidences; - (*self->ptr)->detect(*img.ptr, _bboxes, _confidences); - *bbox = vecrect_cpp2c(_bboxes); - *confidences = vecdouble_cpp2c(_confidences); - END_WRAP -} -CvStatus *WBDetector_Train(PtrWBDetector *self, char *pos_samples, char *neg_imgs) { - BEGIN_WRAP(*self->ptr)->train(pos_samples, neg_imgs); - END_WRAP -} -CvStatus *WBDetector_Read(PtrWBDetector *self, char *filename) { - BEGIN_WRAP - auto fs = cv::FileStorage(filename, cv::FileStorage::READ); - (*self->ptr)->read(fs.root()); - END_WRAP -} -CvStatus *WBDetector_Write(PtrWBDetector *self, char *filename) { - BEGIN_WRAP - auto fs = cv::FileStorage(filename, cv::FileStorage::WRITE); - (*self->ptr)->write(fs); - END_WRAP -} diff --git a/src/extra/xobjdetect.h b/src/extra/xobjdetect.h deleted file mode 100644 index 1df864b1..00000000 --- a/src/extra/xobjdetect.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - Created by rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 rainyl. -*/ -#ifndef CVD_XOBJDETECT_H -#define CVD_XOBJDETECT_H - -#include "../core/core.h" -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -#ifdef __cplusplus -CVD_TYPEDEF(cv::Ptr, PtrWBDetector) -#else -CVD_TYPEDEF(void *, PtrWBDetector) -#endif - -CvStatus *WBDetector_Create(PtrWBDetector *rval); -void WBDetector_Close(PtrWBDetectorPtr self); -CvStatus *WBDetector_Detect(PtrWBDetector *self, Mat img, CVD_OUT VecRect *bbox, - CVD_OUT VecF64 *confidences); -CvStatus *WBDetector_Train(PtrWBDetector *self, char *pos_samples, char *neg_imgs); -CvStatus *WBDetector_Read(PtrWBDetector *self, char *filename); -CvStatus *WBDetector_Write(PtrWBDetector *self, char *filename); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_XOBJDETECT_H diff --git a/src/features2d/features2d.cpp b/src/features2d/features2d.cpp deleted file mode 100644 index dd447982..00000000 --- a/src/features2d/features2d.cpp +++ /dev/null @@ -1,373 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "features2d.h" -#include "core/vec.hpp" -#include "utils.hpp" - -#include - -CvStatus *AKAZE_Create(AKAZE *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::AKAZE::create())}; - END_WRAP -} -void AKAZE_Close(AKAZEPtr a) { - a->ptr->reset(); - CVD_FREE(a); -} - -CvStatus *AKAZE_Detect(AKAZE a, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*a.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} -CvStatus *AKAZE_DetectAndCompute(AKAZE a, Mat src, Mat mask, Mat desc, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*a.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, *desc.ptr); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *AgastFeatureDetector_Create(AgastFeatureDetector *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::AgastFeatureDetector::create())}; - END_WRAP -} -void AgastFeatureDetector_Close(AgastFeatureDetectorPtr a) { - a->ptr->reset(); - CVD_FREE(a); -} - -CvStatus *AgastFeatureDetector_Detect(AgastFeatureDetector a, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*a.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *BRISK_Create(BRISK *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::BRISK::create())}; - END_WRAP -} -void BRISK_Close(BRISKPtr b) { - b->ptr->reset(); - CVD_FREE(b); -} - -CvStatus *BRISK_Detect(BRISK b, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*b.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} -CvStatus *BRISK_DetectAndCompute(BRISK b, Mat src, Mat mask, Mat desc, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*b.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, *desc.ptr); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *FastFeatureDetector_Create(FastFeatureDetector *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::FastFeatureDetector::create())}; - END_WRAP -} -CvStatus *FastFeatureDetector_CreateWithParams( - int threshold, bool nonmaxSuppression, int type, FastFeatureDetector *rval -) { - BEGIN_WRAP - auto type_ = static_cast(type); - *rval = {new cv::Ptr( - cv::FastFeatureDetector::create(threshold, nonmaxSuppression, type_) - )}; - END_WRAP -} -void FastFeatureDetector_Close(FastFeatureDetectorPtr f) { - f->ptr->reset(); - CVD_FREE(f); -} - -CvStatus *FastFeatureDetector_Detect(FastFeatureDetector f, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*f.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *GFTTDetector_Create(GFTTDetector *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::GFTTDetector::create())}; - END_WRAP -} -void GFTTDetector_Close(GFTTDetectorPtr a) { - a->ptr->reset(); - CVD_FREE(a); -} - -CvStatus *GFTTDetector_Detect(GFTTDetector a, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*a.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *KAZE_Create(KAZE *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::KAZE::create())}; - END_WRAP -} -void KAZE_Close(KAZEPtr a) { - a->ptr->reset(); - CVD_FREE(a); -} - -CvStatus *KAZE_Detect(KAZE a, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*a.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} -CvStatus *KAZE_DetectAndCompute(KAZE a, Mat src, Mat mask, Mat desc, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*a.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, *desc.ptr); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *MSER_Create(MSER *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::MSER::create())}; - END_WRAP -} -void MSER_Close(MSERPtr a) { - a->ptr->reset(); - CVD_FREE(a); -} - -CvStatus *MSER_Detect(MSER a, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*a.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *ORB_Create(ORB *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::ORB::create())}; - END_WRAP -} -CvStatus *ORB_CreateWithParams( - int nfeatures, - float scaleFactor, - int nlevels, - int edgeThreshold, - int firstLevel, - int WTA_K, - int scoreType, - int patchSize, - int fastThreshold, - ORB *rval -) { - BEGIN_WRAP - auto type = static_cast(scoreType); - *rval = {new cv::Ptr(cv::ORB::create( - nfeatures, - scaleFactor, - nlevels, - edgeThreshold, - firstLevel, - WTA_K, - type, - patchSize, - fastThreshold - ))}; - END_WRAP -} -void ORB_Close(ORBPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *ORB_Detect(const ORB self, const Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *ORB_DetectAndCompute(ORB self, Mat src, Mat mask, Mat *desc, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected; - cv::Mat _desc; - (*self.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, _desc); - *rval = veckeypoint_cpp2c(detected); - *desc = {new cv::Mat(_desc)}; - END_WRAP -} - -CvStatus *SimpleBlobDetector_Create(SimpleBlobDetector *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::SimpleBlobDetector::create())}; - END_WRAP -} -CvStatus * -SimpleBlobDetector_Create_WithParams(SimpleBlobDetectorParams params, SimpleBlobDetector *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::SimpleBlobDetector::create(ConvertCParamsToCPPParams(params)) - )}; - END_WRAP -} -void SimpleBlobDetector_Close(SimpleBlobDetectorPtr b) { - b->ptr->reset(); - CVD_FREE(b); -} - -CvStatus *SimpleBlobDetector_Detect(SimpleBlobDetector b, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*b.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} -CvStatus *SimpleBlobDetectorParams_Create(SimpleBlobDetectorParams *rval) { - BEGIN_WRAP - *rval = ConvertCPPParamsToCParams(cv::SimpleBlobDetector::Params()); - END_WRAP -} - -CvStatus *BFMatcher_Create(BFMatcher *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::BFMatcher::create())}; - END_WRAP -} -CvStatus *BFMatcher_CreateWithParams(int normType, bool crossCheck, BFMatcher *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::BFMatcher::create(normType, crossCheck))}; - END_WRAP -} -void BFMatcher_Close(BFMatcherPtr b) { - b->ptr->reset(); - CVD_FREE(b); -} - -CvStatus *BFMatcher_Match(BFMatcher b, Mat query, Mat train, VecDMatch *rval) { - BEGIN_WRAP - std::vector matches = std::vector(); - (*b.ptr)->match(*query.ptr, *train.ptr, matches); - *rval = vecdmatch_cpp2c(matches); - END_WRAP -} -CvStatus *BFMatcher_KnnMatch(BFMatcher b, Mat query, Mat train, int k, VecVecDMatch *rval) { - BEGIN_WRAP - std::vector> matches = std::vector>(); - (*b.ptr)->knnMatch(*query.ptr, *train.ptr, matches, k); - *rval = vecvecdmatch_cpp2c(matches); - END_WRAP -} - -CvStatus *FlannBasedMatcher_Create(FlannBasedMatcher *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::FlannBasedMatcher::create())}; - END_WRAP -} -void FlannBasedMatcher_Close(FlannBasedMatcherPtr f) { - f->ptr->reset(); - CVD_FREE(f); -} - -CvStatus * -FlannBasedMatcher_KnnMatch(FlannBasedMatcher f, Mat query, Mat train, int k, VecVecDMatch *rval) { - BEGIN_WRAP - std::vector> matches = std::vector>(); - (*f.ptr)->knnMatch(*query.ptr, *train.ptr, matches, k); - *rval = vecvecdmatch_cpp2c(matches); - END_WRAP -} - -CvStatus *DrawKeyPoints(Mat src, VecKeyPoint kp, Mat dst, const Scalar color, int flags) { - BEGIN_WRAP - auto color_ = cv::Scalar(color.val1, color.val2, color.val3, color.val4); - auto _kp = veckeypoint_c2cpp(kp); - cv::drawKeypoints(*src.ptr, _kp, *dst.ptr, color_, static_cast(flags)); - END_WRAP -} - -CvStatus *SIFT_Create(SIFT *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::SIFT::create())}; - END_WRAP -} -void SIFT_Close(SIFTPtr f) { - f->ptr->reset(); - CVD_FREE(f); -} - -CvStatus *SIFT_Detect(SIFT f, Mat src, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*f.ptr)->detect(*src.ptr, detected); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} -CvStatus *SIFT_DetectAndCompute(SIFT f, Mat src, Mat mask, Mat desc, VecKeyPoint *rval) { - BEGIN_WRAP - std::vector detected = std::vector(); - (*f.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, *desc.ptr); - *rval = veckeypoint_cpp2c(detected); - END_WRAP -} - -CvStatus *DrawMatches( - Mat img1, - VecKeyPoint kp1, - Mat img2, - VecKeyPoint kp2, - VecDMatch matches1to2, - Mat outImg, - const Scalar matchesColor, - const Scalar pointColor, - VecChar matchesMask, - int flags -) { - BEGIN_WRAP - auto mColor = - cv::Scalar(matchesColor.val1, matchesColor.val2, matchesColor.val3, matchesColor.val4); - auto pColor = cv::Scalar(pointColor.val1, pointColor.val2, pointColor.val3, pointColor.val4); - auto _kp1 = veckeypoint_c2cpp(kp1); - auto _kp2 = veckeypoint_c2cpp(kp2); - auto _matches1to2 = vecdmatch_c2cpp(matches1to2); - auto _matchesMask = vecchar_c2cpp(matchesMask); - cv::drawMatches( - *img1.ptr, - _kp1, - *img2.ptr, - _kp2, - _matches1to2, - *outImg.ptr, - mColor, - pColor, - _matchesMask, - static_cast(flags) - ); - END_WRAP -} diff --git a/src/features2d/features2d.h b/src/features2d/features2d.h deleted file mode 100644 index faa15650..00000000 --- a/src/features2d/features2d.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef _OPENCV3_FEATURES2D_H_ -#define _OPENCV3_FEATURES2D_H_ - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "core/core.h" -#include -#ifdef __cplusplus -CVD_TYPEDEF(cv::Ptr, AKAZE); -CVD_TYPEDEF(cv::Ptr, AgastFeatureDetector); -CVD_TYPEDEF(cv::Ptr, BRISK); -CVD_TYPEDEF(cv::Ptr, FastFeatureDetector); -CVD_TYPEDEF(cv::Ptr, GFTTDetector); -CVD_TYPEDEF(cv::Ptr, KAZE); -CVD_TYPEDEF(cv::Ptr, MSER); -CVD_TYPEDEF(cv::Ptr, ORB); -CVD_TYPEDEF(cv::Ptr, SimpleBlobDetector); -CVD_TYPEDEF(cv::Ptr, BFMatcher); -CVD_TYPEDEF(cv::Ptr, FlannBasedMatcher); -CVD_TYPEDEF(cv::Ptr, SIFT); -#else -CVD_TYPEDEF(void, AKAZE); -CVD_TYPEDEF(void, AgastFeatureDetector); -CVD_TYPEDEF(void, BRISK); -CVD_TYPEDEF(void, FastFeatureDetector); -CVD_TYPEDEF(void, GFTTDetector); -CVD_TYPEDEF(void, KAZE); -CVD_TYPEDEF(void, MSER); -CVD_TYPEDEF(void, ORB); -CVD_TYPEDEF(void, SimpleBlobDetector); -CVD_TYPEDEF(void, BFMatcher); -CVD_TYPEDEF(void, FlannBasedMatcher); -CVD_TYPEDEF(void, SIFT); -#endif - -// Wrapper for SimpleBlobDetectorParams aka SimpleBlobDetector::Params -typedef struct SimpleBlobDetectorParams { - unsigned char blobColor; - bool filterByArea; - bool filterByCircularity; - bool filterByColor; - bool filterByConvexity; - bool filterByInertia; - float maxArea; - float maxCircularity; - float maxConvexity; - float maxInertiaRatio; - float maxThreshold; - float minArea; - float minCircularity; - float minConvexity; - float minDistBetweenBlobs; - float minInertiaRatio; - size_t minRepeatability; - float minThreshold; - float thresholdStep; -} SimpleBlobDetectorParams; - -CvStatus *AKAZE_Create(AKAZE *rval); -void AKAZE_Close(AKAZEPtr a); -CvStatus *AKAZE_Detect(AKAZE a, Mat src, VecKeyPoint *rval); -CvStatus *AKAZE_DetectAndCompute(AKAZE a, Mat src, Mat mask, Mat desc, VecKeyPoint *rval); - -CvStatus *AgastFeatureDetector_Create(AgastFeatureDetector *rval); -void AgastFeatureDetector_Close(AgastFeatureDetectorPtr a); -CvStatus *AgastFeatureDetector_Detect(AgastFeatureDetector a, Mat src, VecKeyPoint *rval); - -CvStatus *BRISK_Create(BRISK *rval); -void BRISK_Close(BRISKPtr b); -CvStatus *BRISK_Detect(BRISK b, Mat src, VecKeyPoint *rval); -CvStatus *BRISK_DetectAndCompute(BRISK b, Mat src, Mat mask, Mat desc, VecKeyPoint *rval); - -CvStatus *FastFeatureDetector_Create(FastFeatureDetector *rval); -CvStatus *FastFeatureDetector_CreateWithParams(int threshold, bool nonmaxSuppression, int type, - FastFeatureDetector *rval); -void FastFeatureDetector_Close(FastFeatureDetectorPtr f); -CvStatus *FastFeatureDetector_Detect(FastFeatureDetector f, Mat src, VecKeyPoint *rval); - -CvStatus *GFTTDetector_Create(GFTTDetector *rval); -void GFTTDetector_Close(GFTTDetectorPtr a); -CvStatus *GFTTDetector_Detect(GFTTDetector a, Mat src, VecKeyPoint *rval); - -CvStatus *KAZE_Create(KAZE *rval); -void KAZE_Close(KAZEPtr a); -CvStatus *KAZE_Detect(KAZE a, Mat src, VecKeyPoint *rval); -CvStatus *KAZE_DetectAndCompute(KAZE a, Mat src, Mat mask, Mat desc, VecKeyPoint *rval); - -CvStatus *MSER_Create(MSER *rval); -void MSER_Close(MSERPtr a); -CvStatus *MSER_Detect(MSER a, Mat src, VecKeyPoint *rval); - -CvStatus *ORB_Create(ORB *rval); -CvStatus *ORB_CreateWithParams(int nfeatures, float scaleFactor, int nlevels, int edgeThreshold, - int firstLevel, int WTA_K, int scoreType, int patchSize, int fastThreshold, - ORB *rval); -void ORB_Close(ORBPtr self); -CvStatus *ORB_Detect(ORB self, Mat src, VecKeyPoint *rval); -CvStatus *ORB_DetectAndCompute(ORB self, Mat src, Mat mask, Mat *desc, VecKeyPoint *rval); - -CvStatus *SimpleBlobDetector_Create(SimpleBlobDetector *rval); -CvStatus *SimpleBlobDetector_Create_WithParams(SimpleBlobDetectorParams params, SimpleBlobDetector *rval); -void SimpleBlobDetector_Close(SimpleBlobDetectorPtr b); -CvStatus *SimpleBlobDetector_Detect(SimpleBlobDetector b, Mat src, VecKeyPoint *rval); -CvStatus *SimpleBlobDetectorParams_Create(SimpleBlobDetectorParams *rval); - -CvStatus *BFMatcher_Create(BFMatcher *rval); -CvStatus *BFMatcher_CreateWithParams(int normType, bool crossCheck, BFMatcher *rval); -void BFMatcher_Close(BFMatcherPtr b); -CvStatus *BFMatcher_Match(BFMatcher b, Mat query, Mat train, VecDMatch *rval); -CvStatus *BFMatcher_KnnMatch(BFMatcher b, Mat query, Mat train, int k, VecVecDMatch *rval); - -CvStatus *FlannBasedMatcher_Create(FlannBasedMatcher *rval); -void FlannBasedMatcher_Close(FlannBasedMatcherPtr f); -CvStatus *FlannBasedMatcher_KnnMatch(FlannBasedMatcher f, Mat query, Mat train, int k, VecVecDMatch *rval); - -CvStatus *DrawKeyPoints(Mat src, VecKeyPoint kp, Mat dst, const Scalar color, int flags); - -CvStatus *SIFT_Create(SIFT *rval); -void SIFT_Close(SIFTPtr f); -CvStatus *SIFT_Detect(SIFT f, Mat src, VecKeyPoint *rval); -CvStatus *SIFT_DetectAndCompute(SIFT f, Mat src, Mat mask, Mat desc, VecKeyPoint *rval); - -CvStatus *DrawMatches(Mat img1, VecKeyPoint kp1, Mat img2, VecKeyPoint kp2, VecDMatch matches1to2, Mat outImg, - const Scalar matchesColor, const Scalar pointColor, VecChar matchesMask, int flags); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_FEATURES2D_H_ diff --git a/src/features2d/features2d_async.cpp b/src/features2d/features2d_async.cpp deleted file mode 100644 index 161fa30a..00000000 --- a/src/features2d/features2d_async.cpp +++ /dev/null @@ -1,450 +0,0 @@ -/* Created by Abdelaziz Mahdy. Licensed: Apache 2.0 license. Copyright (c) 2024 Abdelaziz Mahdy. */ -#include "features2d_async.h" -#include "utils.hpp" - -#include "core/types.h" -#include "core/vec.hpp" - -// Asynchronous functions for AKAZE -CvStatus *AKAZE_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new AKAZE{new cv::Ptr(cv::AKAZE::create())}); - END_WRAP -} - -CvStatus *AKAZE_Close_Async(AKAZEPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *AKAZE_Detect_Async(AKAZE self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -CvStatus *AKAZE_DetectAndCompute_Async(AKAZE self, Mat src, Mat mask, CvCallback_2 callback) { - BEGIN_WRAP - std::vector detected; - cv::Mat desc; - (*self.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, desc); - callback(veckeypoint_cpp2c_p(detected), new Mat{new cv::Mat(desc)}); - END_WRAP -} - -// Asynchronous functions for AgastFeatureDetector -CvStatus *AgastFeatureDetector_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new AgastFeatureDetector{ - new cv::Ptr(cv::AgastFeatureDetector::create()) - }); - END_WRAP -} - -CvStatus *AgastFeatureDetector_Close_Async(AgastFeatureDetectorPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus * -AgastFeatureDetector_Detect_Async(AgastFeatureDetector self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -// Asynchronous functions for BRISK -CvStatus *BRISK_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new BRISK{new cv::Ptr(cv::BRISK::create())}); - END_WRAP -} - -CvStatus *BRISK_Close_Async(BRISKPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *BRISK_Detect_Async(BRISK self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -CvStatus *BRISK_DetectAndCompute_Async(BRISK self, Mat src, Mat mask, CvCallback_2 callback) { - BEGIN_WRAP - std::vector detected; - cv::Mat desc; - (*self.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, desc); - callback(veckeypoint_cpp2c_p(detected), new Mat{new cv::Mat(desc)}); - END_WRAP -} - -// Asynchronous functions for FastFeatureDetector -CvStatus *FastFeatureDetector_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new FastFeatureDetector{ - new cv::Ptr(cv::FastFeatureDetector::create()) - }); - END_WRAP -} - -CvStatus *FastFeatureDetector_CreateWithParams_Async( - int threshold, bool nonmaxSuppression, int type, CvCallback_1 callback -) { - BEGIN_WRAP - auto type_ = static_cast(type); - callback(new FastFeatureDetector{new cv::Ptr( - cv::FastFeatureDetector::create(threshold, nonmaxSuppression, type_) - )}); - END_WRAP -} - -CvStatus *FastFeatureDetector_Close_Async(FastFeatureDetectorPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus * -FastFeatureDetector_Detect_Async(FastFeatureDetector self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -// Asynchronous functions for GFTTDetector -CvStatus *GFTTDetector_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new GFTTDetector{new cv::Ptr(cv::GFTTDetector::create())}); - END_WRAP -} - -CvStatus *GFTTDetector_Close_Async(GFTTDetectorPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *GFTTDetector_Detect_Async(GFTTDetector self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -// Asynchronous functions for KAZE -CvStatus *KAZE_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new KAZE{new cv::Ptr(cv::KAZE::create())}); - END_WRAP -} - -CvStatus *KAZE_Close_Async(KAZEPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *KAZE_Detect_Async(KAZE self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -CvStatus *KAZE_DetectAndCompute_Async(KAZE self, Mat src, Mat mask, CvCallback_2 callback) { - BEGIN_WRAP - std::vector detected; - cv::Mat desc; - (*self.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, desc); - callback(veckeypoint_cpp2c_p(detected), new Mat{new cv::Mat(desc)}); - END_WRAP -} - -// Asynchronous functions for MSER -CvStatus *MSER_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new MSER{new cv::Ptr(cv::MSER::create())}); - END_WRAP -} - -CvStatus *MSER_Close_Async(MSERPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *MSER_Detect_Async(MSER self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -// Asynchronous functions for ORB -CvStatus *ORB_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new ORB{new cv::Ptr(cv::ORB::create())}); - END_WRAP -} - -CvStatus *ORB_CreateWithParams_Async( - int nfeatures, - float scaleFactor, - int nlevels, - int edgeThreshold, - int firstLevel, - int WTA_K, - int scoreType, - int patchSize, - int fastThreshold, - CvCallback_1 callback -) { - BEGIN_WRAP - auto type = static_cast(scoreType); - callback(new ORB{new cv::Ptr(cv::ORB::create( - nfeatures, - scaleFactor, - nlevels, - edgeThreshold, - firstLevel, - WTA_K, - type, - patchSize, - fastThreshold - ))}); - END_WRAP -} - -CvStatus *ORB_Close_Async(ORBPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *ORB_Detect_Async(ORB self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -CvStatus *ORB_DetectAndCompute_Async(ORB self, Mat src, Mat mask, CvCallback_2 callback) { - BEGIN_WRAP - std::vector detected; - cv::Mat desc; - (*self.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, desc); - callback(veckeypoint_cpp2c_p(detected), new Mat{new cv::Mat(desc)}); - END_WRAP -} - -// Asynchronous functions for SimpleBlobDetector -CvStatus *SimpleBlobDetector_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback( - new SimpleBlobDetector{new cv::Ptr(cv::SimpleBlobDetector::create())} - ); - END_WRAP -} - -CvStatus * -SimpleBlobDetector_Create_WithParams_Async(SimpleBlobDetectorParams params, CvCallback_1 callback) { - BEGIN_WRAP - callback(new SimpleBlobDetector{new cv::Ptr( - cv::SimpleBlobDetector::create(ConvertCParamsToCPPParams(params)) - )}); - END_WRAP -} - -CvStatus *SimpleBlobDetector_Close_Async(SimpleBlobDetectorPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *SimpleBlobDetector_Detect_Async(SimpleBlobDetector self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -// Asynchronous functions for BFMatcher -CvStatus *BFMatcher_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new BFMatcher{new cv::Ptr(cv::BFMatcher::create())}); - END_WRAP -} - -CvStatus *BFMatcher_CreateWithParams_Async(int normType, bool crossCheck, CvCallback_1 callback) { - BEGIN_WRAP - callback(new BFMatcher{new cv::Ptr(cv::BFMatcher::create(normType, crossCheck))}); - END_WRAP -} - -CvStatus *BFMatcher_Close_Async(BFMatcherPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *BFMatcher_Match_Async(BFMatcher self, Mat query, Mat train, CvCallback_1 callback) { - BEGIN_WRAP - std::vector matches; - (*self.ptr)->match(*query.ptr, *train.ptr, matches); - callback(vecdmatch_cpp2c_p(matches)); - END_WRAP -} - -CvStatus * -BFMatcher_KnnMatch_Async(BFMatcher self, Mat query, Mat train, int k, CvCallback_1 callback) { - BEGIN_WRAP - std::vector> matches; - (*self.ptr)->knnMatch(*query.ptr, *train.ptr, matches, k); - callback(vecvecdmatch_cpp2c_p(matches)); - END_WRAP -} - -// Asynchronous functions for FlannBasedMatcher -CvStatus *FlannBasedMatcher_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new FlannBasedMatcher{new cv::Ptr(cv::FlannBasedMatcher::create()) - }); - END_WRAP -} - -CvStatus *FlannBasedMatcher_Close_Async(FlannBasedMatcherPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *FlannBasedMatcher_KnnMatch_Async( - FlannBasedMatcher self, Mat query, Mat train, int k, CvCallback_1 callback -) { - BEGIN_WRAP - std::vector> matches; - (*self.ptr)->knnMatch(*query.ptr, *train.ptr, matches, k); - callback(vecvecdmatch_cpp2c_p(matches)); - END_WRAP -} - -// Asynchronous utility functions -CvStatus *DrawKeyPoints_Async( - Mat src, VecKeyPoint kp, Mat dst, const Scalar color, int flags, CvCallback_0 callback -) { - BEGIN_WRAP - auto color_ = cv::Scalar(color.val1, color.val2, color.val3, color.val4); - auto _kp = veckeypoint_c2cpp(kp); - cv::drawKeypoints(*src.ptr, _kp, *dst.ptr, color_, static_cast(flags)); - callback(); - END_WRAP -} - -CvStatus *DrawMatches_Async( - Mat img1, - VecKeyPoint kp1, - Mat img2, - VecKeyPoint kp2, - VecDMatch matches1to2, - Mat outImg, - const Scalar matchesColor, - const Scalar pointColor, - VecChar matchesMask, - int flags, - CvCallback_0 callback -) { - BEGIN_WRAP - auto mColor = - cv::Scalar(matchesColor.val1, matchesColor.val2, matchesColor.val3, matchesColor.val4); - auto pColor = cv::Scalar(pointColor.val1, pointColor.val2, pointColor.val3, pointColor.val4); - auto _kp1 = veckeypoint_c2cpp(kp1); - auto _kp2 = veckeypoint_c2cpp(kp2); - auto _matches1to2 = vecdmatch_c2cpp(matches1to2); - auto _matchesMask = vecchar_c2cpp(matchesMask); - cv::drawMatches( - *img1.ptr, - _kp1, - *img2.ptr, - _kp2, - _matches1to2, - *outImg.ptr, - mColor, - pColor, - _matchesMask, - static_cast(flags) - ); - callback(); - END_WRAP -} - -// Asynchronous functions for SIFT -CvStatus *SIFT_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new SIFT{new cv::Ptr(cv::SIFT::create())}); - END_WRAP -} - -CvStatus *SIFT_Close_Async(SIFTPtr self, CvCallback_0 callback) { - BEGIN_WRAP - self->ptr->reset(); - CVD_FREE(self); - callback(); - END_WRAP -} - -CvStatus *SIFT_Detect_Async(SIFT self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - std::vector detected; - (*self.ptr)->detect(*src.ptr, detected); - callback(veckeypoint_cpp2c_p(detected)); - END_WRAP -} - -CvStatus *SIFT_DetectAndCompute_Async(SIFT self, Mat src, Mat mask, CvCallback_2 callback) { - BEGIN_WRAP - std::vector detected; - cv::Mat desc; - (*self.ptr)->detectAndCompute(*src.ptr, *mask.ptr, detected, desc); - callback(veckeypoint_cpp2c_p(detected), new Mat{new cv::Mat(desc)}); - END_WRAP -} diff --git a/src/features2d/features2d_async.h b/src/features2d/features2d_async.h deleted file mode 100644 index 200bdd0e..00000000 --- a/src/features2d/features2d_async.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Created by Abdelaziz Mahdy. Licensed: Apache 2.0 license. Copyright (c) 2024 Abdelaziz Mahdy. */ -#ifndef CVD_FEATURES2D_ASYNC_H_ -#define CVD_FEATURES2D_ASYNC_H_ - -#include "core/types.h" -#include "features2d.h" -#include - -#ifdef __cplusplus -#include -extern "C" { -#endif - -// AKAZE -CvStatus *AKAZE_Create_Async(CvCallback_1 callback); -CvStatus *AKAZE_Close_Async(AKAZEPtr self, CvCallback_0 callback); -CvStatus *AKAZE_Detect_Async(AKAZE self, Mat src, CvCallback_1 callback); -CvStatus *AKAZE_DetectAndCompute_Async(AKAZE self, Mat src, Mat mask, CvCallback_2 callback); - -// AgastFeatureDetector -CvStatus *AgastFeatureDetector_Create_Async(CvCallback_1 callback); -CvStatus *AgastFeatureDetector_Close_Async(AgastFeatureDetectorPtr self, CvCallback_0 callback); -CvStatus *AgastFeatureDetector_Detect_Async(AgastFeatureDetector self, Mat src, CvCallback_1 callback); - -// BRISK -CvStatus *BRISK_Create_Async(CvCallback_1 callback); -CvStatus *BRISK_Close_Async(BRISKPtr self, CvCallback_0 callback); -CvStatus *BRISK_Detect_Async(BRISK self, Mat src, CvCallback_1 callback); -CvStatus *BRISK_DetectAndCompute_Async(BRISK self, Mat src, Mat mask, CvCallback_2 callback); - -// FastFeatureDetector -CvStatus *FastFeatureDetector_Create_Async(CvCallback_1 callback); -CvStatus *FastFeatureDetector_CreateWithParams_Async(int threshold, bool nonmaxSuppression, int type, CvCallback_1 callback); -CvStatus *FastFeatureDetector_Close_Async(FastFeatureDetectorPtr self, CvCallback_0 callback); -CvStatus *FastFeatureDetector_Detect_Async(FastFeatureDetector self, Mat src, CvCallback_1 callback); - -// GFTTDetector -CvStatus *GFTTDetector_Create_Async(CvCallback_1 callback); -CvStatus *GFTTDetector_Close_Async(GFTTDetectorPtr self, CvCallback_0 callback); -CvStatus *GFTTDetector_Detect_Async(GFTTDetector self, Mat src, CvCallback_1 callback); - -// KAZE -CvStatus *KAZE_Create_Async(CvCallback_1 callback); -CvStatus *KAZE_Close_Async(KAZEPtr self, CvCallback_0 callback); -CvStatus *KAZE_Detect_Async(KAZE self, Mat src, CvCallback_1 callback); -CvStatus *KAZE_DetectAndCompute_Async(KAZE self, Mat src, Mat mask, CvCallback_2 callback); - -// MSER -CvStatus *MSER_Create_Async(CvCallback_1 callback); -CvStatus *MSER_Close_Async(MSERPtr self, CvCallback_0 callback); -CvStatus *MSER_Detect_Async(MSER self, Mat src, CvCallback_1 callback); - -// ORB -CvStatus *ORB_Create_Async(CvCallback_1 callback); -CvStatus *ORB_CreateWithParams_Async(int nfeatures, float scaleFactor, int nlevels, int edgeThreshold, int firstLevel, int WTA_K, int scoreType, int patchSize, int fastThreshold, CvCallback_1 callback); -CvStatus *ORB_Close_Async(ORBPtr self, CvCallback_0 callback); -CvStatus *ORB_Detect_Async(ORB self, Mat src, CvCallback_1 callback); -CvStatus *ORB_DetectAndCompute_Async(ORB self, Mat src, Mat mask, CvCallback_2 callback); - -// SimpleBlobDetector -CvStatus *SimpleBlobDetector_Create_Async(CvCallback_1 callback); -CvStatus *SimpleBlobDetector_Create_WithParams_Async(SimpleBlobDetectorParams params, CvCallback_1 callback); -CvStatus *SimpleBlobDetector_Close_Async(SimpleBlobDetectorPtr self, CvCallback_0 callback); -CvStatus *SimpleBlobDetector_Detect_Async(SimpleBlobDetector self, Mat src, CvCallback_1 callback); - -// BFMatcher -CvStatus *BFMatcher_Create_Async(CvCallback_1 callback); -CvStatus *BFMatcher_CreateWithParams_Async(int normType, bool crossCheck, CvCallback_1 callback); -CvStatus *BFMatcher_Close_Async(BFMatcherPtr self, CvCallback_0 callback); -CvStatus *BFMatcher_Match_Async(BFMatcher self, Mat query, Mat train, CvCallback_1 callback); -CvStatus *BFMatcher_KnnMatch_Async(BFMatcher self, Mat query, Mat train, int k, CvCallback_1 callback); - -// FlannBasedMatcher -CvStatus *FlannBasedMatcher_Create_Async(CvCallback_1 callback); -CvStatus *FlannBasedMatcher_Close_Async(FlannBasedMatcherPtr self, CvCallback_0 callback); -CvStatus *FlannBasedMatcher_KnnMatch_Async(FlannBasedMatcher self, Mat query, Mat train, int k, CvCallback_1 callback); - -// Utility functions -CvStatus *DrawKeyPoints_Async(Mat src, VecKeyPoint kp, Mat dst, const Scalar color, int flags, CvCallback_0 callback); -CvStatus *DrawMatches_Async(Mat img1, VecKeyPoint kp1, Mat img2, VecKeyPoint kp2, VecDMatch matches1to2, Mat outImg, const Scalar matchesColor, const Scalar pointColor, VecChar matchesMask, int flags, CvCallback_0 callback); - -// SIFT -CvStatus *SIFT_Create_Async(CvCallback_1 callback); -CvStatus *SIFT_Close_Async(SIFTPtr self, CvCallback_0 callback); -CvStatus *SIFT_Detect_Async(SIFT self, Mat src, CvCallback_1 callback); -CvStatus *SIFT_DetectAndCompute_Async(SIFT self, Mat src, Mat mask, CvCallback_2 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_FEATURES2D_ASYNC_H_ diff --git a/src/features2d/utils.hpp b/src/features2d/utils.hpp deleted file mode 100644 index 6110cfeb..00000000 --- a/src/features2d/utils.hpp +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef CVD_FEATURES2D_UTILS_H -#define CVD_FEATURES2D_UTILS_H - -#include "features2d/features2d.h" -#include - -inline cv::SimpleBlobDetector::Params ConvertCParamsToCPPParams(SimpleBlobDetectorParams params) -{ - cv::SimpleBlobDetector::Params converted; - - converted.blobColor = params.blobColor; - converted.filterByArea = params.filterByArea; - converted.filterByCircularity = params.filterByCircularity; - converted.filterByColor = params.filterByColor; - converted.filterByConvexity = params.filterByConvexity; - converted.filterByInertia = params.filterByInertia; - converted.maxArea = params.maxArea; - converted.maxCircularity = params.maxCircularity; - converted.maxConvexity = params.maxConvexity; - converted.maxInertiaRatio = params.maxInertiaRatio; - converted.maxThreshold = params.maxThreshold; - converted.minArea = params.minArea; - converted.minCircularity = params.minCircularity; - converted.minConvexity = params.minConvexity; - converted.minDistBetweenBlobs = params.minDistBetweenBlobs; - converted.minInertiaRatio = params.minInertiaRatio; - converted.minRepeatability = params.minRepeatability; - converted.minThreshold = params.minThreshold; - converted.thresholdStep = params.thresholdStep; - - return converted; -} - -inline SimpleBlobDetectorParams ConvertCPPParamsToCParams(cv::SimpleBlobDetector::Params params) -{ - SimpleBlobDetectorParams converted; - - converted.blobColor = params.blobColor; - converted.filterByArea = params.filterByArea; - converted.filterByCircularity = params.filterByCircularity; - converted.filterByColor = params.filterByColor; - converted.filterByConvexity = params.filterByConvexity; - converted.filterByInertia = params.filterByInertia; - converted.maxArea = params.maxArea; - converted.maxCircularity = params.maxCircularity; - converted.maxConvexity = params.maxConvexity; - converted.maxInertiaRatio = params.maxInertiaRatio; - converted.maxThreshold = params.maxThreshold; - converted.minArea = params.minArea; - converted.minCircularity = params.minCircularity; - converted.minConvexity = params.minConvexity; - converted.minDistBetweenBlobs = params.minDistBetweenBlobs; - converted.minInertiaRatio = params.minInertiaRatio; - converted.minRepeatability = params.minRepeatability; - converted.minThreshold = params.minThreshold; - converted.thresholdStep = params.thresholdStep; - - return converted; -} - -#endif // CVD_FEATURES2D_UTILS_H diff --git a/src/gapi/gapi.cpp b/src/gapi/gapi.cpp deleted file mode 100644 index 2177eeed..00000000 --- a/src/gapi/gapi.cpp +++ /dev/null @@ -1,137 +0,0 @@ -#include "gapi.h" -#include "core/types.h" - -CvStatus *gapi_GMat_New_Empty(GMat *rval) -{ - BEGIN_WRAP - *rval = {new cv::GMat()}; - END_WRAP -} - -CvStatus *gapi_GMat_New_FromMat(Mat mat, GMat *rval) -{ - BEGIN_WRAP - *rval = {new cv::GMat(*mat.ptr)}; - END_WRAP -} - -void gapi_GMat_Close(GMatPtr mat) -{ - delete mat->ptr; - mat->ptr = nullptr; -} - -CvStatus *gapi_GScalar_New_Empty(GScalar *rval) -{ - BEGIN_WRAP - *rval = {new cv::GScalar()}; - END_WRAP -} -CvStatus *gapi_GScalar_New_FromScalar(Scalar scalar, GScalar *rval) -{ - BEGIN_WRAP - *rval = {new cv::GScalar(cv::Scalar(scalar.val1, scalar.val2, scalar.val3, scalar.val4))}; - END_WRAP -} -CvStatus *gapi_GScalar_New_FromDouble(double v0, GScalar *rval) -{ - BEGIN_WRAP - *rval = {new cv::GScalar(cv::Scalar(v0))}; - END_WRAP -} -void gapi_GScalar_Close(GScalarPtr scalar) -{ - delete scalar->ptr; - scalar->ptr = nullptr; -} - -CvStatus *gapi_GComputation_New(GMat in, GMat out, GComputation *rval) -{ - BEGIN_WRAP - *rval = {new cv::GComputation(*in.ptr, *out.ptr)}; - END_WRAP -} - -CvStatus *gapi_GComputation_New_1(GMat in, GScalar out, GComputation *rval) -{ - BEGIN_WRAP - *rval = {new cv::GComputation(*in.ptr, *out.ptr)}; - END_WRAP -} - -CvStatus *gapi_GComputation_New_2(GMat in1, GMat in2, GMat out, GComputation *rval) -{ - BEGIN_WRAP - *rval = {new cv::GComputation(*in1.ptr, *in2.ptr, *out.ptr)}; - END_WRAP -} - -CvStatus *gapi_GComputation_New_3(GMat in1, GMat in2, GScalar out, GComputation *rval) -{ - BEGIN_WRAP - *rval = {new cv::GComputation(*in1.ptr, *in2.ptr, *out.ptr)}; - END_WRAP -} - -void gapi_GComputation_Close(GComputationPtr self) { CVD_FREE(self); } - -CvStatus *gapi_GComputation_apply(GComputation self, Mat in, - CvCallback_1 callback /*TODO: GCompileArgs &&args={}*/) -{ - BEGIN_WRAP - cv::Mat _out; - (*self.ptr).apply(*in.ptr, _out); - callback(new Mat{new cv::Mat(_out)}); - END_WRAP -} - -CvStatus *gapi_GComputation_apply_1(GComputation self, Mat in, Scalar *out /*TODO: GCompileArgs &&args={}*/) -{ - BEGIN_WRAP - cv::Scalar _out; - (*self.ptr).apply(*in.ptr, _out); - *out = {_out.val[0], _out.val[1], _out.val[2], _out.val[3]}; - END_WRAP -} - -CvStatus *gapi_GComputation_apply_2(GComputation self, Mat in1, Mat in2, - Mat *out /*TODO: GCompileArgs &&args={}*/) -{ - BEGIN_WRAP - cv::Mat _out; - (*self.ptr).apply(*in1.ptr, *in2.ptr, _out); - *out = {new cv::Mat(_out)}; - END_WRAP -} - -CvStatus *gapi_GComputation_apply_3(GComputation self, Mat in1, Mat in2, - Scalar *out /*TODO: GCompileArgs &&args={}*/) -{ - BEGIN_WRAP - cv::Scalar _out; - (*self.ptr).apply(*in1.ptr, *in2.ptr, _out); - *out = {_out.val[0], _out.val[1], _out.val[2], _out.val[3]}; - END_WRAP -} - -// CvStatus *VecGMat_NewFromVec(VecMat vec, VecGMat *rval) -// { -// BEGIN_WRAP -// auto v = std::vector(*vec.ptr); -// *rval = {new}; -// END_WRAP -// } - -CvStatus *gapi_add(GMat src1, GMat src2, int ddepth, GMat *rval) -{ - BEGIN_WRAP - *rval = {new cv::GMat(cv::gapi::add(*src1.ptr, *src2.ptr, ddepth))}; - END_WRAP -} - -CvStatus *gapi_addC(GMat src, GScalar c, int ddepth, GMat *rval) -{ - BEGIN_WRAP - *rval = {new cv::GMat(cv::gapi::addC(*src.ptr, *c.ptr, ddepth))}; - END_WRAP -} diff --git a/src/gapi/gapi.h b/src/gapi/gapi.h deleted file mode 100644 index c7ee3fb6..00000000 --- a/src/gapi/gapi.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef OPENCV_DART_GAPI_H -#define OPENCV_DART_GAPI_H - -#include "core/core.h" -#include "core/types.h" - -#ifdef __cplusplus -#include -#include -#include -#include -#include -#include -#include -#include -extern "C" { -#endif - -#ifdef __cplusplus -CVD_TYPEDEF(cv::GMat, GMat); -CVD_TYPEDEF(cv::GScalar, GScalar); -CVD_TYPEDEF(cv::GFrame, GFrame); -CVD_TYPEDEF(cv::GComputation, GComputation); -CVD_TYPEDEF(cv::GOpaque, GOpaqueRect); -CVD_TYPEDEF(cv::GOpaque, GOpaquePoint); -CVD_TYPEDEF(cv::GOpaque, GOpaqueVec4f); -CVD_TYPEDEF(cv::GOpaque, GOpaqueVec6f); -CVD_TYPEDEF(std::vector, VecGMat); -CVD_TYPEDEF(cv::gapi::wip::draw::Prim, Prim); -CVD_TYPEDEF(std::vector, VecPrim); - -CVD_TYPEDEF(cv::GArray>, GArrayGArrayPoint); -CVD_TYPEDEF(cv::GArray, GArrayVec4i); -CVD_TYPEDEF(cv::GArray, GArrayPoint); -CVD_TYPEDEF(cv::GArray, GArrayPoint2f); -CVD_TYPEDEF(cv::GArray, GArrayPoint2i); -CVD_TYPEDEF(cv::GArray, GArrayPoint2d); -CVD_TYPEDEF(cv::GArray, GArrayPoint3f); -CVD_TYPEDEF(cv::GArray, GArrayPoint3d); -CVD_TYPEDEF(cv::GArray, GArrayPoint3i); -CVD_TYPEDEF(cv::GArray, GArrayPrim); - -#else -CVD_TYPEDEF(void, GMat); -CVD_TYPEDEF(void, GScalar); -CVD_TYPEDEF(void, GFrame); -CVD_TYPEDEF(void, GComputation); -CVD_TYPEDEF(void, GOpaqueRect); -CVD_TYPEDEF(void, GOpaquePoint); -CVD_TYPEDEF(void, GOpaqueVec4f); -CVD_TYPEDEF(void, GOpaqueVec6f); -CVD_TYPEDEF(void, VecGMat); -CVD_TYPEDEF(void, Prim); -CVD_TYPEDEF(void, VecPrim); - -CVD_TYPEDEF(void, GArrayGArrayPoint); -CVD_TYPEDEF(void, GArrayVec4i); -CVD_TYPEDEF(void, GArrayPoint); -CVD_TYPEDEF(void, GArrayPoint2f); -CVD_TYPEDEF(void, GArrayPoint2i); -CVD_TYPEDEF(void, GArrayPoint2d); -CVD_TYPEDEF(void, GArrayPoint3f); -CVD_TYPEDEF(void, GArrayPoint3d); -CVD_TYPEDEF(void, GArrayPoint3i); -CVD_TYPEDEF(void, GArrayPrim); -#endif - -typedef VecPrim Prims; -// typedef void (*GMatCallback)(GMat *); -// typedef void (*MatCallback)(void *); - -CvStatus *gapi_GMat_New_Empty(GMat *rval); -CvStatus *gapi_GMat_New_FromMat(Mat mat, GMat *rval); -void gapi_GMat_Close(GMatPtr mat); - -CvStatus *gapi_GScalar_New_Empty(GScalar *rval); -CvStatus *gapi_GScalar_New_FromScalar(Scalar scalar, GScalar *rval); -CvStatus *gapi_GScalar_New_FromDouble(double v0, GScalar *rval); -void gapi_GScalar_Close(GScalarPtr scalar); - -CvStatus *gapi_GComputation_New(GMat in, GMat out, GComputation *rval); -CvStatus *gapi_GComputation_New_1(GMat in, GScalar out, GComputation *rval); -CvStatus *gapi_GComputation_New_2(GMat in1, GMat in2, GMat out, GComputation *rval); -CvStatus *gapi_GComputation_New_3(GMat in1, GMat in2, GScalar out, GComputation *rval); -void gapi_GComputation_Close(GComputationPtr self); -CvStatus *gapi_GComputation_apply(GComputation self, Mat in, - CvCallback_1 callback /*TODO: GCompileArgs &&args={}*/); -CvStatus *gapi_GComputation_apply_1(GComputation self, Mat in, Scalar *out /*TODO: GCompileArgs &&args={}*/); -CvStatus *gapi_GComputation_apply_2(GComputation self, Mat in1, Mat in2, - Mat *out /*TODO: GCompileArgs &&args={}*/); -CvStatus *gapi_GComputation_apply_3(GComputation self, Mat in1, Mat in2, - Scalar *out /*TODO: GCompileArgs &&args={}*/); - -// CvStatus *VecGMat_NewFromVec(VecMat vec, VecGMat *rval); - -CvStatus *Prim_from_Circle(Point center, Scalar color, int lt, int radius, int shift, int thick, Prim *rval); -CvStatus *Prim_from_FText(char *text, int text_len, Point org, int fh, Scalar color, Prim *rval); -CvStatus *Prim_from_Image(Point org, Mat img, Mat alpha, Prim *rval); -CvStatus *Prim_from_Line(Scalar color, int lt, Point pt1, Point pt2, int shift, int thick, Prim *rval); -CvStatus *Prim_from_Mosaic(int cellSz, int decim, Rect mos, Prim *rval); -CvStatus *Prim_from_Poly(VecPoint points, Scalar color, int thick, int lt, int shift, Prim *rval); -CvStatus *Prim_from_Rect(Scalar color, int lt, Rect rect, int shift, int thick, Prim *rval); -CvStatus *Prim_from_Text(bool bottom_left_origin, Scalar color, int ff, double fs, int lt, Point org, - char *text, int text_len, int thick, Prim *rval); - -CvStatus *VecPrim_New(VecPrim *rval); -CvStatus *VecPrim_NewFromPointer(Prim *points, int length, VecPrim *rval); -CvStatus *VecPrim_NewFromVec(VecPrim vec, VecPrim *rval); -CvStatus *VecPrim_At(VecPrim vec, int idx, Prim *rval); -CvStatus *VecPrim_Append(VecPrim vec, Prim p); -CvStatus *VecPrim_Size(VecPrim vec, int *rval); -void VecPrim_Close(VecPrimPtr vec); - -CvStatus *GArrayGArrayPoint_FromVec(VecVecPoint points, GArrayGArrayPoint *rval); -CvStatus *GArrayVec4i_FromVec(VecVec4i v, GArrayVec4i *rval); -CvStatus *GArrayPoint_FromVec(VecPoint v, GArrayPoint *rval); -CvStatus *GArrayPoint2f_FromVec(VecPoint v, GArrayPoint2f *rval); -CvStatus *GArrayPoint2i_FromVec(VecPoint v, GArrayPoint2i *rval); -CvStatus *GArrayPoint2d_FromVec(VecPoint v, GArrayPoint2d *rval); -CvStatus *GArrayPoint3f_FromVec(VecPoint v, GArrayPoint3f *rval); -CvStatus *GArrayPoint3d_FromVec(VecPoint v, GArrayPoint3d *rval); -CvStatus *GArrayPoint3i_FromVec(VecPoint v, GArrayPoint3i *rval); -CvStatus *GArrayPrim_FromVec(VecPrim v, GArrayPrim *rval); - -// Graph API: Math operations -// https://docs.opencv.org/4.10.0/da/dd3/group__gapi__math.html#ga3fec036f5cf3f6cb8c2633c109085f0b -CvStatus *gapi_add(GMat src1, GMat src2, int ddepth, GMat *rval); -CvStatus *gapi_addC(GMat src, GScalar c, int ddepth, GMat *rval); -CvStatus *gapi_addC_1(GScalar c, GMat src, int ddepth, GMat *rval); -CvStatus *gapi_cartToPolar(GMat x, GMat y, bool angleInDegrees, GMat *rval, GMat *rval1); -CvStatus *gapi_div(GMat src1, GMat src2, double scale, int ddepth, GMat *rval); -CvStatus *gapi_divC(GMat src, GScalar divisor, double scale, int ddepth, GMat *rval); -CvStatus *gapi_divRC(GScalar divident, GMat src, double scale, int ddepth, GMat *rval); -CvStatus *gapi_mask(GMat src, GMat mask, GMat *rval); -CvStatus *gapi_mean(GMat src, GScalar *rval); -CvStatus *gapi_mul(GMat src1, GMat src2, double scale, int ddepth, GMat *rval); -CvStatus *gapi_mulC(GMat src, GScalar multiplier, int ddepth, GMat *rval); -CvStatus *gapi_mulC_1(GMat src, double multiplier, int ddepth, GMat *rval); -CvStatus *gapi_mulC_2(GScalar multiplier, GMat src, int ddepth, GMat *rval); -CvStatus *gapi_phase(GMat x, GMat y, bool angleInDegrees, GMat *rval); -CvStatus *gapi_polarToCart(GMat magnitude, GMat angle, bool angleInDegrees, GMat *rval); -CvStatus *gapi_sqrt(GMat src, GMat *rval); -CvStatus *gapi_sub(GMat src1, GMat src2, int ddepth, GMat *rval); -CvStatus *gapi_subC(GMat src, GScalar c, int ddepth, GMat *rval); -CvStatus *gapi_subRC(GScalar c, GMat src, int ddepth, GMat *rval); - -// Graph API: Image filters -// https://docs.opencv.org/4.10.0/da/dc5/group__gapi__filters.html -CvStatus *gapi_bilateralFilter(const GMat src, int d, double sigmaColor, double sigmaSpace, int borderType, - GMat *rval); -CvStatus *gapi_blur(const GMat src, const Size ksize, const Point anchor, int borderType, - const Scalar borderValue, GMat *rval); -CvStatus *gapi_boxFilter(const GMat src, int dtype, const Size ksize, const Point anchor, bool normalize, - int borderType, const Scalar borderValue, GMat *rval); -CvStatus *gapi_dilate(const GMat src, const Mat kernel, const Point anchor, int iterations, int borderType, - const Scalar borderValue, GMat *rval); -CvStatus *gapi_dilate3x3(const GMat src, int iterations, int borderType, const Scalar borderValue, - GMat *rval); -CvStatus *gapi_erode(const GMat src, const Mat kernel, const Point anchor, int iterations, int borderType, - const Scalar borderValue, GMat *rval); -CvStatus *gapi_erode3x3(const GMat src, int iterations, int borderType, const Scalar borderValue, GMat *rval); -CvStatus *gapi_filter2D(const GMat src, int ddepth, const Mat kernel, const Point anchor, const Scalar delta, - int borderType, const Scalar borderValue, GMat *rval); -CvStatus *gapi_gaussianBlur(const GMat src, const Size ksize, double sigmaX, double sigmaY, int borderType, - const Scalar borderValue, GMat *rval); -CvStatus *gapi_Laplacian(const GMat src, int ddepth, int ksize, double scale, double delta, int borderType, - GMat *rval); -CvStatus *gapi_medianBlur(const GMat src, int ksize, GMat *rval); -CvStatus *gapi_morphologyEx(const GMat src, const int op, const Mat kernel, const Point anchor, - const int iterations, const int borderType, const Scalar borderValue, GMat *rval); -CvStatus *gapi_sepFilter(const GMat src, int ddepth, const Mat kernelX, const Mat kernelY, const Point anchor, - const Scalar delta, int borderType, const Scalar borderValue, GMat *rval); -CvStatus *gapi_Sobel(const GMat src, int ddepth, int dx, int dy, int ksize, double scale, double delta, - int borderType, const Scalar borderValue, GMat *rval); -CvStatus *gapi_SobelXY(const GMat src, int ddepth, int order, int ksize, double scale, double delta, - int borderType, const Scalar borderValue, GMat *rval, GMat *rval1); - -// Graph API: Converting image from one color space to another -CvStatus *gapi_BayerGR2RGB(const GMat src_gr, GMat *rval); -CvStatus *gapi_BGR2Gray(const GMat src, GMat *rval); -CvStatus *gapi_BGR2I420(const GMat src, GMat *rval); -CvStatus *gapi_BGR2LUV(const GMat src, GMat *rval); -CvStatus *gapi_BGR2RGB(const GMat src, GMat *rval); -CvStatus *gapi_BGR2YUV(const GMat src, GMat *rval); -CvStatus *gapi_I4202BGR(const GMat src, GMat *rval); -CvStatus *gapi_I4202RGB(const GMat src, GMat *rval); -CvStatus *gapi_LUV2BGR(const GMat src, GMat *rval); -CvStatus *gapi_NV12toBGR(const GMat src_y, const GMat src_uv, GMat *rval); -CvStatus *gapi_NV12toBGRp(const GMat src_y, const GMat src_uv, GMat *rval); -CvStatus *gapi_NV12toGray(const GMat src_y, const GMat src_uv, GMat *rval); -CvStatus *gapi_NV12toRGB(const GMat src_y, const GMat src_uv, GMat *rval); -CvStatus *gapi_NV12toRGBp(const GMat src_y, const GMat src_uv, GMat *rval); -CvStatus *gapi_RGB2Gray(const GMat src, GMat *rval); -CvStatus *gapi_RGB2Gray_1(const GMat src, float rY, float gY, float bY, GMat *rval); -CvStatus *gapi_RGB2HSV(const GMat src, GMat *rval); -CvStatus *gapi_RGB2I420(const GMat src, GMat *rval); -CvStatus *gapi_RGB2Lab(const GMat src, GMat *rval); -CvStatus *gapi_RGB2YUV(const GMat src, GMat *rval); -CvStatus *gapi_RGB2YUV422(const GMat src, GMat *rval); -CvStatus *gapi_YUV2BGR(const GMat src, GMat *rval); -CvStatus *gapi_YUV2RGB(const GMat src, GMat *rval); - -// Graph API: Image Feature Detection -CvStatus *gapi_Canny(const GMat image, double threshold1, double threshold2, int apertureSize, - bool L2gradient, GMat *rval); -CvStatus *gapi_goodFeaturesToTrack(const GMat image, int maxCorners, double qualityLevel, double minDistance, - const Mat mask, int blockSize, bool useHarrisDetector, double k); - -// Graph API: Image Structural Analysis and Shape Descriptors -CvStatus *gapi_boundingRect(const GArrayPoint2f src, GOpaqueRect *rval); -CvStatus *gapi_boundingRect_1(const GArrayPoint2i src, GOpaqueRect *rval); -CvStatus *gapi_boundingRect_2(const GMat src, GOpaqueRect *rval); -CvStatus *gapi_findContours(const GMat src, const int mode, const int method, GArrayGArrayPoint *rval); -CvStatus *gapi_findContours_1(const GMat src, const int mode, const int method, const GOpaquePoint offset, - GArrayGArrayPoint *rval); -CvStatus *gapi_findContoursH(const GMat src, const int mode, const int method, GArrayGArrayPoint *rval, - GArrayVec4i *rval1); -CvStatus *gapi_findContoursH_1(const GMat src, const int mode, const int method, const GOpaquePoint offset, - GArrayGArrayPoint *rval, GArrayVec4i *rval1); -CvStatus *gapi_fitLine2D(const GArrayPoint2d src, const int distType, const double param, const double reps, - const double aeps, GOpaqueVec4f *rval); -CvStatus *gapi_fitLine2D_1(const GArrayPoint2f src, const int distType, const double param, const double reps, - const double aeps, GOpaqueVec4f *rval); -CvStatus *gapi_fitLine2D_2(const GArrayPoint2i src, const int distType, const double param, const double reps, - const double aeps, GOpaqueVec4f *rval); -CvStatus *gapi_fitLine2D_3(const GMat src, const int distType, const double param, const double reps, - const double aeps, GOpaqueVec4f *rval); -CvStatus *gapi_fitLine3D_1(const GArrayPoint3d src, const int distType, const double param, const double reps, - const double aeps, GOpaqueVec4f *rval); -CvStatus *gapi_fitLine3D_2(const GArrayPoint3f src, const int distType, const double param, const double reps, - const double aeps, GOpaqueVec4f *rval); -CvStatus *gapi_fitLine3D_3(const GArrayPoint3i src, const int distType, const double param, const double reps, - const double aeps, GOpaqueVec4f *rval); -CvStatus *gapi_fitLine3D_4(const GMat src, const int distType, const double param, const double reps, - const double aeps, GOpaqueVec4f *rval); - -// Graph API: Image and channel composition functions -CvStatus *gapi_concatHor(const GMat src1, const GMat src2, GMat *rval); -// CvStatus *gapi_concatHor_1(const VecGMat v, GMat *rval); -CvStatus *gapi_concatVert(const GMat src1, const GMat src2, GMat *rval); -// CvStatus *gapi_concatVert_2(const VecGMat v, GMat *rval); -CvStatus *gapi_convertTo(const GMat src, int rdepth, double alpha, double beta, GMat *rval); -// CvStatus *gapi_copy(const GFrame in, GFrame *rval); -CvStatus *gapi_copy_1(const GMat in, GMat *rval); -CvStatus *gapi_crop(const GMat src, const Rect rect, GMat *rval); -CvStatus *gapi_flip(const GMat src, int flipCode, GMat *rval); -CvStatus *gapi_LUT(const GMat src, const Mat lut, GMat *rval); -CvStatus *gapi_merge3(const GMat src1, const GMat src2, const GMat src3, GMat *rval); -CvStatus *gapi_merge4(const GMat src1, const GMat src2, const GMat src3, const GMat src4, GMat *rval); -CvStatus *gapi_normalize(const GMat src, double alpha, double beta, int norm_type, int ddepth, GMat *rval); -CvStatus *gapi_remap(const GMat src, const Mat map1, const Mat map2, int interpolation, int borderMode, - const Scalar borderValue, GMat *rval); -CvStatus *gapi_resize(const GMat src, const Size dsize, double fx, double fy, int interpolation, GMat *rval); -CvStatus *gapi_resizeP(const GMat src, const Size dsize, int interpolation, GMat *rval); -CvStatus *gapi_split3(const GMat src, GMat *rval, GMat *rval1, GMat *rval2); -CvStatus *gapi_split4(const GMat src, GMat *rval, GMat *rval1, GMat *rval2, GMat *rval3); -CvStatus *gapi_warpAffine(const GMat src, const Mat M, const Size dsize, int flags, int borderMode, - const Scalar borderValue, GMat *rval); -CvStatus *gapi_warpPerspective(const GMat src, const Mat M, const Size dsize, int flags, int borderMode, - const Scalar borderValue, GMat *rval); - -// G-API Video processing functionality - -// G-API Drawing and composition functionality -// CvStatus *gapi_wip_draw_render(cv::Mat bgr, const Prims prims /*, cv::GCompileArgs args*/); -// CvStatus *gapi_wip_draw_render_1(cv::Mat y_plane, cv::Mat uv_plane, -// const Prims prims /*, cv::GCompileArgs args = {}*/); -// CvStatus *gapi_wip_draw_render_2(cv::MediaFrame frame, const Prims prims /*, cv::GCompileArgs args = {}*/); -// CvStatus *gapi_wip_draw_render3ch(const GMat src, const GArrayPrim prims, GMat *rval); -// CvStatus *gapi_wip_draw_renderNV12(const GMat y, const GMat uv, const GArrayPrim prims, GMat *rval, -// GMat *rval1); - -#ifdef __cplusplus -} -#endif - -#endif // OPENCV_DART_GAPI_H diff --git a/src/highgui/highgui.cpp b/src/highgui/highgui.cpp deleted file mode 100644 index b81e17a5..00000000 --- a/src/highgui/highgui.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#include "highgui.h" -#include "core/vec.hpp" - -// Window -CvStatus *Window_New(const char *winname, int flags) { - BEGIN_WRAP - cv::namedWindow(winname, flags); - END_WRAP -} - -void Window_Close(const char *winname) { cv::destroyWindow(winname); } - -CvStatus *Window_IMShow(const char *winname, Mat mat) { - BEGIN_WRAP - cv::imshow(winname, *mat.ptr); - END_WRAP -} - -CvStatus *Window_GetProperty(const char *winname, int flag, double *rval) { - BEGIN_WRAP - *rval = cv::getWindowProperty(winname, flag); - END_WRAP -} - -CvStatus *Window_SetProperty(const char *winname, int flag, double value) { - BEGIN_WRAP - cv::setWindowProperty(winname, flag, value); - END_WRAP -} - -CvStatus *Window_SetTitle(const char *winname, const char *title) { - BEGIN_WRAP - cv::setWindowTitle(winname, title); - END_WRAP -} - -CvStatus *Window_WaitKey(int delay, int *rval) { - BEGIN_WRAP - *rval = cv::waitKey(delay); - END_WRAP -} - -CvStatus *Window_Move(const char *winname, int x, int y) { - BEGIN_WRAP - cv::moveWindow(winname, x, y); - END_WRAP -} - -CvStatus *Window_Resize(const char *winname, int width, int height) { - BEGIN_WRAP - cv::resizeWindow(winname, width, height); - END_WRAP -} - -CvStatus *Window_SelectROI(const char *winname, Mat img, Rect *rval) { - BEGIN_WRAP - auto rect = cv::selectROI(winname, *img.ptr); - *rval = {rect.x, rect.y, rect.width, rect.height}; - END_WRAP -} - -CvStatus *Window_SelectROIs(const char *winname, Mat img, VecRect *rval) { - BEGIN_WRAP - std::vector rects = std::vector(); - cv::selectROIs(winname, *img.ptr, rects); - *rval = vecrect_cpp2c(rects); - END_WRAP -} - -CvStatus *destroyAllWindows() { - BEGIN_WRAP - cv::destroyAllWindows(); - END_WRAP -} - -// Trackbar -CvStatus *Trackbar_Create(const char *winname, const char *trackname, int max) { - BEGIN_WRAP - cv::createTrackbar(trackname, winname, nullptr, max); - END_WRAP -} - -CvStatus * -Trackbar_CreateWithValue(const char *winname, const char *trackname, int *value, int max) { - BEGIN_WRAP - cv::createTrackbar(trackname, winname, value, max); - END_WRAP -} - -CvStatus *Trackbar_GetPos(const char *winname, const char *trackname, int *rval) { - BEGIN_WRAP - *rval = cv::getTrackbarPos(trackname, winname); - END_WRAP -} - -CvStatus *Trackbar_SetPos(const char *winname, const char *trackname, int pos) { - BEGIN_WRAP - cv::setTrackbarPos(trackname, winname, pos); - END_WRAP -} - -CvStatus *Trackbar_SetMin(const char *winname, const char *trackname, int pos) { - BEGIN_WRAP - cv::setTrackbarMin(trackname, winname, pos); - END_WRAP -} - -CvStatus *Trackbar_SetMax(const char *winname, const char *trackname, int pos) { - BEGIN_WRAP - cv::setTrackbarMax(trackname, winname, pos); - END_WRAP -} diff --git a/src/highgui/highgui.h b/src/highgui/highgui.h deleted file mode 100644 index 0319799b..00000000 --- a/src/highgui/highgui.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ -#pragma once -#ifndef _OPENCV3_HIGHGUI_H_ -#define _OPENCV3_HIGHGUI_H_ - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "core/core.h" - -// Window -CvStatus *Window_New(const char *winname, int flags); -void Window_Close(const char *winname); -CvStatus *Window_IMShow(const char *winname, Mat mat); -CvStatus *Window_GetProperty(const char *winname, int flag, double *rval); -CvStatus *Window_SetProperty(const char *winname, int flag, double value); -CvStatus *Window_SetTitle(const char *winname, const char *title); -CvStatus *Window_WaitKey(int delay, int *rval); -CvStatus *Window_Move(const char *winname, int x, int y); -CvStatus *Window_Resize(const char *winname, int width, int height); -CvStatus *Window_SelectROI(const char *winname, Mat img, Rect *rval); -CvStatus *Window_SelectROIs(const char *winname, Mat img, VecRect *rval); -CvStatus *destroyAllWindows(); - -// Trackbar -CvStatus *Trackbar_Create(const char *winname, const char *trackname, int max); -CvStatus *Trackbar_CreateWithValue(const char *winname, const char *trackname, int *value, int max); -CvStatus *Trackbar_GetPos(const char *winname, const char *trackname, int *rval); -CvStatus *Trackbar_SetPos(const char *winname, const char *trackname, int pos); -CvStatus *Trackbar_SetMin(const char *winname, const char *trackname, int pos); -CvStatus *Trackbar_SetMax(const char *winname, const char *trackname, int pos); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_HIGHGUI_H_ diff --git a/src/imgcodecs/imgcodecs.cpp b/src/imgcodecs/imgcodecs.cpp deleted file mode 100644 index 098a7bcf..00000000 --- a/src/imgcodecs/imgcodecs.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "imgcodecs.h" -#include "core/vec.hpp" -#include - -CvStatus *Image_IMRead(const char *filename, int flags, Mat *rval) -{ - BEGIN_WRAP - *rval = {new cv::Mat(cv::imread(filename, flags))}; - END_WRAP -} -CvStatus *Image_IMWrite(const char *filename, Mat img, bool *rval) -{ - BEGIN_WRAP - *rval = cv::imwrite(filename, *img.ptr); - END_WRAP -} -CvStatus *Image_IMWrite_WithParams(const char *filename, Mat img, VecI32 params, bool *rval) -{ - BEGIN_WRAP - auto _params = vecint_c2cpp(params); - *rval = cv::imwrite(filename, *img.ptr, _params); - END_WRAP -} -CvStatus *Image_IMEncode(const char *fileExt, Mat img, bool *success, VecUChar *rval) -{ - BEGIN_WRAP - std::vector buf; - *success = cv::imencode(fileExt, *img.ptr, buf); - *rval = vecuchar_cpp2c(buf); - END_WRAP -} -CvStatus *Image_IMEncode_WithParams(const char *fileExt, Mat img, VecI32 params, bool *success, - VecUChar *rval) -{ - BEGIN_WRAP - std::vector buf; - auto _params = vecint_c2cpp(params); - *success = cv::imencode(fileExt, *img.ptr, buf, _params); - *rval = vecuchar_cpp2c(buf); - END_WRAP -} -CvStatus *Image_IMDecode(VecUChar buf, int flags, Mat *rval) -{ - BEGIN_WRAP - auto _buf = vecuchar_c2cpp(buf); - auto m = cv::imdecode(_buf, flags); - *rval = {new cv::Mat(m)}; - END_WRAP -} diff --git a/src/imgcodecs/imgcodecs.h b/src/imgcodecs/imgcodecs.h deleted file mode 100644 index 1a301fd7..00000000 --- a/src/imgcodecs/imgcodecs.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef _OPENCV3_IMGCODECS_H_ -#define _OPENCV3_IMGCODECS_H_ - -#include - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "core/core.h" - -CvStatus *Image_IMRead(const char *filename, int flags, CVD_OUT Mat *rval); -CvStatus *Image_IMWrite(const char *filename, Mat img, CVD_OUT bool *rval); -CvStatus *Image_IMWrite_WithParams(const char *filename, Mat img, VecI32 params, CVD_OUT bool *rval); -CvStatus *Image_IMEncode(const char *fileExt, Mat img, CVD_OUT bool *success, CVD_OUT VecUChar *rval); -CvStatus *Image_IMEncode_WithParams(const char *fileExt, Mat img, VecI32 params, CVD_OUT bool *success, - CVD_OUT VecUChar *rval); -CvStatus *Image_IMDecode(VecUChar buf, int flags, CVD_OUT Mat *rval); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_IMGCODECS_H_ diff --git a/src/imgcodecs/imgcodecs_async.cpp b/src/imgcodecs/imgcodecs_async.cpp deleted file mode 100644 index 112c3c76..00000000 --- a/src/imgcodecs/imgcodecs_async.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "imgcodecs_async.h" -#include "core/types.h" -#include "core/vec.hpp" - -CvStatus *Image_IMRead_Async(const char *filename, int flags, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(cv::imread(filename, flags))}); - END_WRAP -} - -CvStatus *Image_IMWrite_Async(const char *filename, Mat img, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool(cv::imwrite(filename, *img.ptr))); - END_WRAP -} - -CvStatus *Image_IMWrite_WithParams_Async( - const char *filename, Mat img, VecI32 params, CvCallback_1 callback -) { - BEGIN_WRAP - auto _params = vecint_c2cpp(params); - callback(new bool(cv::imwrite(filename, *img.ptr, _params))); - END_WRAP -} - -CvStatus *Image_IMEncode_Async(const char *fileExt, Mat img, CvCallback_2 callback) { - BEGIN_WRAP - std::vector buf; - bool success = cv::imencode(fileExt, *img.ptr, buf); - callback(new bool(success), vecuchar_cpp2c_p(buf)); - END_WRAP -} - -CvStatus *Image_IMEncode_WithParams_Async( - const char *fileExt, Mat img, VecI32 params, CvCallback_2 callback -) { - BEGIN_WRAP - std::vector buf; - auto _params = vecint_c2cpp(params); - bool success = cv::imencode(fileExt, *img.ptr, buf, _params); - callback(new bool(success), vecuchar_cpp2c_p(buf)); - END_WRAP -} - -CvStatus *Image_IMDecode_Async(VecUChar buf, int flags, CvCallback_1 callback) { - BEGIN_WRAP - auto _buf = vecuchar_c2cpp(buf); - auto m = cv::imdecode(_buf, flags); - callback(new Mat{new cv::Mat(m)}); - END_WRAP -} diff --git a/src/imgcodecs/imgcodecs_async.h b/src/imgcodecs/imgcodecs_async.h deleted file mode 100644 index 9dfe4883..00000000 --- a/src/imgcodecs/imgcodecs_async.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef CVD_IMGCODECS_ASYNC_H_ -#define CVD_IMGCODECS_ASYNC_H_ - -#include "core/types.h" -#include - -#ifdef __cplusplus -#include -extern "C" { -#endif - -CvStatus *Image_IMRead_Async(const char *filename, int flags, CvCallback_1 callback); -CvStatus *Image_IMWrite_Async(const char *filename, Mat img, CvCallback_1 callback); -CvStatus * -Image_IMWrite_WithParams_Async(const char *filename, Mat img, VecI32 params, CvCallback_1 callback); -CvStatus *Image_IMEncode_Async(const char *fileExt, Mat img, CvCallback_2 callback); -CvStatus * -Image_IMEncode_WithParams_Async(const char *fileExt, Mat img, VecI32 params, CvCallback_2 callback); -CvStatus *Image_IMDecode_Async(VecUChar buf, int flags, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_IMGCODECS_ASYNC_H_ diff --git a/src/imgproc/imgproc.cpp b/src/imgproc/imgproc.cpp deleted file mode 100644 index e5880b91..00000000 --- a/src/imgproc/imgproc.cpp +++ /dev/null @@ -1,1217 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "imgproc.h" -#include "core/types.h" -#include "core/vec.hpp" -#include - -CvStatus *ArcLength(VecPoint curve, bool is_closed, double *rval) { - BEGIN_WRAP - auto _curve = vecpoint_c2cpp(curve); - *rval = cv::arcLength(_curve, is_closed); - END_WRAP -} -CvStatus *ApproxPolyDP(VecPoint curve, double epsilon, bool closed, VecPoint *rval) { - BEGIN_WRAP - std::vector approxCurvePts; - auto _curve = vecpoint_c2cpp(curve); - cv::approxPolyDP(_curve, approxCurvePts, epsilon, closed); - *rval = vecpoint_cpp2c(approxCurvePts); - END_WRAP -} -CvStatus *CvtColor(Mat src, Mat dst, int code) { - BEGIN_WRAP - cv::cvtColor(*src.ptr, *dst.ptr, code); - END_WRAP -} -CvStatus *EqualizeHist(Mat src, Mat dst) { - BEGIN_WRAP - cv::equalizeHist(*src.ptr, *dst.ptr); - END_WRAP -} -CvStatus *CalcHist(VecMat mats, VecI32 chans, Mat mask, Mat hist, VecI32 sz, VecF32 rng, bool acc) { - BEGIN_WRAP - auto _mats = vecmat_c2cpp(mats); - auto _chans = vecint_c2cpp(chans); - auto _sz = vecint_c2cpp(sz); - auto _rng = vecfloat_c2cpp(rng); - cv::calcHist(_mats, _chans, *mask.ptr, *hist.ptr, _sz, _rng, acc); - END_WRAP -} -CvStatus * -CalcBackProject(VecMat mats, VecI32 chans, Mat hist, Mat *backProject, VecF32 rng, double scale) { - BEGIN_WRAP - cv::Mat _backProject; - auto _mats = vecmat_c2cpp(mats); - auto _chans = vecint_c2cpp(chans); - auto _rng = vecfloat_c2cpp(rng); - cv::calcBackProject(_mats, _chans, *hist.ptr, _backProject, _rng, scale); - *backProject = {new cv::Mat(_backProject)}; - END_WRAP -} -CvStatus *CompareHist(Mat hist1, Mat hist2, int method, double *rval) { - BEGIN_WRAP - *rval = cv::compareHist(*hist1.ptr, *hist2.ptr, method); - END_WRAP -} -CvStatus *ConvexHull(VecPoint points, Mat hull, bool clockwise, bool returnPoints) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(points); - cv::convexHull(_points, *hull.ptr, clockwise, returnPoints); - END_WRAP -} -CvStatus *ConvexityDefects(VecPoint points, Mat hull, Mat result) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(points); - cv::convexityDefects(_points, *hull.ptr, *result.ptr); - END_WRAP -} -CvStatus *BilateralFilter(Mat src, Mat dst, int d, double sc, double ss) { - BEGIN_WRAP - cv::bilateralFilter(*src.ptr, *dst.ptr, d, sc, ss); - END_WRAP -} -CvStatus *Blur(Mat src, Mat dst, Size ps) { - BEGIN_WRAP - cv::blur(*src.ptr, *dst.ptr, cv::Size(ps.width, ps.height)); - END_WRAP -} -CvStatus * -BoxFilter(Mat src, Mat dst, int ddepth, Size ps, Point anchor, bool normalize, int borderType) { - BEGIN_WRAP - cv::boxFilter( - *src.ptr, - *dst.ptr, - ddepth, - cv::Size(ps.width, ps.height), - cv::Point(anchor.x, anchor.y), - normalize, - borderType - ); - END_WRAP -} -CvStatus * -SqrBoxFilter(Mat src, Mat dst, int ddepth, Size ps, Point anchor, bool normalize, int borderType) { - BEGIN_WRAP - cv::sqrBoxFilter(*src.ptr, *dst.ptr, ddepth, cv::Size(ps.width, ps.height)); - END_WRAP -} -CvStatus *Dilate(Mat src, Mat dst, Mat kernel) { - BEGIN_WRAP - cv::dilate(*src.ptr, *dst.ptr, *kernel.ptr); - END_WRAP -} -CvStatus *DilateWithParams( - Mat src, Mat dst, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue -) { - BEGIN_WRAP - cv::dilate( - *src.ptr, - *dst.ptr, - *kernel.ptr, - cv::Point(anchor.x, anchor.y), - iterations, - borderType, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - END_WRAP -} -CvStatus * -DistanceTransform(Mat src, Mat dst, Mat labels, int distanceType, int maskSize, int labelType) { - BEGIN_WRAP - cv::distanceTransform(*src.ptr, *dst.ptr, *labels.ptr, distanceType, maskSize, labelType); - END_WRAP -} -CvStatus *Erode(Mat src, Mat dst, Mat kernel) { - BEGIN_WRAP - cv::erode(*src.ptr, *dst.ptr, *kernel.ptr); - END_WRAP -} -CvStatus *ErodeWithParams( - Mat src, Mat dst, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue -) { - BEGIN_WRAP - cv::erode( - *src.ptr, - *dst.ptr, - *kernel.ptr, - cv::Point(anchor.x, anchor.y), - iterations, - borderType, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - END_WRAP -} -CvStatus *MatchTemplate(Mat image, Mat templ, Mat result, int method, Mat mask) { - BEGIN_WRAP - cv::matchTemplate(*image.ptr, *templ.ptr, *result.ptr, method, *mask.ptr); - END_WRAP -} -CvStatus *Moments(Mat src, bool binaryImage, Moment *rval) { - BEGIN_WRAP - auto m = cv::moments(*src.ptr, binaryImage); - *rval = { - m.m00, m.m10, m.m01, m.m20, m.m11, m.m02, m.m30, m.m21, - m.m12, m.m03, m.mu20, m.mu11, m.mu02, m.mu30, m.mu21, m.mu12, - m.mu03, m.nu20, m.nu11, m.nu02, m.nu30, m.nu21, m.nu12, m.nu03, - }; - END_WRAP -} -CvStatus *PyrDown(Mat src, Mat dst, Size dstsize, int borderType) { - BEGIN_WRAP - cv::pyrDown(*src.ptr, *dst.ptr, cv::Size(dstsize.width, dstsize.height), borderType); - END_WRAP -} -CvStatus *PyrUp(Mat src, Mat dst, Size dstsize, int borderType) { - BEGIN_WRAP - cv::pyrUp(*src.ptr, *dst.ptr, cv::Size(dstsize.width, dstsize.height), borderType); - END_WRAP -} -CvStatus *BoundingRect(VecPoint pts, Rect *rval) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - cv::Rect r = cv::boundingRect(_points); - *rval = {r.x, r.y, r.width, r.height}; - END_WRAP -} - -CvStatus *BoxPoints(RotatedRect rect, VecPoint2f *boxPts) { - BEGIN_WRAP - /// bottom left, top left, top right, bottom right - auto mat = cv::Mat(); - auto center = cv::Point2f(rect.center.x, rect.center.y); - auto size = cv::Size2f(rect.size.width, rect.size.height); - cv::boxPoints(cv::RotatedRect(center, size, rect.angle), mat); - std::vector vec; - for (int i = 0; i < mat.rows; i++) { - vec.push_back(cv::Point2f(mat.at(i, 0), mat.at(i, 1))); - } - *boxPts = vecpoint2f_cpp2c(vec); - END_WRAP -} -CvStatus *ContourArea(VecPoint pts, double *rval) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - *rval = cv::contourArea(_points); - END_WRAP -} -CvStatus *MinAreaRect(VecPoint pts, RotatedRect *rval) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - auto r = cv::minAreaRect(_points); - *rval = {{r.center.x, r.center.y}, {r.size.width, r.size.height}, r.angle}; - END_WRAP -} -CvStatus *FitEllipse(VecPoint pts, RotatedRect *rval) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - auto r = cv::fitEllipse(_points); - *rval = {{r.center.x, r.center.y}, {r.size.width, r.size.height}, r.angle}; - END_WRAP -} -CvStatus *MinEnclosingCircle(VecPoint pts, Point2f *center, float *radius) { - BEGIN_WRAP - cv::Point2f c; - float r; - auto _points = vecpoint_c2cpp(pts); - cv::minEnclosingCircle(_points, c, r); - *center = {c.y, c.x}; - *radius = r; - END_WRAP -} -CvStatus *FindContours(Mat src, Mat hierarchy, int mode, int method, VecVecPoint *rval) { - BEGIN_WRAP - std::vector> contours; - // std::vector hierarchy; - cv::findContours(*src.ptr, contours, *hierarchy.ptr, mode, method); - *rval = vecvecpoint_cpp2c(contours); - END_WRAP -} -CvStatus *PointPolygonTest(VecPoint pts, Point2f pt, bool measureDist, double *rval) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - double d = cv::pointPolygonTest(_points, cv::Point2f(pt.x, pt.y), measureDist); - *rval = d; - END_WRAP -} -CvStatus * -ConnectedComponents(Mat src, Mat dst, int connectivity, int ltype, int ccltype, int *rval) { - BEGIN_WRAP - *rval = cv::connectedComponents(*src.ptr, *dst.ptr, connectivity, ltype, ccltype); - END_WRAP -} -CvStatus *ConnectedComponentsWithStats( - Mat src, - Mat labels, - Mat stats, - Mat centroids, - int connectivity, - int ltype, - int ccltype, - int *rval -) { - BEGIN_WRAP - *rval = cv::connectedComponentsWithStats( - *src.ptr, *labels.ptr, *stats.ptr, *centroids.ptr, connectivity, ltype, ccltype - ); - END_WRAP -} - -CvStatus *GaussianBlur(Mat src, Mat dst, Size ps, double sX, double sY, int bt) { - BEGIN_WRAP - cv::GaussianBlur(*src.ptr, *dst.ptr, cv::Size(ps.width, ps.height), sX, sY, bt); - END_WRAP -} -CvStatus *GetGaussianKernel(int ksize, double sigma, int ktype, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(cv::getGaussianKernel(ksize, sigma, ktype))}; - END_WRAP -} -CvStatus * -Laplacian(Mat src, Mat dst, int dDepth, int kSize, double scale, double delta, int borderType) { - BEGIN_WRAP - cv::Laplacian(*src.ptr, *dst.ptr, dDepth, kSize, scale, delta, borderType); - END_WRAP -} -CvStatus * -Scharr(Mat src, Mat dst, int dDepth, int dx, int dy, double scale, double delta, int borderType) { - BEGIN_WRAP - cv::Scharr(*src.ptr, *dst.ptr, dDepth, dx, dy, scale, delta, borderType); - END_WRAP -} -CvStatus *GetStructuringElement(int shape, Size ksize, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(cv::getStructuringElement(shape, cv::Size(ksize.width, ksize.height)))}; - END_WRAP -} -CvStatus *MorphologyDefaultBorderValue(Scalar *rval) { - BEGIN_WRAP - auto scalar = cv::morphologyDefaultBorderValue(); - *rval = {scalar.val[0], scalar.val[1], scalar.val[2], scalar.val[3]}; - END_WRAP -} -CvStatus *MorphologyEx(Mat src, Mat dst, int op, Mat kernel) { - BEGIN_WRAP - cv::morphologyEx(*src.ptr, *dst.ptr, op, *kernel.ptr); - END_WRAP -} -CvStatus *MorphologyExWithParams( - Mat src, - Mat dst, - int op, - Mat kernel, - Point pt, - int iterations, - int borderType, - Scalar borderValue -) { - BEGIN_WRAP - auto bv = cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4); - cv::morphologyEx( - *src.ptr, *dst.ptr, op, *kernel.ptr, cv::Point(pt.x, pt.y), iterations, borderType, bv - ); - END_WRAP -} -CvStatus *MedianBlur(Mat src, Mat dst, int ksize) { - BEGIN_WRAP - cv::medianBlur(*src.ptr, *dst.ptr, ksize); - END_WRAP -} - -CvStatus *Canny(Mat src, Mat edges, double t1, double t2, int apertureSize, bool l2gradient) { - BEGIN_WRAP - cv::Canny(*src.ptr, *edges.ptr, t1, t2, apertureSize, l2gradient); - END_WRAP -} -CvStatus * -CornerSubPix(Mat img, VecPoint2f corners, Size winSize, Size zeroZone, TermCriteria criteria) { - BEGIN_WRAP - auto size = cv::Size(winSize.width, winSize.height); - auto zone = cv::Size(zeroZone.width, zeroZone.height); - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - auto _corners = vecpoint2f_c2cpp(corners); - cv::cornerSubPix(*img.ptr, _corners, size, zone, tc); - // std::cout << *corners.ptr << std::endl; - END_WRAP -} -CvStatus *GoodFeaturesToTrack( - Mat img, - VecPoint2f *corners, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - bool useHarrisDetector, - double k -) { - BEGIN_WRAP - std::vector _corners; - cv::goodFeaturesToTrack( - *img.ptr, _corners, maxCorners, quality, minDist, *mask.ptr, blockSize, useHarrisDetector, k - ); - *corners = vecpoint2f_cpp2c(_corners); - END_WRAP -} -CvStatus *GoodFeaturesToTrackWithGradient( - Mat img, - VecPoint2f *corners, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - int gradientSize, - bool useHarrisDetector, - double k -) { - BEGIN_WRAP - std::vector _corners; - cv::goodFeaturesToTrack( - *img.ptr, - _corners, - maxCorners, - quality, - minDist, - *mask.ptr, - blockSize, - gradientSize, - useHarrisDetector, - k - ); - *corners = vecpoint2f_cpp2c(_corners); - END_WRAP -} -CvStatus * -GrabCut(Mat img, Mat mask, Rect rect, Mat bgdModel, Mat fgdModel, int iterCount, int mode) { - BEGIN_WRAP - cv::grabCut( - *img.ptr, - *mask.ptr, - cv::Rect(rect.x, rect.y, rect.width, rect.height), - *bgdModel.ptr, - *fgdModel.ptr, - iterCount, - mode - ); - END_WRAP -} -CvStatus *HoughCircles(Mat src, Mat circles, int method, double dp, double minDist) { - BEGIN_WRAP - cv::HoughCircles(*src.ptr, *circles.ptr, method, dp, minDist); - END_WRAP -} -CvStatus *HoughCirclesWithParams( - Mat src, - Mat circles, - int method, - double dp, - double minDist, - double param1, - double param2, - int minRadius, - int maxRadius -) { - BEGIN_WRAP - cv::HoughCircles( - *src.ptr, *circles.ptr, method, dp, minDist, param1, param2, minRadius, maxRadius - ); - END_WRAP -} -CvStatus *HoughLines( - Mat src, - Mat lines, - double rho, - double theta, - int threshold, - double srn, - double stn, - double min_theta, - double max_theta -) { - BEGIN_WRAP - cv::HoughLines(*src.ptr, *lines.ptr, rho, theta, threshold, srn, stn, min_theta, max_theta); - END_WRAP -} -CvStatus *HoughLinesP(Mat src, Mat lines, double rho, double theta, int threshold) { - BEGIN_WRAP - cv::HoughLinesP(*src.ptr, *lines.ptr, rho, theta, threshold); - END_WRAP -} -CvStatus *HoughLinesPWithParams( - Mat src, - Mat lines, - double rho, - double theta, - int threshold, - double minLineLength, - double maxLineGap -) { - BEGIN_WRAP - cv::HoughLinesP(*src.ptr, *lines.ptr, rho, theta, threshold, minLineLength, maxLineGap); - END_WRAP -} -CvStatus *HoughLinesPointSet( - Mat points, - Mat lines, - int lines_max, - int threshold, - double min_rho, - double max_rho, - double rho_step, - double min_theta, - double max_theta, - double theta_step -) { - BEGIN_WRAP - cv::HoughLinesPointSet( - *points.ptr, - *lines.ptr, - lines_max, - threshold, - min_rho, - max_rho, - rho_step, - min_theta, - max_theta, - theta_step - ); - END_WRAP -} -CvStatus *Integral(Mat src, Mat sum, Mat sqsum, Mat tilted, int sdepth, int sqdepth) { - BEGIN_WRAP - cv::integral(*src.ptr, *sum.ptr, *sqsum.ptr, *tilted.ptr, sdepth, sqdepth); - END_WRAP -} -CvStatus *Threshold(Mat src, Mat dst, double thresh, double maxvalue, int typ, double *rval) { - BEGIN_WRAP - *rval = cv::threshold(*src.ptr, *dst.ptr, thresh, maxvalue, typ); - END_WRAP -} -CvStatus *AdaptiveThreshold( - Mat src, Mat dst, double maxValue, int adaptiveTyp, int typ, int blockSize, double c -) { - BEGIN_WRAP - cv::adaptiveThreshold(*src.ptr, *dst.ptr, maxValue, adaptiveTyp, typ, blockSize, c); - END_WRAP -} - -CvStatus *ArrowedLine( - Mat img, - Point pt1, - Point pt2, - Scalar color, - int thickness, - int line_type, - int shift, - double tipLength -) { - BEGIN_WRAP - cv::arrowedLine( - *img.ptr, - cv::Point(pt1.x, pt1.y), - cv::Point(pt2.x, pt2.y), - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - line_type, - shift, - tipLength - ); - END_WRAP -} -CvStatus *Circle(Mat img, Point center, int radius, Scalar color, int thickness) { - BEGIN_WRAP - cv::circle( - *img.ptr, - cv::Point(center.x, center.y), - radius, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - END_WRAP -} -CvStatus *CircleWithParams( - Mat img, Point center, int radius, Scalar color, int thickness, int lineType, int shift -) { - BEGIN_WRAP - cv::circle( - *img.ptr, - cv::Point(center.x, center.y), - radius, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - shift - ); - END_WRAP -} -CvStatus *Ellipse( - Mat img, - Point center, - Point axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness -) { - BEGIN_WRAP - cv::ellipse( - *img.ptr, - cv::Point(center.x, center.y), - cv::Size(axes.x, axes.y), - angle, - startAngle, - endAngle, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - END_WRAP -} -CvStatus *EllipseWithParams( - Mat img, - Point center, - Point axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - int lineType, - int shift -) { - BEGIN_WRAP - cv::ellipse( - *img.ptr, - cv::Point(center.x, center.y), - cv::Size(axes.x, axes.y), - angle, - startAngle, - endAngle, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - shift - ); - END_WRAP -} -CvStatus * -Line(Mat img, Point pt1, Point pt2, Scalar color, int thickness, int lineType, int shift) { - BEGIN_WRAP - cv::line( - *img.ptr, - cv::Point(pt1.x, pt1.y), - cv::Point(pt2.x, pt2.y), - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - shift - ); - END_WRAP -} -CvStatus *Rectangle(Mat img, Rect rect, Scalar color, int thickness) { - BEGIN_WRAP - cv::rectangle( - *img.ptr, - cv::Rect(rect.x, rect.y, rect.width, rect.height), - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - END_WRAP -} -CvStatus * -RectangleWithParams(Mat img, Rect rect, Scalar color, int thickness, int lineType, int shift) { - BEGIN_WRAP - cv::rectangle( - *img.ptr, - cv::Rect(rect.x, rect.y, rect.width, rect.height), - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - shift - ); - END_WRAP -} -CvStatus *FillPoly(Mat img, VecVecPoint points, Scalar color) { - BEGIN_WRAP - auto _points = vecvecpoint_c2cpp(points); - cv::fillPoly(*img.ptr, _points, cv::Scalar(color.val1, color.val2, color.val3, color.val4)); - END_WRAP -} -CvStatus *FillPolyWithParams( - Mat img, VecVecPoint points, Scalar color, int lineType, int shift, Point offset -) { - BEGIN_WRAP - auto _points = vecvecpoint_c2cpp(points); - cv::fillPoly( - *img.ptr, - _points, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - lineType, - shift, - cv::Point(offset.x, offset.y) - ); - END_WRAP -} -CvStatus *Polylines(Mat img, VecVecPoint points, bool isClosed, Scalar color, int thickness) { - BEGIN_WRAP - auto _points = vecvecpoint_c2cpp(points); - cv::polylines( - *img.ptr, - _points, - isClosed, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - END_WRAP -} -CvStatus *GetTextSizeWithBaseline( - const char *text, int fontFace, double fontScale, int thickness, int *baseline, Size *rval -) { - BEGIN_WRAP - cv::Size r = cv::getTextSize(text, fontFace, fontScale, thickness, baseline); - *rval = {r.width, r.height}; - END_WRAP -} -CvStatus *PutText( - Mat img, - const char *text, - Point org, - int fontFace, - double fontScale, - Scalar color, - int thickness -) { - BEGIN_WRAP - cv::putText( - *img.ptr, - text, - cv::Point(org.x, org.y), - fontFace, - fontScale, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - END_WRAP -} -CvStatus *PutTextWithParams( - Mat img, - const char *text, - Point org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - int lineType, - bool bottomLeftOrigin -) { - BEGIN_WRAP - cv::putText( - *img.ptr, - text, - cv::Point(org.x, org.y), - fontFace, - fontScale, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - bottomLeftOrigin - ); - END_WRAP -} -CvStatus *Resize(Mat src, Mat dst, Size sz, double fx, double fy, int interp) { - BEGIN_WRAP - cv::resize(*src.ptr, *dst.ptr, cv::Size(sz.width, sz.height), fx, fy, interp); - END_WRAP -} -CvStatus *GetRectSubPix(Mat src, Size patchSize, Point2f center, Mat dst) { - BEGIN_WRAP - cv::getRectSubPix( - *src.ptr, - cv::Size(patchSize.width, patchSize.height), - cv::Point2f(center.x, center.y), - *dst.ptr - ); - END_WRAP -} -CvStatus *GetRotationMatrix2D(Point2f center, double angle, double scale, Mat *rval) { - BEGIN_WRAP - auto mat = cv::getRotationMatrix2D(cv::Point2f(center.x, center.y), angle, scale); - *rval = {new cv::Mat(mat)}; - END_WRAP -} -CvStatus *WarpAffine(Mat src, Mat dst, Mat rot_mat, Size dsize) { - BEGIN_WRAP - cv::warpAffine(*src.ptr, *dst.ptr, *rot_mat.ptr, cv::Size(dsize.width, dsize.height)); - END_WRAP -} -CvStatus *WarpAffineWithParams( - Mat src, Mat dst, Mat rot_mat, Size dsize, int flags, int borderMode, Scalar borderValue -) { - BEGIN_WRAP - cv::warpAffine( - *src.ptr, - *dst.ptr, - *rot_mat.ptr, - cv::Size(dsize.width, dsize.height), - flags, - borderMode, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - END_WRAP -} -CvStatus *WarpPerspective(Mat src, Mat dst, Mat m, Size dsize) { - BEGIN_WRAP - cv::warpPerspective(*src.ptr, *dst.ptr, *m.ptr, cv::Size(dsize.width, dsize.height)); - END_WRAP -} -CvStatus *WarpPerspectiveWithParams( - Mat src, Mat dst, Mat rot_mat, Size dsize, int flags, int borderMode, Scalar borderValue -) { - BEGIN_WRAP - cv::warpPerspective( - *src.ptr, - *dst.ptr, - *rot_mat.ptr, - cv::Size(dsize.width, dsize.height), - flags, - borderMode, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - END_WRAP -} -CvStatus *Watershed(Mat image, Mat markers) { - BEGIN_WRAP - cv::watershed(*image.ptr, *markers.ptr); - END_WRAP -} -CvStatus *ApplyColorMap(Mat src, Mat dst, int colormap) { - BEGIN_WRAP - cv::applyColorMap(*src.ptr, *dst.ptr, colormap); - END_WRAP -} -CvStatus *ApplyCustomColorMap(Mat src, Mat dst, Mat colormap) { - BEGIN_WRAP - cv::applyColorMap(*src.ptr, *dst.ptr, *colormap.ptr); - END_WRAP -} - -CvStatus *GetPerspectiveTransform(VecPoint src, VecPoint dst, Mat *rval, int solveMethod) { - BEGIN_WRAP - std::vector src2f = vecPointToVecPoint2f(src); - std::vector dst2f = vecPointToVecPoint2f(dst); - *rval = {new cv::Mat(cv::getPerspectiveTransform(src2f, dst2f, solveMethod))}; - END_WRAP -} -CvStatus *GetPerspectiveTransform2f(VecPoint2f src, VecPoint2f dst, Mat *rval, int solveMethod) { - BEGIN_WRAP - auto _src = vecpoint2f_c2cpp(src); - auto _dst = vecpoint2f_c2cpp(dst); - *rval = {new cv::Mat(cv::getPerspectiveTransform(_src, _dst, solveMethod))}; - END_WRAP -} -CvStatus *GetAffineTransform(VecPoint src, VecPoint dst, Mat *rval) { - BEGIN_WRAP - std::vector src2f = vecPointToVecPoint2f(src); - std::vector dst2f = vecPointToVecPoint2f(dst); - *rval = {new cv::Mat(cv::getAffineTransform(src2f, dst2f))}; - END_WRAP -} -CvStatus *GetAffineTransform2f(VecPoint2f src, VecPoint2f dst, Mat *rval) { - BEGIN_WRAP - auto _src = vecpoint2f_c2cpp(src); - auto _dst = vecpoint2f_c2cpp(dst); - *rval = {new cv::Mat(cv::getAffineTransform(_src, _dst))}; - END_WRAP -} - -CvStatus *DrawContours(Mat src, VecVecPoint contours, int contourIdx, Scalar color, int thickness) { - BEGIN_WRAP - auto _contours = vecvecpoint_c2cpp(contours); - cv::drawContours( - *src.ptr, - _contours, - contourIdx, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - END_WRAP -} -CvStatus *DrawContoursWithParams( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - int lineType, - Mat hierarchy, - int maxLevel, - Point offset -) { - BEGIN_WRAP - auto _contours = vecvecpoint_c2cpp(contours); - cv::drawContours( - *src.ptr, - _contours, - contourIdx, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - *hierarchy.ptr, - maxLevel, - cv::Point(offset.x, offset.y) - ); - END_WRAP -} -CvStatus *Sobel( - Mat src, - Mat dst, - int ddepth, - int dx, - int dy, - int ksize, - double scale, - double delta, - int borderType -) { - BEGIN_WRAP - cv::Sobel(*src.ptr, *dst.ptr, ddepth, dx, dy, ksize, scale, delta, borderType); - END_WRAP -} -CvStatus *SpatialGradient(Mat src, Mat dx, Mat dy, int ksize, int borderType) { - BEGIN_WRAP - cv::spatialGradient(*src.ptr, *dx.ptr, *dy.ptr, ksize, borderType); - END_WRAP -} -CvStatus * -Remap(Mat src, Mat dst, Mat map1, Mat map2, int interpolation, int borderMode, Scalar borderValue) { - BEGIN_WRAP - cv::remap( - *src.ptr, - *dst.ptr, - *map1.ptr, - *map2.ptr, - interpolation, - borderMode, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - END_WRAP -} -CvStatus * -Filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta, int borderType) { - BEGIN_WRAP - cv::filter2D( - *src.ptr, *dst.ptr, ddepth, *kernel.ptr, cv::Point(anchor.x, anchor.y), delta, borderType - ); - END_WRAP -} -CvStatus *SepFilter2D( - Mat src, - Mat dst, - int ddepth, - Mat kernelX, - Mat kernelY, - Point anchor, - double delta, - int borderType -) { - BEGIN_WRAP - cv::sepFilter2D( - *src.ptr, - *dst.ptr, - ddepth, - *kernelX.ptr, - *kernelY.ptr, - cv::Point(anchor.x, anchor.y), - delta, - borderType - ); - END_WRAP -} -CvStatus *LogPolar(Mat src, Mat dst, Point2f center, double m, int flags) { - BEGIN_WRAP - cv::logPolar(*src.ptr, *dst.ptr, cv::Point2f(center.x, center.y), m, flags); - END_WRAP -} -CvStatus *FitLine(VecPoint pts, Mat line, int distType, double param, double reps, double aeps) { - BEGIN_WRAP - auto _pts = vecpoint_c2cpp(pts); - cv::fitLine(_pts, *line.ptr, distType, param, reps, aeps); - END_WRAP -} -CvStatus *LinearPolar(Mat src, Mat dst, Point2f center, double maxRadius, int flags) { - BEGIN_WRAP - cv::linearPolar(*src.ptr, *dst.ptr, cv::Point2f(center.x, center.y), maxRadius, flags); - END_WRAP -} -CvStatus * -MatchShapes(VecPoint contour1, VecPoint contour2, int method, double parameter, double *rval) { - BEGIN_WRAP - auto _contour1 = vecpoint_c2cpp(contour1); - auto _contour2 = vecpoint_c2cpp(contour2); - *rval = cv::matchShapes(_contour1, _contour2, method, parameter); - END_WRAP -} -CvStatus *ClipLine(Rect imgRect, Point pt1, Point pt2, bool *rval) { - BEGIN_WRAP - auto sz = cv::Rect(imgRect.x, imgRect.y, imgRect.width, imgRect.height); - cv::Point p1(pt1.x, pt1.y); - cv::Point p2(pt2.x, pt2.y); - *rval = cv::clipLine(sz, p1, p2); - END_WRAP -} - -CvStatus *CLAHE_Create(CLAHE *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::createCLAHE())}; - END_WRAP -} -CvStatus *CLAHE_CreateWithParams(double clipLimit, Size tileGridSize, CLAHE *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::createCLAHE(clipLimit, cv::Size(tileGridSize.width, tileGridSize.height)) - )}; - END_WRAP -} -void CLAHE_Close(CLAHEPtr c) { - c->ptr->reset(); - CVD_FREE(c); -} - -CvStatus *CLAHE_Apply(CLAHE c, Mat src, Mat dst) { - BEGIN_WRAP(*c.ptr)->apply(*src.ptr, *dst.ptr); - END_WRAP -} -CvStatus *CLAHE_CollectGarbage(CLAHE c) { - BEGIN_WRAP(*c.ptr)->collectGarbage(); - END_WRAP -} - -CvStatus *CLAHE_GetClipLimit(CLAHE c, double *rval) { - BEGIN_WRAP - *rval = (*c.ptr)->getClipLimit(); - END_WRAP -} -CvStatus *CLAHE_SetClipLimit(CLAHE c, double clipLimit) { - BEGIN_WRAP(*c.ptr)->setClipLimit(clipLimit); - END_WRAP -} -CvStatus *CLAHE_GetTilesGridSize(CLAHE c, Size *rval) { - BEGIN_WRAP - auto sz = (*c.ptr)->getTilesGridSize(); - *rval = {sz.width, sz.height}; - END_WRAP -} -CvStatus *CLAHE_SetTilesGridSize(CLAHE c, Size size) { - BEGIN_WRAP(*c.ptr)->setTilesGridSize(cv::Size(size.width, size.height)); - END_WRAP -} - -CvStatus *Subdiv2D_NewEmpty(Subdiv2D *rval) { - BEGIN_WRAP - *rval = {new cv::Subdiv2D()}; - END_WRAP -} -CvStatus *Subdiv2D_NewWithRect(Rect rect, Subdiv2D *rval) { - BEGIN_WRAP - *rval = {new cv::Subdiv2D(cv::Rect(rect.x, rect.y, rect.width, rect.height))}; - END_WRAP -} -void Subdiv2D_Close(Subdiv2DPtr self) { CVD_FREE(self); } - -CvStatus *Subdiv2D_EdgeDst(Subdiv2D self, int edge, Point2f *dstpt, int *rval) { - BEGIN_WRAP - auto p = cv::Point2f(); - *rval = self.ptr->edgeDst(edge, &p); - *dstpt = {p.x, p.y}; - END_WRAP -} -CvStatus *Subdiv2D_EdgeOrg(Subdiv2D self, int edge, Point2f *orgpt, int *rval) { - BEGIN_WRAP - auto p = cv::Point2f(); - *rval = self.ptr->edgeOrg(edge, &p); - *orgpt = {p.x, p.y}; - END_WRAP -} -CvStatus *Subdiv2D_FindNearest(Subdiv2D self, Point2f pt, Point2f *nearestPt, int *rval) { - BEGIN_WRAP - auto p = cv::Point2f(); - *rval = self.ptr->findNearest(cv::Point2f(pt.x, pt.y), &p); - *nearestPt = {p.x, p.y}; - END_WRAP -} -CvStatus *Subdiv2D_GetEdge(Subdiv2D self, int edge, int nextEdgeType, int *rval) { - BEGIN_WRAP - *rval = self.ptr->getEdge(edge, nextEdgeType); - END_WRAP -} -CvStatus *Subdiv2D_GetEdgeList(Subdiv2D self, Vec4f **rval, int *size) { - BEGIN_WRAP - auto v = std::vector(); - self.ptr->getEdgeList(v); - *size = v.size(); - auto rv = new Vec4f[v.size()]; - for (int i = 0; i < v.size(); i++) { - rv[i] = {v[i].val[0], v[i].val[1], v[i].val[2], v[i].val[3]}; - } - *rval = rv; - END_WRAP -} -CvStatus *Subdiv2D_GetLeadingEdgeList(Subdiv2D self, VecI32 *leadingEdgeList) { - BEGIN_WRAP - std::vector v; - self.ptr->getLeadingEdgeList(v); - *leadingEdgeList = vecint_cpp2c(v); - END_WRAP -} -CvStatus *Subdiv2D_GetTriangleList(Subdiv2D self, Vec6f **rval, int *size) { - BEGIN_WRAP - auto v = std::vector(); - self.ptr->getTriangleList(v); - *size = v.size(); - auto rv = new Vec6f[v.size()]; - for (int i = 0; i < v.size(); i++) { - rv[i] = {v[i].val[0], v[i].val[1], v[i].val[2], v[i].val[3], v[i].val[4], v[i].val[5]}; - } - *rval = rv; - END_WRAP -} -CvStatus *Subdiv2D_GetVertex(Subdiv2D self, int vertex, int *firstEdge, Point2f *rval) { - BEGIN_WRAP - auto p = self.ptr->getVertex(vertex, firstEdge); - *rval = {p.x, p.y}; - END_WRAP -} -CvStatus *Subdiv2D_GetVoronoiFacetList( - Subdiv2D self, VecI32 idx, VecVecPoint2f *facetList, VecPoint2f *facetCenters -) { - BEGIN_WRAP - auto vf = std::vector>(); - auto vfc = std::vector(); - auto _idx = vecint_c2cpp(idx); - self.ptr->getVoronoiFacetList(_idx, vf, vfc); - *facetList = vecvecpoint2f_cpp2c(vf); - *facetCenters = vecpoint2f_cpp2c(vfc); - END_WRAP; -} -CvStatus *Subdiv2D_InitDelaunay(Subdiv2D self, Rect rect) { - BEGIN_WRAP - self.ptr->initDelaunay(cv::Rect(rect.x, rect.y, rect.width, rect.height)); - END_WRAP -} -CvStatus *Subdiv2D_Insert(Subdiv2D self, Point2f pt, int *rval) { - BEGIN_WRAP - *rval = self.ptr->insert(cv::Point2f(pt.x, pt.y)); - END_WRAP -} -CvStatus *Subdiv2D_InsertVec(Subdiv2D self, VecPoint2f ptvec) { - BEGIN_WRAP - auto _ptvec = vecpoint2f_c2cpp(ptvec); - self.ptr->insert(_ptvec); - END_WRAP -} -CvStatus *Subdiv2D_Locate(Subdiv2D self, Point2f pt, int *edge, int *vertex, int *rval) { - BEGIN_WRAP - *rval = self.ptr->locate(cv::Point2f(pt.x, pt.y), *edge, *vertex); - END_WRAP -} -CvStatus *Subdiv2D_NextEdge(Subdiv2D self, int edge, int *rval) { - BEGIN_WRAP - *rval = self.ptr->nextEdge(edge); - END_WRAP -} -CvStatus *Subdiv2D_RotateEdge(Subdiv2D self, int edge, int rotate, int *rval) { - BEGIN_WRAP - *rval = self.ptr->rotateEdge(edge, rotate); - END_WRAP -} -CvStatus *Subdiv2D_SymEdge(Subdiv2D self, int edge, int *rval) { - BEGIN_WRAP - *rval = self.ptr->symEdge(edge); - END_WRAP -} - -CvStatus *InvertAffineTransform(Mat src, Mat dst) { - BEGIN_WRAP - cv::invertAffineTransform(*src.ptr, *dst.ptr); - END_WRAP -} -CvStatus *PhaseCorrelate(Mat src1, Mat src2, Mat window, double *response, Point2f *rval) { - BEGIN_WRAP - auto p = cv::phaseCorrelate(*src1.ptr, *src2.ptr, *window.ptr, response); - // TODO: add Point2d - *rval = {static_cast(p.x), static_cast(p.y)}; - END_WRAP -} - -CvStatus *Mat_Accumulate(Mat src, Mat dst) { - BEGIN_WRAP - cv::accumulate(*src.ptr, *dst.ptr); - END_WRAP -} -CvStatus *Mat_AccumulateWithMask(Mat src, Mat dst, Mat mask) { - BEGIN_WRAP - cv::accumulate(*src.ptr, *dst.ptr, *mask.ptr); - END_WRAP -} -CvStatus *Mat_AccumulateSquare(Mat src, Mat dst) { - BEGIN_WRAP - cv::accumulateSquare(*src.ptr, *dst.ptr); - END_WRAP -} -CvStatus *Mat_AccumulateSquareWithMask(Mat src, Mat dst, Mat mask) { - BEGIN_WRAP - cv::accumulateSquare(*src.ptr, *dst.ptr, *mask.ptr); - END_WRAP -} -CvStatus *Mat_AccumulateProduct(Mat src1, Mat src2, Mat dst) { - BEGIN_WRAP - cv::accumulateProduct(*src1.ptr, *src2.ptr, *dst.ptr); - END_WRAP -} -CvStatus *Mat_AccumulateProductWithMask(Mat src1, Mat src2, Mat dst, Mat mask) { - BEGIN_WRAP - cv::accumulateProduct(*src1.ptr, *src2.ptr, *dst.ptr, *mask.ptr); - END_WRAP -} -CvStatus *Mat_AccumulatedWeighted(Mat src, Mat dst, double alpha) { - BEGIN_WRAP - cv::accumulateWeighted(*src.ptr, *dst.ptr, alpha); - END_WRAP -} -CvStatus *Mat_AccumulatedWeightedWithMask(Mat src, Mat dst, double alpha, Mat mask) { - BEGIN_WRAP - cv::accumulateWeighted(*src.ptr, *dst.ptr, alpha, *mask.ptr); - END_WRAP -} - -CvStatus *FloodFill( - Mat src, - Mat mask, - Point seedPoint, - Scalar newVal, - Rect *rect, - Scalar loDiff, - Scalar upDiff, - int flags, - int *rval -) { - BEGIN_WRAP - auto _seedPoint = cv::Point(seedPoint.x, seedPoint.y); - auto _rect = cv::Rect(); - auto _newVal = cv::Scalar(newVal.val1, newVal.val2, newVal.val3, newVal.val4); - auto _loDiff = cv::Scalar(loDiff.val1, loDiff.val2, loDiff.val3, loDiff.val4); - auto _upDiff = cv::Scalar(upDiff.val1, upDiff.val2, upDiff.val3, upDiff.val4); - *rval = cv::floodFill(*src.ptr, *mask.ptr, _seedPoint, _newVal, &_rect, _loDiff, _upDiff, flags); - rect->x = _rect.x; - rect->y = _rect.y; - rect->width = _rect.width; - rect->height = _rect.height; - END_WRAP -} diff --git a/src/imgproc/imgproc.h b/src/imgproc/imgproc.h deleted file mode 100644 index 0097278a..00000000 --- a/src/imgproc/imgproc.h +++ /dev/null @@ -1,771 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef _OPENCV3_IMGPROC_H_ -#define _OPENCV3_IMGPROC_H_ - -#include "core/core.h" -#include - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#ifdef __cplusplus -CVD_TYPEDEF(cv::Ptr, CLAHE); -CVD_TYPEDEF(cv::Subdiv2D, Subdiv2D); -#else -CVD_TYPEDEF(void, CLAHE); -CVD_TYPEDEF(void, Subdiv2D); -#endif - -// SECTION - Image Filtering -// Applies the bilateral filter to an image. -// void cv::bilateralFilter (InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT) -CvStatus *BilateralFilter(Mat src, Mat dst, int d, double sc, double ss); - -// Blurs an image using the normalized box filter. -// void cv::blur (InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT) -CvStatus *Blur(Mat src, Mat dst, Size ps); - -// Blurs an image using the box filter. -// void cv::boxFilter (InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT) -CvStatus * -BoxFilter(Mat src, Mat dst, int ddepth, Size ps, Point anchor, bool normalize, int borderType); - -// TODO -// Constructs the Gaussian pyramid for an image. -// void cv::buildPyramid (InputArray src, OutputArrayOfArrays dst, int maxlevel, int borderType=BORDER_DEFAULT) - -// Dilates an image by using a specific structuring element. -// void cv::dilate (InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar &borderValue=morphologyDefaultBorderValue()) -CvStatus *Dilate(Mat src, Mat dst, Mat kernel); -CvStatus *DilateWithParams( - Mat src, Mat dst, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue -); - -// Erodes an image by using a specific structuring element. -// void cv::erode (InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar &borderValue=morphologyDefaultBorderValue()) -CvStatus *Erode(Mat src, Mat dst, Mat kernel); -CvStatus *ErodeWithParams( - Mat src, Mat dst, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue -); - -// Convolves an image with the kernel. -// void cv::filter2D (InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT) -CvStatus * -Filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta, int borderType); - -// Blurs an image using a Gaussian filter. -// void cv::GaussianBlur (InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT) -CvStatus *GaussianBlur(Mat src, Mat dst, Size ps, double sX, double sY, int bt); - -// TODO -// Returns filter coefficients for computing spatial image derivatives. -// void cv::getDerivKernels (OutputArray kx, OutputArray ky, int dx, int dy, int ksize, bool normalize=false, int ktype=CV_32F) - -// TODO -// Returns Gabor filter coefficients. -// Mat cv::getGaborKernel (Size ksize, double sigma, double theta, double lambd, double gamma, double psi=CV_PI *0.5, int ktype=CV_64F) - -// Returns Gaussian filter coefficients. -// Mat cv::getGaussianKernel (int ksize, double sigma, int ktype=CV_64F) -CvStatus *GetGaussianKernel(int ksize, double sigma, int ktype, Mat *rval); - -// Returns a structuring element of the specified size and shape for morphological operations. -// Mat cv::getStructuringElement (int shape, Size ksize, Point anchor=Point(-1,-1)) -CvStatus *GetStructuringElement(int shape, Size ksize, Mat *rval); - -// Calculates the Laplacian of an image. -// void cv::Laplacian (InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT) -CvStatus * -Laplacian(Mat src, Mat dst, int dDepth, int kSize, double scale, double delta, int borderType); - -// Blurs an image using the median filter. -// void cv::medianBlur (InputArray src, OutputArray dst, int ksize) -CvStatus *MedianBlur(Mat src, Mat dst, int ksize); - -// returns "magic" border value for erosion and dilation. It is automatically transformed to Scalar::all(-DBL_MAX) for dilation. -// static Scalar cv::morphologyDefaultBorderValue () -CvStatus *MorphologyDefaultBorderValue(Scalar *rval); - -// Performs advanced morphological transformations. -// void cv::morphologyEx (InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar &borderValue=morphologyDefaultBorderValue()) -CvStatus *MorphologyEx(Mat src, Mat dst, int op, Mat kernel); -CvStatus *MorphologyExWithParams( - Mat src, - Mat dst, - int op, - Mat kernel, - Point pt, - int iterations, - int borderType, - Scalar borderValue -); - -// Blurs an image and downsamples it. -// void cv::pyrDown (InputArray src, OutputArray dst, const Size &dstsize=Size(), int borderType=BORDER_DEFAULT) -CvStatus *PyrDown(Mat src, Mat dst, Size dstsize, int borderType); - -// TODO -// Performs initial step of meanshift segmentation of an image. -// void cv::pyrMeanShiftFiltering (InputArray src, OutputArray dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1)) - -// Upsamples an image and then blurs it. -// void cv::pyrUp (InputArray src, OutputArray dst, const Size &dstsize=Size(), int borderType=BORDER_DEFAULT) -CvStatus *PyrUp(Mat src, Mat dst, Size dstsize, int borderType); - -// Calculates the first x- or y- image derivative using Scharr operator. -// void cv::Scharr (InputArray src, OutputArray dst, int ddepth, int dx, int dy, double scale=1, double delta=0, int borderType=BORDER_DEFAULT) -CvStatus * -Scharr(Mat src, Mat dst, int dDepth, int dx, int dy, double scale, double delta, int borderType); - -// Applies a separable linear filter to an image. -// void cv::sepFilter2D (InputArray src, OutputArray dst, int ddepth, InputArray kernelX, InputArray kernelY, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT) -CvStatus *SepFilter2D( - Mat src, - Mat dst, - int ddepth, - Mat kernelX, - Mat kernelY, - Point anchor, - double delta, - int borderType -); - -// Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. -// void cv::Sobel (InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT) -CvStatus *Sobel( - Mat src, - Mat dst, - int ddepth, - int dx, - int dy, - int ksize, - double scale, - double delta, - int borderType -); - -// Calculates the first order image derivative in both x and y using a Sobel operator. -// void cv::spatialGradient (InputArray src, OutputArray dx, OutputArray dy, int ksize=3, int borderType=BORDER_DEFAULT) -CvStatus *SpatialGradient(Mat src, Mat dx, Mat dy, int ksize, int borderType); - -// Calculates the normalized sum of squares of the pixel values overlapping the filter. -// void cv::sqrBoxFilter (InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1, -1), bool normalize=true, int borderType=BORDER_DEFAULT) -CvStatus * -SqrBoxFilter(Mat src, Mat dst, int ddepth, Size ps, Point anchor, bool normalize, int borderType); - -// TODO -// Blurs an image using the stackBlur. -// void cv::stackBlur (InputArray src, OutputArray dst, Size ksize) - -// SECTION - Geometric Image Transformations - -// TODO -// Converts image transformation maps from one representation to another. -// void cv::convertMaps (InputArray map1, InputArray map2, OutputArray dstmap1, OutputArray dstmap2, int dstmap1type, bool nninterpolation=false) - -// Calculates an affine transform from three pairs of the corresponding points. -// Mat cv::getAffineTransform (const Point2f src[], const Point2f dst[]) -// Mat cv::getAffineTransform (InputArray src, InputArray dst) -CvStatus *GetAffineTransform(VecPoint src, VecPoint dst, Mat *rval); -CvStatus *GetAffineTransform2f(VecPoint2f src, VecPoint2f dst, Mat *rval); - - -// Calculates a perspective transform from four pairs of the corresponding points. -// Mat cv::getPerspectiveTransform (const Point2f src[], const Point2f dst[], int solveMethod=DECOMP_LU) -// Mat cv::getPerspectiveTransform (InputArray src, InputArray dst, int solveMethod=DECOMP_LU) -CvStatus *GetPerspectiveTransform(VecPoint src, VecPoint dst, Mat *rval, int solveMethod); -CvStatus *GetPerspectiveTransform2f(VecPoint2f src, VecPoint2f dst, Mat *rval, int solveMethod); - -// Retrieves a pixel rectangle from an image with sub-pixel accuracy. -// void cv::getRectSubPix (InputArray image, Size patchSize, Point2f center, OutputArray patch, int patchType=-1) -CvStatus *GetRectSubPix(Mat src, Size patchSize, Point2f center, Mat dst); - -// Calculates an affine matrix of 2D rotation. -// Mat cv::getRotationMatrix2D (Point2f center, double angle, double scale) -CvStatus *GetRotationMatrix2D(Point2f center, double angle, double scale, Mat *rval); - -// Inverts an affine transformation. -// void cv::invertAffineTransform (InputArray M, OutputArray iM) -CvStatus *InvertAffineTransform(Mat src, Mat dst); - -// Remaps an image to polar coordinates space. -// void cv::linearPolar (InputArray src, OutputArray dst, Point2f center, double maxRadius, int flags) -CvStatus *LinearPolar(Mat src, Mat dst, Point2f center, double maxRadius, int flags); - -// Remaps an image to semilog-polar coordinates space. -// void cv::logPolar (InputArray src, OutputArray dst, Point2f center, double M, int flags) -CvStatus *LogPolar(Mat src, Mat dst, Point2f center, double m, int flags); - -// Applies a generic geometrical transformation to an image. -// void cv::remap (InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar()) -CvStatus * -Remap(Mat src, Mat dst, Mat map1, Mat map2, int interpolation, int borderMode, Scalar borderValue); - -// Resizes an image. -// void cv::resize (InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR) -CvStatus *Resize(Mat src, Mat dst, Size sz, double fx, double fy, int interp); - -// Applies an affine transformation to an image. -// void cv::warpAffine (InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar()) -CvStatus *WarpAffine(Mat src, Mat dst, Mat rot_mat, Size dsize); -CvStatus *WarpAffineWithParams( - Mat src, Mat dst, Mat rot_mat, Size dsize, int flags, int borderMode, Scalar borderValue -); -// Applies a perspective transformation to an image. -// void cv::warpPerspective (InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar()) -CvStatus *WarpPerspective(Mat src, Mat dst, Mat m, Size dsize); -CvStatus *WarpPerspectiveWithParams( - Mat src, Mat dst, Mat rot_mat, Size dsize, int flags, int borderMode, Scalar borderValue -); - -// TODO -// Remaps an image to polar or semilog-polar coordinates space. -// void cv::warpPolar (InputArray src, OutputArray dst, Size dsize, Point2f center, double maxRadius, int flags) - -// SECTION - Miscellaneous Image Transformations -// Applies an adaptive threshold to an array. -// void cv::adaptiveThreshold (InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C) -CvStatus *AdaptiveThreshold( - Mat src, Mat dst, double maxValue, int adaptiveTyp, int typ, int blockSize, double c -); - -// void cv::blendLinear (InputArray src1, InputArray src2, InputArray weights1, InputArray weights2, OutputArray dst) - -// void cv::distanceTransform (InputArray src, OutputArray dst, int distanceType, int maskSize, int dstType=CV_32F) - -// Calculates the distance to the closest zero pixel for each pixel of the source image. -// void cv::distanceTransform (InputArray src, OutputArray dst, OutputArray labels, int distanceType, int maskSize, int labelType=DIST_LABEL_CCOMP) -CvStatus * -DistanceTransform(Mat src, Mat dst, Mat labels, int distanceType, int maskSize, int labelType); - -// Fills a connected component with the given color. -// int cv::floodFill (InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect *rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4) -// int cv::floodFill (InputOutputArray image, Point seedPoint, Scalar newVal, Rect *rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4) -CvStatus * FloodFill(Mat src, Mat mask, Point seedPoint, Scalar newVal, Rect *rect, Scalar loDiff, Scalar upDiff, int flags, int *rval); - -// Calculates the integral of an image. -// void cv::integral (InputArray src, OutputArray sum, int sdepth=-1) -// void cv::integral (InputArray src, OutputArray sum, OutputArray sqsum, int sdepth=-1, int sqdepth=-1) -// void cv::integral (InputArray src, OutputArray sum, OutputArray sqsum, OutputArray tilted, int sdepth=-1, int sqdepth=-1) -CvStatus *Integral(Mat src, Mat sum, Mat sqsum, Mat tilted, int sdepth, int sqdepth); - -// Applies a fixed-level threshold to each array element. -// double cv::threshold (InputArray src, OutputArray dst, double thresh, double maxval, int type) -CvStatus *Threshold(Mat src, Mat dst, double thresh, double maxvalue, int typ, double *rval); - -// SECTION - Drawing Functions - -// Draws an arrow segment pointing from the first point to the second one. -// void cv::arrowedLine (InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int line_type=8, int shift=0, double tipLength=0.1) -CvStatus *ArrowedLine( - Mat img, - Point pt1, - Point pt2, - Scalar color, - int thickness, - int line_type, - int shift, - double tipLength -); - -// Draws a circle. -// void cv::circle (InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0) -CvStatus *Circle(Mat img, Point center, int radius, Scalar color, int thickness); -CvStatus *CircleWithParams( - Mat img, Point center, int radius, Scalar color, int thickness, int lineType, int shift -); - -// Clips the line against the image rectangle. -// bool cv::clipLine (Rect imgRect, Point &pt1, Point &pt2) -// bool cv::clipLine (Size imgSize, Point &pt1, Point &pt2) -// bool cv::clipLine (Size2l imgSize, Point2l &pt1, Point2l &pt2) -CvStatus *ClipLine(Rect imgRect, Point pt1, Point pt2, bool *rval); - -// Draws contours outlines or filled contours. -// void cv::drawContours (InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar &color, int thickness=1, int lineType=LINE_8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point()) -CvStatus *DrawContours(Mat src, VecVecPoint contours, int contourIdx, Scalar color, int thickness); -CvStatus *DrawContoursWithParams( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - int lineType, - Mat hierarchy, - int maxLevel, - Point offset -); - -// Draws a marker on a predefined position in an image. -// void cv::drawMarker (InputOutputArray img, Point position, const Scalar &color, int markerType=MARKER_CROSS, int markerSize=20, int thickness=1, int line_type=8) - - -// Draws a simple or thick elliptic arc or fills an ellipse sector. -// void cv::ellipse (InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0) -// void cv::ellipse (InputOutputArray img, const RotatedRect &box, const Scalar &color, int thickness=1, int lineType=LINE_8) -CvStatus *Ellipse( - Mat img, - Point center, - Point axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness -); -CvStatus *EllipseWithParams( - Mat img, - Point center, - Point axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - int lineType, - int shift -); - -// Approximates an elliptic arc with a polyline. -// void cv::ellipse2Poly (Point center, Size axes, int angle, int arcStart, int arcEnd, int delta, std::vector< Point > &pts) -// void cv::ellipse2Poly (Point2d center, Size2d axes, int angle, int arcStart, int arcEnd, int delta, std::vector< Point2d > &pts) - - -// Fills a convex polygon. -// void cv::fillConvexPoly (InputOutputArray img, InputArray points, const Scalar &color, int lineType=LINE_8, int shift=0) -// void cv::fillConvexPoly (InputOutputArray img, const Point *pts, int npts, const Scalar &color, int lineType=LINE_8, int shift=0) - -// Fills the area bounded by one or more polygons. -// void cv::fillPoly (InputOutputArray img, const Point **pts, const int *npts, int ncontours, const Scalar &color, int lineType=LINE_8, int shift=0, Point offset=Point()) -// void cv::fillPoly (InputOutputArray img, InputArrayOfArrays pts, const Scalar &color, int lineType=LINE_8, int shift=0, Point offset=Point()) -CvStatus *FillPoly(Mat img, VecVecPoint points, Scalar color); -CvStatus *FillPolyWithParams( - Mat img, VecVecPoint points, Scalar color, int lineType, int shift, Point offset -); - -// Calculates the font-specific size to use to achieve a given height in pixels. -// double cv::getFontScaleFromHeight (const int fontFace, const int pixelHeight, const int thickness=1) - -// Calculates the width and height of a text string. -// Size cv::getTextSize (const String &text, int fontFace, double fontScale, int thickness, int *baseLine) -CvStatus *GetTextSizeWithBaseline( - const char *text, int fontFace, double fontScale, int thickness, int *baseline, Size *rval -); - -// Draws a line segment connecting two points. -// void cv::line (InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0) -CvStatus *Line(Mat img, Point pt1, Point pt2, Scalar color, int thickness, int lineType, int shift); - -// Draws several polygonal curves. -// void cv::polylines (InputOutputArray img, const Point *const *pts, const int *npts, int ncontours, bool isClosed, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0) -// void cv::polylines (InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0) -CvStatus *Polylines(Mat img, VecVecPoint points, bool isClosed, Scalar color, int thickness); - -// Draws a text string. -// void cv::putText (InputOutputArray img, const String &text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=LINE_8, bool bottomLeftOrigin=false) -CvStatus *PutText( - Mat img, - const char *text, - Point org, - int fontFace, - double fontScale, - Scalar color, - int thickness -); -CvStatus *PutTextWithParams( - Mat img, - const char *text, - Point org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - int lineType, - bool bottomLeftOrigin -); - -// Draws a simple, thick, or filled up-right rectangle. -// void cv::rectangle (InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0) -// void cv::rectangle (InputOutputArray img, Rect rec, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0) -CvStatus *Rectangle(Mat img, Rect rect, Scalar color, int thickness); -CvStatus * -RectangleWithParams(Mat img, Rect rect, Scalar color, int thickness, int lineType, int shift); - -// SECTION - Color Space Conversions -// Converts an image from one color space to another. -// void cv::cvtColor (InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT) -CvStatus *CvtColor(Mat src, CVD_OUT Mat dst, int code); - -// Converts an image from one color space to another where the source image is stored in two planes. -// void cv::cvtColorTwoPlane (InputArray src1, InputArray src2, OutputArray dst, int code, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT) - -// main function for all demosaicing processes -// void cv::demosaicing (InputArray src, OutputArray dst, int code, int dstCn=0) - -// SECTION - ColorMaps in OpenCV -// Applies a user colormap on a given image. -// void cv::applyColorMap (InputArray src, OutputArray dst, InputArray userColor) -CvStatus *ApplyCustomColorMap(Mat src, Mat dst, Mat colormap); - -// Applies a GNU Octave/MATLAB equivalent colormap on a given image. -// void cv::applyColorMap (InputArray src, OutputArray dst, int colormap) -CvStatus *ApplyColorMap(Mat src, Mat dst, int colormap); - -// SECTION - Planar Subdivision -CvStatus *Subdiv2D_NewEmpty(Subdiv2D *rval); -CvStatus *Subdiv2D_NewWithRect(Rect rect, Subdiv2D *rval); -void Subdiv2D_Close(Subdiv2DPtr self); -CvStatus *Subdiv2D_EdgeDst(Subdiv2D self, int edge, Point2f *dstpt, int *rval); -CvStatus *Subdiv2D_EdgeOrg(Subdiv2D self, int edge, Point2f *orgpt, int *rval); -CvStatus *Subdiv2D_FindNearest(Subdiv2D self, Point2f pt, Point2f *nearestPt, int *rval); -CvStatus *Subdiv2D_GetEdge(Subdiv2D self, int edge, int nextEdgeType, int *rval); -CvStatus *Subdiv2D_GetEdgeList(Subdiv2D self, Vec4f **rval, int *size); -CvStatus *Subdiv2D_GetLeadingEdgeList(Subdiv2D self, VecI32 *leadingEdgeList); -CvStatus *Subdiv2D_GetTriangleList(Subdiv2D self, Vec6f **rval, int *size); -CvStatus *Subdiv2D_GetVertex(Subdiv2D self, int vertex, int *firstEdge, Point2f *rval); -CvStatus *Subdiv2D_GetVoronoiFacetList( - Subdiv2D self, VecI32 idx, VecVecPoint2f *facetList, VecPoint2f *facetCenters -); -CvStatus *Subdiv2D_InitDelaunay(Subdiv2D self, Rect rect); -CvStatus *Subdiv2D_Insert(Subdiv2D self, Point2f pt, int *rval); -CvStatus *Subdiv2D_InsertVec(Subdiv2D self, VecPoint2f ptvec); -CvStatus *Subdiv2D_Locate(Subdiv2D self, Point2f pt, int *edge, int *vertex, int *rval); -CvStatus *Subdiv2D_NextEdge(Subdiv2D self, int edge, int *rval); -CvStatus *Subdiv2D_RotateEdge(Subdiv2D self, int edge, int rotate, int *rval); -CvStatus *Subdiv2D_SymEdge(Subdiv2D self, int edge, int *rval); - -// SECTION - Histograms -// Calculates the back projection of a histogram. -// void cv::calcBackProject (const Mat *images, int nimages, const int *channels, const SparseMat &hist, OutputArray backProject, const float **ranges, double scale=1, bool uniform=true) -// void cv::calcBackProject (const Mat *images, int nimages, const int *channels, InputArray hist, OutputArray backProject, const float **ranges, double scale=1, bool uniform=true) -// void cv::calcBackProject (InputArrayOfArrays images, const std::vector< int > &channels, InputArray hist, OutputArray dst, const std::vector< float > &ranges, double scale) -CvStatus *CalcBackProject( - VecMat mats, VecI32 chans, Mat hist, CVD_OUT Mat *backProject, VecF32 rng, double scale -); - -// Calculates a histogram of a set of arrays. -// void cv::calcHist (const Mat *images, int nimages, const int *channels, InputArray mask, OutputArray hist, int dims, const int *histSize, const float **ranges, bool uniform=true, bool accumulate=false) -// void cv::calcHist (const Mat *images, int nimages, const int *channels, InputArray mask, SparseMat &hist, int dims, const int *histSize, const float **ranges, bool uniform=true, bool accumulate=false) -// void cv::calcHist (InputArrayOfArrays images, const std::vector< int > &channels, InputArray mask, OutputArray hist, const std::vector< int > &histSize, const std::vector< float > &ranges, bool accumulate=false) -CvStatus * -CalcHist(VecMat mats, VecI32 chans, Mat mask, CVD_OUT Mat hist, VecI32 sz, VecF32 rng, bool acc); - -// Compares two histograms. -// double cv::compareHist (const SparseMat &H1, const SparseMat &H2, int method) -// double cv::compareHist (InputArray H1, InputArray H2, int method) -CvStatus *CompareHist(Mat hist1, Mat hist2, int method, CVD_OUT double *rval); - -// Creates a smart pointer to a cv::CLAHE class and initializes it. -// Ptr< CLAHE > cv::createCLAHE (double clipLimit=40.0, Size tileGridSize=Size(8, 8)) - -CvStatus *CLAHE_Create(CLAHE *rval); -CvStatus *CLAHE_CreateWithParams(double clipLimit, Size tileGridSize, CLAHE *rval); -void CLAHE_Close(CLAHEPtr c); -CvStatus *CLAHE_Apply(CLAHE c, Mat src, Mat dst); -CvStatus *CLAHE_CollectGarbage(CLAHE c); -CvStatus *CLAHE_GetClipLimit(CLAHE c, double *rval); -CvStatus *CLAHE_SetClipLimit(CLAHE c, double clipLimit); -CvStatus *CLAHE_GetTilesGridSize(CLAHE c, Size *rval); -CvStatus *CLAHE_SetTilesGridSize(CLAHE c, Size size); - -// Computes the "minimal work" distance between two weighted point configurations. -// float cv::EMD (InputArray signature1, InputArray signature2, int distType, InputArray cost=noArray(), float *lowerBound=0, OutputArray flow=noArray()) - -// Equalizes the histogram of a grayscale image. -// void cv::equalizeHist (InputArray src, OutputArray dst) -CvStatus *EqualizeHist(Mat src, CVD_OUT Mat dst); - -// float cv::wrapperEMD (InputArray signature1, InputArray signature2, int distType, InputArray cost=noArray(), Ptr< float > lowerBound=Ptr< float >(), OutputArray flow=noArray()) - -// SECTION - Structural Analysis and Shape Descriptors -// Approximates a polygonal curve(s) with the specified precision. -// void cv::approxPolyDP (InputArray curve, OutputArray approxCurve, double epsilon, bool closed) -CvStatus *ApproxPolyDP(VecPoint curve, double epsilon, bool closed, CVD_OUT VecPoint *rval); - -// Approximates a polygon with a convex hull with a specified accuracy and number of sides. -// void cv::approxPolyN (InputArray curve, OutputArray approxCurve, int nsides, float epsilon_percentage=-1.0, bool ensure_convex=true) - -// Calculates a contour perimeter or a curve length. -// double cv::arcLength (InputArray curve, bool closed) -CvStatus *ArcLength(VecPoint curve, bool is_closed, CVD_OUT double *rval); - -// Calculates the up-right bounding rectangle of a point set or non-zero pixels of gray-scale image. -// Rect cv::boundingRect (InputArray array) -CvStatus *BoundingRect(VecPoint pts, Rect *rval); - -// Finds the four vertices of a rotated rect. Useful to draw the rotated rectangle. -// void cv::boxPoints (RotatedRect box, OutputArray points) -CvStatus *BoxPoints(RotatedRect rect, VecPoint2f *boxPts); - -// computes the connected components labeled image of boolean image -// int cv::connectedComponents (InputArray image, OutputArray labels, int connectivity, int ltype, int ccltype) -// int cv::connectedComponents (InputArray image, OutputArray labels, int connectivity=8, int ltype=CV_32S) -CvStatus * -ConnectedComponents(Mat src, Mat dst, int connectivity, int ltype, int ccltype, int *rval); - -// computes the connected components labeled image of boolean image and also produces a statistics output for each label -// int cv::connectedComponentsWithStats (InputArray image, OutputArray labels, OutputArray stats, OutputArray centroids, int connectivity, int ltype, int ccltype) -// int cv::connectedComponentsWithStats (InputArray image, OutputArray labels, OutputArray stats, OutputArray centroids, int connectivity=8, int ltype=CV_32S) -CvStatus *ConnectedComponentsWithStats( - Mat src, - Mat labels, - Mat stats, - Mat centroids, - int connectivity, - int ltype, - int ccltype, - int *rval -); - -// Calculates a contour area. -// double cv::contourArea (InputArray contour, bool oriented=false) -CvStatus *ContourArea(VecPoint pts, double *rval); - -// Finds the convex hull of a point set. -// void cv::convexHull (InputArray points, OutputArray hull, bool clockwise=false, bool returnPoints=true) -CvStatus *ConvexHull(VecPoint points, CVD_OUT Mat hull, bool clockwise, bool returnPoints); - -// Finds the convexity defects of a contour. -// void cv::convexityDefects (InputArray contour, InputArray convexhull, OutputArray convexityDefects) -CvStatus *ConvexityDefects(VecPoint points, Mat hull, Mat result); - -// Creates a smart pointer to a cv::GeneralizedHoughBallard class and initializes it. -// Ptr< GeneralizedHoughBallard > cv::createGeneralizedHoughBallard () - -// Creates a smart pointer to a cv::GeneralizedHoughGuil class and initializes it. -// Ptr< GeneralizedHoughGuil > cv::createGeneralizedHoughGuil () - -// Finds contours in a binary image. -// void cv::findContours (InputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point()) -// void cv::findContours (InputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point()) -CvStatus *FindContours(Mat src, Mat hierarchy, int mode, int method, VecVecPoint *rval); - -// Find contours using link runs algorithm. -// void cv::findContoursLinkRuns (InputArray image, OutputArrayOfArrays contours) -// void cv::findContoursLinkRuns (InputArray image, OutputArrayOfArrays contours, OutputArray hierarchy) - -// Fits an ellipse around a set of 2D points. -// RotatedRect cv::fitEllipse (InputArray points) -CvStatus *FitEllipse(VecPoint pts, RotatedRect *rval); - -// Fits an ellipse around a set of 2D points. -// RotatedRect cv::fitEllipseAMS (InputArray points) - -// Fits an ellipse around a set of 2D points. -// RotatedRect cv::fitEllipseDirect (InputArray points) - -// Fits a line to a 2D or 3D point set. -// void cv::fitLine (InputArray points, OutputArray line, int distType, double param, double reps, double aeps) -CvStatus *FitLine(VecPoint pts, Mat line, int distType, double param, double reps, double aeps); - -// Calculates seven Hu invariants. -// void cv::HuMoments (const Moments &m, OutputArray hu) -// void cv::HuMoments (const Moments &moments, double hu[7]) - -// Finds intersection of two convex polygons. -// float cv::intersectConvexConvex (InputArray p1, InputArray p2, OutputArray p12, bool handleNested=true) - -// Tests a contour convexity. -// bool cv::isContourConvex (InputArray contour) - -// Compares two shapes. -// double cv::matchShapes (InputArray contour1, InputArray contour2, int method, double parameter) -CvStatus * -MatchShapes(VecPoint contour1, VecPoint contour2, int method, double parameter, double *rval); - -// Finds a rotated rectangle of the minimum area enclosing the input 2D point set. -// RotatedRect cv::minAreaRect (InputArray points) -CvStatus *MinAreaRect(VecPoint pts, RotatedRect *rval); - -// Finds a circle of the minimum area enclosing a 2D point set. -// void cv::minEnclosingCircle (InputArray points, Point2f ¢er, float &radius) -CvStatus *MinEnclosingCircle(VecPoint pts, Point2f *center, float *radius); - -// Finds a triangle of minimum area enclosing a 2D point set and returns its area. -// double cv::minEnclosingTriangle (InputArray points, OutputArray triangle) - -// Calculates all of the moments up to the third order of a polygon or rasterized shape. -// Moments cv::moments (InputArray array, bool binaryImage=false) -CvStatus *Moments(Mat src, bool binaryImage, Moment *rval); - -// Performs a point-in-contour test. -// double cv::pointPolygonTest (InputArray contour, Point2f pt, bool measureDist) -CvStatus *PointPolygonTest(VecPoint pts, Point2f pt, bool measureDist, double *rval); - -// Finds out if there is any intersection between two rotated rectangles. -// int cv::rotatedRectangleIntersection (const RotatedRect &rect1, const RotatedRect &rect2, OutputArray intersectingRegion) - -// SECTION - Motion Analysis and Object Tracking -// Adds an image to the accumulator image. -// void cv::accumulate (InputArray src, InputOutputArray dst, InputArray mask=noArray()) -CvStatus *Mat_Accumulate(Mat src, Mat dst); -CvStatus *Mat_AccumulateWithMask(Mat src, Mat dst, Mat mask); - -// Adds the per-element product of two input images to the accumulator image. -// void cv::accumulateProduct (InputArray src1, InputArray src2, InputOutputArray dst, InputArray mask=noArray()) -CvStatus *Mat_AccumulateProduct(Mat src1, Mat src2, Mat dst); -CvStatus *Mat_AccumulateProductWithMask(Mat src1, Mat src2, Mat dst, Mat mask); - -// Adds the square of a source image to the accumulator image. -// void cv::accumulateSquare (InputArray src, InputOutputArray dst, InputArray mask=noArray()) -CvStatus *Mat_AccumulateSquare(Mat src, Mat dst); -CvStatus *Mat_AccumulateSquareWithMask(Mat src, Mat dst, Mat mask); - -// Updates a running average. -// void cv::accumulateWeighted (InputArray src, InputOutputArray dst, double alpha, InputArray mask=noArray()) -CvStatus *Mat_AccumulatedWeighted(Mat src, Mat dst, double alpha); -CvStatus *Mat_AccumulatedWeightedWithMask(Mat src, Mat dst, double alpha, Mat mask); - -// This function computes a Hanning window coefficients in two dimensions. -// void cv::createHanningWindow (OutputArray dst, Size winSize, int type) - -// Performs the per-element division of the first Fourier spectrum by the second Fourier spectrum. -// void cv::divSpectrums (InputArray a, InputArray b, OutputArray c, int flags, bool conjB=false) - -// The function is used to detect translational shifts that occur between two images. -// Point2d cv::phaseCorrelate (InputArray src1, InputArray src2, InputArray window=noArray(), double *response=0) -CvStatus *PhaseCorrelate(Mat src1, Mat src2, Mat window, double *response, Point2f *rval); - -// SECTION - Feature Detection -// Finds edges in an image using the Canny algorithm [48] . -// void cv::Canny (InputArray dx, InputArray dy, OutputArray edges, double threshold1, double threshold2, bool L2gradient=false) -// void cv::Canny (InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false) -CvStatus *Canny(Mat src, Mat edges, double t1, double t2, int apertureSize, bool l2gradient); - -// Calculates eigenvalues and eigenvectors of image blocks for corner detection. -// void cv::cornerEigenValsAndVecs (InputArray src, OutputArray dst, int blockSize, int ksize, int borderType=BORDER_DEFAULT) - -// Harris corner detector. -// void cv::cornerHarris (InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType=BORDER_DEFAULT) - -// Calculates the minimal eigenvalue of gradient matrices for corner detection. -// void cv::cornerMinEigenVal (InputArray src, OutputArray dst, int blockSize, int ksize=3, int borderType=BORDER_DEFAULT) - -// Refines the corner locations. -// void cv::cornerSubPix (InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria) -CvStatus * -CornerSubPix(Mat img, VecPoint2f corners, Size winSize, Size zeroZone, TermCriteria criteria); - -// Creates a smart pointer to a LineSegmentDetector object and initializes it. -// Ptr< LineSegmentDetector > cv::createLineSegmentDetector (int refine=LSD_REFINE_STD, double scale=0.8, double sigma_scale=0.6, double quant=2.0, double ang_th=22.5, double log_eps=0, double density_th=0.7, int n_bins=1024) - -// Determines strong corners on an image. -// Same as above, but returns also quality measure of the detected corners. -// void cv::goodFeaturesToTrack (InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask, int blockSize, int gradientSize, bool useHarrisDetector=false, double k=0.04) -// void cv::goodFeaturesToTrack (InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask, OutputArray cornersQuality, int blockSize=3, int gradientSize=3, bool useHarrisDetector=false, double k=0.04) -// void cv::goodFeaturesToTrack (InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04) -CvStatus *GoodFeaturesToTrack( - Mat img, - VecPoint2f *corners, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - bool useHarrisDetector, - double k -); -CvStatus *GoodFeaturesToTrackWithGradient( - Mat img, - VecPoint2f *corners, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - int gradientSize, - bool useHarrisDetector, - double k -); - -// Finds circles in a grayscale image using the Hough transform. -// void cv::HoughCircles (InputArray image, OutputArray circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0) -CvStatus *HoughCircles(Mat src, Mat circles, int method, double dp, double minDist); -CvStatus *HoughCirclesWithParams( - Mat src, - Mat circles, - int method, - double dp, - double minDist, - double param1, - double param2, - int minRadius, - int maxRadius -); - -// Finds lines in a binary image using the standard Hough transform. -// void cv::HoughLines (InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0, double min_theta=0, double max_theta=CV_PI) -CvStatus *HoughLines( - Mat src, - Mat lines, - double rho, - double theta, - int threshold, - double srn, - double stn, - double min_theta, - double max_theta -); - -// Finds line segments in a binary image using the probabilistic Hough transform. -// void cv::HoughLinesP (InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0) -CvStatus *HoughLinesP(Mat src, Mat lines, double rho, double theta, int threshold); -CvStatus *HoughLinesPWithParams( - Mat src, - Mat lines, - double rho, - double theta, - int threshold, - double minLineLength, - double maxLineGap -); - -// Finds lines in a set of points using the standard Hough transform. -// void cv::HoughLinesPointSet (InputArray point, OutputArray lines, int lines_max, int threshold, double min_rho, double max_rho, double rho_step, double min_theta, double max_theta, double theta_step) -CvStatus *HoughLinesPointSet( - Mat points, - Mat lines, - int lines_max, - int threshold, - double min_rho, - double max_rho, - double rho_step, - double min_theta, - double max_theta, - double theta_step -); - -// Calculates a feature map for corner detection. -// void cv::preCornerDetect (InputArray src, OutputArray dst, int ksize, int borderType=BORDER_DEFAULT) - -// SECTION - Object Detection -// Compares a template against overlapped image regions. -// void cv::matchTemplate (InputArray image, InputArray templ, OutputArray result, int method, InputArray mask=noArray()) -CvStatus *MatchTemplate(Mat image, Mat templ, Mat result, int method, Mat mask); - -// SECTION - Image Segmentation -// Runs the GrabCut algorithm. -// void cv::grabCut (InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode=GC_EVAL) -CvStatus * -GrabCut(Mat img, Mat mask, Rect rect, Mat bgdModel, Mat fgdModel, int iterCount, int mode); - -// Performs a marker-based image segmentation using the watershed algorithm. -// void cv::watershed (InputArray image, InputOutputArray markers) -CvStatus *Watershed(Mat image, Mat markers); - -// SECTION - Hardware Acceleration Layer - -#ifdef __cplusplus -} -#endif - -#endif//_OPENCV3_IMGPROC_H_ diff --git a/src/imgproc/imgproc_async.cpp b/src/imgproc/imgproc_async.cpp deleted file mode 100644 index 96e7fd4a..00000000 --- a/src/imgproc/imgproc_async.cpp +++ /dev/null @@ -1,1587 +0,0 @@ -#include "imgproc_async.h" -#include "core/types.h" -#include "core/vec.hpp" -#include "opencv2/core/mat.hpp" -#include "opencv2/core/matx.hpp" -#include -#include - -CvStatus *ArcLength_Async(VecPoint curve, bool is_closed, CVD_OUT CvCallback_1 callback) { - BEGIN_WRAP - auto _curve = vecpoint_c2cpp(curve); - callback(new double(cv::arcLength(_curve, is_closed))); - END_WRAP -} - -CvStatus *ApproxPolyDP_Async(VecPoint curve, double epsilon, bool closed, CvCallback_1 callback) { - BEGIN_WRAP - std::vector approxCurvePts; - auto _curve = vecpoint_c2cpp(curve); - cv::approxPolyDP(_curve, approxCurvePts, epsilon, closed); - callback(vecpoint_cpp2c_p(approxCurvePts)); - END_WRAP -} - -CvStatus *BilateralFilter_Async(Mat src, int d, double sc, double ss, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::bilateralFilter(*src.ptr, dst, d, sc, ss); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *Blur_Async(Mat src, Size ps, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::blur(*src.ptr, dst, cv::Size(ps.width, ps.height)); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *BoxFilter_Async(Mat src, int ddepth, Size ps, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::boxFilter(*src.ptr, dst, ddepth, cv::Size(ps.width, ps.height)); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *CvtColor_Async(Mat src, int code, CVD_OUT CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::cvtColor(*src.ptr, dst, code); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *CalcHist_Async( - VecMat mats, VecI32 chans, Mat mask, VecI32 sz, VecF32 rng, bool acc, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat hist; - auto _mats = vecmat_c2cpp(mats); - auto _chans = vecint_c2cpp(chans); - auto _sz = vecint_c2cpp(sz); - auto _rng = vecfloat_c2cpp(rng); - cv::calcHist(_mats, _chans, *mask.ptr, hist, _sz, _rng, acc); - callback(new Mat{new cv::Mat(hist)}); - END_WRAP -} - -CvStatus *CalcBackProject_Async( - VecMat mats, VecI32 chans, Mat hist, VecF32 rng, double scale, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat backProject; - auto _mats = vecmat_c2cpp(mats); - auto _chans = vecint_c2cpp(chans); - auto _rng = vecfloat_c2cpp(rng); - cv::calcBackProject(_mats, _chans, *hist.ptr, backProject, _rng, scale); - callback(new Mat{new cv::Mat(backProject)}); - END_WRAP -} - -CvStatus *CompareHist_Async(Mat hist1, Mat hist2, int method, CVD_OUT CvCallback_1 callback) { - BEGIN_WRAP - callback(new double{cv::compareHist(*hist1.ptr, *hist2.ptr, method)}); - END_WRAP -} - -CvStatus * -ConvexHull_Async(VecPoint points, bool clockwise, bool returnPoints, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat hull; - auto _points = vecpoint_c2cpp(points); - cv::convexHull(_points, hull, clockwise, returnPoints); - callback(new Mat{new cv::Mat(hull)}); - END_WRAP -} - -CvStatus *ConvexityDefects_Async(VecPoint points, Mat hull, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat defects; - auto _points = vecpoint_c2cpp(points); - cv::convexityDefects(_points, *hull.ptr, defects); - callback(new Mat{new cv::Mat(defects)}); - END_WRAP -} - -CvStatus *SqBoxFilter_Async(Mat src, int ddepth, Size ps, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::sqrBoxFilter(*src.ptr, dst, ddepth, cv::Size(ps.width, ps.height)); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *Dilate_Async(Mat src, Mat kernel, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::dilate(*src.ptr, dst, *kernel.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *DilateWithParams_Async( - Mat src, - Mat kernel, - Point anchor, - int iterations, - int borderType, - Scalar borderValue, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::dilate( - *src.ptr, - dst, - *kernel.ptr, - cv::Point(anchor.x, anchor.y), - iterations, - borderType, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *DistanceTransform_Async( - Mat src, int distanceType, int maskSize, int labelType, CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::Mat labels; - cv::distanceTransform(*src.ptr, dst, labels, distanceType, maskSize, labelType); - callback(new Mat{new cv::Mat(dst)}, new Mat{new cv::Mat(labels)}); - END_WRAP -} - -CvStatus *FloodFill_Async( - Mat src, - Mat mask, - Point seedPoint, - Scalar newVal, - Scalar loDiff, - Scalar upDiff, - int flags, - CvCallback_2 callback -) { - BEGIN_WRAP - auto _seedPoint = cv::Point(seedPoint.x, seedPoint.y); - auto _rect = cv::Rect(); - auto _newVal = cv::Scalar(newVal.val1, newVal.val2, newVal.val3, newVal.val4); - auto _loDiff = cv::Scalar(loDiff.val1, loDiff.val2, loDiff.val3, loDiff.val4); - auto _upDiff = cv::Scalar(upDiff.val1, upDiff.val2, upDiff.val3, upDiff.val4); - int rval = - cv::floodFill(*src.ptr, *mask.ptr, _seedPoint, _newVal, &_rect, _loDiff, _upDiff, flags); - callback(new int(rval), new Rect{_rect.x, _rect.y, _rect.width, _rect.height}); - END_WRAP -} - -CvStatus *EqualizeHist_Async(Mat src, CVD_OUT CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::equalizeHist(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *Erode_Async(Mat src, Mat kernel, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::erode(*src.ptr, dst, *kernel.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *ErodeWithParams_Async( - Mat src, - Mat kernel, - Point anchor, - int iterations, - int borderType, - Scalar borderValue, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::erode( - *src.ptr, - dst, - *kernel.ptr, - cv::Point(anchor.x, anchor.y), - iterations, - borderType, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *MatchTemplate_Async(Mat image, Mat templ, int method, Mat mask, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat result; - cv::matchTemplate(*image.ptr, *templ.ptr, result, method, *mask.ptr); - callback(new Mat{new cv::Mat(result)}); - END_WRAP -} - -CvStatus *Moments_Async(Mat src, bool binaryImage, CvCallback_1 callback) { - BEGIN_WRAP - cv::Moments m = cv::moments(*src.ptr, binaryImage); - callback(new Moment{ - m.m00, m.m10, m.m01, m.m20, m.m11, m.m02, m.m30, m.m21, - m.m12, m.m03, m.mu20, m.mu11, m.mu02, m.mu30, m.mu21, m.mu12, - m.mu03, m.nu20, m.nu11, m.nu02, m.nu30, m.nu21, m.nu12, m.nu03, - }); - END_WRAP -} - -CvStatus *PyrDown_Async(Mat src, Size dstsize, int borderType, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::pyrDown(*src.ptr, dst, cv::Size(dstsize.width, dstsize.height), borderType); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *PyrUp_Async(Mat src, Size dstsize, int borderType, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::pyrUp(*src.ptr, dst, cv::Size(dstsize.width, dstsize.height), borderType); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *BoundingRect_Async(VecPoint pts, CvCallback_1 callback) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - cv::Rect r = cv::boundingRect(_points); - callback(new Rect{r.x, r.y, r.width, r.height}); - END_WRAP -} - -CvStatus *BoxPoints_Async(RotatedRect rect, CvCallback_1 callback) { - BEGIN_WRAP - /// bottom left, top left, top right, bottom right - auto mat = cv::Mat(); - std::vector vec; - auto center = cv::Point2f(rect.center.x, rect.center.y); - auto size = cv::Size2f(rect.size.width, rect.size.height); - cv::boxPoints(cv::RotatedRect(center, size, rect.angle), mat); - for (int i = 0; i < mat.rows; i++) { - vec.push_back(cv::Point2f(mat.at(i, 0), mat.at(i, 1))); - } - callback(vecpoint2f_cpp2c_p(vec)); - END_WRAP -} - -CvStatus *ContourArea_Async(VecPoint pts, CvCallback_1 callback) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - callback(new double(cv::contourArea(_points))); - END_WRAP -} - -CvStatus *MinAreaRect_Async(VecPoint pts, CvCallback_1 callback) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - auto r = cv::minAreaRect(_points); - callback(new RotatedRect{{r.center.x, r.center.y}, {r.size.width, r.size.height}, r.angle}); - END_WRAP -} - -CvStatus *FitEllipse_Async(VecPoint pts, CvCallback_1 callback) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - auto r = cv::fitEllipse(_points); - callback(new RotatedRect{{r.center.x, r.center.y}, {r.size.width, r.size.height}, r.angle}); - END_WRAP -} - -CvStatus *MinEnclosingCircle_Async(VecPoint pts, CvCallback_2 callback) { - BEGIN_WRAP - cv::Point2f c; - float r; - auto _points = vecpoint_c2cpp(pts); - cv::minEnclosingCircle(_points, c, r); - callback(new Point2f{c.y, c.x}, new float(r)); - END_WRAP -} - -CvStatus *FindContours_Async(Mat src, int mode, int method, CvCallback_2 callback) { - BEGIN_WRAP - std::vector> contours; - // std::vector hierarchy; - cv::Mat hierarchy; - cv::findContours(*src.ptr, contours, hierarchy, mode, method); - callback(vecvecpoint_cpp2c_p(contours), new Mat{new cv::Mat(hierarchy)}); - END_WRAP -} - -CvStatus * -PointPolygonTest_Async(VecPoint pts, Point2f pt, bool measureDist, CvCallback_1 callback) { - BEGIN_WRAP - auto _points = vecpoint_c2cpp(pts); - callback(new double(cv::pointPolygonTest(_points, cv::Point2f(pt.x, pt.y), measureDist))); - END_WRAP -} - -CvStatus *ConnectedComponents_Async( - Mat src, int connectivity, int ltype, int ccltype, CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat dst; - int rval = cv::connectedComponents(*src.ptr, dst, connectivity, ltype, ccltype); - callback(new int(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *ConnectedComponentsWithStats_Async( - Mat src, int connectivity, int ltype, int ccltype, CvCallback_4 callback -) { - BEGIN_WRAP - cv::Mat labels, stats, centroids; - int rval = cv::connectedComponentsWithStats( - *src.ptr, labels, stats, centroids, connectivity, ltype, ccltype - ); - callback( - new int(rval), - new Mat{new cv::Mat(labels)}, - new Mat{new cv::Mat(stats)}, - new Mat{new cv::Mat(centroids)} - ); - END_WRAP -} - -CvStatus * -GaussianBlur_Async(Mat src, Size ps, double sX, double sY, int bt, CVD_OUT CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::GaussianBlur(*src.ptr, dst, cv::Size(ps.width, ps.height), sX, sY, bt); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *GetGaussianKernel_Async(int ksize, double sigma, int ktype, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(cv::getGaussianKernel(ksize, sigma, ktype))}); - END_WRAP -} - -CvStatus *Laplacian_Async( - Mat src, - int dDepth, - int kSize, - double scale, - double delta, - int borderType, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::Laplacian(*src.ptr, dst, dDepth, kSize, scale, delta, borderType); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *Scharr_Async( - Mat src, - int dDepth, - int dx, - int dy, - double scale, - double delta, - int borderType, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::Scharr(*src.ptr, dst, dDepth, dx, dy, scale, delta, borderType); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *GetStructuringElement_Async(int shape, Size ksize, Point anchor, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat element = cv::getStructuringElement( - shape, cv::Size(ksize.width, ksize.height), cv::Point(anchor.x, anchor.y) - ); - callback(new Mat{new cv::Mat(element)}); - END_WRAP -} - -CvStatus *MorphologyDefaultBorderValue_Async(CvCallback_1 callback) { - BEGIN_WRAP - auto scalar = cv::morphologyDefaultBorderValue(); - callback(new Scalar{scalar.val[0], scalar.val[1], scalar.val[2], scalar.val[3]}); - END_WRAP -} - -CvStatus *MorphologyEx_Async(Mat src, int op, Mat kernel, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::morphologyEx(*src.ptr, dst, op, *kernel.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *MorphologyExWithParams_Async( - Mat src, - int op, - Mat kernel, - Point pt, - int iterations, - int borderType, - Scalar borderValue, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - auto bv = cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4); - cv::morphologyEx( - *src.ptr, dst, op, *kernel.ptr, cv::Point(pt.x, pt.y), iterations, borderType, bv - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *MedianBlur_Async(Mat src, int ksize, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::medianBlur(*src.ptr, dst, ksize); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *Canny_Async( - Mat src, double t1, double t2, int apertureSize, bool l2gradient, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::Canny(*src.ptr, dst, t1, t2, apertureSize, l2gradient); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *CornerSubPix_Async( - Mat img, - VecPoint2f corners, - Size winSize, - Size zeroZone, - TermCriteria criteria, - CvCallback_0 callback -) { - BEGIN_WRAP - auto size = cv::Size(winSize.width, winSize.height); - auto zone = cv::Size(zeroZone.width, zeroZone.height); - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - auto _corners = vecpoint2f_c2cpp(corners); - cv::cornerSubPix(*img.ptr, _corners, size, zone, tc); - // std::cout << *corners.ptr << std::endl; - callback(); - END_WRAP -} - -CvStatus *GoodFeaturesToTrack_Async( - Mat img, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - bool useHarrisDetector, - double k, - CvCallback_1 callback -) { - BEGIN_WRAP - std::vector _corners; - cv::goodFeaturesToTrack( - *img.ptr, _corners, maxCorners, quality, minDist, *mask.ptr, blockSize, useHarrisDetector, k - ); - callback(vecpoint2f_cpp2c_p(_corners)); - END_WRAP -} - -CvStatus *GoodFeaturesToTrackWithGradient_Async( - Mat img, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - int gradientSize, - bool useHarrisDetector, - double k, - CvCallback_1 callback -) { - BEGIN_WRAP - std::vector _corners; - cv::goodFeaturesToTrack( - *img.ptr, - _corners, - maxCorners, - quality, - minDist, - *mask.ptr, - blockSize, - gradientSize, - useHarrisDetector, - k - ); - callback(vecpoint2f_cpp2c_p(_corners)); - END_WRAP -} - -CvStatus *GrabCut_Async( - Mat img, - Mat mask, - Rect rect, - Mat bgdModel, - Mat fgdModel, - int iterCount, - int mode, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::grabCut( - *img.ptr, - *mask.ptr, - cv::Rect(rect.x, rect.y, rect.width, rect.height), - *bgdModel.ptr, - *fgdModel.ptr, - iterCount, - mode - ); - callback(); - END_WRAP -} - -CvStatus * -HoughCircles_Async(Mat src, int method, double dp, double minDist, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat circles; - cv::HoughCircles(*src.ptr, circles, method, dp, minDist); - callback(new Mat{new cv::Mat(circles)}); - END_WRAP -} - -CvStatus *HoughCirclesWithParams_Async( - Mat src, - int method, - double dp, - double minDist, - double param1, - double param2, - int minRadius, - int maxRadius, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat circles; - cv::HoughCircles(*src.ptr, circles, method, dp, minDist, param1, param2, minRadius, maxRadius); - callback(new Mat{new cv::Mat(circles)}); - END_WRAP -} - -CvStatus *HoughLines_Async( - Mat src, - double rho, - double theta, - int threshold, - double srn, - double stn, - double min_theta, - double max_theta, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat lines; - cv::HoughLines(*src.ptr, lines, rho, theta, threshold, srn, stn, min_theta, max_theta); - callback(new Mat{new cv::Mat(lines)}); - END_WRAP -} - -CvStatus * -HoughLinesP_Async(Mat src, double rho, double theta, int threshold, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat lines; - cv::HoughLinesP(*src.ptr, lines, rho, theta, threshold); - callback(new Mat{new cv::Mat(lines)}); - END_WRAP -} - -CvStatus *HoughLinesPWithParams_Async( - Mat src, - double rho, - double theta, - int threshold, - double minLineLength, - double maxLineGap, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat lines; - cv::HoughLinesP(*src.ptr, lines, rho, theta, threshold, minLineLength, maxLineGap); - callback(new Mat{new cv::Mat(lines)}); - END_WRAP -} - -CvStatus *HoughLinesPointSet_Async( - Mat points, - int lines_max, - int threshold, - double min_rho, - double max_rho, - double rho_step, - double min_theta, - double max_theta, - double theta_step, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat lines; - cv::HoughLinesPointSet( - *points.ptr, - lines, - lines_max, - threshold, - min_rho, - max_rho, - rho_step, - min_theta, - max_theta, - theta_step - ); - callback(new Mat{new cv::Mat(lines)}); - END_WRAP -} - -CvStatus *Integral_Async(Mat src, int sdepth, int sqdepth, CvCallback_3 callback) { - BEGIN_WRAP - cv::Mat sum, sqsum, tilted; - cv::integral(*src.ptr, sum, sqsum, tilted, sdepth, sqdepth); - callback(new Mat{new cv::Mat(sum)}, new Mat{new cv::Mat(sqsum)}, new Mat{new cv::Mat(tilted)}); - END_WRAP -} - -CvStatus *Threshold_Async(Mat src, double thresh, double maxvalue, int typ, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dst; - auto rval = cv::threshold(*src.ptr, dst, thresh, maxvalue, typ); - callback(new double(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *AdaptiveThreshold_Async( - Mat src, - double maxValue, - int adaptiveTyp, - int typ, - int blockSize, - double c, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::adaptiveThreshold(*src.ptr, dst, maxValue, adaptiveTyp, typ, blockSize, c); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *ArrowedLine_Async( - Mat img, - Point pt1, - Point pt2, - Scalar color, - int thickness, - int line_type, - int shift, - double tipLength, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::arrowedLine( - *img.ptr, - cv::Point(pt1.x, pt1.y), - cv::Point(pt2.x, pt2.y), - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - line_type, - shift, - tipLength - ); - callback(); - END_WRAP -} - -CvStatus *Circle_Async( - Mat img, Point center, int radius, Scalar color, int thickness, CvCallback_0 callback -) { - BEGIN_WRAP - cv::circle( - *img.ptr, - cv::Point(center.x, center.y), - radius, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - callback(); - END_WRAP -} - -CvStatus *CircleWithParams_Async( - Mat img, - Point center, - int radius, - Scalar color, - int thickness, - int lineType, - int shift, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::circle( - *img.ptr, - cv::Point(center.x, center.y), - radius, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - shift - ); - callback(); - END_WRAP -} - -CvStatus *Ellipse_Async( - Mat img, - Point center, - Point axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::ellipse( - *img.ptr, - cv::Point(center.x, center.y), - cv::Size(axes.x, axes.y), - angle, - startAngle, - endAngle, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - callback(); - END_WRAP -} - -CvStatus *EllipseWithParams_Async( - Mat img, - Point center, - Point axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - int lineType, - int shift, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::ellipse( - *img.ptr, - cv::Point(center.x, center.y), - cv::Size(axes.x, axes.y), - angle, - startAngle, - endAngle, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - shift - ); - callback(); - END_WRAP -} - -CvStatus *Line_Async( - Mat img, - Point pt1, - Point pt2, - Scalar color, - int thickness, - int lineType, - int shift, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::line( - *img.ptr, - cv::Point(pt1.x, pt1.y), - cv::Point(pt2.x, pt2.y), - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - shift - ); - callback(); - END_WRAP -} - -CvStatus *Rectangle_Async(Mat img, Rect rect, Scalar color, int thickness, CvCallback_0 callback) { - BEGIN_WRAP - cv::rectangle( - *img.ptr, - cv::Rect(rect.x, rect.y, rect.width, rect.height), - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - callback(); - END_WRAP -} - -CvStatus *RectangleWithParams_Async( - Mat img, Rect rect, Scalar color, int thickness, int lineType, int shift, CvCallback_0 callback -) { - BEGIN_WRAP - cv::rectangle( - *img.ptr, - cv::Rect(rect.x, rect.y, rect.width, rect.height), - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - shift - ); - callback(); - END_WRAP -} - -CvStatus *FillPoly_Async(Mat img, VecVecPoint points, Scalar color, CvCallback_0 callback) { - BEGIN_WRAP - auto _points = vecvecpoint_c2cpp(points); - cv::fillPoly(*img.ptr, _points, cv::Scalar(color.val1, color.val2, color.val3, color.val4)); - callback(); - END_WRAP -} - -CvStatus *FillPolyWithParams_Async( - Mat img, - VecVecPoint points, - Scalar color, - int lineType, - int shift, - Point offset, - CvCallback_0 callback -) { - BEGIN_WRAP - auto _points = vecvecpoint_c2cpp(points); - cv::fillPoly( - *img.ptr, - _points, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - lineType, - shift, - cv::Point(offset.x, offset.y) - ); - callback(); - END_WRAP -} - -CvStatus *Polylines_Async( - Mat img, VecVecPoint points, bool isClosed, Scalar color, int thickness, CvCallback_0 callback -) { - BEGIN_WRAP - auto _points = vecvecpoint_c2cpp(points); - cv::polylines( - *img.ptr, - _points, - isClosed, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - callback(); - END_WRAP -} - -CvStatus *GetTextSizeWithBaseline_Async( - const char *text, int fontFace, double fontScale, int thickness, CvCallback_2 callback -) { - BEGIN_WRAP - int baseline; - cv::Size r = cv::getTextSize(text, fontFace, fontScale, thickness, &baseline); - callback(new Size{r.width, r.height}, new int(baseline)); - END_WRAP -} - -CvStatus *PutText_Async( - Mat img, - const char *text, - Point org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::putText( - *img.ptr, - text, - cv::Point(org.x, org.y), - fontFace, - fontScale, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness - ); - callback(); - END_WRAP -} - -CvStatus *PutTextWithParams_Async( - Mat img, - const char *text, - Point org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - int lineType, - bool bottomLeftOrigin, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::putText( - *img.ptr, - text, - cv::Point(org.x, org.y), - fontFace, - fontScale, - cv::Scalar(color.val1, color.val2, color.val3, color.val4), - thickness, - lineType, - bottomLeftOrigin - ); - callback(); - END_WRAP -} - -CvStatus *Resize_Async(Mat src, Size sz, double fx, double fy, int interp, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::resize(*src.ptr, dst, cv::Size(sz.width, sz.height), fx, fy, interp); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *GetRectSubPix_Async(Mat src, Size patchSize, Point2f center, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::getRectSubPix( - *src.ptr, cv::Size(patchSize.width, patchSize.height), cv::Point2f(center.x, center.y), dst - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus * -GetRotationMatrix2D_Async(Point2f center, double angle, double scale, CvCallback_1 callback) { - BEGIN_WRAP - auto mat = cv::getRotationMatrix2D(cv::Point2f(center.x, center.y), angle, scale); - callback(new Mat{new cv::Mat(mat)}); - END_WRAP -} - -CvStatus *WarpAffine_Async(Mat src, Mat rot_mat, Size dsize, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::warpAffine(*src.ptr, dst, *rot_mat.ptr, cv::Size(dsize.width, dsize.height)); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *WarpAffineWithParams_Async( - Mat src, - Mat rot_mat, - Size dsize, - int flags, - int borderMode, - Scalar borderValue, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::warpAffine( - *src.ptr, - dst, - *rot_mat.ptr, - cv::Size(dsize.width, dsize.height), - flags, - borderMode, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *WarpPerspective_Async(Mat src, Mat m, Size dsize, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::warpPerspective(*src.ptr, dst, *m.ptr, cv::Size(dsize.width, dsize.height)); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *WarpPerspectiveWithParams_Async( - Mat src, - Mat rot_mat, - Size dsize, - int flags, - int borderMode, - Scalar borderValue, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::warpPerspective( - *src.ptr, - dst, - *rot_mat.ptr, - cv::Size(dsize.width, dsize.height), - flags, - borderMode, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *Watershed_Async(Mat image, Mat markers, CvCallback_0 callback) { - BEGIN_WRAP - cv::watershed(*image.ptr, *markers.ptr); - callback(); - END_WRAP -} - -CvStatus *ApplyColorMap_Async(Mat src, int colormap, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::applyColorMap(*src.ptr, dst, colormap); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *ApplyCustomColorMap_Async(Mat src, Mat colormap, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::applyColorMap(*src.ptr, dst, *colormap.ptr); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus * -GetPerspectiveTransform_Async(VecPoint src, VecPoint dst, int solveMethod, CvCallback_1 callback) { - BEGIN_WRAP - std::vector src2f = vecPointToVecPoint2f(src); - std::vector dst2f = vecPointToVecPoint2f(dst); - callback(new Mat{new cv::Mat(cv::getPerspectiveTransform(src2f, dst2f, solveMethod))}); - END_WRAP -} - -CvStatus *GetPerspectiveTransform2f_Async( - VecPoint2f src, VecPoint2f dst, int solveMethod, CvCallback_1 callback -) { - BEGIN_WRAP - auto _src = vecpoint2f_c2cpp(src); - auto _dst = vecpoint2f_c2cpp(dst); - callback(new Mat{new cv::Mat(cv::getPerspectiveTransform(_src, _dst, solveMethod))}); - END_WRAP -} - -CvStatus *GetAffineTransform_Async(VecPoint src, VecPoint dst, CvCallback_1 callback) { - BEGIN_WRAP - std::vector src2f = vecPointToVecPoint2f(src); - std::vector dst2f = vecPointToVecPoint2f(dst); - callback(new Mat{new cv::Mat(cv::getAffineTransform(src2f, dst2f))}); - END_WRAP -} - -CvStatus *GetAffineTransform2f_Async(VecPoint2f src, VecPoint2f dst, CvCallback_1 callback) { - BEGIN_WRAP - auto _src = vecpoint2f_c2cpp(src); - auto _dst = vecpoint2f_c2cpp(dst); - callback(new Mat{new cv::Mat(cv::getAffineTransform(_src, _dst))}); - END_WRAP -} - -CvStatus *DrawContours_Async( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - CvCallback_0 callback -) { - BEGIN_WRAP - auto _contours = vecvecpoint_c2cpp(contours); - cv::Scalar _color = cv::Scalar(color.val1, color.val2, color.val3, color.val4); - cv::drawContours(*src.ptr, _contours, contourIdx, _color, thickness); - callback(); - END_WRAP -} - -CvStatus *DrawContoursWithParams_Async( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - int lineType, - Mat hierarchy, - int maxLevel, - Point offset, - CvCallback_0 callback -) { - BEGIN_WRAP - auto _contours = vecvecpoint_c2cpp(contours); - cv::Scalar _color = cv::Scalar(color.val1, color.val2, color.val3, color.val4); - cv::drawContours( - *src.ptr, - _contours, - contourIdx, - _color, - thickness, - lineType, - *hierarchy.ptr, - maxLevel, - cv::Point(offset.x, offset.y) - ); - callback(); - END_WRAP -} - -CvStatus *Sobel_Async( - Mat src, - int ddepth, - int dx, - int dy, - int ksize, - double scale, - double delta, - int borderType, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::Sobel(*src.ptr, dst, ddepth, dx, dy, ksize, scale, delta, borderType); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *SpatialGradient_Async(Mat src, int ksize, int borderType, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dx, dy; - cv::spatialGradient(*src.ptr, dx, dy, ksize, borderType); - callback(new Mat{new cv::Mat(dx)}, new Mat{new cv::Mat(dy)}); - END_WRAP -} - -CvStatus *Remap_Async( - Mat src, - Mat map1, - Mat map2, - int interpolation, - int borderMode, - Scalar borderValue, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::remap( - *src.ptr, - dst, - *map1.ptr, - *map2.ptr, - interpolation, - borderMode, - cv::Scalar(borderValue.val1, borderValue.val2, borderValue.val3, borderValue.val4) - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *Filter2D_Async( - Mat src, - int ddepth, - Mat kernel, - Point anchor, - double delta, - int borderType, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::filter2D( - *src.ptr, dst, ddepth, *kernel.ptr, cv::Point(anchor.x, anchor.y), delta, borderType - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *SepFilter2D_Async( - Mat src, - int ddepth, - Mat kernelX, - Mat kernelY, - Point anchor, - double delta, - int borderType, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - cv::sepFilter2D( - *src.ptr, - dst, - ddepth, - *kernelX.ptr, - *kernelY.ptr, - cv::Point(anchor.x, anchor.y), - delta, - borderType - ); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *LogPolar_Async(Mat src, Point2f center, double m, int flags, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::logPolar(*src.ptr, dst, cv::Point2f(center.x, center.y), m, flags); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *FitLine_Async( - VecPoint pts, int distType, double param, double reps, double aeps, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - auto _points = vecpoint_c2cpp(pts); - cv::fitLine(_points, dst, distType, param, reps, aeps); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus * -LinearPolar_Async(Mat src, Point2f center, double maxRadius, int flags, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::linearPolar(*src.ptr, dst, cv::Point2f(center.x, center.y), maxRadius, flags); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *MatchShapes_Async( - VecPoint contour1, VecPoint contour2, int method, double parameter, CvCallback_1 callback -) { - BEGIN_WRAP - auto _contour1 = vecpoint_c2cpp(contour1); - auto _contour2 = vecpoint_c2cpp(contour2); - auto rval = cv::matchShapes(_contour1, _contour2, method, parameter); - callback(new double{rval}); - END_WRAP -} - -CvStatus *ClipLine_Async(Rect imgRect, Point pt1, Point pt2, CvCallback_1 callback) { - BEGIN_WRAP - auto sz = cv::Rect(imgRect.x, imgRect.y, imgRect.width, imgRect.height); - cv::Point p1(pt1.x, pt1.y); - cv::Point p2(pt2.x, pt2.y); - auto rval = cv::clipLine(sz, p1, p2); - callback(new bool{rval}); - END_WRAP -} - -CvStatus *CLAHE_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new CLAHE{new cv::Ptr(cv::createCLAHE())}); - END_WRAP -} - -CvStatus *CLAHE_CreateWithParams_Async(double clipLimit, Size tileGridSize, CvCallback_1 callback) { - BEGIN_WRAP - callback(new CLAHE{new cv::Ptr( - cv::createCLAHE(clipLimit, cv::Size(tileGridSize.width, tileGridSize.height)) - )}); - END_WRAP -} - -void CLAHE_Close_Async(CLAHEPtr self, CvCallback_0 callback) { - self->ptr->reset(); - CVD_FREE(self); - callback(); -} - -CvStatus *CLAHE_Apply_Async(CLAHE self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->apply(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *CLAHE_CollectGarbage_Async(CLAHE self, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->collectGarbage(); - callback(); - END_WRAP -} - -CvStatus *CLAHE_GetClipLimit_Async(CLAHE self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new double((*self.ptr)->getClipLimit())); - END_WRAP -} - -CvStatus *CLAHE_SetClipLimit_Async(CLAHE self, double clipLimit, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setClipLimit(clipLimit); - callback(); - END_WRAP -} - -CvStatus *CLAHE_GetTilesGridSize_Async(CLAHE self, CvCallback_1 callback) { - BEGIN_WRAP - auto sz = (*self.ptr)->getTilesGridSize(); - callback(new Size{sz.width, sz.height}); - END_WRAP -} - -CvStatus *CLAHE_SetTilesGridSize_Async(CLAHE self, Size size, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setTilesGridSize(cv::Size(size.width, size.height)); - callback(); - END_WRAP -} - -CvStatus *Subdiv2D_NewEmpty_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new Subdiv2D{new cv::Subdiv2D()}); - END_WRAP -} - -CvStatus *Subdiv2D_NewWithRect_Async(Rect rect, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Subdiv2D{new cv::Subdiv2D(cv::Rect(rect.x, rect.y, rect.width, rect.height))}); - END_WRAP -} - -void Subdiv2D_Close_Async(Subdiv2DPtr self, CvCallback_0 callback) { - CVD_FREE(self); - callback(); -} - -CvStatus *Subdiv2D_EdgeDst_Async(Subdiv2D self, int edge, CvCallback_2 callback) { - BEGIN_WRAP - auto p = cv::Point2f(); - auto rval = self.ptr->edgeDst(edge, &p); - callback(new int(rval), new Point2f{p.x, p.y}); - END_WRAP -} - -CvStatus *Subdiv2D_EdgeOrg_Async(Subdiv2D self, int edge, CvCallback_2 callback) { - BEGIN_WRAP - auto p = cv::Point2f(); - auto rval = self.ptr->edgeOrg(edge, &p); - callback(new int(rval), new Point2f{p.x, p.y}); - END_WRAP -} - -CvStatus *Subdiv2D_FindNearest_Async(Subdiv2D self, Point2f pt, CvCallback_2 callback) { - BEGIN_WRAP - auto p = cv::Point2f(); - int rval = self.ptr->findNearest(cv::Point2f(pt.x, pt.y), &p); - callback(new int(rval), new Point2f{p.x, p.y}); - END_WRAP -} - -CvStatus *Subdiv2D_GetEdge_Async(Subdiv2D self, int edge, int nextEdgeType, CvCallback_1 callback) { - BEGIN_WRAP - int rval = self.ptr->getEdge(edge, nextEdgeType); - callback(new int(rval)); - END_WRAP -} - -CvStatus *Subdiv2D_GetEdgeList_Async(Subdiv2D self, CvCallback_1 callback) { - BEGIN_WRAP - auto v = std::vector(); - self.ptr->getEdgeList(v); - callback(vec_vec4f_cpp2c_p(v)); - END_WRAP -} - -CvStatus *Subdiv2D_GetLeadingEdgeList_Async(Subdiv2D self, CvCallback_1 callback) { - BEGIN_WRAP - std::vector v; - self.ptr->getLeadingEdgeList(v); - callback(vecint_cpp2c_p(v)); - END_WRAP -} - -CvStatus *Subdiv2D_GetTriangleList_Async(Subdiv2D self, CvCallback_1 callback) { - BEGIN_WRAP - auto v = std::vector(); - self.ptr->getTriangleList(v); - callback(vec_vec6f_cpp2c_p(v)); - END_WRAP -} - -CvStatus *Subdiv2D_GetVertex_Async(Subdiv2D self, int vertex, CvCallback_2 callback) { - BEGIN_WRAP - int firstEdge; - cv::Point2f p = self.ptr->getVertex(vertex, &firstEdge); - callback(new Point2f{p.x, p.y}, new int(firstEdge)); - END_WRAP -} - -CvStatus *Subdiv2D_GetVoronoiFacetList_Async(Subdiv2D self, VecI32 idx, CvCallback_2 callback) { - BEGIN_WRAP - auto vf = std::vector>(); - auto vfc = std::vector(); - auto _idx = vecint_c2cpp(idx); - self.ptr->getVoronoiFacetList(_idx, vf, vfc); - callback(vecvecpoint2f_cpp2c_p(vf), vecpoint2f_cpp2c_p(vfc)); - END_WRAP; -} - -CvStatus *Subdiv2D_InitDelaunay_Async(Subdiv2D self, Rect rect, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->initDelaunay(cv::Rect(rect.x, rect.y, rect.width, rect.height)); - callback(); - END_WRAP -} - -CvStatus *Subdiv2D_Insert_Async(Subdiv2D self, Point2f pt, CvCallback_1 callback) { - BEGIN_WRAP - int rval = self.ptr->insert(cv::Point2f(pt.x, pt.y)); - callback(new int(rval)); - END_WRAP -} - -CvStatus *Subdiv2D_InsertVec_Async(Subdiv2D self, VecPoint2f ptvec, CvCallback_0 callback) { - BEGIN_WRAP - auto _ptvec = vecpoint2f_c2cpp(ptvec); - self.ptr->insert(_ptvec); - callback(); - END_WRAP -} - -CvStatus *Subdiv2D_Locate_Async(Subdiv2D self, Point2f pt, CvCallback_3 callback) { - BEGIN_WRAP - int edge; - int vertex; - int rval = self.ptr->locate(cv::Point2f(pt.x, pt.y), edge, vertex); - callback(new int(rval), new int(edge), new int(vertex)); - END_WRAP -} - -CvStatus *Subdiv2D_NextEdge_Async(Subdiv2D self, int edge, CvCallback_1 callback) { - BEGIN_WRAP - int rval = self.ptr->nextEdge(edge); - callback(new int(rval)); - END_WRAP -} - -CvStatus *Subdiv2D_RotateEdge_Async(Subdiv2D self, int edge, int rotate, CvCallback_1 callback) { - BEGIN_WRAP - int rval = self.ptr->rotateEdge(edge, rotate); - callback(new int(rval)); - END_WRAP -} - -CvStatus *Subdiv2D_SymEdge_Async(Subdiv2D self, int edge, CvCallback_1 callback) { - BEGIN_WRAP - int rval = self.ptr->symEdge(edge); - callback(new int(rval)); - END_WRAP -} - -CvStatus *InvertAffineTransform_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - cv::invertAffineTransform(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *PhaseCorrelate_Async(Mat src1, Mat src2, Mat window, CvCallback_2 callback) { - BEGIN_WRAP - double response; - auto p = cv::phaseCorrelate(*src1.ptr, *src2.ptr, *window.ptr, &response); - // TODO: add Point2d - callback(new Point2f{static_cast(p.x), static_cast(p.y)}, new double(response)); - END_WRAP -} - -CvStatus *Mat_Accumulate_Async(Mat src, Mat dst, CvCallback_0 callback) { - BEGIN_WRAP - cv::accumulate(*src.ptr, *dst.ptr); - callback(); - END_WRAP -} - -CvStatus *Mat_AccumulateWithMask_Async(Mat src, Mat dst, Mat mask, CvCallback_0 callback) { - BEGIN_WRAP - cv::accumulate(*src.ptr, *dst.ptr, *mask.ptr); - callback(); - END_WRAP -} - -CvStatus *Mat_AccumulateSquare_Async(Mat src, Mat dst, CvCallback_0 callback) { - BEGIN_WRAP - cv::accumulateSquare(*src.ptr, *dst.ptr); - callback(); - END_WRAP -} - -CvStatus *Mat_AccumulateSquareWithMask_Async(Mat src, Mat dst, Mat mask, CvCallback_0 callback) { - BEGIN_WRAP - cv::accumulateSquare(*src.ptr, *dst.ptr, *mask.ptr); - callback(); - END_WRAP -} - -CvStatus *Mat_AccumulateProduct_Async(Mat src1, Mat src2, Mat dst, CvCallback_0 callback) { - BEGIN_WRAP - cv::accumulateProduct(*src1.ptr, *src2.ptr, *dst.ptr); - callback(); - END_WRAP -} - -CvStatus * -Mat_AccumulateProductWithMask_Async(Mat src1, Mat src2, Mat dst, Mat mask, CvCallback_0 callback) { - BEGIN_WRAP - cv::accumulateProduct(*src1.ptr, *src2.ptr, *dst.ptr, *mask.ptr); - callback(); - END_WRAP -} - -CvStatus *Mat_AccumulatedWeighted_Async(Mat src, Mat dst, double alpha, CvCallback_0 callback) { - BEGIN_WRAP - cv::accumulateWeighted(*src.ptr, *dst.ptr, alpha); - callback(); - END_WRAP -} - -CvStatus *Mat_AccumulatedWeightedWithMask_Async( - Mat src, Mat dst, double alpha, Mat mask, CvCallback_0 callback -) { - BEGIN_WRAP - cv::accumulateWeighted(*src.ptr, *dst.ptr, alpha, *mask.ptr); - callback(); - END_WRAP -} diff --git a/src/imgproc/imgproc_async.h b/src/imgproc/imgproc_async.h deleted file mode 100644 index b03e9803..00000000 --- a/src/imgproc/imgproc_async.h +++ /dev/null @@ -1,470 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef CVD_ASYNC_IMGPROC_H -#define CVD_ASYNC_IMGPROC_H - -#include "core/types.h" -#include "imgproc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -CvStatus *ArcLength_Async(VecPoint curve, bool is_closed, CVD_OUT CvCallback_1 callback); -CvStatus *ApproxPolyDP_Async(VecPoint curve, double epsilon, bool closed, CvCallback_1 callback); -CvStatus *BilateralFilter_Async(Mat src, int d, double sc, double ss, CvCallback_1 callback); -CvStatus *Blur_Async(Mat src, Size ps, CvCallback_1 callback); -CvStatus *BoxFilter_Async(Mat src, int ddepth, Size ps, CvCallback_1 callback); -CvStatus *CvtColor_Async(Mat src, int code, CVD_OUT CvCallback_1 callback); -CvStatus *CalcHist_Async( - VecMat mats, VecI32 chans, Mat mask, VecI32 sz, VecF32 rng, bool acc, CvCallback_1 callback -); -CvStatus *CalcBackProject_Async( - VecMat mats, VecI32 chans, Mat backProject, VecF32 rng, double scale, CvCallback_1 callback -); -CvStatus *CompareHist_Async(Mat hist1, Mat hist2, int method, CVD_OUT CvCallback_1 callback); -CvStatus * -ConvexHull_Async(VecPoint points, bool clockwise, bool returnPoints, CvCallback_1 callback); -CvStatus *ConvexityDefects_Async(VecPoint points, Mat hull, CvCallback_1 callback); - -CvStatus *SqBoxFilter_Async(Mat src, int ddepth, Size ps, CvCallback_1 callback); -CvStatus *Dilate_Async(Mat src, Mat kernel, CvCallback_1 callback); -CvStatus *DilateWithParams_Async( - Mat src, - Mat kernel, - Point anchor, - int iterations, - int borderType, - Scalar borderValue, - CvCallback_1 callback -); -CvStatus *DistanceTransform_Async( - Mat src, int distanceType, int maskSize, int labelType, CvCallback_2 callback -); -CvStatus *FloodFill_Async(Mat src, Mat mask, Point seedPoint, Scalar newVal, Scalar loDiff, Scalar upDiff, int flags, CvCallback_2 callback); - -CvStatus *EqualizeHist_Async(Mat src, CVD_OUT CvCallback_1 callback); -CvStatus *Erode_Async(Mat src, Mat kernel, CvCallback_1 callback); -CvStatus *ErodeWithParams_Async( - Mat src, - Mat kernel, - Point anchor, - int iterations, - int borderType, - Scalar borderValue, - CvCallback_1 callback -); -CvStatus *MatchTemplate_Async(Mat image, Mat templ, int method, Mat mask, CvCallback_1 callback); -CvStatus *Moments_Async(Mat src, bool binaryImage, CvCallback_1 callback); -CvStatus *PyrDown_Async(Mat src, Size dstsize, int borderType, CvCallback_1 callback); -CvStatus *PyrUp_Async(Mat src, Size dstsize, int borderType, CvCallback_1 callback); -CvStatus *BoundingRect_Async(VecPoint pts, CvCallback_1 callback); -CvStatus *BoxPoints_Async(RotatedRect rect, CvCallback_1 callback); -CvStatus *ContourArea_Async(VecPoint pts, CvCallback_1 callback); -CvStatus *MinAreaRect_Async(VecPoint pts, CvCallback_1 callback); -CvStatus *FitEllipse_Async(VecPoint pts, CvCallback_1 callback); -CvStatus *MinEnclosingCircle_Async(VecPoint pts, CvCallback_2 callback); -CvStatus *FindContours_Async(Mat src, int mode, int method, CvCallback_2 callback); -CvStatus *PointPolygonTest_Async(VecPoint pts, Point2f pt, bool measureDist, CvCallback_1 callback); -CvStatus * -ConnectedComponents_Async(Mat src, int connectivity, int ltype, int ccltype, CvCallback_2 callback); -CvStatus *ConnectedComponentsWithStats_Async( - Mat src, int connectivity, int ltype, int ccltype, CvCallback_4 callback -); - -CvStatus *GaussianBlur_Async(Mat src, Size ps, double sX, double sY, int bt, CvCallback_1 callback); -CvStatus *GetGaussianKernel_Async(int ksize, double sigma, int ktype, CvCallback_1 callback); -CvStatus *Laplacian_Async( - Mat src, - int dDepth, - int kSize, - double scale, - double delta, - int borderType, - CvCallback_1 callback -); -CvStatus *Scharr_Async( - Mat src, - int dDepth, - int dx, - int dy, - double scale, - double delta, - int borderType, - CvCallback_1 callback -); -CvStatus *GetStructuringElement_Async(int shape, Size ksize, Point anchor, CvCallback_1 callback); -CvStatus *MorphologyDefaultBorderValue_Async(CvCallback_1 callback); -CvStatus *MorphologyEx_Async(Mat src, int op, Mat kernel, CvCallback_1 callback); -CvStatus *MorphologyExWithParams_Async( - Mat src, - int op, - Mat kernel, - Point pt, - int iterations, - int borderType, - Scalar borderValue, - CvCallback_1 callback -); -CvStatus *MedianBlur_Async(Mat src, int ksize, CvCallback_1 callback); - -CvStatus *Canny_Async( - Mat src, double t1, double t2, int apertureSize, bool l2gradient, CvCallback_1 callback -); -CvStatus *CornerSubPix_Async( - Mat img, - VecPoint2f corners, - Size winSize, - Size zeroZone, - TermCriteria criteria, - CvCallback_0 callback -); -CvStatus *GoodFeaturesToTrack_Async( - Mat img, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - bool useHarrisDetector, - double k, - CvCallback_1 callback -); -CvStatus *GoodFeaturesToTrackWithGradient_Async( - Mat img, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - int gradientSize, - bool useHarrisDetector, - double k, - CvCallback_1 callback -); -CvStatus *GrabCut_Async( - Mat img, - Mat mask, - Rect rect, - Mat bgdModel, - Mat fgdModel, - int iterCount, - int mode, - CvCallback_0 callback -); -CvStatus *HoughCircles_Async(Mat src, int method, double dp, double minDist, CvCallback_1 callback); -CvStatus *HoughCirclesWithParams_Async( - Mat src, - int method, - double dp, - double minDist, - double param1, - double param2, - int minRadius, - int maxRadius, - CvCallback_1 callback -); -CvStatus *HoughLines_Async( - Mat src, - double rho, - double theta, - int threshold, - double srn, - double stn, - double min_theta, - double max_theta, - CvCallback_1 callback -); -CvStatus * -HoughLinesP_Async(Mat src, double rho, double theta, int threshold, CvCallback_1 callback); -CvStatus *HoughLinesPWithParams_Async( - Mat src, - double rho, - double theta, - int threshold, - double minLineLength, - double maxLineGap, - CvCallback_1 callback -); -CvStatus *HoughLinesPointSet_Async( - Mat points, - int lines_max, - int threshold, - double min_rho, - double max_rho, - double rho_step, - double min_theta, - double max_theta, - double theta_step, - CvCallback_1 callback -); -CvStatus *Integral_Async(Mat src, int sdepth, int sqdepth, CvCallback_3 callback); -CvStatus *Threshold_Async(Mat src, double thresh, double maxvalue, int typ, CvCallback_2 callback); -CvStatus *AdaptiveThreshold_Async( - Mat src, - double maxValue, - int adaptiveTyp, - int typ, - int blockSize, - double c, - CvCallback_1 callback -); - -CvStatus *ArrowedLine_Async( - Mat img, - Point pt1, - Point pt2, - Scalar color, - int thickness, - int line_type, - int shift, - double tipLength, - CvCallback_0 callback -); -CvStatus * -Circle_Async(Mat img, Point center, int radius, Scalar color, int thickness, CvCallback_0 callback); -CvStatus *CircleWithParams_Async( - Mat img, - Point center, - int radius, - Scalar color, - int thickness, - int lineType, - int shift, - CvCallback_0 callback -); -CvStatus *Ellipse_Async( - Mat img, - Point center, - Point axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - CvCallback_0 callback -); -CvStatus *EllipseWithParams_Async( - Mat img, - Point center, - Point axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - int lineType, - int shift, - CvCallback_0 callback -); -CvStatus *Line_Async( - Mat img, - Point pt1, - Point pt2, - Scalar color, - int thickness, - int lineType, - int shift, - CvCallback_0 callback -); -CvStatus *Rectangle_Async(Mat img, Rect rect, Scalar color, int thickness, CvCallback_0 callback); -CvStatus *RectangleWithParams_Async( - Mat img, Rect rect, Scalar color, int thickness, int lineType, int shift, CvCallback_0 callback -); -CvStatus *FillPoly_Async(Mat img, VecVecPoint points, Scalar color, CvCallback_0 callback); -CvStatus *FillPolyWithParams_Async( - Mat img, - VecVecPoint points, - Scalar color, - int lineType, - int shift, - Point offset, - CvCallback_0 callback -); -CvStatus *Polylines_Async( - Mat img, VecVecPoint points, bool isClosed, Scalar color, int thickness, CvCallback_0 callback -); -CvStatus *GetTextSizeWithBaseline_Async( - const char *text, int fontFace, double fontScale, int thickness, CvCallback_2 callback -); -CvStatus *PutText_Async( - Mat img, - const char *text, - Point org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - CvCallback_0 callback -); -CvStatus *PutTextWithParams_Async( - Mat img, - const char *text, - Point org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - int lineType, - bool bottomLeftOrigin, - CvCallback_0 callback -); -CvStatus *Resize_Async(Mat src, Size sz, double fx, double fy, int interp, CvCallback_1 callback); -CvStatus *GetRectSubPix_Async(Mat src, Size patchSize, Point2f center, CvCallback_1 callback); -CvStatus * -GetRotationMatrix2D_Async(Point2f center, double angle, double scale, CvCallback_1 callback); -CvStatus *WarpAffine_Async(Mat src, Mat rot_mat, Size dsize, CvCallback_1 callback); -CvStatus *WarpAffineWithParams_Async( - Mat src, - Mat rot_mat, - Size dsize, - int flags, - int borderMode, - Scalar borderValue, - CvCallback_1 callback -); -CvStatus *WarpPerspective_Async(Mat src, Mat m, Size dsize, CvCallback_1 callback); -CvStatus *WarpPerspectiveWithParams_Async( - Mat src, - Mat rot_mat, - Size dsize, - int flags, - int borderMode, - Scalar borderValue, - CvCallback_1 callback -); -CvStatus *Watershed_Async(Mat image, Mat markers, CvCallback_0 callback); -CvStatus *ApplyColorMap_Async(Mat src, int colormap, CvCallback_1 callback); -CvStatus *ApplyCustomColorMap_Async(Mat src, Mat colormap, CvCallback_1 callback); -CvStatus * -GetPerspectiveTransform_Async(VecPoint src, VecPoint dst, int solveMethod, CvCallback_1 callback); -CvStatus *GetPerspectiveTransform2f_Async( - VecPoint2f src, VecPoint2f dst, int solveMethod, CvCallback_1 callback -); -CvStatus *GetAffineTransform_Async(VecPoint src, VecPoint dst, CvCallback_1 callback); -CvStatus *GetAffineTransform2f_Async(VecPoint2f src, VecPoint2f dst, CvCallback_1 callback); - -CvStatus *DrawContours_Async( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - CvCallback_0 callback -); -CvStatus *DrawContoursWithParams_Async( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - int lineType, - Mat hierarchy, - int maxLevel, - Point offset, - CvCallback_0 callback -); -CvStatus *Sobel_Async( - Mat src, - int ddepth, - int dx, - int dy, - int ksize, - double scale, - double delta, - int borderType, - CvCallback_1 callback -); -CvStatus *SpatialGradient_Async(Mat src, int ksize, int borderType, CvCallback_2 callback); -CvStatus *Remap_Async( - Mat src, - Mat map1, - Mat map2, - int interpolation, - int borderMode, - Scalar borderValue, - CvCallback_1 callback -); -CvStatus *Filter2D_Async( - Mat src, - int ddepth, - Mat kernel, - Point anchor, - double delta, - int borderType, - CvCallback_1 callback -); -CvStatus *SepFilter2D_Async( - Mat src, - int ddepth, - Mat kernelX, - Mat kernelY, - Point anchor, - double delta, - int borderType, - CvCallback_1 callback -); -CvStatus *LogPolar_Async(Mat src, Point2f center, double m, int flags, CvCallback_1 callback); -CvStatus *FitLine_Async( - VecPoint pts, int distType, double param, double reps, double aeps, CvCallback_1 callback -); -CvStatus * -LinearPolar_Async(Mat src, Point2f center, double maxRadius, int flags, CvCallback_1 callback); -CvStatus *MatchShapes_Async( - VecPoint contour1, VecPoint contour2, int method, double parameter, CvCallback_1 callback -); -CvStatus *ClipLine_Async(Rect imgRect, Point pt1, Point pt2, CvCallback_1 callback); - -CvStatus *CLAHE_Create_Async(CvCallback_1 callback); -CvStatus *CLAHE_CreateWithParams_Async(double clipLimit, Size tileGridSize, CvCallback_1 callback); -void CLAHE_Close_Async(CLAHEPtr self, CvCallback_0 callback); -CvStatus *CLAHE_Apply_Async(CLAHE self, Mat src, CvCallback_1 callback); -CvStatus *CLAHE_CollectGarbage_Async(CLAHE self, CvCallback_0 callback); -CvStatus *CLAHE_GetClipLimit_Async(CLAHE self, CvCallback_1 callback); -CvStatus *CLAHE_SetClipLimit_Async(CLAHE self, double clipLimit, CvCallback_0 callback); -CvStatus *CLAHE_GetTilesGridSize_Async(CLAHE self, CvCallback_1 callback); -CvStatus *CLAHE_SetTilesGridSize_Async(CLAHE self, Size size, CvCallback_0 callback); - -CvStatus *Subdiv2D_NewEmpty_Async(CvCallback_1 callback); -CvStatus *Subdiv2D_NewWithRect_Async(Rect rect, CvCallback_1 callback); -void Subdiv2D_Close_Async(Subdiv2DPtr self, CvCallback_0 callback); -CvStatus *Subdiv2D_EdgeDst_Async(Subdiv2D self, int edge, CvCallback_2 callback); -CvStatus *Subdiv2D_EdgeOrg_Async(Subdiv2D self, int edge, CvCallback_2 callback); -CvStatus *Subdiv2D_FindNearest_Async(Subdiv2D self, Point2f pt, CvCallback_2 callback); -CvStatus *Subdiv2D_GetEdge_Async(Subdiv2D self, int edge, int nextEdgeType, CvCallback_1 callback); -CvStatus *Subdiv2D_GetEdgeList_Async(Subdiv2D self, CvCallback_1 callback); -CvStatus *Subdiv2D_GetLeadingEdgeList_Async(Subdiv2D self, CvCallback_1 callback); -CvStatus *Subdiv2D_GetTriangleList_Async(Subdiv2D self, CvCallback_1 callback); -CvStatus *Subdiv2D_GetVertex_Async(Subdiv2D self, int vertex, CvCallback_2 callback); -CvStatus *Subdiv2D_GetVoronoiFacetList_Async(Subdiv2D self, VecI32 idx, CvCallback_2 callback); -CvStatus *Subdiv2D_InitDelaunay_Async(Subdiv2D self, Rect rect, CvCallback_0 callback); -CvStatus *Subdiv2D_Insert_Async(Subdiv2D self, Point2f pt, CvCallback_1 callback); -CvStatus *Subdiv2D_InsertVec_Async(Subdiv2D self, VecPoint2f ptvec, CvCallback_0 callback); -CvStatus *Subdiv2D_Locate_Async(Subdiv2D self, Point2f pt, CvCallback_3 callback); -CvStatus *Subdiv2D_NextEdge_Async(Subdiv2D self, int edge, CvCallback_1 callback); -CvStatus *Subdiv2D_RotateEdge_Async(Subdiv2D self, int edge, int rotate, CvCallback_1 callback); -CvStatus *Subdiv2D_SymEdge_Async(Subdiv2D self, int edge, CvCallback_1 callback); - -CvStatus *InvertAffineTransform_Async(Mat src, CvCallback_1 callback); -CvStatus *PhaseCorrelate_Async(Mat src1, Mat src2, Mat window, CvCallback_2 callback); - -CvStatus *Mat_Accumulate_Async(Mat src, Mat dst, CvCallback_0 callback); -CvStatus *Mat_AccumulateWithMask_Async(Mat src, Mat dst, Mat mask, CvCallback_0 callback); -CvStatus *Mat_AccumulateSquare_Async(Mat src, Mat dst, CvCallback_0 callback); -CvStatus *Mat_AccumulateSquareWithMask_Async(Mat src, Mat dst, Mat mask, CvCallback_0 callback); -CvStatus *Mat_AccumulateProduct_Async(Mat src1, Mat src2, Mat dst, CvCallback_0 callback); -CvStatus * -Mat_AccumulateProductWithMask_Async(Mat src1, Mat src2, Mat dst, Mat mask, CvCallback_0 callback); -CvStatus *Mat_AccumulatedWeighted_Async(Mat src, Mat dst, double alpha, CvCallback_0 callback); -CvStatus *Mat_AccumulatedWeightedWithMask_Async( - Mat src, Mat dst, double alpha, Mat mask, CvCallback_0 callback -); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_ASYNC_IMGPROC_H diff --git a/src/objdetect/objdetect.cpp b/src/objdetect/objdetect.cpp deleted file mode 100644 index 2d28af2c..00000000 --- a/src/objdetect/objdetect.cpp +++ /dev/null @@ -1,608 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "objdetect.h" -#include "core/vec.hpp" -#include - -// CascadeClassifier -CvStatus *CascadeClassifier_New(CascadeClassifier *rval) { - BEGIN_WRAP - *rval = {new cv::CascadeClassifier()}; - END_WRAP -} -CvStatus *CascadeClassifier_NewFromFile(char *filename, CascadeClassifier *rval) { - BEGIN_WRAP - *rval = {new cv::CascadeClassifier(filename)}; - END_WRAP -} -void CascadeClassifier_Close(CascadeClassifierPtr self) { CVD_FREE(self); } - -CvStatus *CascadeClassifier_Load(CascadeClassifier self, const char *name, int *rval) { - BEGIN_WRAP - *rval = self.ptr->load(name); - END_WRAP -} -CvStatus *CascadeClassifier_DetectMultiScale(CascadeClassifier self, Mat img, VecRect *rval) { - BEGIN_WRAP - std::vector rects = std::vector(); - self.ptr->detectMultiScale(*img.ptr, rects); - *rval = vecrect_cpp2c(rects); - END_WRAP -} -CvStatus *CascadeClassifier_DetectMultiScaleWithParams( - CascadeClassifier self, - Mat img, - VecRect *objects, - double scale, - int minNeighbors, - int flags, - Size minSize, - Size maxSize -) { - BEGIN_WRAP - std::vector rects; - auto minsize = cv::Size(minSize.width, minSize.height); - auto maxsize = cv::Size(maxSize.width, maxSize.height); - self.ptr->detectMultiScale(*img.ptr, rects, scale, minNeighbors, flags, minsize, maxsize); - *objects = vecrect_cpp2c(rects); - END_WRAP -} - -CvStatus *CascadeClassifier_DetectMultiScale2( - CascadeClassifier self, - Mat img, - VecRect *objects, - VecI32 *numDetections, - double scaleFactor, - int minNeighbors, - int flags, - Size minSize, - Size maxSize -) { - BEGIN_WRAP - std::vector rects; - std::vector nums; - auto minsize = cv::Size(minSize.width, minSize.height); - auto maxsize = cv::Size(maxSize.width, maxSize.height); - self.ptr->detectMultiScale( - *img.ptr, rects, nums, scaleFactor, minNeighbors, flags, minsize, maxsize - ); - *objects = vecrect_cpp2c(rects); - *numDetections = vecint_cpp2c(nums); - END_WRAP -} - -CvStatus *CascadeClassifier_DetectMultiScale3( - CascadeClassifier self, - Mat img, - VecRect *objects, - VecI32 *rejectLevels, - VecF64 *levelWeights, - double scaleFactor, - int minNeighbors, - int flags, - Size minSize, - Size maxSize, - bool outputRejectLevels -) { - BEGIN_WRAP - std::vector rects; - std::vector rejects; - std::vector weights; - auto minsize = cv::Size(minSize.width, minSize.height); - auto maxsize = cv::Size(maxSize.width, maxSize.height); - self.ptr->detectMultiScale( - *img.ptr, - rects, - rejects, - weights, - scaleFactor, - minNeighbors, - flags, - minsize, - maxsize, - outputRejectLevels - ); - *objects = vecrect_cpp2c(rects); - *rejectLevels = vecint_cpp2c(rejects); - *levelWeights = vecdouble_cpp2c(weights); - END_WRAP -} -CvStatus *CascadeClassifier_Empty(CascadeClassifier self, bool *rval) { - BEGIN_WRAP - *rval = self.ptr->empty(); - END_WRAP -} -CvStatus *CascadeClassifier_getFeatureType(CascadeClassifier self, int *rval) { - BEGIN_WRAP - *rval = self.ptr->getFeatureType(); - END_WRAP -} -CvStatus *CascadeClassifier_getOriginalWindowSize(CascadeClassifier self, Size *rval) { - BEGIN_WRAP - auto sz = self.ptr->getOriginalWindowSize(); - *rval = {sz.width, sz.height}; - END_WRAP -} -CvStatus *CascadeClassifier_isOldFormatCascade(CascadeClassifier self, bool *rval) { - BEGIN_WRAP - *rval = self.ptr->isOldFormatCascade(); - END_WRAP -} - -CvStatus *HOGDescriptor_New(HOGDescriptor *rval) { - BEGIN_WRAP - *rval = {new cv::HOGDescriptor()}; - END_WRAP -} -CvStatus *HOGDescriptor_NewFromFile(char *filename, HOGDescriptor *rval) { - BEGIN_WRAP - *rval = {new cv::HOGDescriptor(filename)}; - END_WRAP -} -void HOGDescriptor_Close(HOGDescriptorPtr self) { CVD_FREE(self); } - -CvStatus *HOGDescriptor_Load(HOGDescriptor self, char *name, bool *rval) { - BEGIN_WRAP - *rval = self.ptr->load(name); - END_WRAP -} -CvStatus *HOGDescriptor_Detect( - HOGDescriptor self, - Mat img, - VecPoint *foundLocations, - VecF64 *weights, - double hitThresh, - Size winStride, - Size padding, - VecPoint *searchLocations -) { - BEGIN_WRAP - std::vector _foundLocations; - std::vector _searchLocations; - std::vector _weights; - self.ptr->detect( - *img.ptr, - _foundLocations, - _weights, - hitThresh, - cv::Point(winStride.width, winStride.height), - cv::Point(padding.width, padding.height), - _searchLocations - ); - *foundLocations = vecpoint_cpp2c(_foundLocations); - *weights = vecdouble_cpp2c(_weights); - *searchLocations = vecpoint_cpp2c(_searchLocations); - END_WRAP -} -CvStatus *HOGDescriptor_Detect2( - HOGDescriptor self, - Mat img, - VecPoint *foundLocations, - double hitThresh, - Size winStride, - Size padding, - VecPoint *searchLocations -) { - BEGIN_WRAP - std::vector _foundLocations; - std::vector _searchLocations; - self.ptr->detect( - *img.ptr, - _foundLocations, - hitThresh, - cv::Point(winStride.width, winStride.height), - cv::Point(padding.width, padding.height), - _searchLocations - ); - *foundLocations = vecpoint_cpp2c(_foundLocations); - *searchLocations = vecpoint_cpp2c(_searchLocations); - END_WRAP -} -CvStatus *HOGDescriptor_DetectMultiScale(HOGDescriptor self, Mat img, VecRect *rval) { - BEGIN_WRAP - std::vector rects = std::vector(); - self.ptr->detectMultiScale(*img.ptr, rects); - *rval = vecrect_cpp2c(rects); - END_WRAP -} -CvStatus *HOGDescriptor_DetectMultiScaleWithParams( - HOGDescriptor self, - Mat img, - double hitThresh, - Size winStride, - Size padding, - double scale, - double finalThreshold, - bool useMeanshiftGrouping, - VecRect *rval -) { - BEGIN_WRAP - std::vector rects; - auto winstride = cv::Size(winStride.width, winStride.height); - auto pad = cv::Size(padding.width, padding.height); - self.ptr->detectMultiScale( - *img.ptr, rects, hitThresh, winstride, pad, scale, finalThreshold, useMeanshiftGrouping - ); - *rval = vecrect_cpp2c(rects); - END_WRAP -} -CvStatus *HOG_GetDefaultPeopleDetector(VecF32 *rval) { - BEGIN_WRAP - *rval = vecfloat_cpp2c(cv::HOGDescriptor::getDefaultPeopleDetector()); - END_WRAP -} -CvStatus *HOGDescriptor_SetSVMDetector(HOGDescriptor self, VecF32 det) { - BEGIN_WRAP - self.ptr->setSVMDetector(vecfloat_c2cpp(det)); - END_WRAP -} -CvStatus *HOGDescriptor_Compute( - HOGDescriptor self, - Mat img, - VecF32 *descriptors, - Size winStride, - Size padding, - VecPoint *locations -) { - BEGIN_WRAP - std::vector _descriptors; - std::vector _locations; - self.ptr->compute( - *img.ptr, - _descriptors, - cv::Size(winStride.width, winStride.height), - cv::Size(padding.width, padding.height), - _locations - ); - *descriptors = vecfloat_cpp2c(_descriptors); - *locations = vecpoint_cpp2c(_locations); - END_WRAP -} -CvStatus *HOGDescriptor_computeGradient( - HOGDescriptor self, Mat img, Mat grad, Mat angleOfs, Size paddingTL, Size paddingBR -) { - BEGIN_WRAP - self.ptr->computeGradient( - *img.ptr, - *grad.ptr, - *angleOfs.ptr, - cv::Size(paddingTL.width, paddingTL.height), - cv::Size(paddingBR.width, paddingBR.height) - ); - END_WRAP -} -// CvStatus *HOGDescriptor_detectMultiScaleROI(HOGDescriptor self, Mat img, VecRect *foundLocations, -// DetectionROI *locations, int *lenLocations, double -// hitThreshold, int groupThreshold) -// { -// BEGIN_WRAP -// auto _foundLocations = vecrect_cpp2c(); -// auto _locations = new std::vector(); -// self.ptr->detectMultiScaleROI(*img.ptr, *_foundLocations, *_locations, hitThreshold, -// groupThreshold); *foundLocations = {_foundLocations}; locations = _locations->data(); END_WRAP -// } -// CvStatus *HOGDescriptor_detectROI(HOGDescriptor self, Mat img, VecPoint *locations, VecPoint -// *foundLocations, -// VecF64 *confidences, double hitThreshold, Size winStride, -// Size padding) -// { -// BEGIN_WRAP -// auto _locations = vecpoint_cpp2c(); -// auto _foundLocations = vecpoint_cpp2c(); -// auto _confidences = vecdouble_cpp2c(); -// self.ptr->detectROI(*img.ptr, *_locations, *_foundLocations, *_confidences, hitThreshold, -// cv::Size(winStride.width, winStride.height), cv::Size(padding.width, -// padding.height)); -// *locations = {_locations}; -// *foundLocations = {_foundLocations}; -// *confidences = {_confidences}; -// END_WRAP -// } -CvStatus *HOGDescriptor_getDaimlerPeopleDetector(VecF32 *rval) { - BEGIN_WRAP - *rval = vecfloat_cpp2c(cv::HOGDescriptor::getDaimlerPeopleDetector()); - END_WRAP -} -CvStatus *HOGDescriptor_getDescriptorSize(HOGDescriptor self, size_t *rval) { - BEGIN_WRAP - *rval = self.ptr->getDescriptorSize(); - END_WRAP -} -CvStatus *HOGDescriptor_getWinSigma(HOGDescriptor self, double *rval) { - BEGIN_WRAP - *rval = self.ptr->getWinSigma(); - END_WRAP -} -CvStatus *HOGDescriptor_groupRectangles( - HOGDescriptor self, VecRect *rectList, VecF64 *weights, int groupThreshold, double eps -) { - BEGIN_WRAP - auto _rectList = vecrect_c2cpp(*rectList); - auto _weights = vecdouble_c2cpp(*weights); - self.ptr->groupRectangles(_rectList, _weights, groupThreshold, eps); - vecrect_cpp2c(_rectList, rectList); - vecdouble_cpp2c(_weights, weights); - END_WRAP -} - -CvStatus *GroupRectangles(VecRect *rects, int groupThreshold, double eps) { - BEGIN_WRAP - auto _rects = vecrect_c2cpp(*rects); - cv::groupRectangles(_rects, groupThreshold, eps); - vecrect_cpp2c(_rects, rects); - END_WRAP -} - -CvStatus *QRCodeDetector_New(QRCodeDetector *rval) { - BEGIN_WRAP - *rval = {new cv::QRCodeDetector()}; - END_WRAP -} -CvStatus *QRCodeDetector_DetectAndDecode( - QRCodeDetector self, Mat input, VecPoint *points, Mat *straight_qrcode, char **rval -) { - BEGIN_WRAP - std::vector points_; - cv::Mat mat; - auto info = self.ptr->detectAndDecode(*input.ptr, points_, mat); - *rval = strdup(info.c_str()); - *points = vecpoint_cpp2c(points_); - *straight_qrcode = {new cv::Mat(mat)}; - END_WRAP -} -CvStatus *QRCodeDetector_Detect(QRCodeDetector self, Mat input, VecPoint *points, bool *rval) { - BEGIN_WRAP - std::vector _points; - *rval = self.ptr->detect(*input.ptr, _points); - *points = vecpoint_cpp2c(_points); - END_WRAP -} -CvStatus *QRCodeDetector_Decode( - QRCodeDetector self, Mat input, VecPoint *points, Mat straight_qrcode, char **rval -) { - BEGIN_WRAP - std::vector _points; - auto info = self.ptr->detectAndDecode(*input.ptr, _points, *straight_qrcode.ptr); - *rval = strdup(info.c_str()); - *points = vecpoint_cpp2c(_points); - END_WRAP -} -CvStatus *QRCodeDetector_decodeCurved( - QRCodeDetector self, Mat img, VecPoint points, CVD_OUT Mat *straight_qrcode, char **rval -) { - BEGIN_WRAP - cv::Mat _straight_qrcode; - auto _points = vecpoint_c2cpp(points); - auto ret = self.ptr->decodeCurved(*img.ptr, _points, _straight_qrcode); - *rval = strdup(ret.c_str()); - *straight_qrcode = {new cv::Mat(_straight_qrcode)}; - END_WRAP -} -CvStatus *QRCodeDetector_detectAndDecodeCurved( - QRCodeDetector self, Mat img, VecPoint *points, CVD_OUT Mat *straight_qrcode, char **rval -) { - BEGIN_WRAP - cv::Mat _straight_qrcode; - std::vector _points; - auto ret = self.ptr->detectAndDecodeCurved(*img.ptr, _points, _straight_qrcode); - *rval = strdup(ret.c_str()); - *points = vecpoint_cpp2c(_points); - *straight_qrcode = {new cv::Mat(_straight_qrcode)}; - END_WRAP -} -void QRCodeDetector_Close(QRCodeDetectorPtr self) { CVD_FREE(self); } - -CvStatus *QRCodeDetector_DetectMulti(QRCodeDetector self, Mat input, VecPoint *points, bool *rval) { - BEGIN_WRAP - std::vector _points; - *rval = self.ptr->detectMulti(*input.ptr, _points); - *points = vecpoint_cpp2c(_points); - END_WRAP -} -CvStatus *QRCodeDetector_DetectAndDecodeMulti( - QRCodeDetector self, - Mat input, - VecVecChar *decoded, - VecPoint *points, - VecMat *straight_code, - bool *rval -) { - BEGIN_WRAP - std::vector decodedCodes; - std::vector straightQrCodes; - std::vector points_; - - *rval = self.ptr->detectAndDecodeMulti(*input.ptr, decodedCodes, points_, straightQrCodes); - if (!*rval) { - *decoded = {NULL, 0}; - *straight_code = {NULL, 0}; - *points = {NULL, 0}; - } else { - std::vector> vecvec; - for (int i = 0; i < decodedCodes.size(); i++) { - vecvec.push_back(std::vector(decodedCodes[i].begin(), decodedCodes[i].end())); - } - *decoded = vecvecchar_cpp2c(vecvec); - *straight_code = vecmat_cpp2c(straightQrCodes); - *points = vecpoint_cpp2c(points_); - } - END_WRAP -} - -CvStatus *QRCodeDetector_setEpsX(QRCodeDetector self, double epsX) { - BEGIN_WRAP - self.ptr->setEpsX(epsX); - END_WRAP -} -CvStatus *QRCodeDetector_setEpsY(QRCodeDetector self, double epsY) { - BEGIN_WRAP - self.ptr->setEpsY(epsY); - END_WRAP -} -CvStatus *QRCodeDetector_setUseAlignmentMarkers(QRCodeDetector self, bool useAlignmentMarkers) { - BEGIN_WRAP - self.ptr->setUseAlignmentMarkers(useAlignmentMarkers); - END_WRAP -} -// FaceDetectorYN -CvStatus *FaceDetectorYN_New( - const char *model, - const char *config, - Size input_size, - float score_threshold, - float nms_threshold, - int top_k, - int backend_id, - int target_id, - FaceDetectorYN *rval -) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::FaceDetectorYN::create( - model, - config, - cv::Size(input_size.width, input_size.height), - score_threshold, - nms_threshold, - top_k, - backend_id, - target_id - ))}; - END_WRAP -} - -CvStatus *FaceDetectorYN_NewFromBuffer( - const char *framework, - VecUChar buffer, - VecUChar buffer_config, - Size input_size, - float score_threshold, - float nms_threshold, - int top_k, - int backend_id, - int target_id, - FaceDetectorYN *rval -) { - BEGIN_WRAP - auto _buffer = vecuchar_c2cpp(buffer); - auto _buffer_config = vecuchar_c2cpp(buffer_config); - *rval = {new cv::Ptr(cv::FaceDetectorYN::create( - framework, - _buffer, - _buffer_config, - cv::Size(input_size.width, input_size.height), - score_threshold, - nms_threshold, - top_k, - backend_id, - target_id - ))}; - END_WRAP -} - -void FaceDetectorYN_Close(FaceDetectorYNPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *FaceDetectorYN_Detect(FaceDetectorYN self, Mat img, Mat *faces) { - BEGIN_WRAP - cv::Mat _faces; - (*self.ptr)->detect(*img.ptr, _faces); - *faces = {new cv::Mat(_faces)}; - END_WRAP -} - -CvStatus *FaceDetectorYN_SetInputSize(FaceDetectorYN self, Size input_size) { - BEGIN_WRAP(*self.ptr)->setInputSize(cv::Size(input_size.width, input_size.height)); - END_WRAP -} - -CvStatus *FaceDetectorYN_GetInputSize(FaceDetectorYN self, Size *input_size) { - BEGIN_WRAP - cv::Size sz = (*self.ptr)->getInputSize(); - *input_size = {sz.width, sz.height}; - END_WRAP -} - -CvStatus *FaceDetectorYN_SetScoreThreshold(FaceDetectorYN self, float score_threshold) { - BEGIN_WRAP(*self.ptr)->setScoreThreshold(score_threshold); - END_WRAP -} - -CvStatus *FaceDetectorYN_GetScoreThreshold(FaceDetectorYN self, float *score_threshold) { - BEGIN_WRAP - *score_threshold = (*self.ptr)->getScoreThreshold(); - END_WRAP -} -CvStatus *FaceDetectorYN_SetNMSThreshold(FaceDetectorYN self, float nms_threshold) { - BEGIN_WRAP(*self.ptr)->setNMSThreshold(nms_threshold); - END_WRAP -} - -CvStatus *FaceDetectorYN_GetNMSThreshold(FaceDetectorYN self, float *nms_threshold) { - BEGIN_WRAP - *nms_threshold = (*self.ptr)->getNMSThreshold(); - END_WRAP -} - -CvStatus *FaceDetectorYN_SetTopK(FaceDetectorYN self, int top_k) { - BEGIN_WRAP(*self.ptr)->setTopK(top_k); - END_WRAP -} - -CvStatus *FaceDetectorYN_GetTopK(FaceDetectorYN self, int *top_k) { - BEGIN_WRAP - *top_k = (*self.ptr)->getTopK(); - END_WRAP -} -// FaceRecognizerSF -CvStatus *FaceRecognizerSF_New( - const char *model, const char *config, int backend_id, int target_id, FaceRecognizerSF *rval -) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::FaceRecognizerSF::create(model, config, backend_id, target_id) - )}; - END_WRAP -} -void FaceRecognizerSF_Close(FaceRecognizerSFPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus * -FaceRecognizerSF_AlignCrop(FaceRecognizerSF self, Mat src_img, Mat face_box, Mat *aligned_img) { - BEGIN_WRAP - cv::Mat _align; - (*self.ptr)->alignCrop(*src_img.ptr, *face_box.ptr, _align); - *aligned_img = {new cv::Mat(_align)}; - END_WRAP -} - -CvStatus * -FaceRecognizerSF_Feature(FaceRecognizerSF self, Mat aligned_img, bool clone, Mat *face_feature) { - BEGIN_WRAP - cv::Mat _face_feature; - (*self.ptr)->feature(*aligned_img.ptr, _face_feature); - if (clone) { - *face_feature = {new cv::Mat(_face_feature.clone())}; - } else { - *face_feature = {new cv::Mat(_face_feature)}; - } - END_WRAP -} - -CvStatus *FaceRecognizerSF_Match( - FaceRecognizerSF self, Mat face_feature1, Mat face_feature2, int dis_type, double *distance -) { - BEGIN_WRAP - *distance = (*self.ptr)->match(*face_feature1.ptr, *face_feature2.ptr, dis_type); - END_WRAP -} diff --git a/src/objdetect/objdetect.h b/src/objdetect/objdetect.h deleted file mode 100644 index 03e8bf0b..00000000 --- a/src/objdetect/objdetect.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef _OPENCV3_OBJDETECT_H_ -#define _OPENCV3_OBJDETECT_H_ - -#include -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "core/core.h" -#include - -#ifdef __cplusplus -// Define types for the C++ classes used -CVD_TYPEDEF(cv::CascadeClassifier, CascadeClassifier); -CVD_TYPEDEF(cv::HOGDescriptor, HOGDescriptor); -CVD_TYPEDEF(cv::QRCodeDetector, QRCodeDetector); -CVD_TYPEDEF(cv::Ptr, FaceDetectorYN); -CVD_TYPEDEF(cv::Ptr, FaceRecognizerSF); -#else -// Define types for the C-compatible interface -CVD_TYPEDEF(void, CascadeClassifier); -CVD_TYPEDEF(void, HOGDescriptor); -CVD_TYPEDEF(void, QRCodeDetector); -CVD_TYPEDEF(void *, FaceDetectorYN); -CVD_TYPEDEF(void *, FaceRecognizerSF); -#endif - -// CascadeClassifier -CvStatus *CascadeClassifier_New(CascadeClassifier *rval); -CvStatus *CascadeClassifier_NewFromFile(char *filename, CascadeClassifier *rval); -void CascadeClassifier_Close(CascadeClassifierPtr self); -CvStatus *CascadeClassifier_Load(CascadeClassifier self, const char *name, int *rval); -CvStatus *CascadeClassifier_DetectMultiScale(CascadeClassifier self, Mat img, VecRect *rval); -CvStatus *CascadeClassifier_DetectMultiScaleWithParams(CascadeClassifier self, Mat img, VecRect *objects, - double scale, int minNeighbors, int flags, - Size minSize, Size maxSize); -CvStatus *CascadeClassifier_DetectMultiScale2(CascadeClassifier self, Mat img, VecRect *objects, - VecI32 *numDetections, double scaleFactor, int minNeighbors, - int flags, Size minSize, Size maxSize); -CvStatus *CascadeClassifier_DetectMultiScale3(CascadeClassifier self, Mat img, VecRect *objects, - VecI32 *rejectLevels, VecF64 *levelWeights, - double scaleFactor, int minNeighbors, int flags, Size minSize, - Size maxSize, bool outputRejectLevels); -CvStatus *CascadeClassifier_Empty(CascadeClassifier self, bool *rval); -CvStatus *CascadeClassifier_getFeatureType(CascadeClassifier self, int *rval); -CvStatus *CascadeClassifier_getOriginalWindowSize(CascadeClassifier self, Size *rval); -CvStatus *CascadeClassifier_isOldFormatCascade(CascadeClassifier self, bool *rval); - -// HOGDescriptor -// struct for detection region of interest (ROI) -// typedef struct DetectionROI { -// VecF64 confidences; -// VecPoint locations; -// double scale; -// } DetectionROI; -CvStatus *HOGDescriptor_New(HOGDescriptor *rval); -CvStatus *HOGDescriptor_NewFromFile(char *filename, HOGDescriptor *rval); -void HOGDescriptor_Close(HOGDescriptorPtr self); -CvStatus *HOGDescriptor_Load(HOGDescriptor self, char *name, bool *rval); -CvStatus *HOGDescriptor_Detect(HOGDescriptor self, Mat img, VecPoint *foundLocations, VecF64 *weights, - double hitThresh, Size winStride, Size padding, VecPoint *searchLocations); -CvStatus *HOGDescriptor_Detect2(HOGDescriptor self, Mat img, VecPoint *foundLocations, double hitThresh, - Size winStride, Size padding, VecPoint *searchLocations); -CvStatus *HOGDescriptor_DetectMultiScale(HOGDescriptor self, Mat img, VecRect *rval); -CvStatus *HOGDescriptor_DetectMultiScaleWithParams(HOGDescriptor self, Mat img, double hitThresh, - Size winStride, Size padding, double scale, - double finalThreshold, bool useMeanshiftGrouping, - VecRect *rval); -CvStatus *HOG_GetDefaultPeopleDetector(VecF32 *rval); -CvStatus *HOGDescriptor_SetSVMDetector(HOGDescriptor self, VecF32 det); -CvStatus *HOGDescriptor_Compute(HOGDescriptor self, Mat img, VecF32 *descriptors, Size winStride, - Size padding, VecPoint *locations); -CvStatus *HOGDescriptor_computeGradient(HOGDescriptor self, Mat img, Mat grad, Mat angleOfs, Size paddingTL, - Size paddingBR); -// CvStatus *HOGDescriptor_detectMultiScaleROI(HOGDescriptor self, Mat img, VecRect *foundLocations, -// DetectionROI *locations, int *lenLocations, double hitThreshold, -// int groupThreshold); -// CvStatus *HOGDescriptor_detectROI(HOGDescriptor self, Mat img, VecPoint *locations, VecPoint -// *foundLocations, -// VecF64 *confidences, double hitThreshold, Size winStride, Size -// padding); -CvStatus *HOGDescriptor_getDaimlerPeopleDetector(VecF32 *rval); -CvStatus *HOGDescriptor_getDescriptorSize(HOGDescriptor self, size_t *rval); -CvStatus *HOGDescriptor_getWinSigma(HOGDescriptor self, double *rval); -CvStatus *HOGDescriptor_groupRectangles(HOGDescriptor self, VecRect *rectList, VecF64 *weights, - int groupThreshold, double eps); -CvStatus *GroupRectangles(VecRect *rects, int groupThreshold, double eps); - -// QRCodeDetector -CvStatus *QRCodeDetector_New(QRCodeDetector *rval); -void QRCodeDetector_Close(QRCodeDetectorPtr self); -CvStatus *QRCodeDetector_DetectAndDecode(QRCodeDetector self, Mat input, VecPoint *points, - Mat *straight_qrcode, char **rval); -CvStatus *QRCodeDetector_Detect(QRCodeDetector self, Mat input, VecPoint *points, bool *rval); -CvStatus *QRCodeDetector_Decode(QRCodeDetector self, Mat input, VecPoint *points, Mat straight_qrcode, - char **rval); -CvStatus *QRCodeDetector_decodeCurved(QRCodeDetector self, Mat img, VecPoint points, - CVD_OUT Mat *straight_qrcode, char **rval); -CvStatus *QRCodeDetector_detectAndDecodeCurved(QRCodeDetector self, Mat img, VecPoint *points, - CVD_OUT Mat *straight_qrcode, char **rval); -CvStatus *QRCodeDetector_DetectMulti(QRCodeDetector self, Mat input, VecPoint *points, bool *rval); -CvStatus *QRCodeDetector_DetectAndDecodeMulti(QRCodeDetector self, Mat input, VecVecChar *decoded, - VecPoint *points, VecMat *straight_code, bool *rval); -CvStatus *QRCodeDetector_setEpsX(QRCodeDetector self, double epsX); -CvStatus *QRCodeDetector_setEpsY(QRCodeDetector self, double epsY); -CvStatus *QRCodeDetector_setUseAlignmentMarkers(QRCodeDetector self, bool useAlignmentMarkers); - -// FaceDetectorYN -CvStatus *FaceDetectorYN_New(const char *model, const char *config, Size input_size, float score_threshold, - float nms_threshold, int top_k, int backend_id, int target_id, - FaceDetectorYN *rval); -CvStatus *FaceDetectorYN_NewFromBuffer(const char *framework, VecUChar buffer, VecUChar buffer_config, - Size input_size, float score_threshold, float nms_threshold, int top_k, - int backend_id, int target_id, FaceDetectorYN *rval); -void FaceDetectorYN_Close(FaceDetectorYNPtr self); -CvStatus *FaceDetectorYN_Detect(FaceDetectorYN self, Mat img, Mat *faces); -CvStatus *FaceDetectorYN_SetInputSize(FaceDetectorYN self, Size input_size); -CvStatus *FaceDetectorYN_SetScoreThreshold(FaceDetectorYN self, float score_threshold); -CvStatus *FaceDetectorYN_SetNMSThreshold(FaceDetectorYN self, float nms_threshold); -CvStatus *FaceDetectorYN_SetTopK(FaceDetectorYN self, int top_k); -CvStatus *FaceDetectorYN_GetInputSize(FaceDetectorYN self, Size *input_size); -CvStatus *FaceDetectorYN_GetScoreThreshold(FaceDetectorYN self, float *score_threshold); -CvStatus *FaceDetectorYN_GetNMSThreshold(FaceDetectorYN self, float *nms_threshold); -CvStatus *FaceDetectorYN_GetTopK(FaceDetectorYN self, int *top_k); - -// FaceRecognizerSF -CvStatus *FaceRecognizerSF_New(const char *model, const char *config, int backend_id, int target_id, - FaceRecognizerSF *rval); -void FaceRecognizerSF_Close(FaceRecognizerSFPtr self); -CvStatus *FaceRecognizerSF_AlignCrop(FaceRecognizerSF self, Mat src_img, Mat face_box, Mat *aligned_img); -CvStatus *FaceRecognizerSF_Feature(FaceRecognizerSF self, Mat aligned_img, bool clone, Mat *face_feature); -CvStatus *FaceRecognizerSF_Match(FaceRecognizerSF self, Mat face_feature1, Mat face_feature2, int dis_type, - double *distance); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_OBJDETECT_H_ diff --git a/src/objdetect/objdetect_async.cpp b/src/objdetect/objdetect_async.cpp deleted file mode 100644 index a630b932..00000000 --- a/src/objdetect/objdetect_async.cpp +++ /dev/null @@ -1,637 +0,0 @@ -#include "objdetect_async.h" -#include "core/types.h" -#include "core/vec.hpp" -#include - -// Asynchronous functions for CascadeClassifier -CvStatus *CascadeClassifier_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new CascadeClassifier{new cv::CascadeClassifier()}); - END_WRAP -} - -CvStatus *CascadeClassifier_NewFromFile_Async(const char *filename, CvCallback_1 callback) { - BEGIN_WRAP - callback(new CascadeClassifier{new cv::CascadeClassifier(filename)}); - END_WRAP -} - -CvStatus * -CascadeClassifier_Load_Async(CascadeClassifier self, const char *name, CvCallback_1 callback) { - BEGIN_WRAP - int rval = self.ptr->load(name); - callback(new int(rval)); - END_WRAP -} - -CvStatus * -CascadeClassifier_DetectMultiScale_Async(CascadeClassifier self, Mat img, CvCallback_1 callback) { - BEGIN_WRAP - std::vector rects; - self.ptr->detectMultiScale(*img.ptr, rects); - callback(vecrect_cpp2c_p(rects)); - END_WRAP -} - -CvStatus *CascadeClassifier_DetectMultiScaleWithParams_Async( - CascadeClassifier self, - Mat img, - double scale, - int minNeighbors, - int flags, - Size minSize, - Size maxSize, - CvCallback_1 callback -) { - BEGIN_WRAP - std::vector rects; - auto minsize = cv::Size(minSize.width, minSize.height); - auto maxsize = cv::Size(maxSize.width, maxSize.height); - self.ptr->detectMultiScale(*img.ptr, rects, scale, minNeighbors, flags, minsize, maxsize); - callback(vecrect_cpp2c_p(rects)); - END_WRAP -} - -CvStatus *CascadeClassifier_DetectMultiScale2_Async( - CascadeClassifier self, - Mat img, - double scaleFactor, - int minNeighbors, - int flags, - Size minSize, - Size maxSize, - CvCallback_2 callback -) { - BEGIN_WRAP - std::vector rects; - std::vector nums; - auto minsize = cv::Size(minSize.width, minSize.height); - auto maxsize = cv::Size(maxSize.width, maxSize.height); - self.ptr->detectMultiScale( - *img.ptr, rects, nums, scaleFactor, minNeighbors, flags, minsize, maxsize - ); - callback(vecrect_cpp2c_p(rects), vecint_cpp2c_p(nums)); - END_WRAP -} - -CvStatus *CascadeClassifier_DetectMultiScale3_Async( - CascadeClassifier self, - Mat img, - double scaleFactor, - int minNeighbors, - int flags, - Size minSize, - Size maxSize, - bool outputRejectLevels, - CvCallback_3 callback -) { - BEGIN_WRAP - std::vector rects; - std::vector rejects; - std::vector weights; - auto minsize = cv::Size(minSize.width, minSize.height); - auto maxsize = cv::Size(maxSize.width, maxSize.height); - self.ptr->detectMultiScale( - *img.ptr, - rects, - rejects, - weights, - scaleFactor, - minNeighbors, - flags, - minsize, - maxsize, - outputRejectLevels - ); - callback( - vecrect_cpp2c_p(rects), - vecint_cpp2c_p(rejects), - vecdouble_cpp2c_p(weights) - ); - END_WRAP -} - -CvStatus *CascadeClassifier_Empty_Async(CascadeClassifier self, CvCallback_1 callback) { - BEGIN_WRAP - bool rval = self.ptr->empty(); - callback(new bool(rval)); - END_WRAP -} - -CvStatus *CascadeClassifier_getFeatureType_Async(CascadeClassifier self, CvCallback_1 callback) { - BEGIN_WRAP - int rval = self.ptr->getFeatureType(); - callback(new int(rval)); - END_WRAP -} - -CvStatus * -CascadeClassifier_getOriginalWindowSize_Async(CascadeClassifier self, CvCallback_1 callback) { - BEGIN_WRAP - auto sz = self.ptr->getOriginalWindowSize(); - callback(new Size{sz.width, sz.height}); - END_WRAP -} - -CvStatus * -CascadeClassifier_isOldFormatCascade_Async(CascadeClassifier self, CvCallback_1 callback) { - BEGIN_WRAP - bool rval = self.ptr->isOldFormatCascade(); - callback(new bool(rval)); - END_WRAP -} - -// Asynchronous functions for HOGDescriptor -CvStatus *HOGDescriptor_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new HOGDescriptor{new cv::HOGDescriptor()}); - END_WRAP -} - -CvStatus *HOGDescriptor_NewFromFile_Async(const char *filename, CvCallback_1 callback) { - BEGIN_WRAP - callback(new HOGDescriptor{new cv::HOGDescriptor(filename)}); - END_WRAP -} - -CvStatus *HOGDescriptor_Load_Async(HOGDescriptor self, const char *name, CvCallback_1 callback) { - BEGIN_WRAP - bool rval = self.ptr->load(name); - callback(new bool(rval)); - END_WRAP -} - -CvStatus *HOGDescriptor_Detect_Async( - HOGDescriptor self, - Mat img, - double hitThresh, - Size winStride, - Size padding, - CvCallback_3 callback -) { - BEGIN_WRAP - std::vector _foundLocations; - std::vector _searchLocations; - std::vector _weights; - self.ptr->detect( - *img.ptr, - _foundLocations, - _weights, - hitThresh, - cv::Point(winStride.width, winStride.height), - cv::Point(padding.width, padding.height), - _searchLocations - ); - callback( - vecpoint_cpp2c_p(_foundLocations), - vecdouble_cpp2c_p(_weights), - vecpoint_cpp2c_p(_searchLocations) - ); - END_WRAP -} - -CvStatus *HOGDescriptor_Detect2_Async( - HOGDescriptor self, - Mat img, - double hitThresh, - Size winStride, - Size padding, - CvCallback_2 callback -) { - BEGIN_WRAP - std::vector _foundLocations; - std::vector _searchLocations; - self.ptr->detect( - *img.ptr, - _foundLocations, - hitThresh, - cv::Point(winStride.width, winStride.height), - cv::Point(padding.width, padding.height), - _searchLocations - ); - callback( - vecpoint_cpp2c_p(_foundLocations), vecpoint_cpp2c_p(_searchLocations) - ); - END_WRAP -} - -CvStatus *HOGDescriptor_DetectMultiScale_Async(HOGDescriptor self, Mat img, CvCallback_1 callback) { - BEGIN_WRAP - std::vector rects; - self.ptr->detectMultiScale(*img.ptr, rects); - callback(vecrect_cpp2c_p(rects)); - END_WRAP -} - -CvStatus *HOGDescriptor_DetectMultiScaleWithParams_Async( - HOGDescriptor self, - Mat img, - double hitThresh, - Size winStride, - Size padding, - double scale, - double finalThreshold, - bool useMeanshiftGrouping, - CvCallback_1 callback -) { - BEGIN_WRAP - std::vector rects; - auto winstride = cv::Size(winStride.width, winStride.height); - auto pad = cv::Size(padding.width, padding.height); - self.ptr->detectMultiScale( - *img.ptr, rects, hitThresh, winstride, pad, scale, finalThreshold, useMeanshiftGrouping - ); - callback(vecrect_cpp2c_p(rects)); - END_WRAP -} - -CvStatus *HOGDescriptor_Compute_Async( - HOGDescriptor self, Mat img, Size winStride, Size padding, CvCallback_2 callback -) { - BEGIN_WRAP - std::vector _descriptors; - std::vector _locations; - self.ptr->compute( - *img.ptr, - _descriptors, - cv::Size(winStride.width, winStride.height), - cv::Size(padding.width, padding.height), - _locations - ); - callback(vecfloat_cpp2c_p(_descriptors), vecpoint_cpp2c_p(_locations)); - END_WRAP -} - -CvStatus *HOGDescriptor_computeGradient_Async( - HOGDescriptor self, - Mat img, - Mat grad, - Mat angleOfs, - Size paddingTL, - Size paddingBR, - CvCallback_0 callback -) { - BEGIN_WRAP - self.ptr->computeGradient( - *img.ptr, - *grad.ptr, - *angleOfs.ptr, - cv::Size(paddingTL.width, paddingTL.height), - cv::Size(paddingBR.width, paddingBR.height) - ); - callback(); - END_WRAP -} - -CvStatus *HOG_GetDefaultPeopleDetector_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(vecfloat_cpp2c_p(cv::HOGDescriptor::getDefaultPeopleDetector())); - END_WRAP -} - -CvStatus * -HOGDescriptor_SetSVMDetector_Async(HOGDescriptor self, VecF32 det, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->setSVMDetector(vecfloat_c2cpp(det)); - callback(); - END_WRAP -} - -CvStatus *HOGDescriptor_getDaimlerPeopleDetector_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(vecfloat_cpp2c_p(cv::HOGDescriptor::getDaimlerPeopleDetector())); - END_WRAP -} - -CvStatus *HOGDescriptor_getDescriptorSize_Async(HOGDescriptor self, CvCallback_1 callback) { - BEGIN_WRAP - size_t rval = self.ptr->getDescriptorSize(); - callback(new size_t(rval)); - END_WRAP -} - -CvStatus *HOGDescriptor_getWinSigma_Async(HOGDescriptor self, CvCallback_1 callback) { - BEGIN_WRAP - double rval = self.ptr->getWinSigma(); - callback(new double(rval)); - END_WRAP -} - -CvStatus *HOGDescriptor_groupRectangles_Async( - HOGDescriptor self, - VecRect *rectList, - VecF64 *weights, - int groupThreshold, - double eps, - CvCallback_0 callback -) { - BEGIN_WRAP - auto _rectList = vecrect_c2cpp(*rectList); - auto _weights = vecdouble_c2cpp(*weights); - self.ptr->groupRectangles(_rectList, _weights, groupThreshold, eps); - vecrect_cpp2c(_rectList, rectList); - vecdouble_cpp2c(_weights, weights); - callback(); - END_WRAP -} - -CvStatus * -GroupRectangles_Async(VecRect *rects, int groupThreshold, double eps, CvCallback_0 callback) { - BEGIN_WRAP - auto _rects = vecrect_c2cpp(*rects); - cv::groupRectangles(_rects, groupThreshold, eps); - vecrect_cpp2c(_rects, rects); - callback(); - END_WRAP -} - -// Asynchronous functions for QRCodeDetector -CvStatus *QRCodeDetector_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new QRCodeDetector{new cv::QRCodeDetector()}); - END_WRAP -} - -CvStatus * -QRCodeDetector_DetectAndDecode_Async(QRCodeDetector self, Mat input, CvCallback_3 callback) { - BEGIN_WRAP - std::vector points_; - cv::Mat straight_qrcode; - auto info = self.ptr->detectAndDecode(*input.ptr, points_, straight_qrcode); - callback( - new char *(strdup(info.c_str())), - vecpoint_cpp2c_p(points_), - new Mat{new cv::Mat(straight_qrcode)} - ); - END_WRAP -} - -CvStatus *QRCodeDetector_Detect_Async(QRCodeDetector self, Mat input, CvCallback_2 callback) { - BEGIN_WRAP - std::vector _points; - bool rval = self.ptr->detect(*input.ptr, _points); - callback(new bool(rval), vecpoint_cpp2c_p(_points)); - END_WRAP -} - -CvStatus *QRCodeDetector_Decode_Async(QRCodeDetector self, Mat input, CvCallback_3 callback) { - BEGIN_WRAP - std::vector _points; - cv::Mat straight_qrcode; - auto info = self.ptr->detectAndDecode(*input.ptr, _points, straight_qrcode); - callback( - new char *(strdup(info.c_str())), - vecpoint_cpp2c_p(_points), - new Mat{new cv::Mat(straight_qrcode)} - ); - END_WRAP -} - -CvStatus *QRCodeDetector_decodeCurved_Async( - QRCodeDetector self, Mat img, VecPoint points, CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat _straight_qrcode; - auto _points = vecpoint_c2cpp(points); - auto ret = self.ptr->decodeCurved(*img.ptr, _points, _straight_qrcode); - callback(new char *(strdup(ret.c_str())), new Mat{new cv::Mat(_straight_qrcode)}); - END_WRAP -} - -CvStatus * -QRCodeDetector_detectAndDecodeCurved_Async(QRCodeDetector self, Mat img, CvCallback_3 callback) { - BEGIN_WRAP - cv::Mat _straight_qrcode; - std::vector _points; - auto ret = self.ptr->detectAndDecodeCurved(*img.ptr, _points, _straight_qrcode); - callback( - new char *(strdup(ret.c_str())), - vecpoint_cpp2c_p(_points), - new Mat{new cv::Mat(_straight_qrcode)} - ); - END_WRAP -} - -CvStatus *QRCodeDetector_DetectMulti_Async(QRCodeDetector self, Mat input, CvCallback_2 callback) { - BEGIN_WRAP - std::vector _points; - bool rval = self.ptr->detectMulti(*input.ptr, _points); - callback(new bool(rval), vecpoint_cpp2c_p(_points)); - END_WRAP -} - -CvStatus * -QRCodeDetector_DetectAndDecodeMulti_Async(QRCodeDetector self, Mat input, CvCallback_4 callback) { - BEGIN_WRAP - std::vector decodedCodes; - std::vector straightQrCodes; - std::vector points_; - bool rval = self.ptr->detectAndDecodeMulti(*input.ptr, decodedCodes, points_, straightQrCodes); - if (!rval) { - callback( - new bool(rval), - new VecVecChar{NULL, 0}, - new VecPoint{NULL, 0}, - new VecMat{NULL, 0} - ); - } else { - std::vector> vecvec; - for (int i = 0; i < decodedCodes.size(); i++) { - vecvec.push_back(std::vector(decodedCodes[i].begin(), decodedCodes[i].end())); - } - callback( - new bool(rval), - vecvecchar_cpp2c_p(vecvec), - vecpoint_cpp2c_p(points_), - vecmat_cpp2c_p(straightQrCodes) - ); - } - END_WRAP -} - -CvStatus *QRCodeDetector_setEpsX_Async(QRCodeDetector self, double epsX, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->setEpsX(epsX); - callback(); - END_WRAP -} - -CvStatus *QRCodeDetector_setEpsY_Async(QRCodeDetector self, double epsY, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->setEpsY(epsY); - callback(); - END_WRAP -} - -CvStatus *QRCodeDetector_setUseAlignmentMarkers_Async( - QRCodeDetector self, bool useAlignmentMarkers, CvCallback_0 callback -) { - BEGIN_WRAP - self.ptr->setUseAlignmentMarkers(useAlignmentMarkers); - callback(); - END_WRAP -} - -// Asynchronous functions for FaceDetectorYN -CvStatus *FaceDetectorYN_New_Async( - const char *model, - const char *config, - Size input_size, - float score_threshold, - float nms_threshold, - int top_k, - int backend_id, - int target_id, - CvCallback_1 callback -) { - BEGIN_WRAP - callback(new FaceDetectorYN{new cv::Ptr(cv::FaceDetectorYN::create( - model, - config, - cv::Size(input_size.width, input_size.height), - score_threshold, - nms_threshold, - top_k, - backend_id, - target_id - ))}); - END_WRAP -} - -CvStatus *FaceDetectorYN_NewFromBuffer_Async( - const char *framework, - VecUChar buffer, - VecUChar buffer_config, - Size input_size, - float score_threshold, - float nms_threshold, - int top_k, - int backend_id, - int target_id, - CvCallback_1 callback -) { - BEGIN_WRAP - auto _buffer = vecuchar_c2cpp(buffer); - auto _buffer_config = vecuchar_c2cpp(buffer_config); - callback(new FaceDetectorYN{new cv::Ptr(cv::FaceDetectorYN::create( - framework, - _buffer, - _buffer_config, - cv::Size(input_size.width, input_size.height), - score_threshold, - nms_threshold, - top_k, - backend_id, - target_id - ))}); - END_WRAP -} - -CvStatus *FaceDetectorYN_Detect_Async(FaceDetectorYN self, Mat img, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat faces; - (*self.ptr)->detect(*img.ptr, faces); - callback(new Mat{new cv::Mat(faces)}); - END_WRAP -} - -CvStatus * -FaceDetectorYN_SetInputSize_Async(FaceDetectorYN self, Size input_size, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setInputSize(cv::Size(input_size.width, input_size.height)); - callback(); - END_WRAP -} - -CvStatus *FaceDetectorYN_GetInputSize_Async(FaceDetectorYN self, CvCallback_1 callback) { - BEGIN_WRAP - cv::Size sz = (*self.ptr)->getInputSize(); - callback(new Size{sz.width, sz.height}); - END_WRAP -} - -CvStatus *FaceDetectorYN_SetScoreThreshold_Async( - FaceDetectorYN self, float score_threshold, CvCallback_0 callback -) { - BEGIN_WRAP(*self.ptr)->setScoreThreshold(score_threshold); - callback(); - END_WRAP -} - -CvStatus *FaceDetectorYN_GetScoreThreshold_Async(FaceDetectorYN self, CvCallback_1 callback) { - BEGIN_WRAP - float score_threshold = (*self.ptr)->getScoreThreshold(); - callback(new float(score_threshold)); - END_WRAP -} - -CvStatus *FaceDetectorYN_SetNMSThreshold_Async( - FaceDetectorYN self, float nms_threshold, CvCallback_0 callback -) { - BEGIN_WRAP(*self.ptr)->setNMSThreshold(nms_threshold); - callback(); - END_WRAP -} - -CvStatus *FaceDetectorYN_GetNMSThreshold_Async(FaceDetectorYN self, CvCallback_1 callback) { - BEGIN_WRAP - float nms_threshold = (*self.ptr)->getNMSThreshold(); - callback(new float(nms_threshold)); - END_WRAP -} - -CvStatus *FaceDetectorYN_SetTopK_Async(FaceDetectorYN self, int top_k, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setTopK(top_k); - callback(); - END_WRAP -} - -CvStatus *FaceDetectorYN_GetTopK_Async(FaceDetectorYN self, CvCallback_1 callback) { - BEGIN_WRAP - int top_k = (*self.ptr)->getTopK(); - callback(new int(top_k)); - END_WRAP -} - -// Asynchronous functions for FaceRecognizerSF -CvStatus *FaceRecognizerSF_New_Async( - const char *model, const char *config, int backend_id, int target_id, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new FaceRecognizerSF{new cv::Ptr( - cv::FaceRecognizerSF::create(model, config, backend_id, target_id) - )}); - END_WRAP -} - -CvStatus *FaceRecognizerSF_AlignCrop_Async( - FaceRecognizerSF self, Mat src_img, Mat face_box, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat aligned_img; - (*self.ptr)->alignCrop(*src_img.ptr, *face_box.ptr, aligned_img); - callback(new Mat{new cv::Mat(aligned_img)}); - END_WRAP -} - -CvStatus *FaceRecognizerSF_Feature_Async( - FaceRecognizerSF self, Mat aligned_img, bool clone, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat face_feature; - (*self.ptr)->feature(*aligned_img.ptr, face_feature); - if (clone) { - callback(new Mat{new cv::Mat(face_feature.clone())}); - } else { - callback(new Mat{new cv::Mat(face_feature)}); - } - END_WRAP -} - -CvStatus *FaceRecognizerSF_Match_Async( - FaceRecognizerSF self, Mat face_feature1, Mat face_feature2, int dis_type, CvCallback_1 callback -) { - BEGIN_WRAP - double distance = (*self.ptr)->match(*face_feature1.ptr, *face_feature2.ptr, dis_type); - callback(new double(distance)); - END_WRAP -} diff --git a/src/objdetect/objdetect_async.h b/src/objdetect/objdetect_async.h deleted file mode 100644 index 1f17c9c6..00000000 --- a/src/objdetect/objdetect_async.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Created by Rainyl. Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. */ -#ifndef CVD_OBJDETECT_ASYNC_H_ -#define CVD_OBJDETECT_ASYNC_H_ - -#include "core/types.h" -#include "objdetect.h" -#include - -#ifdef __cplusplus -#include -extern "C" { -#endif - -// CascadeClassifier -CvStatus *CascadeClassifier_New_Async(CvCallback_1 callback); -CvStatus *CascadeClassifier_NewFromFile_Async(const char *filename, CvCallback_1 callback); -CvStatus *CascadeClassifier_Load_Async(CascadeClassifier self, const char *name, CvCallback_1 callback); -CvStatus *CascadeClassifier_DetectMultiScale_Async(CascadeClassifier self, Mat img, CvCallback_1 callback); -CvStatus *CascadeClassifier_DetectMultiScaleWithParams_Async(CascadeClassifier self, Mat img, double scale, int minNeighbors, int flags, Size minSize, Size maxSize, CvCallback_1 callback); -CvStatus *CascadeClassifier_DetectMultiScale2_Async(CascadeClassifier self, Mat img, double scaleFactor, int minNeighbors, int flags, Size minSize, Size maxSize, CvCallback_2 callback); -CvStatus *CascadeClassifier_DetectMultiScale3_Async(CascadeClassifier self, Mat img, double scaleFactor, int minNeighbors, int flags, Size minSize, Size maxSize, bool outputRejectLevels, CvCallback_3 callback); -CvStatus *CascadeClassifier_Empty_Async(CascadeClassifier self, CvCallback_1 callback); -CvStatus *CascadeClassifier_getFeatureType_Async(CascadeClassifier self, CvCallback_1 callback); -CvStatus *CascadeClassifier_getOriginalWindowSize_Async(CascadeClassifier self, CvCallback_1 callback); -CvStatus *CascadeClassifier_isOldFormatCascade_Async(CascadeClassifier self, CvCallback_1 callback); - -// HOGDescriptor -CvStatus *HOGDescriptor_New_Async(CvCallback_1 callback); -CvStatus *HOGDescriptor_NewFromFile_Async(const char *filename, CvCallback_1 callback); -CvStatus *HOGDescriptor_Load_Async(HOGDescriptor self, const char *name, CvCallback_1 callback); -CvStatus *HOGDescriptor_Detect_Async(HOGDescriptor self, Mat img, double hitThresh, Size winStride, Size padding, CvCallback_3 callback); -CvStatus *HOGDescriptor_Detect2_Async(HOGDescriptor self, Mat img, double hitThresh, Size winStride, Size padding, CvCallback_2 callback); -CvStatus *HOGDescriptor_DetectMultiScale_Async(HOGDescriptor self, Mat img, CvCallback_1 callback); -CvStatus *HOGDescriptor_DetectMultiScaleWithParams_Async(HOGDescriptor self, Mat img, double hitThresh, Size winStride, Size padding, double scale, double finalThreshold, bool useMeanshiftGrouping, CvCallback_1 callback); -CvStatus *HOGDescriptor_Compute_Async(HOGDescriptor self, Mat img, Size winStride, Size padding, CvCallback_2 callback); -CvStatus *HOGDescriptor_computeGradient_Async(HOGDescriptor self, Mat img, Mat grad, Mat angleOfs, Size paddingTL, Size paddingBR, CvCallback_0 callback); -CvStatus *HOG_GetDefaultPeopleDetector_Async(CvCallback_1 callback); -CvStatus *HOGDescriptor_SetSVMDetector_Async(HOGDescriptor self, VecF32 det, CvCallback_0 callback); -CvStatus *HOGDescriptor_getDaimlerPeopleDetector_Async(CvCallback_1 callback); -CvStatus *HOGDescriptor_getDescriptorSize_Async(HOGDescriptor self, CvCallback_1 callback); -CvStatus *HOGDescriptor_getWinSigma_Async(HOGDescriptor self, CvCallback_1 callback); -CvStatus *HOGDescriptor_groupRectangles_Async(HOGDescriptor self, VecRect *rectList, VecF64 *weights, int groupThreshold, double eps, CvCallback_0 callback); -CvStatus *GroupRectangles_Async(VecRect *rects, int groupThreshold, double eps, CvCallback_0 callback); - -// QRCodeDetector -CvStatus *QRCodeDetector_New_Async(CvCallback_1 callback); -CvStatus *QRCodeDetector_DetectAndDecode_Async(QRCodeDetector self, Mat input, CvCallback_3 callback); -CvStatus *QRCodeDetector_Detect_Async(QRCodeDetector self, Mat input, CvCallback_2 callback); -CvStatus *QRCodeDetector_Decode_Async(QRCodeDetector self, Mat input, CvCallback_3 callback); -CvStatus *QRCodeDetector_decodeCurved_Async(QRCodeDetector self, Mat img, VecPoint points, CvCallback_2 callback); -CvStatus *QRCodeDetector_detectAndDecodeCurved_Async(QRCodeDetector self, Mat img, CvCallback_3 callback); -CvStatus *QRCodeDetector_DetectMulti_Async(QRCodeDetector self, Mat input, CvCallback_2 callback); -CvStatus *QRCodeDetector_DetectAndDecodeMulti_Async(QRCodeDetector self, Mat input, CvCallback_4 callback); -CvStatus *QRCodeDetector_setEpsX_Async(QRCodeDetector self, double epsX, CvCallback_0 callback); -CvStatus *QRCodeDetector_setEpsY_Async(QRCodeDetector self, double epsY, CvCallback_0 callback); -CvStatus *QRCodeDetector_setUseAlignmentMarkers_Async(QRCodeDetector self, bool useAlignmentMarkers, CvCallback_0 callback); - -// FaceDetectorYN -CvStatus *FaceDetectorYN_New_Async(const char *model, const char *config, Size input_size, float score_threshold, float nms_threshold, int top_k, int backend_id, int target_id, CvCallback_1 callback); -CvStatus *FaceDetectorYN_NewFromBuffer_Async(const char *framework, VecUChar buffer, VecUChar buffer_config, Size input_size, float score_threshold, float nms_threshold, int top_k, int backend_id, int target_id, CvCallback_1 callback); -CvStatus *FaceDetectorYN_Detect_Async(FaceDetectorYN self, Mat img, CvCallback_1 callback); -CvStatus *FaceDetectorYN_SetInputSize_Async(FaceDetectorYN self, Size input_size, CvCallback_0 callback); -CvStatus *FaceDetectorYN_GetInputSize_Async(FaceDetectorYN self, CvCallback_1 callback); -CvStatus *FaceDetectorYN_SetScoreThreshold_Async(FaceDetectorYN self, float score_threshold, CvCallback_0 callback); -CvStatus *FaceDetectorYN_GetScoreThreshold_Async(FaceDetectorYN self, CvCallback_1 callback); -CvStatus *FaceDetectorYN_SetNMSThreshold_Async(FaceDetectorYN self, float nms_threshold, CvCallback_0 callback); -CvStatus *FaceDetectorYN_GetNMSThreshold_Async(FaceDetectorYN self, CvCallback_1 callback); -CvStatus *FaceDetectorYN_SetTopK_Async(FaceDetectorYN self, int top_k, CvCallback_0 callback); -CvStatus *FaceDetectorYN_GetTopK_Async(FaceDetectorYN self, CvCallback_1 callback); - -// FaceRecognizerSF -CvStatus *FaceRecognizerSF_New_Async(const char *model, const char *config, int backend_id, int target_id, CvCallback_1 callback); -CvStatus *FaceRecognizerSF_AlignCrop_Async(FaceRecognizerSF self, Mat src_img, Mat face_box, CvCallback_1 callback); -CvStatus *FaceRecognizerSF_Feature_Async(FaceRecognizerSF self, Mat aligned_img, bool clone, CvCallback_1 callback); -CvStatus *FaceRecognizerSF_Match_Async(FaceRecognizerSF self, Mat face_feature1, Mat face_feature2, int dis_type, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_OBJDETECT_ASYNC_H_ diff --git a/src/opencv_dart.cpp b/src/opencv_dart.cpp deleted file mode 100644 index 6dd64464..00000000 --- a/src/opencv_dart.cpp +++ /dev/null @@ -1,6 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "opencv_dart.h" diff --git a/src/opencv_dart.h b/src/opencv_dart.h deleted file mode 100644 index 1547ed5e..00000000 --- a/src/opencv_dart.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include -#include -#include - -#if _WIN32 -#include -#else -#include -#include -#endif - -#ifdef _WIN32 -#ifdef __cplusplus -#define FFI_PLUGIN_EXPORT extern "C" __declspec(dllexport) -#else -#define FFI_PLUGIN_EXPORT __declspec(dllexport) -#endif // __cplusplus -#else -#ifdef __cplusplus -#define FFI_PLUGIN_EXPORT extern "C" -#else -#define FFI_PLUGIN_EXPORT -#endif // __cplusplus -#endif // _WIN32 diff --git a/src/photo/photo.cpp b/src/photo/photo.cpp deleted file mode 100644 index 001e86e1..00000000 --- a/src/photo/photo.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "photo.h" -#include "core/vec.hpp" - -CvStatus *ColorChange(Mat src, Mat mask, Mat dst, float red_mul, float green_mul, float blue_mul) { - BEGIN_WRAP - cv::colorChange(*src.ptr, *mask.ptr, *dst.ptr, red_mul, green_mul, blue_mul); - END_WRAP -} - -CvStatus *SeamlessClone(Mat src, Mat dst, Mat mask, Point p, Mat blend, int flags) { - BEGIN_WRAP - cv::seamlessClone(*src.ptr, *dst.ptr, *mask.ptr, cv::Point(p.x, p.y), *blend.ptr, flags); - END_WRAP -} - -CvStatus *IlluminationChange(Mat src, Mat mask, Mat dst, float alpha, float beta) { - BEGIN_WRAP - cv::illuminationChange(*src.ptr, *mask.ptr, *dst.ptr, alpha, beta); - END_WRAP -} - -CvStatus *TextureFlattening( - Mat src, Mat mask, Mat dst, float low_threshold, float high_threshold, int kernel_size -) { - BEGIN_WRAP - cv::textureFlattening(*src.ptr, *mask.ptr, *dst.ptr, low_threshold, high_threshold, kernel_size); - END_WRAP -} - -CvStatus *FastNlMeansDenoisingColoredMulti( - VecMat src, Mat dst, int imgToDenoiseIndex, int temporalWindowSize -) { - BEGIN_WRAP - auto _src = vecmat_c2cpp(src); - cv::fastNlMeansDenoisingColoredMulti(_src, *dst.ptr, imgToDenoiseIndex, temporalWindowSize); - END_WRAP -} -CvStatus *FastNlMeansDenoisingColoredMultiWithParams( - VecMat src, - Mat dst, - int imgToDenoiseIndex, - int temporalWindowSize, - float h, - float hColor, - int templateWindowSize, - int searchWindowSize -) { - BEGIN_WRAP - auto _src = vecmat_c2cpp(src); - cv::fastNlMeansDenoisingColoredMulti( - _src, - *dst.ptr, - imgToDenoiseIndex, - temporalWindowSize, - h, - hColor, - templateWindowSize, - searchWindowSize - ); - END_WRAP -} -CvStatus *FastNlMeansDenoising(Mat src, Mat dst) { - BEGIN_WRAP - cv::fastNlMeansDenoising(*src.ptr, *dst.ptr); - END_WRAP -} -CvStatus *FastNlMeansDenoisingWithParams( - Mat src, Mat dst, float h, int templateWindowSize, int searchWindowSize -) { - BEGIN_WRAP - cv::fastNlMeansDenoising(*src.ptr, *dst.ptr, h, templateWindowSize, searchWindowSize); - END_WRAP -} -CvStatus *FastNlMeansDenoisingColored(Mat src, Mat dst) { - BEGIN_WRAP - cv::fastNlMeansDenoisingColored(*src.ptr, *dst.ptr); - END_WRAP -} -CvStatus *FastNlMeansDenoisingColoredWithParams( - Mat src, Mat dst, float h, float hColor, int templateWindowSize, int searchWindowSize -) { - BEGIN_WRAP - cv::fastNlMeansDenoisingColored( - *src.ptr, *dst.ptr, h, hColor, templateWindowSize, searchWindowSize - ); - END_WRAP -} - -CvStatus *MergeMertens_Create(MergeMertens *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::createMergeMertens())}; - END_WRAP -} -CvStatus *MergeMertens_CreateWithParams( - float contrast_weight, float saturation_weight, float exposure_weight, MergeMertens *rval -) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::createMergeMertens(contrast_weight, saturation_weight, exposure_weight) - )}; - END_WRAP -} -CvStatus *MergeMertens_Process(MergeMertens b, VecMat src, Mat dst) { - BEGIN_WRAP - auto _src = vecmat_c2cpp(src); - (*b.ptr)->process(_src, *dst.ptr); - END_WRAP -} -void MergeMertens_Close(MergeMertensPtr b) { - b->ptr->reset(); - CVD_FREE(b); -} - -CvStatus *AlignMTB_Create(AlignMTB *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::createAlignMTB())}; - END_WRAP -} -CvStatus *AlignMTB_CreateWithParams(int max_bits, int exclude_range, bool cut, AlignMTB *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::createAlignMTB(max_bits, exclude_range, cut))}; - END_WRAP -} -CvStatus *AlignMTB_Process(AlignMTB b, VecMat src, VecMat *dst) { - BEGIN_WRAP - auto vec = std::vector(); - auto _src = vecmat_c2cpp(src); - (*b.ptr)->process(_src, vec); - *dst = vecmat_cpp2c(vec); - END_WRAP -} -void AlignMTB_Close(AlignMTBPtr b) { - b->ptr->reset(); - CVD_FREE(b); -} - -CvStatus *DetailEnhance(Mat src, Mat dst, float sigma_s, float sigma_r) { - BEGIN_WRAP - cv::detailEnhance(*src.ptr, *dst.ptr, sigma_s, sigma_r); - END_WRAP -} -CvStatus *EdgePreservingFilter(Mat src, Mat dst, int filter, float sigma_s, float sigma_r) { - BEGIN_WRAP - cv::edgePreservingFilter(*src.ptr, *dst.ptr, filter, sigma_s, sigma_r); - END_WRAP -} -CvStatus * -PencilSketch(Mat src, Mat dst1, Mat dst2, float sigma_s, float sigma_r, float shade_factor) { - BEGIN_WRAP - cv::pencilSketch(*src.ptr, *dst1.ptr, *dst2.ptr, sigma_s, sigma_r, shade_factor); - END_WRAP -} -CvStatus *Stylization(Mat src, Mat dst, float sigma_s, float sigma_r) { - BEGIN_WRAP - cv::stylization(*src.ptr, *dst.ptr, sigma_s, sigma_r); - END_WRAP -} - -CvStatus *PhotoInpaint(Mat src, Mat mask, Mat dst, float inpaint_radius, int algorithm_type) { - BEGIN_WRAP - cv::inpaint(*src.ptr, *mask.ptr, *dst.ptr, inpaint_radius, algorithm_type); - END_WRAP -} diff --git a/src/photo/photo.h b/src/photo/photo.h deleted file mode 100644 index b5597d2a..00000000 --- a/src/photo/photo.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef _OPENCV3_PHOTO_H_ -#define _OPENCV3_PHOTO_H_ - -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -#include "core/core.h" - -#ifdef __cplusplus -/// see : https://docs.opencv.org/3.4/d7/dd6/classcv_1_1MergeMertens.html -CVD_TYPEDEF(cv::Ptr, MergeMertens); -/// see : https://docs.opencv.org/master/d7/db6/classcv_1_1AlignMTB.html -CVD_TYPEDEF(cv::Ptr, AlignMTB); -#else -CVD_TYPEDEF(void, MergeMertens); -CVD_TYPEDEF(void, AlignMTB); -#endif - -CvStatus *ColorChange(Mat src, Mat mask, Mat dst, float red_mul, float green_mul, float blue_mul); - -CvStatus *SeamlessClone(Mat src, Mat dst, Mat mask, Point p, Mat blend, int flags); - -CvStatus *IlluminationChange(Mat src, Mat mask, Mat dst, float alpha, float beta); - -CvStatus *TextureFlattening(Mat src, Mat mask, Mat dst, float low_threshold, float high_threshold, - int kernel_size); - -CvStatus *FastNlMeansDenoisingColoredMulti(VecMat src, Mat dst, int imgToDenoiseIndex, - int temporalWindowSize); -CvStatus *FastNlMeansDenoisingColoredMultiWithParams(VecMat src, Mat dst, int imgToDenoiseIndex, - int temporalWindowSize, float h, float hColor, - int templateWindowSize, int searchWindowSize); -CvStatus *FastNlMeansDenoising(Mat src, Mat dst); -CvStatus *FastNlMeansDenoisingWithParams(Mat src, Mat dst, float h, int templateWindowSize, - int searchWindowSize); -CvStatus *FastNlMeansDenoisingColored(Mat src, Mat dst); -CvStatus *FastNlMeansDenoisingColoredWithParams(Mat src, Mat dst, float h, float hColor, - int templateWindowSize, int searchWindowSize); - -CvStatus *MergeMertens_Create(MergeMertens *rval); -CvStatus *MergeMertens_CreateWithParams(float contrast_weight, float saturation_weight, float exposure_weight, - MergeMertens *rval); -CvStatus *MergeMertens_Process(MergeMertens b, VecMat src, Mat dst); -void MergeMertens_Close(MergeMertensPtr b); - -CvStatus *AlignMTB_Create(AlignMTB *rval); -CvStatus *AlignMTB_CreateWithParams(int max_bits, int exclude_range, bool cut, AlignMTB *rval); -CvStatus *AlignMTB_Process(AlignMTB b, VecMat src, VecMat *dst); -void AlignMTB_Close(AlignMTBPtr b); - -CvStatus *DetailEnhance(Mat src, Mat dst, float sigma_s, float sigma_r); -CvStatus *EdgePreservingFilter(Mat src, Mat dst, int filter, float sigma_s, float sigma_r); -CvStatus *PencilSketch(Mat src, Mat dst1, Mat dst2, float sigma_s, float sigma_r, float shade_factor); -CvStatus *Stylization(Mat src, Mat dst, float sigma_s, float sigma_r); - -CvStatus *PhotoInpaint(Mat src, Mat mask, Mat dst, float inpaint_radius, int algorithm_type); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_PHOTO_H diff --git a/src/photo/photo_async.cpp b/src/photo/photo_async.cpp deleted file mode 100644 index 63e21448..00000000 --- a/src/photo/photo_async.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/* Created by Abdelaziz Mahdy. Licensed: Apache 2.0 license. Copyright (c) 2024 Abdelaziz Mahdy. */ -#include "photo_async.h" -#include "core/types.h" -#include "core/vec.hpp" - -// Asynchronous functions for ColorChange -CvStatus *ColorChange_Async( - Mat src, Mat mask, float red_mul, float green_mul, float blue_mul, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat _dst; - cv::colorChange(*src.ptr, *mask.ptr, _dst, red_mul, green_mul, blue_mul); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for SeamlessClone -CvStatus * -SeamlessClone_Async(Mat src, Mat dst, Mat mask, Point p, int flags, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat _blend; - cv::seamlessClone(*src.ptr, *dst.ptr, *mask.ptr, cv::Point(p.x, p.y), _blend, flags); - callback(new Mat{new cv::Mat(_blend)}); - END_WRAP -} - -// Asynchronous functions for IlluminationChange -CvStatus * -IlluminationChange_Async(Mat src, Mat mask, float alpha, float beta, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat _dst; - cv::illuminationChange(*src.ptr, *mask.ptr, _dst, alpha, beta); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for TextureFlattening -CvStatus *TextureFlattening_Async( - Mat src, - Mat mask, - float low_threshold, - float high_threshold, - int kernel_size, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat _dst; - cv::textureFlattening(*src.ptr, *mask.ptr, _dst, low_threshold, high_threshold, kernel_size); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for FastNlMeansDenoisingColoredMulti -CvStatus *FastNlMeansDenoisingColoredMulti_Async( - VecMat src, int imgToDenoiseIndex, int temporalWindowSize, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat _dst; - auto _src = vecmat_c2cpp(src); - cv::fastNlMeansDenoisingColoredMulti(_src, _dst, imgToDenoiseIndex, temporalWindowSize); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -CvStatus *FastNlMeansDenoisingColoredMultiWithParams_Async( - VecMat src, - int imgToDenoiseIndex, - int temporalWindowSize, - float h, - float hColor, - int templateWindowSize, - int searchWindowSize, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat _dst; - auto _src = vecmat_c2cpp(src); - cv::fastNlMeansDenoisingColoredMulti( - _src, - _dst, - imgToDenoiseIndex, - temporalWindowSize, - h, - hColor, - templateWindowSize, - searchWindowSize - ); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for FastNlMeansDenoising -CvStatus *FastNlMeansDenoising_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat _dst; - cv::fastNlMeansDenoising(*src.ptr, _dst); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -CvStatus *FastNlMeansDenoisingWithParams_Async( - Mat src, float h, int templateWindowSize, int searchWindowSize, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat _dst; - cv::fastNlMeansDenoising(*src.ptr, _dst, h, templateWindowSize, searchWindowSize); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for FastNlMeansDenoisingColored -CvStatus *FastNlMeansDenoisingColored_Async(Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat _dst; - cv::fastNlMeansDenoisingColored(*src.ptr, _dst); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -CvStatus *FastNlMeansDenoisingColoredWithParams_Async( - Mat src, - float h, - float hColor, - int templateWindowSize, - int searchWindowSize, - CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat _dst; - cv::fastNlMeansDenoisingColored(*src.ptr, _dst, h, hColor, templateWindowSize, searchWindowSize); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for MergeMertens -CvStatus *MergeMertens_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new MergeMertens{new cv::Ptr(cv::createMergeMertens())}); - END_WRAP -} - -CvStatus *MergeMertens_CreateWithParams_Async( - float contrast_weight, float saturation_weight, float exposure_weight, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new MergeMertens{new cv::Ptr( - cv::createMergeMertens(contrast_weight, saturation_weight, exposure_weight) - )}); - END_WRAP -} - -CvStatus *MergeMertens_Process_Async(MergeMertens b, VecMat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat _dst; - auto _src = vecmat_c2cpp(src); - (*b.ptr)->process(_src, _dst); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for AlignMTB -CvStatus *AlignMTB_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new AlignMTB{new cv::Ptr(cv::createAlignMTB())}); - END_WRAP -} - -CvStatus * -AlignMTB_CreateWithParams_Async(int max_bits, int exclude_range, bool cut, CvCallback_1 callback) { - BEGIN_WRAP - callback(new AlignMTB{new cv::Ptr(cv::createAlignMTB(max_bits, exclude_range, cut))} - ); - END_WRAP -} - -CvStatus *AlignMTB_Process_Async(AlignMTB b, VecMat src, CvCallback_1 callback) { - BEGIN_WRAP - auto vec = std::vector(); - auto _src = vecmat_c2cpp(src); - (*b.ptr)->process(_src, vec); - callback(vecmat_cpp2c_p(vec)); - END_WRAP -} - -// Asynchronous functions for DetailEnhance -CvStatus *DetailEnhance_Async(Mat src, float sigma_s, float sigma_r, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat _dst; - cv::detailEnhance(*src.ptr, _dst, sigma_s, sigma_r); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for EdgePreservingFilter -CvStatus *EdgePreservingFilter_Async( - Mat src, int filter, float sigma_s, float sigma_r, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat _dst; - cv::edgePreservingFilter(*src.ptr, _dst, filter, sigma_s, sigma_r); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for PencilSketch -CvStatus *PencilSketch_Async( - Mat src, float sigma_s, float sigma_r, float shade_factor, CvCallback_2 callback -) { - BEGIN_WRAP - cv::Mat _dst1, _dst2; - cv::pencilSketch(*src.ptr, _dst1, _dst2, sigma_s, sigma_r, shade_factor); - callback(new Mat{new cv::Mat(_dst1)}, new Mat{new cv::Mat(_dst2)}); - END_WRAP -} - -// Asynchronous functions for Stylization -CvStatus *Stylization_Async(Mat src, float sigma_s, float sigma_r, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat _dst; - cv::stylization(*src.ptr, _dst, sigma_s, sigma_r); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} - -// Asynchronous functions for PhotoInpaint -CvStatus *PhotoInpaint_Async( - Mat src, Mat mask, float inpaint_radius, int algorithm_type, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat _dst; - cv::inpaint(*src.ptr, *mask.ptr, _dst, inpaint_radius, algorithm_type); - callback(new Mat{new cv::Mat(_dst)}); - END_WRAP -} diff --git a/src/photo/photo_async.h b/src/photo/photo_async.h deleted file mode 100644 index 75d69187..00000000 --- a/src/photo/photo_async.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Created by Abdelaziz Mahdy. Licensed: Apache 2.0 license. Copyright (c) 2024 Abdelaziz Mahdy. */ -#ifndef CVD_PHOTO_ASYNC_H_ -#define CVD_PHOTO_ASYNC_H_ - -#include "core/types.h" -#include "photo.h" - -#ifdef __cplusplus -#include -extern "C" -{ -#endif - - // Asynchronous functions for ColorChange - CvStatus *ColorChange_Async(Mat src, Mat mask, float red_mul, float green_mul, float blue_mul, CvCallback_1 callback); - - // Asynchronous functions for SeamlessClone - CvStatus *SeamlessClone_Async(Mat src, Mat dst, Mat mask, Point p, int flags, CvCallback_1 callback); - - // Asynchronous functions for IlluminationChange - CvStatus *IlluminationChange_Async(Mat src, Mat mask, float alpha, float beta, CvCallback_1 callback); - - // Asynchronous functions for TextureFlattening - CvStatus *TextureFlattening_Async(Mat src, Mat mask, float low_threshold, float high_threshold, int kernel_size, CvCallback_1 callback); - - // Asynchronous functions for FastNlMeansDenoisingColoredMulti - CvStatus *FastNlMeansDenoisingColoredMulti_Async(VecMat src, int imgToDenoiseIndex, int temporalWindowSize, CvCallback_1 callback); - CvStatus *FastNlMeansDenoisingColoredMultiWithParams_Async(VecMat src, int imgToDenoiseIndex, int temporalWindowSize, float h, float hColor, int templateWindowSize, int searchWindowSize, CvCallback_1 callback); - - // Asynchronous functions for FastNlMeansDenoising - CvStatus *FastNlMeansDenoising_Async(Mat src, CvCallback_1 callback); - CvStatus *FastNlMeansDenoisingWithParams_Async(Mat src, float h, int templateWindowSize, int searchWindowSize, CvCallback_1 callback); - - // Asynchronous functions for FastNlMeansDenoisingColored - CvStatus *FastNlMeansDenoisingColored_Async(Mat src, CvCallback_1 callback); - CvStatus *FastNlMeansDenoisingColoredWithParams_Async(Mat src, float h, float hColor, int templateWindowSize, int searchWindowSize, CvCallback_1 callback); - - // Asynchronous functions for MergeMertens - CvStatus *MergeMertens_Create_Async(CvCallback_1 callback); - CvStatus *MergeMertens_CreateWithParams_Async(float contrast_weight, float saturation_weight, float exposure_weight, CvCallback_1 callback); - CvStatus *MergeMertens_Process_Async(MergeMertens b, VecMat src, CvCallback_1 callback); - - // Asynchronous functions for AlignMTB - CvStatus *AlignMTB_Create_Async(CvCallback_1 callback); - CvStatus *AlignMTB_CreateWithParams_Async(int max_bits, int exclude_range, bool cut, CvCallback_1 callback); - CvStatus *AlignMTB_Process_Async(AlignMTB b, VecMat src, CvCallback_1 callback); - - // Asynchronous functions for DetailEnhance - CvStatus *DetailEnhance_Async(Mat src, float sigma_s, float sigma_r, CvCallback_1 callback); - - // Asynchronous functions for EdgePreservingFilter - CvStatus *EdgePreservingFilter_Async(Mat src, int filter, float sigma_s, float sigma_r, CvCallback_1 callback); - - // Asynchronous functions for PencilSketch - CvStatus *PencilSketch_Async(Mat src, float sigma_s, float sigma_r, float shade_factor, CvCallback_2 callback); - - // Asynchronous functions for Stylization - CvStatus *Stylization_Async(Mat src, float sigma_s, float sigma_r, CvCallback_1 callback); - - // Asynchronous functions for PhotoInpaint - CvStatus *PhotoInpaint_Async(Mat src, Mat mask, float inpaint_radius, int algorithm_type, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_PHOTO_ASYNC_H_ diff --git a/src/stitching/stitching.cpp b/src/stitching/stitching.cpp deleted file mode 100644 index 8873af6b..00000000 --- a/src/stitching/stitching.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "stitching.h" -#include "core/vec.hpp" - -CvStatus *Stitcher_Create(int mode, Stitcher *rval) { - BEGIN_WRAP - const auto ptr = cv::Stitcher::create(static_cast(mode)); - *rval = {new cv::Ptr(ptr)}; - END_WRAP -} - -void Stitcher_Close(StitcherPtr stitcher) { - stitcher->ptr->reset(); - CVD_FREE(stitcher); -} - -CvStatus *Stitcher_GetRegistrationResol(Stitcher self, double *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->registrationResol(); - END_WRAP -} - -CvStatus *Stitcher_SetRegistrationResol(Stitcher self, double inval) { - BEGIN_WRAP(*self.ptr)->setRegistrationResol(inval); - END_WRAP -} - -CvStatus *Stitcher_GetSeamEstimationResol(Stitcher self, double *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->seamEstimationResol(); - END_WRAP -} -CvStatus *Stitcher_SetSeamEstimationResol(Stitcher self, double inval) { - BEGIN_WRAP(*self.ptr)->setSeamEstimationResol(inval); - END_WRAP -} - -CvStatus *Stitcher_GetCompositingResol(Stitcher self, double *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->compositingResol(); - END_WRAP -} -CvStatus *Stitcher_SetCompositingResol(Stitcher self, double inval) { - BEGIN_WRAP(*self.ptr)->setCompositingResol(inval); - END_WRAP -} - -CvStatus *Stitcher_GetPanoConfidenceThresh(Stitcher self, double *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->panoConfidenceThresh(); - END_WRAP -} -CvStatus *Stitcher_SetPanoConfidenceThresh(Stitcher self, double inval) { - BEGIN_WRAP(*self.ptr)->setPanoConfidenceThresh(inval); - END_WRAP -} - -CvStatus *Stitcher_GetWaveCorrection(Stitcher self, bool *rval) { - BEGIN_WRAP - *rval = (*self.ptr)->waveCorrection(); - END_WRAP -} -CvStatus *Stitcher_SetWaveCorrection(Stitcher self, bool inval) { - BEGIN_WRAP(*self.ptr)->setWaveCorrection(inval); - END_WRAP -} - -CvStatus *Stitcher_GetInterpolationFlags(Stitcher self, int *rval) { - BEGIN_WRAP - *rval = static_cast((*self.ptr)->interpolationFlags()); - END_WRAP -} -CvStatus *Stitcher_SetInterpolationFlags(Stitcher self, int inval) { - BEGIN_WRAP(*self.ptr)->setInterpolationFlags(static_cast(inval)); - END_WRAP -} - -CvStatus *Stitcher_GetWaveCorrectKind(Stitcher self, int *rval) { - BEGIN_WRAP - *rval = static_cast((*self.ptr)->waveCorrectKind()); - END_WRAP -} -CvStatus *Stitcher_SetWaveCorrectKind(Stitcher self, int inval) { - BEGIN_WRAP(*self.ptr)->setWaveCorrectKind(static_cast(inval)); - END_WRAP -} - -CvStatus *Stitcher_EstimateTransform(Stitcher self, VecMat mats, VecMat masks, int *rval) { - BEGIN_WRAP - auto _mats = vecmat_c2cpp(mats); - if (masks.length > 0) { - auto _masks = vecmat_c2cpp(masks); - *rval = static_cast((*self.ptr)->estimateTransform(_mats, _masks)); - } else - *rval = static_cast((*self.ptr)->estimateTransform(_mats)); - END_WRAP -} - -CvStatus *Stitcher_ComposePanorama(Stitcher self, Mat rpano, int *rval) { - BEGIN_WRAP - *rval = static_cast((*self.ptr)->composePanorama(*rpano.ptr)); - END_WRAP -} -CvStatus *Stitcher_ComposePanorama_1(Stitcher self, VecMat mats, Mat rpano, int *rval) { - BEGIN_WRAP - auto _mats = vecmat_c2cpp(mats); - *rval = static_cast((*self.ptr)->composePanorama(_mats, *rpano.ptr)); - END_WRAP -} - -CvStatus *Stitcher_Stitch(Stitcher self, VecMat mats, Mat rpano, int *rval) { - BEGIN_WRAP - auto _mats = vecmat_c2cpp(mats); - *rval = static_cast((*self.ptr)->stitch(_mats, *rpano.ptr)); - END_WRAP -} -CvStatus *Stitcher_Stitch_1(Stitcher self, VecMat mats, VecMat masks, Mat rpano, int *rval) { - BEGIN_WRAP - auto _mats = vecmat_c2cpp(mats); - auto _masks = vecmat_c2cpp(masks); - *rval = static_cast((*self.ptr)->stitch(_mats, _masks, *rpano.ptr)); - END_WRAP -} - -CvStatus *Stitcher_Component(Stitcher self, VecI32 *rval) { - BEGIN_WRAP - std::vector _rval = (*self.ptr)->component(); - *rval = vecint_cpp2c(_rval); - END_WRAP -} diff --git a/src/stitching/stitching.h b/src/stitching/stitching.h deleted file mode 100644 index e29f7763..00000000 --- a/src/stitching/stitching.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef OPENCV_DART_LIBRARY_STITCHING_H -#define OPENCV_DART_LIBRARY_STITCHING_H - -#include "core/core.h" -#include "core/exception.h" - -#ifdef __cplusplus -#include -extern "C" { -#endif - -enum { STITCHING_PANORAMA = 0, STITCHING_SCANS = 1 }; -enum { - STITCHING_OK = 0, - STITCHING_ERR_NEED_MORE_IMGS = 1, - STITCHING_ERR_HOMOGRAPHY_EST_FAIL = 2, - STITCHING_ERR_CAMERA_PARAMS_ADJUST_FAIL = 3 -}; - -#ifdef __cplusplus -CVD_TYPEDEF(cv::Ptr, Stitcher); -#else -CVD_TYPEDEF(void *, Stitcher); -#endif - -CvStatus *Stitcher_Create(int mode, Stitcher *rval); -void Stitcher_Close(StitcherPtr stitcher); -CvStatus *Stitcher_Get(Stitcher self, Stitcher *rval); - -#pragma region getter/setter - -CvStatus *Stitcher_GetRegistrationResol(Stitcher self, double *rval); -CvStatus *Stitcher_SetRegistrationResol(Stitcher self, double inval); - -CvStatus *Stitcher_GetSeamEstimationResol(Stitcher self, double *rval); -CvStatus *Stitcher_SetSeamEstimationResol(Stitcher self, double inval); - -CvStatus *Stitcher_GetCompositingResol(Stitcher self, double *rval); -CvStatus *Stitcher_SetCompositingResol(Stitcher self, double inval); - -CvStatus *Stitcher_GetPanoConfidenceThresh(Stitcher self, double *rval); -CvStatus *Stitcher_SetPanoConfidenceThresh(Stitcher self, double inval); - -CvStatus *Stitcher_GetWaveCorrection(Stitcher self, bool *rval); -CvStatus *Stitcher_SetWaveCorrection(Stitcher self, bool inval); - -CvStatus *Stitcher_GetInterpolationFlags(Stitcher self, int *rval); -CvStatus *Stitcher_SetInterpolationFlags(Stitcher self, int inval); - -CvStatus *Stitcher_GetWaveCorrectKind(Stitcher self, int *rval); -CvStatus *Stitcher_SetWaveCorrectKind(Stitcher self, int inval); -#pragma endregion - -#pragma region functions - -CvStatus *Stitcher_EstimateTransform(Stitcher self, VecMat mats, VecMat masks, int *rval); - -CvStatus *Stitcher_ComposePanorama(Stitcher self, Mat rpano, int *rval); -CvStatus *Stitcher_ComposePanorama_1(Stitcher self, VecMat mats, Mat rpano, int *rval); - -CvStatus *Stitcher_Stitch(Stitcher self, VecMat mats, Mat rpano, int *rval); -CvStatus *Stitcher_Stitch_1(Stitcher self, VecMat mats, VecMat masks, Mat rpano, int *rval); - -CvStatus *Stitcher_Component(Stitcher self, VecI32 *rval); -#pragma endregion - -#ifdef __cplusplus -} -#endif - -#endif // OPENCV_DART_LIBRARY_STITCHING_H diff --git a/src/stitching/stitching_async.cpp b/src/stitching/stitching_async.cpp deleted file mode 100644 index 8e3354fa..00000000 --- a/src/stitching/stitching_async.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* Created by Abdelaziz Mahdy. Licensed: Apache 2.0 license. Copyright (c) 2024 Abdelaziz Mahdy. */ -#include "stitching_async.h" -#include "core/types.h" -#include "core/vec.hpp" - -// Asynchronous functions for Stitcher_Create -CvStatus *Stitcher_Create_Async(int mode, CvCallback_1 callback) { - BEGIN_WRAP - const auto ptr = cv::Stitcher::create(static_cast(mode)); - callback(new Stitcher{new cv::Ptr(ptr)}); - END_WRAP -} - -// Asynchronous getter/setter functions -CvStatus *Stitcher_GetRegistrationResol_Async(Stitcher self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new double((*self.ptr)->registrationResol())); - END_WRAP -} - -CvStatus *Stitcher_SetRegistrationResol_Async(Stitcher self, double inval, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setRegistrationResol(inval); - callback(); - END_WRAP -} - -CvStatus *Stitcher_GetSeamEstimationResol_Async(Stitcher self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new double((*self.ptr)->seamEstimationResol())); - END_WRAP -} - -CvStatus * -Stitcher_SetSeamEstimationResol_Async(Stitcher self, double inval, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setSeamEstimationResol(inval); - callback(); - END_WRAP -} - -CvStatus *Stitcher_GetCompositingResol_Async(Stitcher self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new double((*self.ptr)->compositingResol())); - END_WRAP -} - -CvStatus *Stitcher_SetCompositingResol_Async(Stitcher self, double inval, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setCompositingResol(inval); - callback(); - END_WRAP -} - -CvStatus *Stitcher_GetPanoConfidenceThresh_Async(Stitcher self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new double((*self.ptr)->panoConfidenceThresh())); - END_WRAP -} - -CvStatus * -Stitcher_SetPanoConfidenceThresh_Async(Stitcher self, double inval, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setPanoConfidenceThresh(inval); - callback(); - END_WRAP -} - -CvStatus *Stitcher_GetWaveCorrection_Async(Stitcher self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool((*self.ptr)->waveCorrection())); - END_WRAP -} - -CvStatus *Stitcher_SetWaveCorrection_Async(Stitcher self, bool inval, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setWaveCorrection(inval); - callback(); - END_WRAP -} - -CvStatus *Stitcher_GetInterpolationFlags_Async(Stitcher self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new int(static_cast((*self.ptr)->interpolationFlags()))); - END_WRAP -} - -CvStatus *Stitcher_SetInterpolationFlags_Async(Stitcher self, int inval, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setInterpolationFlags(static_cast(inval)); - callback(); - END_WRAP -} - -CvStatus *Stitcher_GetWaveCorrectKind_Async(Stitcher self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new int(static_cast((*self.ptr)->waveCorrectKind()))); - END_WRAP -} - -CvStatus *Stitcher_SetWaveCorrectKind_Async(Stitcher self, int inval, CvCallback_0 callback) { - BEGIN_WRAP(*self.ptr)->setWaveCorrectKind(static_cast(inval)); - callback(); - END_WRAP -} - -// Asynchronous functions -CvStatus * -Stitcher_EstimateTransform_Async(Stitcher self, VecMat mats, VecMat masks, CvCallback_1 callback) { - BEGIN_WRAP - int rval; - auto _mats = vecmat_c2cpp(mats); - if (masks.length > 0) { - auto _masks = vecmat_c2cpp(masks); - rval = static_cast((*self.ptr)->estimateTransform(_mats, _masks)); - } else - rval = static_cast((*self.ptr)->estimateTransform(_mats)); - callback(new int(rval)); - END_WRAP -} - -CvStatus *Stitcher_ComposePanorama_Async(Stitcher self, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat _rpano; - - int rval = static_cast((*self.ptr)->composePanorama(_rpano)); - callback(new int(rval), new Mat{new cv::Mat(_rpano)}); - END_WRAP -} - -CvStatus *Stitcher_ComposePanorama_1_Async(Stitcher self, VecMat mats, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat _rpano; - auto _mats = vecmat_c2cpp(mats); - auto rval = static_cast((*self.ptr)->composePanorama(_mats, _rpano)); - callback(new int(rval), new Mat{new cv::Mat(_rpano)}); - END_WRAP -} - -CvStatus *Stitcher_Stitch_Async(Stitcher self, VecMat mats, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat _rpano; - auto _mats = vecmat_c2cpp(mats); - int rval = static_cast((*self.ptr)->stitch(_mats, _rpano)); - callback(new int(rval), new Mat{new cv::Mat(_rpano)}); - END_WRAP -} - -CvStatus *Stitcher_Stitch_1_Async(Stitcher self, VecMat mats, VecMat masks, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat _rpano; - auto _mats = vecmat_c2cpp(mats); - auto _masks = vecmat_c2cpp(masks); - int rval = static_cast((*self.ptr)->stitch(_mats, _masks, _rpano)); - callback(new int(rval), new Mat{new cv::Mat(_rpano)}); - END_WRAP -} - -CvStatus *Stitcher_Component_Async(Stitcher self, CvCallback_1 callback) { - BEGIN_WRAP - std::vector _rval = (*self.ptr)->component(); - callback(vecint_cpp2c_p(_rval)); - END_WRAP -} diff --git a/src/stitching/stitching_async.h b/src/stitching/stitching_async.h deleted file mode 100644 index 2312d667..00000000 --- a/src/stitching/stitching_async.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Created by Abdelaziz Mahdy. Licensed: Apache 2.0 license. Copyright (c) 2024 Abdelaziz Mahdy. */ -#ifndef OPENCV_DART_LIBRARY_STITCHING_ASYNC_H -#define OPENCV_DART_LIBRARY_STITCHING_ASYNC_H - -#include "core/types.h" -#include "stitching.h" - -#ifdef __cplusplus -#include -extern "C" { -#endif - -// Asynchronous functions for Stitcher_Create -CvStatus *Stitcher_Create_Async(int mode, CvCallback_1 callback); - -// Asynchronous functions for Stitcher_Close -void Stitcher_Close_Async(StitcherPtr stitcher, CvCallback_0 callback); - -// Asynchronous getter/setter functions -CvStatus *Stitcher_GetRegistrationResol_Async(Stitcher self, CvCallback_1 callback); -CvStatus *Stitcher_SetRegistrationResol_Async(Stitcher self, double inval, CvCallback_0 callback); -CvStatus *Stitcher_GetSeamEstimationResol_Async(Stitcher self, CvCallback_1 callback); -CvStatus *Stitcher_SetSeamEstimationResol_Async(Stitcher self, double inval, CvCallback_0 callback); -CvStatus *Stitcher_GetCompositingResol_Async(Stitcher self, CvCallback_1 callback); -CvStatus *Stitcher_SetCompositingResol_Async(Stitcher self, double inval, CvCallback_0 callback); -CvStatus *Stitcher_GetPanoConfidenceThresh_Async(Stitcher self, CvCallback_1 callback); -CvStatus *Stitcher_SetPanoConfidenceThresh_Async(Stitcher self, double inval, CvCallback_0 callback); -CvStatus *Stitcher_GetWaveCorrection_Async(Stitcher self, CvCallback_1 callback); -CvStatus *Stitcher_SetWaveCorrection_Async(Stitcher self, bool inval, CvCallback_0 callback); -CvStatus *Stitcher_GetInterpolationFlags_Async(Stitcher self, CvCallback_1 callback); -CvStatus *Stitcher_SetInterpolationFlags_Async(Stitcher self, int inval, CvCallback_0 callback); -CvStatus *Stitcher_GetWaveCorrectKind_Async(Stitcher self, CvCallback_1 callback); -CvStatus *Stitcher_SetWaveCorrectKind_Async(Stitcher self, int inval, CvCallback_0 callback); - -// Asynchronous functions -CvStatus *Stitcher_EstimateTransform_Async(Stitcher self, VecMat mats, VecMat masks, CvCallback_1 callback); -CvStatus *Stitcher_ComposePanorama_Async(Stitcher self, CvCallback_2 callback); -CvStatus *Stitcher_ComposePanorama_1_Async(Stitcher self, VecMat mats, CvCallback_2 callback); -CvStatus *Stitcher_Stitch_Async(Stitcher self, VecMat mats, CvCallback_2 callback); -CvStatus *Stitcher_Stitch_1_Async(Stitcher self, VecMat mats, VecMat masks, CvCallback_2 callback); -CvStatus *Stitcher_Component_Async(Stitcher self, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // OPENCV_DART_LIBRARY_STITCHING_ASYNC_H diff --git a/src/t.h b/src/t.h deleted file mode 100644 index b6fa2fa1..00000000 --- a/src/t.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef CVD_ASYNC__H -#define CVD_ASYNC__H - -#include "core/types.h" - -// this file is a template to create more headers - -#endif // CVD_ASYNC__H diff --git a/src/test/calib3d.cc b/src/test/calib3d.cc deleted file mode 100644 index a7621723..00000000 --- a/src/test/calib3d.cc +++ /dev/null @@ -1,15 +0,0 @@ -#include "../calib3d/calib3d.h" -#include "../core/core.h" -#include -// #include -#include - -TEST(calib3d, findChessboardCornersSB) -{ - Mat img = {new cv::Mat(cv::imread("test/images/chessboard_4x6.png", 0))}; - EXPECT_EQ(img.ptr->empty(), false); - Mat corners = {new cv::Mat()}; - bool rval; - CvStatus *s = FindChessboardCornersSB(img, {4, 6}, corners, 0, &rval); - EXPECT_EQ(s->code, 0); -} diff --git a/src/test/core.cc b/src/test/core.cc deleted file mode 100644 index f012501e..00000000 --- a/src/test/core.cc +++ /dev/null @@ -1,403 +0,0 @@ -#include "../core/core.h" - -#include -#include -#include - -TEST(Mat, New_Close) -{ - Mat *mat = (Mat *)malloc(sizeof(Mat)); - CvStatus *s; - s = Mat_New(mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE((*mat).ptr, nullptr); - Mat_Close(mat); - - Mat mat1; - s = Mat_NewWithSize(3, 3, CV_8UC1, &mat1); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat1.ptr, nullptr); - - bool is_empty; - s = Mat_Empty(mat1, &is_empty); - EXPECT_EQ(s->code, 0); - EXPECT_FALSE(is_empty); - - int rows, cols, type; - s = Mat_Rows(mat1, &rows); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(rows, 3); - s = Mat_Cols(mat1, &cols); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(cols, 3); - s = Mat_Type(mat1, &type); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(type, CV_8UC1); - Mat_Close(&mat1); - - VecI32 sizes = {vecint_cpp2c({3, 3})}; - type = CV_8UC1; - - Mat mat2; - s = Mat_NewWithSizes(sizes, type, &mat2); - EXPECT_EQ(s->code, 0); - - s = Mat_Rows(mat2, &rows); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(rows, sizes.ptr->at(0)); - s = Mat_Cols(mat2, &cols); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(cols, sizes.ptr->at(1)); - s = Mat_Type(mat2, &type); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(type, CV_8UC1); - Mat_Close(&mat2); - - Scalar scalar = {1, 2, 3, 4}; - Mat mat3; - - s = Mat_NewWithSizesFromScalar(sizes, CV_8UC3, scalar, &mat3); - - // Check the result - ASSERT_EQ(s->code, 0); - ASSERT_NE(mat3.ptr, nullptr); - EXPECT_EQ(mat3.ptr->rows, sizes.ptr->at(0)); - EXPECT_EQ(mat3.ptr->cols, sizes.ptr->at(1)); - EXPECT_EQ(mat3.ptr->type(), CV_8UC3); - cv::Scalar expectedScalar(1, 2, 3, 4); - for (int i = 0; i < mat3.ptr->rows; i++) { - for (int j = 0; j < mat3.ptr->cols; j++) { - cv::Vec3b pixel = mat3.ptr->at(i, j); - EXPECT_EQ(pixel[0], expectedScalar.val[0]); - EXPECT_EQ(pixel[1], expectedScalar.val[1]); - EXPECT_EQ(pixel[2], expectedScalar.val[2]); - } - } - Mat_Close(&mat3); - - Mat mat4; - s = Mat_NewFromScalar(scalar, CV_8UC3, &mat4); - ASSERT_EQ(s->code, 0); - - // Assert the created Mat object - EXPECT_EQ(mat4.ptr->rows, 1); - EXPECT_EQ(mat4.ptr->cols, 1); - EXPECT_EQ(mat4.ptr->type(), CV_8UC3); - Mat_Close(&mat4); - - Mat mat5; - s = Mat_NewWithSizeFromScalar(scalar, rows, cols, CV_8UC3, &mat5); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(mat5.ptr->rows, rows); - EXPECT_EQ(mat5.ptr->cols, cols); - EXPECT_EQ(mat5.ptr->type(), CV_8UC3); - - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - cv::Vec3b pixel = mat5.ptr->at(i, j); - EXPECT_EQ(pixel[0], scalar.val1); - EXPECT_EQ(pixel[1], scalar.val2); - EXPECT_EQ(pixel[2], scalar.val3); - } - } - Mat_Close(&mat5); -} - -TEST(Mat, Create_extra) -{ - Mat mat; - CvStatus *s; - - s = Zeros(3, 3, CV_8UC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - EXPECT_EQ(mat.ptr->rows, 3); - EXPECT_EQ(mat.ptr->cols, 3); - EXPECT_EQ(mat.ptr->type(), CV_8UC3); - Mat_Close(&mat); - - Mat mat1; - s = Ones(3, 3, CV_8UC3, &mat1); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat1.ptr, nullptr); - EXPECT_EQ(mat1.ptr->rows, 3); - EXPECT_EQ(mat1.ptr->cols, 3); - EXPECT_EQ(mat1.ptr->type(), CV_8UC3); - Mat_Close(&mat1); - - Mat mat2; - s = Eye(3, 3, CV_8UC3, &mat2); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat2.ptr, nullptr); - EXPECT_EQ(mat2.ptr->rows, 3); - EXPECT_EQ(mat2.ptr->cols, 3); - EXPECT_EQ(mat2.ptr->type(), CV_8UC3); - Mat_Close(&mat2); - - std::vector data = {0, 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}; - VecUChar buf = {vecuchar_cpp2c(data)}; - Mat matt = {}; - s = Mat_NewFromBytes(3, 3, CV_8UC3, data.data(), 0, &matt); - EXPECT_EQ(s->code, 0); - EXPECT_NE(matt.ptr, nullptr); - EXPECT_EQ(matt.ptr->rows, 3); - EXPECT_EQ(matt.ptr->cols, 3); - EXPECT_EQ(matt.ptr->channels(), 3); - auto v = matt.ptr->at(0, 0); - std::cout << v << std::endl; - EXPECT_EQ(v.val[1], 1); - for (int i = 0; i < matt.ptr->rows; i++) { - for (int j = 0; j < matt.ptr->cols; j++) { - for (int k = 0; k < matt.ptr->channels(); k++) { - std::cout << static_cast(matt.ptr->at(i, j, k)) << " "; - } - } - } - std::cout << *matt.ptr->data << std::endl; -} - -TEST(Mat, Property) -{ - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Mat_NewWithSizeFromScalar(scalar, 3, 3, CV_8UC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - int rows, cols, type, channels, step, total, elem_size; - s = Mat_Rows(mat, &rows); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(rows, 3); - s = Mat_Cols(mat, &cols); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(cols, 3); - s = Mat_Type(mat, &type); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(type, CV_8UC3); - s = Mat_Channels(mat, &channels); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(channels, 3); - s = Mat_Step(mat, &step); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(step, 3 * 3); - s = Mat_Total(mat, &total); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(total, 3 * 3); - s = Mat_ElemSize(mat, &elem_size); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(elem_size, 3); - - Mat_Close(&mat); -} - -TEST(Mat, Getter_Setter_UChar) -{ - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Mat_NewWithSizeFromScalar(scalar, 3, 3, CV_8UC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - uchar pix; - s = Mat_GetUChar(mat, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 1); - - s = Mat_SetUChar(mat, 0, 0, 241); - EXPECT_EQ(s->code, 0); - s = Mat_SetUChar3(mat, 0, 0, 0, 241); - EXPECT_EQ(s->code, 0); - - s = Mat_GetUChar3(mat, 0, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 241); - - Mat_Close(&mat); -} - -TEST(Mat, Getter_Setter_Char) -{ - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Mat_NewWithSizeFromScalar(scalar, 3, 3, CV_8SC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - int8_t pix; - s = Mat_GetSChar(mat, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 1); - - s = Mat_SetSChar(mat, 0, 0, 127); - EXPECT_EQ(s->code, 0); - s = Mat_SetSChar3(mat, 0, 0, 0, 127); - EXPECT_EQ(s->code, 0); - - s = Mat_GetSChar3(mat, 0, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 127); - - Mat_Close(&mat); -} - -TEST(Mat, Getter_Setter_UShort) -{ - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Mat_NewWithSizeFromScalar(scalar, 3, 3, CV_16UC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - uint16_t pix; - s = Mat_GetUShort(mat, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 1); - - s = Mat_SetUShort(mat, 0, 0, 127); - EXPECT_EQ(s->code, 0); - s = Mat_SetUShort3(mat, 0, 0, 0, 127); - EXPECT_EQ(s->code, 0); - - s = Mat_GetUShort3(mat, 0, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 127); - - Mat_Close(&mat); -} - -TEST(Mat, Getter_Setter_Short) -{ - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Mat_NewWithSizeFromScalar(scalar, 3, 3, CV_16SC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - int16_t pix; - s = Mat_GetShort(mat, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 1); - - s = Mat_SetShort(mat, 0, 0, 127); - EXPECT_EQ(s->code, 0); - s = Mat_SetShort3(mat, 0, 0, 0, 127); - EXPECT_EQ(s->code, 0); - - s = Mat_GetShort3(mat, 0, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 127); - - Mat_Close(&mat); -} - -TEST(Mat, Getter_Setter_Int) -{ - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Mat_NewWithSizeFromScalar(scalar, 3, 3, CV_32SC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - int pix; - s = Mat_GetInt(mat, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 1); - - s = Mat_SetInt(mat, 0, 0, 127); - EXPECT_EQ(s->code, 0); - s = Mat_SetInt3(mat, 0, 0, 0, 127); - EXPECT_EQ(s->code, 0); - - s = Mat_GetInt3(mat, 0, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 127); - - Mat_Close(&mat); -} - -TEST(Mat, Getter_Setter_Float) -{ - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Mat_NewWithSizeFromScalar(scalar, 3, 3, CV_32FC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - float pix; - s = Mat_GetFloat(mat, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 1); - - s = Mat_SetFloat(mat, 0, 0, 127); - EXPECT_EQ(s->code, 0); - s = Mat_SetFloat3(mat, 0, 0, 0, 127); - EXPECT_EQ(s->code, 0); - - s = Mat_GetFloat3(mat, 0, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 127); - - Mat_Close(&mat); -} - -TEST(Mat, Getter_Setter_Double) -{ - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Mat_NewWithSizeFromScalar(scalar, 3, 3, CV_64FC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - double pix; - s = Mat_GetDouble(mat, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 1); - - s = Mat_SetDouble(mat, 0, 0, 127); - EXPECT_EQ(s->code, 0); - s = Mat_SetDouble3(mat, 0, 0, 0, 127); - EXPECT_EQ(s->code, 0); - - s = Mat_GetDouble3(mat, 0, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix, 127); - - Mat_Close(&mat); -} - -TEST(Mat, Getter_Vec) -{ - auto cvmat = cv::Mat(cv::Mat::ones(30, 30, CV_8UC3)); - auto expectedVec = cvmat.at(0, 0); - - auto cvmat1 = cv::Mat(30, 40, CV_8UC3, cv::Scalar(2, 4, 1, 0)); - auto v = static_cast(cvmat1.at(0, 0, 0)); - auto v1 = static_cast(cvmat1.at(0, 1, 0)); - auto v2 = static_cast(cvmat1.at(0, 2, 0)); - std::cout << v << "," << v1 << "," << v2 << std::endl; - - CvStatus *s; - Scalar scalar = {1, 2, 3, 4}; - Mat mat; - s = Ones(30, 30, CV_8UC3, &mat); - EXPECT_EQ(s->code, 0); - EXPECT_NE(mat.ptr, nullptr); - - Vec3b pix; - s = Mat_GetVec3b(mat, 0, 0, &pix); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(pix.val1, expectedVec.val[0]); - EXPECT_EQ(pix.val2, expectedVec.val[1]); - EXPECT_EQ(pix.val3, expectedVec.val[2]); - - Mat_Close(&mat); -} diff --git a/src/test/dnn.cc b/src/test/dnn.cc deleted file mode 100644 index 4c4093bb..00000000 --- a/src/test/dnn.cc +++ /dev/null @@ -1,48 +0,0 @@ -#include "../dnn/dnn.h" -#include "../core/core.h" -#include -#include -#include -// #include -#include -#include - -std::vector readFile(const char *filename) -{ - // open the file: - std::ifstream file(filename, std::ios::binary); - - // Stop eating new lines in binary mode!!! - file.unsetf(std::ios::skipws); - - // get its size: - std::streampos fileSize; - - file.seekg(0, std::ios::end); - fileSize = file.tellg(); - file.seekg(0, std::ios::beg); - - // reserve capacity - std::vector vec; - vec.reserve(fileSize); - - // read the data: - vec.insert(vec.begin(), std::istream_iterator(file), std::istream_iterator()); - - return vec; -} - -TEST(dnn, Create) -{ - Net net; - auto data = readFile("test/models/bvlc_googlenet.caffemodel"); - auto conf = readFile("test/models/bvlc_googlenet.prototxt"); - VecUChar bufM = {&data}; - VecUChar bufC = {&conf}; - CvStatus *status = Net_ReadNetBytes("caffe", bufM, bufC, &net); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(net.ptr->empty(), false); - char *dump = (char *)calloc(1000, sizeof(char)); - Net_Dump(net, &dump); - std::cout << "model dump:" << dump << std::endl; -} diff --git a/src/test/imgcodecs.cc b/src/test/imgcodecs.cc deleted file mode 100644 index e858e8ef..00000000 --- a/src/test/imgcodecs.cc +++ /dev/null @@ -1,14 +0,0 @@ -#include "../imgcodecs/imgcodecs.h" -#include "../core/core.h" -#include - -// #include -#include - -TEST(ImgCodecs, Read) -{ - Mat im; - CvStatus *status = Image_IMRead("test/images/circles.jpg", 0, &im); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(im.ptr->empty(), false); -} diff --git a/src/test/imgproc.cc b/src/test/imgproc.cc deleted file mode 100644 index 46b956bf..00000000 --- a/src/test/imgproc.cc +++ /dev/null @@ -1,25 +0,0 @@ -#include "../imgproc/imgproc.h" -#include "../core/core.h" -#include "../imgcodecs/imgcodecs.h" -#include - -#include -#include - -TEST(ImgProc, cornerSubPix) -{ - Mat img; - CvStatus *status = Image_IMRead("test/images/circles.jpg", cv::ImreadModes::IMREAD_GRAYSCALE, &img); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(img.ptr->empty(), false); - Mat mask = {new cv::Mat()}; - VecPoint2f corners = {vecpoint2f_cpp2c()}; - TermCriteria criteria = {cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 30, 0.1}; - status = GoodFeaturesToTrack(img, &corners, 10, 0.01, 10, mask, 3, false, 0.04); - ASSERT_EQ(status->code, 0); - status = CornerSubPix(img, corners, {10, 10}, {-1, -1}, criteria); - ASSERT_EQ(status->code, 0); - status = CornerSubPix(img, corners, {10, 10}, {-1, -1}, criteria); - ASSERT_EQ(status->code, 0); - std::cout << *corners.ptr << std::endl; -} diff --git a/src/test/vec.cc b/src/test/vec.cc deleted file mode 100644 index c9b1fdd1..00000000 --- a/src/test/vec.cc +++ /dev/null @@ -1,850 +0,0 @@ -#include "../core/vec.h" -#include -#include -#include -#include - -TEST(VecPoint, New) -{ - // Arrange - VecPoint vecPoint; - - // Act - CvStatus *status = VecPoint_New(&vecPoint); - - // Assert - EXPECT_EQ(status->code, 0); - EXPECT_NE(vecPoint.ptr, nullptr); - EXPECT_TRUE(vecPoint.ptr->empty()); // Check if the vector is empty - - // Clean up - VecPoint_Close(&vecPoint); -} - -TEST(VecPoint, NewFromPointerTest) -{ - VecPoint rval; - int length = 3; - Point *points = new Point[length]; - for (int i = 0; i < length; i++) { - points[i].x = i; - points[i].y = i; - } - // Call the function to be tested - CvStatus *status = VecPoint_NewFromPointer(points, length, &rval); - - // Assert the return status - ASSERT_EQ(status->code, 0); - - // Assert the vector size - ASSERT_EQ(rval.ptr->size(), length); - - // Assert the vector content - for (int i = 0; i < length; i++) { - ASSERT_EQ(rval.ptr->at(i).x, points[i].x); - ASSERT_EQ(rval.ptr->at(i).y, points[i].y); - } -} - -TEST(VecPoint, ConvertsMatToVecPoint) -{ - std::vector expectedPts = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; - - Mat mat = {new cv::Mat(expectedPts)}; - VecPoint rval; - // Call the function to be tested - CvStatus *status = VecPoint_NewFromMat(mat, &rval); - - // Assert the return status - if (status->code != 0) { - printf("status->msg: %s", status->msg); - } - ASSERT_EQ(status->code, 0); - ASSERT_NE(rval.ptr, nullptr); - - // Assert the converted vector of points - ASSERT_EQ(*rval.ptr, expectedPts); -} - -TEST(VecPoint, At_Append_Size) -{ - // Initialize any required variables or objects for the tests - VecPoint vec; - CvStatus *s; - s = VecPoint_New(&vec); - EXPECT_EQ(s->code, 0); - s = VecPoint_Append(vec, {1, 2}); - EXPECT_EQ(s->code, 0); - s = VecPoint_Append(vec, {3, 4}); - EXPECT_EQ(s->code, 0); - - int size = 0; - s = VecPoint_Size(vec, &size); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(size, 2); - - Point point; - s = VecPoint_At(vec, 0, &point); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(point.x, 1); - EXPECT_EQ(point.y, 2); -} - -TEST(VecVecPoint, New_Append_At_Size) -{ - VecVecPoint vec; - CvStatus *status = VecVecPoint_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - EXPECT_TRUE(vec.ptr->empty()); // Check if the vector is empty - - std::vector vp = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; - VecVecPoint_Append(vec, {&vp}); - VecVecPoint_Append(vec, {&vp}); - - int size = 0; - status = VecVecPoint_Size(vec, &size); - ASSERT_EQ(size, 2); - - VecPoint v; - status = VecVecPoint_At(vec, 0, &v); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(v.ptr->front(), cv::Point(1, 2)); - - VecVecPoint_Close(&vec); -} - -TEST(VecVecPoint, NewFromPointerTest) -{ - // Create input data - int length = 3; - - VecPoint *points = new VecPoint[length]; - for (int i = 0; i < length; i++) { - std::vector vp = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; - VecPoint v = {.ptr = vecpoint_cpp2c(vp)}; - points[i] = v; - } - - // Create output variable - VecVecPoint vec; - - // Call the function to be tested - CvStatus *status = VecVecPoint_NewFromPointer(points, length, &vec); - - // Assertions - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - - // Verify the output - ASSERT_EQ(vec.ptr->size(), length); - for (int i = 0; i < length; i++) { - EXPECT_EQ(vec.ptr->at(i).size(), 4); - EXPECT_EQ(vec.ptr->at(i).front().x, 1); - EXPECT_EQ(vec.ptr->at(i).front().y, 2); - EXPECT_EQ(vec.ptr->at(i).back().x, 7); - EXPECT_EQ(vec.ptr->at(i).back().y, 8); - } - - VecVecPoint_Close(&vec); -} - -TEST(VecPoint2f, New) -{ - // Arrange - VecPoint2f vecPoint; - - // Act - CvStatus *status = VecPoint2f_New(&vecPoint); - - // Assert - EXPECT_EQ(status->code, 0); - EXPECT_NE(vecPoint.ptr, nullptr); - EXPECT_TRUE(vecPoint.ptr->empty()); // Check if the vector is empty - - // Clean up - VecPoint2f_Close(&vecPoint); -} - -TEST(VecPoint2f, NewFromPointerTest) -{ - VecPoint2f rval; - int length = 3; - Point2f *points = new Point2f[length]; - for (int i = 0; i < length; i++) { - points[i].x = i; - points[i].y = i; - } - // Call the function to be tested - CvStatus *status = VecPoint2f_NewFromPointer(points, length, &rval); - - // Assert the return status - ASSERT_EQ(status->code, 0); - - // Assert the vector size - ASSERT_EQ(rval.ptr->size(), length); - - // Assert the vector content - for (int i = 0; i < length; i++) { - ASSERT_EQ(rval.ptr->at(i).x, points[i].x); - ASSERT_EQ(rval.ptr->at(i).y, points[i].y); - } -} - -TEST(VecPoint2f, ConvertsMatToVecPoint2f) -{ - std::vector expectedPts = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; - - Mat mat = Mat{new cv::Mat(expectedPts)}; - VecPoint2f rval; - // Call the function to be tested - CvStatus *status = VecPoint2f_NewFromMat(mat, &rval); - - // Assert the return status - if (status->code != 0) { - printf("status->msg: %s", status->msg); - } - ASSERT_EQ(status->code, 0); - ASSERT_NE(rval.ptr, nullptr); - - // Assert the converted vector of points - ASSERT_EQ(*rval.ptr, expectedPts); -} - -TEST(VecPoint2f, At_Append_Size) -{ - // Initialize any required variables or objects for the tests - VecPoint2f vec; - CvStatus *s; - s = VecPoint2f_New(&vec); - EXPECT_EQ(s->code, 0); - s = VecPoint2f_Append(vec, {1.0, 2.0}); - EXPECT_EQ(s->code, 0); - s = VecPoint2f_Append(vec, {3, 4}); - EXPECT_EQ(s->code, 0); - - int size = 0; - s = VecPoint2f_Size(vec, &size); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(size, 2); - - Point2f point; - s = VecPoint2f_At(vec, 0, &point); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(point.x, 1.0); - EXPECT_EQ(point.y, 2.0); -} - -TEST(VecVecPoint2f, New_Append_At_Size) -{ - VecVecPoint2f vec; - CvStatus *status = VecVecPoint2f_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - EXPECT_TRUE(vec.ptr->empty()); // Check if the vector is empty - - std::vector vp = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; - VecVecPoint2f_Append(vec, {&vp}); - VecVecPoint2f_Append(vec, {&vp}); - - int size = 0; - status = VecVecPoint2f_Size(vec, &size); - ASSERT_EQ(size, 2); - - VecPoint2f v; - status = VecVecPoint2f_At(vec, 0, &v); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(v.ptr->front(), cv::Point2f(1, 2)); - - VecVecPoint2f_Close(&vec); -} - -TEST(VecVecPoint2f, NewFromPointerTest) -{ - // Create input data - int length = 3; - - VecPoint2f *points = new VecPoint2f[length]; - for (int i = 0; i < length; i++) { - std::vector vp = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; - points[i] = {&vp}; - } - - // Create output variable - VecVecPoint2f vec; - - // Call the function to be tested - CvStatus *status = VecVecPoint2f_NewFromPointer(points, length, &vec); - - // Assertions - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - - // Verify the output - ASSERT_EQ(vec.ptr->size(), length); - for (int i = 0; i < length; i++) { - EXPECT_EQ(vec.ptr->at(i).size(), 4); - EXPECT_EQ(vec.ptr->at(i).front().x, 1); - EXPECT_EQ(vec.ptr->at(i).front().y, 2); - EXPECT_EQ(vec.ptr->at(i).back().x, 7); - EXPECT_EQ(vec.ptr->at(i).back().y, 8); - } - - VecVecPoint2f_Close(&vec); -} - -TEST(VecPoint3f, New) -{ - // Arrange - VecPoint3f vecPoint; - - // Act - CvStatus *status = VecPoint3f_New(&vecPoint); - - // Assert - EXPECT_EQ(status->code, 0); - EXPECT_NE(vecPoint.ptr, nullptr); - EXPECT_TRUE(vecPoint.ptr->empty()); // Check if the vector is empty - - // Clean up - VecPoint3f_Close(&vecPoint); -} - -TEST(VecPoint3f, NewFromPointerTest) -{ - VecPoint3f rval; - int length = 3; - Point3f *points = new Point3f[length]; - for (int i = 0; i < length; i++) { - points[i].x = i; - points[i].y = i; - points[i].z = i; - } - // Call the function to be tested - CvStatus *status = VecPoint3f_NewFromPointer(points, length, &rval); - - // Assert the return status - ASSERT_EQ(status->code, 0); - - // Assert the vector size - ASSERT_EQ(rval.ptr->size(), length); - - // Assert the vector content - for (int i = 0; i < length; i++) { - ASSERT_EQ(rval.ptr->at(i).x, points[i].x); - ASSERT_EQ(rval.ptr->at(i).y, points[i].y); - ASSERT_EQ(rval.ptr->at(i).z, points[i].z); - } -} - -TEST(VecPoint3f, ConvertsMatToVecPoint2f) -{ - std::vector expectedPts = {{1, 2, 1}, {3, 4, 3}, {5, 6, 5}, {7, 8, 7}}; - - Mat mat = {new cv::Mat(expectedPts)}; - VecPoint3f rval; - // Call the function to be tested - CvStatus *status = VecPoint3f_NewFromMat(mat, &rval); - - // Assert the return status - if (status->code != 0) { - printf("status->msg: %s", status->msg); - } - ASSERT_EQ(status->code, 0); - ASSERT_NE(rval.ptr, nullptr); - - // Assert the converted vector of points - ASSERT_EQ(*rval.ptr, expectedPts); -} - -TEST(VecPoint3f, At_Append_Size) -{ - // Initialize any required variables or objects for the tests - VecPoint3f vec; - CvStatus *s; - s = VecPoint3f_New(&vec); - EXPECT_EQ(s->code, 0); - s = VecPoint3f_Append(vec, {1.0, 2.0, 1.0}); - EXPECT_EQ(s->code, 0); - s = VecPoint3f_Append(vec, {3, 4, 3.0}); - EXPECT_EQ(s->code, 0); - - int size = 0; - s = VecPoint3f_Size(vec, &size); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(size, 2); - - Point3f point; - s = VecPoint3f_At(vec, 0, &point); - EXPECT_EQ(s->code, 0); - EXPECT_EQ(point.x, 1.0); - EXPECT_EQ(point.y, 2.0); - EXPECT_EQ(point.z, 1.0); -} - -TEST(VecVecPoint3f, New_Append_At_Size) -{ - VecVecPoint3f vec; - CvStatus *status = VecVecPoint3f_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - EXPECT_TRUE(vec.ptr->empty()); // Check if the vector is empty - - int length = 4; - Point3f *p = new Point3f[length]; - for (int i = 0; i < length; i++) { - p[i].x = i; - p[i].y = i + 1; - p[i].z = i; - } - VecPoint3f vp; - VecPoint3f_NewFromPointer(p, length, &vp); - VecVecPoint3f_Append(vec, vp); - VecVecPoint3f_Append(vec, vp); - - int size = 0; - status = VecVecPoint3f_Size(vec, &size); - ASSERT_EQ(size, 2); - - VecPoint3f v; - status = VecVecPoint3f_At(vec, 0, &v); - std::cout << *v.ptr << std::endl; - std::cout << *vp.ptr << std::endl; - ASSERT_EQ(status->code, 0); - ASSERT_EQ(*v.ptr, *vp.ptr); - - VecVecPoint3f_Close(&vec); -} - -TEST(VecVecPoint3f, NewFromPointerTest) -{ - int length = 3; - - VecPoint3f *points = new VecPoint3f[length]; - for (int i = 0; i < length; i++) { - VecPoint3f vp; - VecPoint3f_New(&vp); - for (int j = 0; j < 4; j++) { - VecPoint3f_Append(vp, {(float)j, (float)j + 1, (float)j}); - } - points[i] = vp; - } - - VecVecPoint3f vec; - CvStatus *status = VecVecPoint3f_NewFromPointer(points, length, &vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - ASSERT_EQ(vec.ptr->size(), length); - for (int i = 0; i < length; i++) { - EXPECT_EQ(vec.ptr->at(i).size(), 4.0); - EXPECT_EQ(vec.ptr->at(i).front().x, 0.0); - EXPECT_EQ(vec.ptr->at(i).front().y, 1.0); - EXPECT_EQ(vec.ptr->at(i).front().z, 0.0); - EXPECT_EQ(vec.ptr->at(i).back().x, 3.0); - EXPECT_EQ(vec.ptr->at(i).back().y, 4.0); - EXPECT_EQ(vec.ptr->at(i).back().z, 3.0); - } - - VecVecPoint3f_Close(&vec); -} - -TEST(VecUChar, New_Append_At_Size_Close) -{ - VecUChar vec; - CvStatus *status = VecUChar_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecUChar_Append(vec, 1); - ASSERT_EQ(status->code, 0); - status = VecUChar_Append(vec, 2); - ASSERT_EQ(status->code, 0); - - uchar c; - status = VecUChar_At(vec, 0, &c); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(c, 1); - - int size; - status = VecUChar_Size(vec, &size); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(size, 2); - - VecUChar_Close(&vec); - - uchar *chars = new uchar[]{0, 1, 2, 3}; - status = VecUChar_NewFromPointer(chars, 4, &vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); -} - -TEST(VecChar, New_Append_At_Size_Close) -{ - VecChar vec; - CvStatus *status = VecChar_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecChar_Append(vec, 1); - ASSERT_EQ(status->code, 0); - status = VecChar_Append(vec, 2); - ASSERT_EQ(status->code, 0); - - char c; - status = VecChar_At(vec, 0, &c); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(c, 1); - - int size; - status = VecChar_Size(vec, &size); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(size, 2); - - VecChar_Close(&vec); - - char *chars = new char[]{0, 1, 2, 3}; - status = VecChar_NewFromPointer(chars, 4, &vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - VecChar_Close(&vec); -} - -TEST(VecChar, ToString) -{ - const char *s = "Hello"; - VecChar vec; - CvStatus *status; - status = VecChar_NewFromPointer(strdup(s), 5, &vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - char *ss = nullptr; - int length = 0; - status = VecChar_ToString(vec, &ss, &length); - ASSERT_EQ(status->code, 0); - ASSERT_NE(ss, nullptr); - ASSERT_EQ(length, 5); - ASSERT_STREQ(ss, s); - VecChar_Close(&vec); -} - -TEST(VecVecChar, New_Append_At_Size_Close) -{ - VecVecChar vec; - CvStatus *status; - status = VecVecChar_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - - const char *str = "abc"; - VecChar v; - status = VecChar_NewFromPointer(str, 3, &v); - EXPECT_EQ(status->code, 0); - EXPECT_NE(v.ptr, nullptr); - status = VecVecChar_Append(vec, v); - EXPECT_EQ(status->code, 0); - int size = 0; - status = VecVecChar_Size(vec, &size); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(size, 1); - - status = VecVecChar_Append_Str(vec, "abc"); - EXPECT_EQ(status->code, 0); - status = VecVecChar_Size(vec, &size); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(size, 2); - - VecChar v1; - status = VecVecChar_At(vec, 0, &v1); - EXPECT_EQ(status->code, 0); - - int sz = 0; - status = VecChar_Size(v1, &sz); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(sz, 3); - - char *s1 = nullptr; - int length = 0; - status = VecVecChar_At_Str(vec, 0, &s1, &length); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(length, 3); - EXPECT_STREQ(s1, "abc"); -} - -TEST(VecI32, New_Append_At_Size_Close) -{ - VecI32 vec; - CvStatus *status = VecI32_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecI32_Append(vec, 1); - ASSERT_EQ(status->code, 0); - status = VecI32_Append(vec, 2); - ASSERT_EQ(status->code, 0); - - int c; - status = VecI32_At(vec, 0, &c); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(c, 1); - - int size; - status = VecI32_Size(vec, &size); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(size, 2); - - VecI32_Close(&vec); - - int *chars = new int[]{0, 1, 2, 3}; - status = VecI32_NewFromPointer(chars, 4, &vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); -} - -TEST(VecF32, New_Append_At_Size_Close) -{ - VecF32 vec; - CvStatus *status = VecF32_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecF32_Append(vec, 1); - ASSERT_EQ(status->code, 0); - status = VecF32_Append(vec, 2); - ASSERT_EQ(status->code, 0); - - float c; - status = VecF32_At(vec, 0, &c); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(c, 1); - - int size; - status = VecF32_Size(vec, &size); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(size, 2); - - VecF32_Close(&vec); - - float *chars = new float[]{0, 1, 2, 3}; - status = VecF32_NewFromPointer(chars, 4, &vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); -} - -TEST(VecF64, New_Append_At_Size_Close) -{ - VecF64 vec; - CvStatus *status = VecF64_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecF64_Append(vec, 1); - ASSERT_EQ(status->code, 0); - status = VecF64_Append(vec, 2); - ASSERT_EQ(status->code, 0); - - double c; - status = VecF64_At(vec, 0, &c); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(c, 1); - - int size; - status = VecF64_Size(vec, &size); - ASSERT_EQ(status->code, 0); - ASSERT_EQ(size, 2); - - VecF64_Close(&vec); - - double *chars = new double[]{0, 1, 2, 3}; - status = VecF64_NewFromPointer(chars, 4, &vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); -} - -TEST(VecMat, New_Append_At_Size_Close) -{ - Mat mat; - Zeros(3, 3, CV_8UC1, &mat); - VecMat vec; - CvStatus *status = VecMat_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecMat_Append(vec, mat); - EXPECT_EQ(status->code, 0); - status = VecMat_Append(vec, mat); - EXPECT_EQ(status->code, 0); - - Mat c; - status = VecMat_At(vec, 0, &c); - EXPECT_EQ(status->code, 0); - EXPECT_EQ((*c.ptr).at(0, 0), 0); - - int size; - status = VecMat_Size(vec, &size); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(size, 2); - - VecMat_Close(&vec); - - Mat *mats = new Mat[4]; - for (int i = 0; i < 4; i++) { - Mat m; - Zeros(3, 3, 1, &m); - mats[i] = m; - } - status = VecMat_NewFromPointer(mats, 4, &vec); - EXPECT_EQ(status->code, 0); - EXPECT_NE(vec.ptr, nullptr); -} - -TEST(VecRect, New_Append_At_Size_Close) -{ - Rect rect = {1, 2, 3, 4}; - VecRect vec; - CvStatus *status = VecRect_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecRect_Append(vec, rect); - EXPECT_EQ(status->code, 0); - status = VecRect_Append(vec, rect); - EXPECT_EQ(status->code, 0); - - Rect r; - status = VecRect_At(vec, 0, &r); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(r.x, rect.x); - EXPECT_EQ(r.y, rect.y); - EXPECT_EQ(r.width, rect.width); - EXPECT_EQ(r.height, rect.height); - - int size; - status = VecRect_Size(vec, &size); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(size, 2); - - VecRect_Close(&vec); - - Rect *rects = new Rect[4]; - for (int i = 0; i < 4; i++) { - Rect r = {1, 2, 3, 4}; - rects[i] = r; - } - status = VecRect_NewFromPointer(rects, 4, &vec); - EXPECT_EQ(status->code, 0); - EXPECT_NE(vec.ptr, nullptr); -} - -TEST(VecKeyPoint, New_Append_At_Size_Close) -{ - KeyPoint kp = {1, 2, 3, 4, 5, 6, 7}; - VecKeyPoint vec; - CvStatus *status = VecKeyPoint_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecKeyPoint_Append(vec, kp); - EXPECT_EQ(status->code, 0); - status = VecKeyPoint_Append(vec, kp); - EXPECT_EQ(status->code, 0); - - KeyPoint r; - status = VecKeyPoint_At(vec, 0, &r); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(r.x, kp.x); - EXPECT_EQ(r.y, kp.y); - EXPECT_EQ(r.size, kp.size); - - int size; - status = VecKeyPoint_Size(vec, &size); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(size, 2); - - VecKeyPoint_Close(&vec); - - KeyPoint *rects = new KeyPoint[4]; - for (int i = 0; i < 4; i++) { - KeyPoint r = {1, 2, 3, 4, 5, 6, 7}; - rects[i] = r; - } - status = VecKeyPoint_NewFromPointer(rects, 4, &vec); - EXPECT_EQ(status->code, 0); - EXPECT_NE(vec.ptr, nullptr); -} - -TEST(VecDMatch, New_Append_At_Size_Close) -{ - DMatch kp = {1, 2, 3, 4}; - VecDMatch vec; - CvStatus *status = VecDMatch_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecDMatch_Append(vec, kp); - EXPECT_EQ(status->code, 0); - status = VecDMatch_Append(vec, kp); - EXPECT_EQ(status->code, 0); - - DMatch r; - status = VecDMatch_At(vec, 0, &r); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(r.queryIdx, kp.queryIdx); - EXPECT_EQ(r.trainIdx, kp.trainIdx); - EXPECT_EQ(r.imgIdx, kp.imgIdx); - - int size; - status = VecDMatch_Size(vec, &size); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(size, 2); - - VecDMatch_Close(&vec); - - DMatch *dms = new DMatch[4]; - for (int i = 0; i < 4; i++) { - DMatch r = {1, 2, 3, 4}; - dms[i] = r; - } - status = VecDMatch_NewFromPointer(dms, 4, &vec); - EXPECT_EQ(status->code, 0); - EXPECT_NE(vec.ptr, nullptr); -} - -TEST(VecVecDMatch, New_Append_At_Size_Close) -{ - DMatch kp = {1, 2, 3, 4}; - VecDMatch vecdm; - CvStatus *status = VecDMatch_New(&vecdm); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vecdm.ptr, nullptr); - status = VecDMatch_Append(vecdm, kp); - EXPECT_EQ(status->code, 0); - status = VecDMatch_Append(vecdm, kp); - EXPECT_EQ(status->code, 0); - - VecVecDMatch vec; - status = VecVecDMatch_New(&vec); - ASSERT_EQ(status->code, 0); - ASSERT_NE(vec.ptr, nullptr); - status = VecVecDMatch_Append(vec, vecdm); - EXPECT_EQ(status->code, 0); - status = VecVecDMatch_Append(vec, vecdm); - EXPECT_EQ(status->code, 0); - - VecDMatch r; - status = VecVecDMatch_At(vec, 0, &r); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(r.ptr->front().queryIdx, kp.queryIdx); - EXPECT_EQ(r.ptr->front().trainIdx, kp.trainIdx); - EXPECT_EQ(r.ptr->front().imgIdx, kp.imgIdx); - - int size; - status = VecVecDMatch_Size(vec, &size); - EXPECT_EQ(status->code, 0); - EXPECT_EQ(size, 2); - - VecVecDMatch_Close(&vec); - - VecDMatch *dms = new VecDMatch[4]; - for (int i = 0; i < 4; i++) { - VecDMatch v; - status = VecDMatch_New(&v); - for (int j = 0; j < 4; j++) { - DMatch dm = {1, 2, 3, 4}; - VecDMatch_Append(v, dm); - } - dms[i] = v; - } - status = VecVecDMatch_NewFromPointer(dms, 4, &vec); - EXPECT_EQ(status->code, 0); -} diff --git a/src/test/video.cc b/src/test/video.cc deleted file mode 100644 index d25c7a57..00000000 --- a/src/test/video.cc +++ /dev/null @@ -1,29 +0,0 @@ -#include "../video/videoio.h" -#include -#include -#include - -TEST(videoCapture, get) -{ - auto vcc = cv::VideoCapture("test/images/small.mp4"); - std::cout << vcc.isOpened() << std::endl; - std::cout << vcc.get(3) << " " << vcc.get(4) << " " << vcc.get(5) << " " << vcc.get(6) << " " << vcc.get(7) - << " " << vcc.get(8) << " " << vcc.get(9) << " " << vcc.get(10) << " " << vcc.get(11) << " " - << vcc.get(12) << std::endl; - auto fourcc = (int)vcc.get(cv::CAP_PROP_FOURCC); - std::cout << (char)(fourcc & 255) << (char)((fourcc >> 8) & 255) << (char)((fourcc >> 16) & 255) - << (char)((fourcc >> 24) & 255) << std::endl; - - VideoCapture cap = {}; - CvStatus *s = VideoCapture_New(&cap); - EXPECT_EQ(s->code, 0); - - bool rval; - s = VideoCapture_OpenWithAPI(cap, "test/images/small.mp4", 0, &rval); - EXPECT_EQ(s->code, 0); - - double cc = 0; - s = VideoCapture_Get(cap, 6, &cc); - EXPECT_EQ(s->code, 0); - std::cout << cc << std::endl; -} diff --git a/src/video/video.cpp b/src/video/video.cpp deleted file mode 100644 index 86a9ab72..00000000 --- a/src/video/video.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "video.h" -#include "core/vec.hpp" -#include - -CvStatus *BackgroundSubtractorMOG2_Create(BackgroundSubtractorMOG2 *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::createBackgroundSubtractorMOG2())}; - END_WRAP -} -CvStatus *BackgroundSubtractorMOG2_CreateWithParams( - int history, double varThreshold, bool detectShadows, BackgroundSubtractorMOG2 *rval -) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::createBackgroundSubtractorMOG2(history, varThreshold, detectShadows) - )}; - END_WRAP -} -void BackgroundSubtractorMOG2_Close(BackgroundSubtractorMOG2Ptr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *BackgroundSubtractorMOG2_Apply(BackgroundSubtractorMOG2 self, Mat src, Mat dst) { - BEGIN_WRAP(*self.ptr)->apply(*src.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *BackgroundSubtractorKNN_Create(BackgroundSubtractorKNN *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::createBackgroundSubtractorKNN())}; - END_WRAP -} -CvStatus *BackgroundSubtractorKNN_CreateWithParams( - int history, double dist2Threshold, bool detectShadows, BackgroundSubtractorKNN *rval -) { - BEGIN_WRAP - *rval = {new cv::Ptr( - cv::createBackgroundSubtractorKNN(history, dist2Threshold, detectShadows) - )}; - END_WRAP -} -void BackgroundSubtractorKNN_Close(BackgroundSubtractorKNNPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *BackgroundSubtractorKNN_Apply(BackgroundSubtractorKNN self, Mat src, Mat dst) { - BEGIN_WRAP(*self.ptr)->apply(*src.ptr, *dst.ptr); - END_WRAP -} - -CvStatus *CalcOpticalFlowPyrLK( - Mat prevImg, Mat nextImg, VecPoint2f prevPts, VecPoint2f *nextPts, VecUChar *status, VecF32 *err -) { - BEGIN_WRAP - auto _prevPts = vecpoint2f_c2cpp(prevPts); - auto _nextPts = vecpoint2f_c2cpp(*nextPts); - std::vector _status; - std::vector _err; - cv::calcOpticalFlowPyrLK(*prevImg.ptr, *nextImg.ptr, _prevPts, _nextPts, _status, _err); - - vecpoint2f_cpp2c(_nextPts, nextPts); - - *status = vecuchar_cpp2c(_status); - *err = vecfloat_cpp2c(_err); - END_WRAP -} - -CvStatus *CalcOpticalFlowPyrLKWithParams( - Mat prevImg, - Mat nextImg, - VecPoint2f prevPts, - VecPoint2f *nextPts, - VecUChar *status, - VecF32 *err, - Size winSize, - int maxLevel, - TermCriteria criteria, - int flags, - double minEigThreshold -) { - BEGIN_WRAP - auto _prevPts = vecpoint2f_c2cpp(prevPts); - auto _nextPts = vecpoint2f_c2cpp(*nextPts); - std::vector _status; - std::vector _err; - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - cv::calcOpticalFlowPyrLK( - *prevImg.ptr, - *nextImg.ptr, - _prevPts, - _nextPts, - _status, - _err, - cv::Size(winSize.width, winSize.height), - maxLevel, - tc, - flags, - minEigThreshold - ); - vecpoint2f_cpp2c(_nextPts, nextPts); - - *status = vecuchar_cpp2c(_status); - *err = vecfloat_cpp2c(_err); - END_WRAP -} -CvStatus *CalcOpticalFlowFarneback( - Mat prevImg, - Mat nextImg, - Mat flow, - double pyrScale, - int levels, - int winsize, - int iterations, - int polyN, - double polySigma, - int flags -) { - BEGIN_WRAP - cv::calcOpticalFlowFarneback( - *prevImg.ptr, - *nextImg.ptr, - *flow.ptr, - pyrScale, - levels, - winsize, - iterations, - polyN, - polySigma, - flags - ); - END_WRAP -} - -CvStatus *FindTransformECC( - Mat templateImage, - Mat inputImage, - Mat warpMatrix, - int motionType, - TermCriteria criteria, - Mat inputMask, - int gaussFiltSize, - double *rval -) { - BEGIN_WRAP - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - *rval = cv::findTransformECC( - *templateImage.ptr, - *inputImage.ptr, - *warpMatrix.ptr, - motionType, - tc, - *inputMask.ptr, - gaussFiltSize - ); - END_WRAP -} - -CvStatus *TrackerMIL_Init(TrackerMIL self, Mat image, Rect bbox) { - BEGIN_WRAP - auto rect = cv::Rect(bbox.x, bbox.y, bbox.width, bbox.height); - (*self.ptr)->init(*image.ptr, rect); - END_WRAP -} -CvStatus *TrackerMIL_Update(TrackerMIL self, Mat image, Rect *boundingBox, bool *rval) { - BEGIN_WRAP - cv::Rect bb; - *rval = (*self.ptr)->update(*image.ptr, bb); - *boundingBox = {bb.x, bb.y, bb.width, bb.height}; - END_WRAP -} - -CvStatus *TrackerMIL_Create(TrackerMIL *rval) { - BEGIN_WRAP - *rval = {new cv::Ptr(cv::TrackerMIL::create())}; - END_WRAP -} -void TrackerMIL_Close(TrackerMILPtr self) { - self->ptr->reset(); - CVD_FREE(self); -} - -CvStatus *KalmanFilter_New( - int dynamParams, int measureParams, int controlParams, int type, KalmanFilter *rval -) { - BEGIN_WRAP - *rval = {new cv::KalmanFilter(dynamParams, measureParams, controlParams, type)}; - END_WRAP -} -void KalmanFilter_Close(KalmanFilterPtr self) { CVD_FREE(self); } - -CvStatus *KalmanFilter_Init(KalmanFilter self, int dynamParams, int measureParams) { - BEGIN_WRAP - self.ptr->init(dynamParams, measureParams); - END_WRAP -} -CvStatus *KalmanFilter_InitWithParams( - KalmanFilter self, int dynamParams, int measureParams, int controlParams, int type -) { - BEGIN_WRAP - self.ptr->init(dynamParams, measureParams, controlParams, type); - END_WRAP -} -CvStatus *KalmanFilter_Predict(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - auto result = self.ptr->predict(); - *rval = {new cv::Mat(result)}; - END_WRAP -} -CvStatus *KalmanFilter_PredictWithParams(KalmanFilter self, Mat control, Mat *rval) { - BEGIN_WRAP - auto result = self.ptr->predict(*control.ptr); - *rval = {new cv::Mat(result)}; - END_WRAP -} -CvStatus *KalmanFilter_Correct(KalmanFilter self, Mat measurement, Mat *rval) { - BEGIN_WRAP - auto result = self.ptr->correct(*measurement.ptr); - *rval = {new cv::Mat(result)}; - END_WRAP -} - -CvStatus *KalmanFilter_GetStatePre(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->statePre)}; - END_WRAP -} -CvStatus *KalmanFilter_GetStatePost(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->statePost)}; - END_WRAP -} -CvStatus *KalmanFilter_GetTransitionMatrix(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->transitionMatrix)}; - END_WRAP -} -CvStatus *KalmanFilter_GetControlMatrix(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->controlMatrix)}; - END_WRAP -} -CvStatus *KalmanFilter_GetMeasurementMatrix(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->measurementMatrix)}; - END_WRAP -} -CvStatus *KalmanFilter_GetProcessNoiseCov(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->processNoiseCov)}; - END_WRAP -} -CvStatus *KalmanFilter_GetMeasurementNoiseCov(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->measurementNoiseCov)}; - END_WRAP -} -CvStatus *KalmanFilter_GetErrorCovPre(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->errorCovPre)}; - END_WRAP -} -CvStatus *KalmanFilter_GetGain(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->gain)}; - END_WRAP -} -CvStatus *KalmanFilter_GetErrorCovPost(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->errorCovPost)}; - END_WRAP -} -CvStatus *KalmanFilter_GetTemp1(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->temp1)}; - END_WRAP -} -CvStatus *KalmanFilter_GetTemp2(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->temp2)}; - END_WRAP -} -CvStatus *KalmanFilter_GetTemp3(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->temp3)}; - END_WRAP -} -CvStatus *KalmanFilter_GetTemp4(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->temp4)}; - END_WRAP -} -CvStatus *KalmanFilter_GetTemp5(KalmanFilter self, Mat *rval) { - BEGIN_WRAP - *rval = {new cv::Mat(self.ptr->temp5)}; - END_WRAP -} - -CvStatus *KalmanFilter_SetStatePre(KalmanFilter self, Mat statePre) { - BEGIN_WRAP - self.ptr->statePre = *statePre.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetStatePost(KalmanFilter self, Mat statePost) { - BEGIN_WRAP - self.ptr->statePost = *statePost.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetTransitionMatrix(KalmanFilter self, Mat transitionMatrix) { - BEGIN_WRAP - self.ptr->transitionMatrix = *transitionMatrix.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetControlMatrix(KalmanFilter self, Mat controlMatrix) { - BEGIN_WRAP - self.ptr->controlMatrix = *controlMatrix.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetMeasurementMatrix(KalmanFilter self, Mat measurementMatrix) { - BEGIN_WRAP - self.ptr->measurementMatrix = *measurementMatrix.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetProcessNoiseCov(KalmanFilter self, Mat processNoiseCov) { - BEGIN_WRAP - self.ptr->processNoiseCov = *processNoiseCov.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetMeasurementNoiseCov(KalmanFilter self, Mat measurementNoiseCov) { - BEGIN_WRAP - self.ptr->measurementNoiseCov = *measurementNoiseCov.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetErrorCovPre(KalmanFilter self, Mat errorCovPre) { - BEGIN_WRAP - self.ptr->errorCovPre = *errorCovPre.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetGain(KalmanFilter self, Mat gain) { - BEGIN_WRAP - self.ptr->gain = *gain.ptr; - END_WRAP -} -CvStatus *KalmanFilter_SetErrorCovPost(KalmanFilter self, Mat errorCovPost) { - BEGIN_WRAP - self.ptr->errorCovPost = *errorCovPost.ptr; - END_WRAP -} diff --git a/src/video/video.h b/src/video/video.h deleted file mode 100644 index c03cd810..00000000 --- a/src/video/video.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef _OPENCV3_VIDEO_H_ -#define _OPENCV3_VIDEO_H_ - -#include "core/core.h" - -#ifdef __cplusplus -#include -#include -extern "C" { -#endif - -#ifdef __cplusplus -CVD_TYPEDEF(cv::Ptr, BackgroundSubtractorMOG2); -CVD_TYPEDEF(cv::Ptr, BackgroundSubtractorKNN); -CVD_TYPEDEF(cv::Ptr, Tracker); -CVD_TYPEDEF(cv::Ptr, TrackerMIL); -CVD_TYPEDEF(cv::Ptr, TrackerGOTURN); -CVD_TYPEDEF(cv::KalmanFilter, KalmanFilter); -#else -CVD_TYPEDEF(void, BackgroundSubtractorMOG2); -CVD_TYPEDEF(void, BackgroundSubtractorKNN); -CVD_TYPEDEF(void, Tracker); -CVD_TYPEDEF(void, TrackerMIL); -CVD_TYPEDEF(void, TrackerGOTURN); -CVD_TYPEDEF(void, KalmanFilter); -#endif - -CvStatus *BackgroundSubtractorMOG2_Create(BackgroundSubtractorMOG2 *rval); -CvStatus *BackgroundSubtractorMOG2_CreateWithParams( - int history, double varThreshold, bool detectShadows, BackgroundSubtractorMOG2 *rval -); -void BackgroundSubtractorMOG2_Close(BackgroundSubtractorMOG2Ptr self); -CvStatus *BackgroundSubtractorMOG2_Apply(BackgroundSubtractorMOG2 self, Mat src, Mat dst); - -CvStatus *BackgroundSubtractorKNN_Create(BackgroundSubtractorKNN *rval); -CvStatus *BackgroundSubtractorKNN_CreateWithParams( - int history, double dist2Threshold, bool detectShadows, BackgroundSubtractorKNN *rval -); -void BackgroundSubtractorKNN_Close(BackgroundSubtractorKNNPtr self); -CvStatus *BackgroundSubtractorKNN_Apply(BackgroundSubtractorKNN self, Mat src, Mat dst); - -CvStatus *CalcOpticalFlowPyrLK( - Mat prevImg, Mat nextImg, VecPoint2f prevPts, VecPoint2f *nextPts, VecUChar *status, VecF32 *err -); -CvStatus *CalcOpticalFlowPyrLKWithParams( - Mat prevImg, - Mat nextImg, - VecPoint2f prevPts, - VecPoint2f *nextPts, - VecUChar *status, - VecF32 *err, - Size winSize, - int maxLevel, - TermCriteria criteria, - int flags, - double minEigThreshold -); -CvStatus *CalcOpticalFlowFarneback( - Mat prevImg, - Mat nextImg, - Mat flow, - double pyrScale, - int levels, - int winsize, - int iterations, - int polyN, - double polySigma, - int flags -); - -CvStatus *FindTransformECC( - Mat templateImage, - Mat inputImage, - Mat warpMatrix, - int motionType, - TermCriteria criteria, - Mat inputMask, - int gaussFiltSize, - double *rval -); - -CvStatus *TrackerMIL_Init(TrackerMIL self, Mat image, Rect bbox); -CvStatus *TrackerMIL_Update(TrackerMIL self, Mat image, Rect *boundingBox, bool *rval); -CvStatus *TrackerMIL_Create(TrackerMIL *rval); -void TrackerMIL_Close(TrackerMILPtr self); - -CvStatus *KalmanFilter_New( - int dynamParams, int measureParams, int controlParams, int type, KalmanFilter *rval -); -void KalmanFilter_Close(KalmanFilterPtr self); - -CvStatus *KalmanFilter_Init(KalmanFilter self, int dynamParams, int measureParams); -CvStatus *KalmanFilter_InitWithParams( - KalmanFilter self, int dynamParams, int measureParams, int controlParams, int type -); -CvStatus *KalmanFilter_Predict(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_PredictWithParams(KalmanFilter self, Mat control, Mat *rval); -CvStatus *KalmanFilter_Correct(KalmanFilter self, Mat measurement, Mat *rval); - -CvStatus *KalmanFilter_GetStatePre(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetStatePost(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetTransitionMatrix(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetControlMatrix(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetMeasurementMatrix(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetProcessNoiseCov(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetMeasurementNoiseCov(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetErrorCovPre(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetGain(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetErrorCovPost(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetTemp1(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetTemp2(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetTemp3(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetTemp4(KalmanFilter self, Mat *rval); -CvStatus *KalmanFilter_GetTemp5(KalmanFilter self, Mat *rval); - -CvStatus *KalmanFilter_SetStatePre(KalmanFilter self, Mat statePre); -CvStatus *KalmanFilter_SetStatePost(KalmanFilter self, Mat statePost); -CvStatus *KalmanFilter_SetTransitionMatrix(KalmanFilter self, Mat transitionMatrix); -CvStatus *KalmanFilter_SetControlMatrix(KalmanFilter self, Mat controlMatrix); -CvStatus *KalmanFilter_SetMeasurementMatrix(KalmanFilter self, Mat measurementMatrix); -CvStatus *KalmanFilter_SetProcessNoiseCov(KalmanFilter self, Mat processNoiseCov); -CvStatus *KalmanFilter_SetMeasurementNoiseCov(KalmanFilter self, Mat measurementNoiseCov); -CvStatus *KalmanFilter_SetErrorCovPre(KalmanFilter self, Mat errorCovPre); -CvStatus *KalmanFilter_SetGain(KalmanFilter self, Mat gain); -CvStatus *KalmanFilter_SetErrorCovPost(KalmanFilter self, Mat errorCovPost); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_VIDEO_H_ diff --git a/src/video/video_async.cpp b/src/video/video_async.cpp deleted file mode 100644 index f3332955..00000000 --- a/src/video/video_async.cpp +++ /dev/null @@ -1,378 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "video_async.h" -#include "core/vec.hpp" -#include - -CvStatus *BackgroundSubtractorMOG2_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new BackgroundSubtractorMOG2{ - new cv::Ptr(cv::createBackgroundSubtractorMOG2()) - }); - END_WRAP -} -CvStatus *BackgroundSubtractorMOG2_CreateWithParams_Async( - int history, double varThreshold, bool detectShadows, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new BackgroundSubtractorMOG2{new cv::Ptr( - cv::createBackgroundSubtractorMOG2(history, varThreshold, detectShadows) - )}); - END_WRAP -} -// void BackgroundSubtractorMOG2_Close(BackgroundSubtractorMOG2Ptr self) -// { -// self->ptr->reset(); -// CVD_FREE(self); -// } - -CvStatus *BackgroundSubtractorMOG2_Apply_Async( - BackgroundSubtractorMOG2 self, Mat src, CvCallback_1 callback -) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->apply(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *BackgroundSubtractorKNN_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new BackgroundSubtractorKNN{ - new cv::Ptr(cv::createBackgroundSubtractorKNN()) - }); - END_WRAP -} -CvStatus *BackgroundSubtractorKNN_CreateWithParams_Async( - int history, double dist2Threshold, bool detectShadows, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new BackgroundSubtractorKNN{new cv::Ptr( - cv::createBackgroundSubtractorKNN(history, dist2Threshold, detectShadows) - )}); - END_WRAP -} -// void BackgroundSubtractorKNN_Close(BackgroundSubtractorKNNPtr self) -// { -// self->ptr->reset(); -// CVD_FREE(self); -// } - -CvStatus * -BackgroundSubtractorKNN_Apply_Async(BackgroundSubtractorKNN self, Mat src, CvCallback_1 callback) { - BEGIN_WRAP - cv::Mat dst; - (*self.ptr)->apply(*src.ptr, dst); - callback(new Mat{new cv::Mat(dst)}); - END_WRAP -} - -CvStatus *CalcOpticalFlowPyrLK_Async( - Mat prevImg, - Mat nextImg, - VecPoint2f prevPts, - VecPoint2f *nextPts, - Size winSize, - int maxLevel, - TermCriteria criteria, - int flags, - double minEigThreshold, - CvCallback_2 callback -) { - BEGIN_WRAP - auto _prevPts = vecpoint2f_c2cpp(prevPts); - auto _nextPts = vecpoint2f_c2cpp(*nextPts); - std::vector _status; - std::vector _err; - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - cv::calcOpticalFlowPyrLK( - *prevImg.ptr, - *nextImg.ptr, - _prevPts, - _nextPts, - _status, - _err, - cv::Size(winSize.width, winSize.height), - maxLevel, - tc, - flags, - minEigThreshold - ); - vecpoint2f_cpp2c(_nextPts, nextPts); - callback(vecuchar_cpp2c_p(_status), vecfloat_cpp2c_p(_err)); - END_WRAP -} -CvStatus *CalcOpticalFlowFarneback_Async( - Mat prevImg, - Mat nextImg, - Mat flow, - double pyrScale, - int levels, - int winsize, - int iterations, - int polyN, - double polySigma, - int flags, - CvCallback_0 callback -) { - BEGIN_WRAP - cv::calcOpticalFlowFarneback( - *prevImg.ptr, - *nextImg.ptr, - *flow.ptr, - pyrScale, - levels, - winsize, - iterations, - polyN, - polySigma, - flags - ); - callback(); - END_WRAP -} - -CvStatus *FindTransformECC_Async( - Mat templateImage, - Mat inputImage, - Mat warpMatrix, - int motionType, - TermCriteria criteria, - Mat inputMask, - int gaussFiltSize, - CvCallback_1 callback -) { - BEGIN_WRAP - auto tc = cv::TermCriteria(criteria.type, criteria.maxCount, criteria.epsilon); - double rval = cv::findTransformECC( - *templateImage.ptr, - *inputImage.ptr, - *warpMatrix.ptr, - motionType, - tc, - *inputMask.ptr, - gaussFiltSize - ); - callback(new double(rval)); - END_WRAP -} - -CvStatus *TrackerMIL_Init_Async(TrackerMIL self, Mat image, Rect bbox, CvCallback_0 callback) { - BEGIN_WRAP - auto rect = cv::Rect(bbox.x, bbox.y, bbox.width, bbox.height); - (*self.ptr)->init(*image.ptr, rect); - callback(); - END_WRAP -} -CvStatus *TrackerMIL_Update_Async(TrackerMIL self, Mat image, CvCallback_2 callback) { - BEGIN_WRAP - cv::Rect bb; - bool rval = (*self.ptr)->update(*image.ptr, bb); - callback(new bool(rval), new Rect{bb.x, bb.y, bb.width, bb.height}); - END_WRAP -} - -CvStatus *TrackerMIL_Create_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new TrackerMIL{new cv::Ptr(cv::TrackerMIL::create())}); - END_WRAP -} -// void TrackerMIL_Close(TrackerMILPtr self) -// { -// self->ptr->reset(); -// CVD_FREE(self); -// } - -CvStatus *KalmanFilter_New_Async( - int dynamParams, int measureParams, int controlParams, int type, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new KalmanFilter{new cv::KalmanFilter(dynamParams, measureParams, controlParams, type)}); - END_WRAP -} -// void KalmanFilter_Close(KalmanFilterPtr self) { CVD_FREE(self); } - -CvStatus *KalmanFilter_Init_Async( - KalmanFilter self, int dynamParams, int measureParams, CvCallback_0 callback -) { - BEGIN_WRAP - self.ptr->init(dynamParams, measureParams); - callback(); - END_WRAP -} -CvStatus *KalmanFilter_InitWithParams_Async( - KalmanFilter self, - int dynamParams, - int measureParams, - int controlParams, - int type, - CvCallback_0 callback -) { - BEGIN_WRAP - self.ptr->init(dynamParams, measureParams, controlParams, type); - callback(); - END_WRAP -} -CvStatus *KalmanFilter_Predict_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - auto result = self.ptr->predict(); - callback(new Mat{new cv::Mat(result)}); - END_WRAP -} -CvStatus * -KalmanFilter_PredictWithParams_Async(KalmanFilter self, Mat control, CvCallback_1 callback) { - BEGIN_WRAP - auto result = self.ptr->predict(*control.ptr); - callback(new Mat{new cv::Mat(result)}); - END_WRAP -} -CvStatus *KalmanFilter_Correct_Async(KalmanFilter self, Mat measurement, CvCallback_1 callback) { - BEGIN_WRAP - auto result = self.ptr->correct(*measurement.ptr); - callback(new Mat{new cv::Mat(result)}); - END_WRAP -} - -CvStatus *KalmanFilter_GetStatePre_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->statePre)}); - END_WRAP -} -CvStatus *KalmanFilter_GetStatePost_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->statePost)}); - END_WRAP -} -CvStatus *KalmanFilter_GetTransitionMatrix_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->transitionMatrix)}); - END_WRAP -} -CvStatus *KalmanFilter_GetControlMatrix_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->controlMatrix)}); - END_WRAP -} -CvStatus *KalmanFilter_GetMeasurementMatrix_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->measurementMatrix)}); - END_WRAP -} -CvStatus *KalmanFilter_GetProcessNoiseCov_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->processNoiseCov)}); - END_WRAP -} -CvStatus *KalmanFilter_GetMeasurementNoiseCov_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->measurementNoiseCov)}); - END_WRAP -} -CvStatus *KalmanFilter_GetErrorCovPre_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->errorCovPre)}); - END_WRAP -} -CvStatus *KalmanFilter_GetGain_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->gain)}); - END_WRAP -} -CvStatus *KalmanFilter_GetErrorCovPost_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->errorCovPost)}); - END_WRAP -} -CvStatus *KalmanFilter_GetTemp1_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->temp1)}); - END_WRAP -} -CvStatus *KalmanFilter_GetTemp2_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->temp2)}); - END_WRAP -} -CvStatus *KalmanFilter_GetTemp3_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->temp3)}); - END_WRAP -} -CvStatus *KalmanFilter_GetTemp4_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->temp4)}); - END_WRAP -} -CvStatus *KalmanFilter_GetTemp5_Async(KalmanFilter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new Mat{new cv::Mat(self.ptr->temp5)}); - END_WRAP -} - -CvStatus *KalmanFilter_SetStatePre_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->statePre = *value.ptr; - callback(); - END_WRAP -} -CvStatus *KalmanFilter_SetStatePost_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->statePost = *value.ptr; - callback(); - END_WRAP -} -CvStatus * -KalmanFilter_SetTransitionMatrix_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->transitionMatrix = *value.ptr; - callback(); - END_WRAP -} -CvStatus *KalmanFilter_SetControlMatrix_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->controlMatrix = *value.ptr; - callback(); - END_WRAP -} -CvStatus * -KalmanFilter_SetMeasurementMatrix_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->measurementMatrix = *value.ptr; - callback(); - END_WRAP -} -CvStatus * -KalmanFilter_SetProcessNoiseCov_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->processNoiseCov = *value.ptr; - callback(); - END_WRAP -} -CvStatus * -KalmanFilter_SetMeasurementNoiseCov_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->measurementNoiseCov = *value.ptr; - callback(); - END_WRAP -} -CvStatus *KalmanFilter_SetErrorCovPre_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->errorCovPre = *value.ptr; - callback(); - END_WRAP -} -CvStatus *KalmanFilter_SetGain_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->gain = *value.ptr; - callback(); - END_WRAP -} -CvStatus *KalmanFilter_SetErrorCovPost_Async(KalmanFilter self, Mat value, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->errorCovPost = *value.ptr; - callback(); - END_WRAP -} diff --git a/src/video/video_async.h b/src/video/video_async.h deleted file mode 100644 index 8d88de2b..00000000 --- a/src/video/video_async.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright _Async(c) 2024 Rainyl. -*/ - -#ifndef CVD_VIDEO_ASYNC_H_ -#define CVD_VIDEO_ASYNC_H_ - -#include "core/types.h" -#include "video.h" - -#ifdef __cplusplus -extern "C" { -#endif - -CvStatus *BackgroundSubtractorMOG2_Create_Async(CvCallback_1 callback); -CvStatus *BackgroundSubtractorMOG2_CreateWithParams_Async( - int history, double varThreshold, bool detectShadows, CvCallback_1 callback -); -// void BackgroundSubtractorMOG2_Close_Async(BackgroundSubtractorMOG2Ptr self); -CvStatus * -BackgroundSubtractorMOG2_Apply_Async(BackgroundSubtractorMOG2 self, Mat src, CvCallback_1 callback); - -CvStatus *BackgroundSubtractorKNN_Create_Async(CvCallback_1 callback); -CvStatus *BackgroundSubtractorKNN_CreateWithParams_Async( - int history, double dist2Threshold, bool detectShadows, CvCallback_1 callback -); -// void BackgroundSubtractorKNN_Close_Async(BackgroundSubtractorKNNPtr self); -CvStatus * -BackgroundSubtractorKNN_Apply_Async(BackgroundSubtractorKNN self, Mat src, CvCallback_1 callback); - -CvStatus *CalcOpticalFlowPyrLK_Async( - Mat prevImg, - Mat nextImg, - VecPoint2f prevPts, - VecPoint2f *nextPts, - Size winSize, - int maxLevel, - TermCriteria criteria, - int flags, - double minEigThreshold, - CvCallback_2 callback -); -CvStatus *CalcOpticalFlowFarneback_Async( - Mat prevImg, - Mat nextImg, - Mat flow, - double pyrScale, - int levels, - int winsize, - int iterations, - int polyN, - double polySigma, - int flags, - CvCallback_0 callback -); - -CvStatus *FindTransformECC_Async( - Mat templateImage, - Mat inputImage, - Mat warpMatrix, - int motionType, - TermCriteria criteria, - Mat inputMask, - int gaussFiltSize, - CvCallback_1 callback -); - -CvStatus *TrackerMIL_Init_Async(TrackerMIL self, Mat image, Rect bbox, CvCallback_0 callback); -CvStatus *TrackerMIL_Update_Async(TrackerMIL self, Mat image, CvCallback_2 callback); -CvStatus *TrackerMIL_Create_Async(CvCallback_1 callback); -// void TrackerMIL_Close_Async(TrackerMILPtr self); - -CvStatus *KalmanFilter_New_Async( - int dynamParams, int measureParams, int controlParams, int type, CvCallback_1 callback -); -// void KalmanFilter_Close_Async(KalmanFilterPtr self); - -CvStatus *KalmanFilter_Init_Async( - KalmanFilter self, int dynamParams, int measureParams, CvCallback_0 callback -); -CvStatus *KalmanFilter_InitWithParams_Async( - KalmanFilter self, - int dynamParams, - int measureParams, - int controlParams, - int type, - CvCallback_0 callback -); -CvStatus *KalmanFilter_Predict_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus * -KalmanFilter_PredictWithParams_Async(KalmanFilter self, Mat control, CvCallback_1 callback); -CvStatus *KalmanFilter_Correct_Async(KalmanFilter self, Mat measurement, CvCallback_1 callback); - -CvStatus *KalmanFilter_GetStatePre_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetStatePost_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetTransitionMatrix_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetControlMatrix_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetMeasurementMatrix_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetProcessNoiseCov_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetMeasurementNoiseCov_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetErrorCovPre_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetGain_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetErrorCovPost_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetTemp1_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetTemp2_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetTemp3_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetTemp4_Async(KalmanFilter self, CvCallback_1 callback); -CvStatus *KalmanFilter_GetTemp5_Async(KalmanFilter self, CvCallback_1 callback); - -CvStatus *KalmanFilter_SetStatePre_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus *KalmanFilter_SetStatePost_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus * -KalmanFilter_SetTransitionMatrix_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus *KalmanFilter_SetControlMatrix_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus * -KalmanFilter_SetMeasurementMatrix_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus * -KalmanFilter_SetProcessNoiseCov_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus * -KalmanFilter_SetMeasurementNoiseCov_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus *KalmanFilter_SetErrorCovPre_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus *KalmanFilter_SetGain_Async(KalmanFilter self, Mat value, CvCallback_0 callback); -CvStatus *KalmanFilter_SetErrorCovPost_Async(KalmanFilter self, Mat value, CvCallback_0 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_VIDEO_ASYNC_H_ diff --git a/src/video/videoio.cpp b/src/video/videoio.cpp deleted file mode 100644 index d9355a78..00000000 --- a/src/video/videoio.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "videoio.h" - -// VideoCapture -CvStatus *VideoCapture_New(VideoCapture *rval) { - BEGIN_WRAP - *rval = {new cv::VideoCapture()}; - END_WRAP -} -CvStatus *VideoCapture_NewFromFile(const char *filename, int apiPreference, VideoCapture *rval) { - BEGIN_WRAP - *rval = {new cv::VideoCapture(filename, apiPreference)}; - END_WRAP -} -CvStatus *VideoCapture_NewFromIndex(int index, int apiPreference, VideoCapture *rval) { - BEGIN_WRAP - *rval = {new cv::VideoCapture(index, apiPreference)}; - END_WRAP -} -void VideoCapture_Close(VideoCapturePtr self) { CVD_FREE(self); } - -CvStatus *VideoCapture_Open(VideoCapture self, const char *uri, bool *rval) { - BEGIN_WRAP - *rval = self.ptr->open(uri); - END_WRAP -} -CvStatus * -VideoCapture_OpenWithAPI(VideoCapture self, const char *uri, int apiPreference, bool *rval) { - BEGIN_WRAP - *rval = self.ptr->open(uri, apiPreference); - END_WRAP -} -CvStatus *VideoCapture_OpenDevice(VideoCapture self, int device, bool *rval) { - BEGIN_WRAP - *rval = self.ptr->open(device); - END_WRAP -} -CvStatus * -VideoCapture_OpenDeviceWithAPI(VideoCapture self, int device, int apiPreference, bool *rval) { - BEGIN_WRAP - *rval = self.ptr->open(device, apiPreference); - END_WRAP -} -CvStatus *VideoCapture_Set(VideoCapture self, int prop, double param) { - BEGIN_WRAP - self.ptr->set(prop, param); - END_WRAP -} -CvStatus *VideoCapture_Get(VideoCapture self, int prop, double *rval) { - BEGIN_WRAP - *rval = self.ptr->get(prop); - END_WRAP -} -CvStatus *VideoCapture_IsOpened(VideoCapture self, int *rval) { - BEGIN_WRAP - *rval = self.ptr->isOpened(); - END_WRAP -} -CvStatus *VideoCapture_Read(VideoCapture self, Mat buf, int *rval) { - BEGIN_WRAP - *rval = self.ptr->read(*buf.ptr); - END_WRAP -} -CvStatus *VideoCapture_Release(VideoCapture self) { - BEGIN_WRAP - self.ptr->release(); - END_WRAP -} -CvStatus *VideoCapture_Grab(VideoCapture self, int skip) { - BEGIN_WRAP - self.ptr->grab(); - END_WRAP -} - -CvStatus *VideoCapture_getBackendName(VideoCapture self, char **rval) { - BEGIN_WRAP - *rval = strdup(self.ptr->getBackendName().c_str()); - END_WRAP -} - -// VideoWriter -CvStatus *VideoWriter_New(VideoWriter *rval) { - BEGIN_WRAP - *rval = {new cv::VideoWriter()}; - END_WRAP -} -CvStatus *VideoWriter_NewFromFile( - const char *name, int fourcc, double fps, int width, int height, bool isColor, VideoWriter *rval -) { - BEGIN_WRAP - *rval = {new cv::VideoWriter(name, fourcc, fps, cv::Size(width, height), isColor)}; - END_WRAP -} - -CvStatus *VideoWriter_NewFromFile_1( - const char *name, - int apiPreference, - int fourcc, - double fps, - int width, - int height, - bool isColor, - VideoWriter *rval -) { - BEGIN_WRAP - *rval = {new cv::VideoWriter(name, apiPreference, fourcc, fps, cv::Size(width, height), isColor)}; - END_WRAP -} - -void VideoWriter_Close(VideoWriterPtr self) { CVD_FREE(self); } - -CvStatus *VideoWriter_Open( - VideoWriter self, const char *name, int fourcc, double fps, int width, int height, bool isColor -) { - BEGIN_WRAP - self.ptr->open(name, fourcc, fps, cv::Size(width, height), isColor); - END_WRAP -} - -CvStatus *VideoWriter_Open_1( - VideoWriter self, - const char *name, - int apiPreference, - int fourcc, - double fps, - int width, - int height, - bool isColor -) { - BEGIN_WRAP - self.ptr->open(name, apiPreference, fourcc, fps, cv::Size(width, height), isColor); - END_WRAP -} - -CvStatus *VideoWriter_IsOpened(VideoWriter self, int *rval) { - BEGIN_WRAP - *rval = self.ptr->isOpened(); - END_WRAP -} -CvStatus *VideoWriter_Write(VideoWriter self, Mat img) { - BEGIN_WRAP - self.ptr->write(*img.ptr); - END_WRAP -} -CvStatus *VideoWriter_Release(VideoWriter self) { - BEGIN_WRAP - self.ptr->release(); - END_WRAP -} -CvStatus *VideoWriter_Fourcc(char c1, char c2, char c3, char c4, int *rval) { - BEGIN_WRAP - *rval = cv::VideoWriter::fourcc(c1, c2, c3, c4); - END_WRAP -} - -CvStatus *VideoWriter_getBackendName(VideoWriter self, char **rval) { - BEGIN_WRAP - *rval = strdup(self.ptr->getBackendName().c_str()); - END_WRAP -} diff --git a/src/video/videoio.h b/src/video/videoio.h deleted file mode 100644 index fe07e95e..00000000 --- a/src/video/videoio.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - This file is originally from gocv project - Licensed: Apache 2.0 license. Copyright (c) 2017-2021 The Hybrid Group. - - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#ifndef _OPENCV3_VIDEOIO_H_ -#define _OPENCV3_VIDEOIO_H_ - -#ifdef __cplusplus -#include -extern "C" { -#endif - -#include "core/core.h" - -#ifdef __cplusplus -CVD_TYPEDEF(cv::VideoCapture, VideoCapture); -CVD_TYPEDEF(cv::VideoWriter, VideoWriter); -#else -CVD_TYPEDEF(void, VideoCapture); -CVD_TYPEDEF(void, VideoWriter); -#endif - -// VideoCapture -CvStatus *VideoCapture_New(VideoCapture *rval); -CvStatus *VideoCapture_NewFromFile(const char *filename, int apiPreference, VideoCapture *rval); -CvStatus *VideoCapture_NewFromIndex(int index, int apiPreference, VideoCapture *rval); -void VideoCapture_Close(VideoCapturePtr self); -CvStatus *VideoCapture_Open(VideoCapture self, const char *uri, bool *rval); -CvStatus * -VideoCapture_OpenWithAPI(VideoCapture self, const char *uri, int apiPreference, bool *rval); -CvStatus *VideoCapture_OpenDevice(VideoCapture self, int device, bool *rval); -CvStatus * -VideoCapture_OpenDeviceWithAPI(VideoCapture self, int device, int apiPreference, bool *rval); -CvStatus *VideoCapture_Set(VideoCapture self, int prop, double param); -CvStatus *VideoCapture_Get(VideoCapture self, int prop, double *rval); -CvStatus *VideoCapture_IsOpened(VideoCapture self, int *rval); -CvStatus *VideoCapture_Read(VideoCapture self, Mat buf, int *rval); -CvStatus *VideoCapture_Release(VideoCapture self); -CvStatus *VideoCapture_Grab(VideoCapture self, int skip); -// TODO: add this to dart -CvStatus *VideoCapture_getBackendName(VideoCapture self, char **rval); - -// VideoWriter -CvStatus *VideoWriter_New(VideoWriter *rval); -void VideoWriter_Close(VideoWriterPtr self); -CvStatus *VideoWriter_NewFromFile( - const char *name, int fourcc, double fps, int width, int height, bool isColor, VideoWriter *rval -); -CvStatus *VideoWriter_NewFromFile_1( - const char *name, - int apiPreference, - int fourcc, - double fps, - int width, - int height, - bool isColor, - VideoWriter *rval -); - -CvStatus *VideoWriter_Open( - VideoWriter self, const char *name, int fourcc, double fps, int width, int height, bool isColor -); - -CvStatus *VideoWriter_Open_1( - VideoWriter self, - const char *name, - int apiPreference, - int fourcc, - double fps, - int width, - int height, - bool isColor -); - -CvStatus *VideoWriter_IsOpened(VideoWriter self, int *rval); -CvStatus *VideoWriter_Write(VideoWriter self, Mat img); -CvStatus *VideoWriter_Release(VideoWriter self); -CvStatus *VideoWriter_Fourcc(char c1, char c2, char c3, char c4, int *rval); -// TODO: add this to dart -CvStatus *VideoWriter_getBackendName(VideoWriter self, char **rval); - -#ifdef __cplusplus -} -#endif - -#endif //_OPENCV3_VIDEOIO_H_ diff --git a/src/video/videoio_async.cpp b/src/video/videoio_async.cpp deleted file mode 100644 index 79dafd16..00000000 --- a/src/video/videoio_async.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - Modified by Rainyl. - Licensed: Apache 2.0 license. Copyright (c) 2024 Rainyl. -*/ - -#include "videoio_async.h" - -// VideoCapture -CvStatus *VideoCapture_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new VideoCapture{new cv::VideoCapture()}); - END_WRAP -} -CvStatus * -VideoCapture_NewFromFile_Async(const char *filename, int apiPreference, CvCallback_1 callback) { - BEGIN_WRAP - callback(new VideoCapture{new cv::VideoCapture(filename, apiPreference)}); - END_WRAP -} -CvStatus *VideoCapture_NewFromIndex_Async(int index, int apiPreference, CvCallback_1 callback) { - BEGIN_WRAP - callback(new VideoCapture{new cv::VideoCapture(index, apiPreference)}); - END_WRAP -} -// void VideoCapture_Close(VideoCapturePtr self) { CVD_FREE(self); } - -CvStatus *VideoCapture_Open_Async(VideoCapture self, const char *uri, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool(self.ptr->open(uri))); - END_WRAP -} -CvStatus *VideoCapture_OpenWithAPI_Async( - VideoCapture self, const char *uri, int apiPreference, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new bool(self.ptr->open(uri, apiPreference))); - END_WRAP -} -CvStatus *VideoCapture_OpenDevice_Async(VideoCapture self, int device, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool(self.ptr->open(device))); - END_WRAP -} -CvStatus *VideoCapture_OpenDeviceWithAPI_Async( - VideoCapture self, int device, int apiPreference, CvCallback_1 callback -) { - BEGIN_WRAP - callback(new bool(self.ptr->open(device, apiPreference))); - END_WRAP -} -CvStatus *VideoCapture_Set_Async(VideoCapture self, int prop, double param, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool(self.ptr->set(prop, param))); - END_WRAP -} -CvStatus *VideoCapture_Get_Async(VideoCapture self, int prop, CvCallback_1 callback) { - BEGIN_WRAP - callback(new double(self.ptr->get(prop))); - END_WRAP -} -CvStatus *VideoCapture_IsOpened_Async(VideoCapture self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool(self.ptr->isOpened())); - END_WRAP -} -CvStatus *VideoCapture_Read_Async(VideoCapture self, CvCallback_2 callback) { - BEGIN_WRAP - cv::Mat dst; - bool rval = self.ptr->read(dst); - callback(new bool(rval), new Mat{new cv::Mat(dst)}); - END_WRAP -} -CvStatus *VideoCapture_Release_Async(VideoCapture self, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->release(); - callback(); - END_WRAP -} -CvStatus *VideoCapture_Grab_Async(VideoCapture self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool(self.ptr->grab())); - END_WRAP -} - -// VideoWriter -CvStatus *VideoWriter_New_Async(CvCallback_1 callback) { - BEGIN_WRAP - callback(new VideoWriter{new cv::VideoWriter()}); - END_WRAP -} -// void VideoWriter_Close_Async(VideoWriterPtr self) { CVD_FREE(self); } - -CvStatus *VideoWriter_Open_Async( - VideoWriter self, - const char *name, - const char *codec, - double fps, - int width, - int height, - bool isColor, - CvCallback_1 callback -) { - BEGIN_WRAP - int codecCode = cv::VideoWriter::fourcc(codec[0], codec[1], codec[2], codec[3]); - bool rval = self.ptr->open(name, codecCode, fps, cv::Size(width, height), isColor); - callback(new bool(rval)); - END_WRAP -} -CvStatus *VideoWriter_IsOpened_Async(VideoWriter self, CvCallback_1 callback) { - BEGIN_WRAP - callback(new bool(self.ptr->isOpened())); - END_WRAP -} -CvStatus *VideoWriter_Write_Async(VideoWriter self, Mat img, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->write(*img.ptr); - callback(); - END_WRAP -} -CvStatus *VideoWriter_Release_Async(VideoWriter self, CvCallback_0 callback) { - BEGIN_WRAP - self.ptr->release(); - callback(); - END_WRAP -} -CvStatus *VideoWriter_Fourcc_Async(char c1, char c2, char c3, char c4, CvCallback_1 callback) { - BEGIN_WRAP - int rval = cv::VideoWriter::fourcc(c1, c2, c3, c4); - callback(new int(rval)); - END_WRAP -} diff --git a/src/video/videoio_async.h b/src/video/videoio_async.h deleted file mode 100644 index b091d14d..00000000 --- a/src/video/videoio_async.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - Created by Rainyl. - Licensed: Apache 2.0 license. Copyright _Async(c) 2024 Rainyl. -*/ - -#ifndef CVD_VIDEOIO_ASYNC_H_ -#define CVD_VIDEOIO_ASYNC_H_ - -#include "core/core.h" -#include "core/types.h" -#include "videoio.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// VideoCapture -CvStatus *VideoCapture_New_Async(CvCallback_1 callback); -CvStatus * -VideoCapture_NewFromFile_Async(const char *filename, int apiPreference, CvCallback_1 callback); -CvStatus *VideoCapture_NewFromIndex_Async(int index, int apiPreference, CvCallback_1 callback); -// void VideoCapture_Close_Async(VideoCapturePtr self); -CvStatus *VideoCapture_Open_Async(VideoCapture self, const char *uri, CvCallback_1 callback); -CvStatus *VideoCapture_OpenWithAPI_Async( - VideoCapture self, const char *uri, int apiPreference, CvCallback_1 callback -); -CvStatus *VideoCapture_OpenDevice_Async(VideoCapture self, int device, CvCallback_1 callback); -CvStatus *VideoCapture_OpenDeviceWithAPI_Async( - VideoCapture self, int device, int apiPreference, CvCallback_1 callback -); -CvStatus *VideoCapture_Set_Async(VideoCapture self, int prop, double param, CvCallback_1 callback); -CvStatus *VideoCapture_Get_Async(VideoCapture self, int prop, CvCallback_1 callback); -CvStatus *VideoCapture_IsOpened_Async(VideoCapture self, CvCallback_1 callback); -CvStatus *VideoCapture_Read_Async(VideoCapture self, CvCallback_2 callback); -CvStatus *VideoCapture_Release_Async(VideoCapture self, CvCallback_0 callback); -CvStatus *VideoCapture_Grab_Async(VideoCapture self, CvCallback_1 callback); - -// VideoWriter -CvStatus *VideoWriter_New_Async(CvCallback_1 callback); -// void VideoWriter_Close_Async(VideoWriterPtr self, CvCallback_0 callback); -CvStatus *VideoWriter_Open_Async( - VideoWriter self, - const char *name, - const char *codec, - double fps, - int width, - int height, - bool isColor, - CvCallback_1 callback -); -CvStatus *VideoWriter_IsOpened_Async(VideoWriter self, CvCallback_1 callback); -CvStatus *VideoWriter_Write_Async(VideoWriter self, Mat img, CvCallback_0 callback); -CvStatus *VideoWriter_Release_Async(VideoWriter self, CvCallback_0 callback); -CvStatus *VideoWriter_Fourcc_Async(char c1, char c2, char c3, char c4, CvCallback_1 callback); - -#ifdef __cplusplus -} -#endif - -#endif // CVD_VIDEOIO_ASYNC_H_ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt deleted file mode 100644 index 61fd8ef2..00000000 --- a/windows/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -# The Flutter tooling requires that developers have a version of Visual Studio -# installed that includes CMake 3.14 or later. You should not increase this -# version, as doing so will cause the plugin to fail to compile for some -# customers of the plugin. -cmake_minimum_required(VERSION 3.18) - -# Project-level configuration. -set(PROJECT_NAME "opencv_dart") - -project(${PROJECT_NAME} LANGUAGES CXX VERSION 1.0.0) - -file(READ "${CMAKE_CURRENT_SOURCE_DIR}/../binary.version" PROJECT_VERSION) - -set(CVD_LIB_URL_BASE "https://github.com/rainyl/opencv_dart/releases/download") -# check whether the auto build is disabled -set(OPENCV_DART_DISABLE_AUTO_BUILD $ENV{OPENCV_DART_DISABLE_AUTO_BUILD}) - -macro(download_and_extract _url _dst_dir) - file(GLOB _libs "${_dst_dir}/*.dll") - if(NOT _libs) - get_filename_component(_dst_file "${_url}" NAME) - set(_dst_file "${_dst_dir}/${_dst_file}") - if(NOT EXISTS ${_dst_file}) - # download if not exist - message(STATUS "Downloading ${_url} -> ${_dst_file}") - file(DOWNLOAD "${_url}" ${_dst_file} - SHOW_PROGRESS STATUS _rtn TLS_VERIFY OFF TIMEOUT 300 - ) - list(GET _rtn 0 _rtncode) - if(NOT 0 EQUAL _rtncode) - message(FATAL_ERROR ${_rtn}) - endif() - endif(NOT EXISTS ${_dst_file}) - - # extract - message(STATUS "Extracting ${_dst_file}") - file(ARCHIVE_EXTRACT INPUT "${_dst_file}" DESTINATION ${_dst_dir}) - else() - message(STATUS "${_libs} exists, no need to download or extract!") - endif() -endmacro() - -if(NOT OPENCV_DART_DISABLE_AUTO_BUILD) - # Define default architecture - set(OPENCV_DART_ARCH $ENV{OPENCV_DART_ARCH}) - if(NOT OPENCV_DART_ARCH) - set(OPENCV_DART_ARCH "x64") - endif() - - # Print messages - message(STATUS "Auto-selected architecture: ${OPENCV_DART_ARCH}") - message(STATUS "Running setup with architecture: ${OPENCV_DART_ARCH}") - - set(LIB_FILENAME "libopencv_dart-windows-${OPENCV_DART_ARCH}.tar.gz") - set(LIB_URL "${CVD_LIB_URL_BASE}/v${PROJECT_VERSION}/${LIB_FILENAME}") - download_and_extract(${LIB_URL} ${CMAKE_CURRENT_SOURCE_DIR}) -endif() - -# Invoke the build for native code shared with the other target platforms. -# This can be changed to accommodate different builds. -# add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") - -# List of absolute paths to libraries that should be bundled with the plugin. -# This list could contain prebuilt libraries, or libraries created by an -# external build triggered from this build file. -file(GLOB opencv_dart_libs "${CMAKE_CURRENT_SOURCE_DIR}/*.dll") -if(NOT opencv_dart_libs) - message(FATAL_ERROR "${PROJECT_NAME} setup failed: not found any dll in ${CMAKE_CURRENT_SOURCE_DIR}") -endif() - -set(opencv_dart_bundled_libraries - # Defined in ../src/CMakeLists.txt. - # This can be changed to accommodate different builds. - # $ - ${opencv_dart_libs} - PARENT_SCOPE -) From c9fd15303d694c2ba172f469fdd700df08f0480a Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 11 Oct 2024 10:15:20 +0800 Subject: [PATCH 02/30] fix examples workflow --- .github/workflows/examples.yaml | 50 ++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 0e0b51ba..92becacb 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -3,8 +3,14 @@ name: Examples on: push: branches: ["main"] - # pull_request: - # branches: ["main"] + paths: + - ".github/workflows/**" + - "packages/opencv_dart/example/**" + - "packages/opencv_core/example/**" + paths-ignore: + - "**.md" + - "LICENSE" + pull_request: jobs: windows: @@ -17,9 +23,13 @@ jobs: - uses: actions/checkout@v4 with: submodules: true - - name: build + - name: opencv_dart run: | - cd example + cd packages/opencv_dart/example + flutter build windows + - name: opencv_core + run: | + cd packages/opencv_core/example flutter build windows ubuntu: name: ubuntu @@ -29,10 +39,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y curl git wget python3 unzip build-essential \ - libgtk-3-dev ffmpeg libavcodec-dev \ - cmake ninja-build nasm libavformat-dev libavutil-dev \ - libswscale-dev libgflags-dev \ - libjpeg-dev libpng-dev libtiff-dev python3-pip + libgtk-3-dev - uses: subosito/flutter-action@v2 with: channel: "stable" @@ -43,9 +50,14 @@ jobs: with: distribution: 'temurin' java-version: '11' - - name: build + - name: opencv_dart + run: | + cd packages/opencv_dart/example + flutter build linux + flutter build apk --release --target-platform android-arm64,android-arm,android-x64 --split-per-abi + - name: opencv_core run: | - cd example + cd packages/opencv_core/example flutter build linux flutter build apk --release --target-platform android-arm64,android-arm,android-x64 --split-per-abi macos: @@ -58,9 +70,14 @@ jobs: - uses: actions/checkout@v4 with: submodules: true - - name: build + - name: opencv_dart run: | - cd example + cd packages/opencv_dart/example + flutter build macos + flutter build ios --release --no-codesign + - name: opencv_core + run: | + cd packages/opencv_core/example flutter build macos flutter build ios --release --no-codesign macos-arm: @@ -73,8 +90,13 @@ jobs: - uses: actions/checkout@v4 with: submodules: true - - name: build + - name: opencv_dart + run: | + cd packages/opencv_dart/example + flutter build macos + flutter build ios --release --no-codesign + - name: opencv_core run: | - cd example + cd packages/opencv_core/example flutter build macos flutter build ios --release --no-codesign From 05691b89da6daeebdcd14c54f172e8cfbb51889b Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 11 Oct 2024 10:21:48 +0800 Subject: [PATCH 03/30] fix --- .github/workflows/examples.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 92becacb..cbd9dc1d 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -11,6 +11,7 @@ on: - "**.md" - "LICENSE" pull_request: + branches: ["main"] jobs: windows: From d198c72cff09472277a0e44e6b841e3ef579e45d Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 11 Oct 2024 12:10:55 +0800 Subject: [PATCH 04/30] fix, enable building for android --- .github/workflows/android.yaml | 41 ++++++++++++++++++--------------- .github/workflows/examples.yaml | 10 +++----- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index 51edd538..bda129c3 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -16,43 +16,46 @@ jobs: abi: [armeabi-v7a, arm64-v8a, x86_64] env: COMMON_CMAKE_OPTIONS: | - -DCMAKE_POLICY_DEFAULT_CMP0057=NEW \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_LATEST_HOME/build/cmake/android.toolchain.cmake \ -DANDROID_USE_LEGACY_TOOLCHAIN_FILE=False \ -DANDROID_PLATFORM=android-24 \ - -DCMAKE_INSTALL_PREFIX=install \ -DCMAKE_BUILD_TYPE=Release \ -DANDROID_STL=c++_static \ + -DANDROID_ARM_NEON=ON \ steps: - uses: actions/checkout@v4 with: - submodules: true - - uses: robinraju/release-downloader@v1.10 - with: - repository: "rainyl/opencv.full" - tag: "4.10.0+6" - fileName: "libopencv-android-${{ matrix.abi }}.tar.gz" - out-file-path: "build/opencv" - extract: true + repository: 'https://github.com/rainyl/dartcv.git' + ref: 'main' - name: build run: | - cd build + mkdir build && cd build cmake -S ${{ github.workspace }} \ ${{ env.COMMON_CMAKE_OPTIONS }} -DANDROID_ABI="${{ matrix.abi }}" \ - -DOpenCV_DIR=${{ github.workspace }}/build/opencv/sdk/native/jni \ - -DANDROID_ARM_NEON=ON + -DCMAKE_INSTALL_PREFIX="${{ matrix.abi }}" \ cmake --build . --config Release -j $(nproc) cmake --build . --config Release --target install - - name: package - run: | - tar -C build/install -zcvf libopencv_dart-android-${{ matrix.abi }}.tar.gz . - uses: actions/upload-artifact@v4 name: upload with: - path: libopencv_dart-android-${{ matrix.abi }}.tar.gz - name: libopencv_dart-android-${{ matrix.abi }}.tar.gz + path: build/${{ matrix.abi }} + name: libdartcv-android-${{ matrix.abi }} + release: + name: android + runs-on: ubuntu-24.04 + steps: + - name: download + uses: actions/download-artifact@v4 + with: + path: libdartcv-android + pattern: libdartcv-android* + merge-multiple: true + - name: package + run: | + ls -R libdartcv-android + tar -C libdartcv-android -zcvf libdartcv-android.tar.gz . - name: release uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') @@ -60,4 +63,4 @@ jobs: draft: true prerelease: false files: | - libopencv_dart-android-${{ matrix.abi }}.tar.gz + libdartcv-android.tar.gz diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index cbd9dc1d..062cab82 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -3,10 +3,6 @@ name: Examples on: push: branches: ["main"] - paths: - - ".github/workflows/**" - - "packages/opencv_dart/example/**" - - "packages/opencv_core/example/**" paths-ignore: - "**.md" - "LICENSE" @@ -18,12 +14,12 @@ jobs: name: windows runs-on: windows-2019 steps: - - uses: subosito/flutter-action@v2 - with: - channel: "stable" - uses: actions/checkout@v4 with: submodules: true + - uses: subosito/flutter-action@v2 + with: + channel: "stable" - name: opencv_dart run: | cd packages/opencv_dart/example From 81f3aaaf4eb0c477795dd1aeef317027268b2aaa Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 11 Oct 2024 12:12:02 +0800 Subject: [PATCH 05/30] fix --- .github/workflows/android.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index bda129c3..11ad0691 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -25,7 +25,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - repository: 'https://github.com/rainyl/dartcv.git' + repository: 'rainyl/dartcv' ref: 'main' - name: build run: | From e9983e4be96e9ede76ae3c2aeef737f73a37d630 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 11 Oct 2024 12:13:00 +0800 Subject: [PATCH 06/30] fix --- .github/workflows/examples.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 062cab82..c4a82540 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -36,7 +36,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y curl git wget python3 unzip build-essential \ - libgtk-3-dev + libgtk-3-dev ninja-build - uses: subosito/flutter-action@v2 with: channel: "stable" From 55dd8194931b86a8dfdfaf9a57cb3a2acd353bb4 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Fri, 11 Oct 2024 12:17:24 +0800 Subject: [PATCH 07/30] add podfile --- packages/opencv_core/example/ios/Podfile | 44 ++++++++++++++++++++++ packages/opencv_core/example/macos/Podfile | 43 +++++++++++++++++++++ packages/opencv_dart/example/ios/Podfile | 2 +- packages/opencv_dart/example/macos/Podfile | 2 +- 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 packages/opencv_core/example/ios/Podfile create mode 100644 packages/opencv_core/example/macos/Podfile diff --git a/packages/opencv_core/example/ios/Podfile b/packages/opencv_core/example/ios/Podfile new file mode 100644 index 00000000..164df534 --- /dev/null +++ b/packages/opencv_core/example/ios/Podfile @@ -0,0 +1,44 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '12.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/packages/opencv_core/example/macos/Podfile b/packages/opencv_core/example/macos/Podfile new file mode 100644 index 00000000..b52666a1 --- /dev/null +++ b/packages/opencv_core/example/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/packages/opencv_dart/example/ios/Podfile b/packages/opencv_dart/example/ios/Podfile index d97f17e2..164df534 100644 --- a/packages/opencv_dart/example/ios/Podfile +++ b/packages/opencv_dart/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '12.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/packages/opencv_dart/example/macos/Podfile b/packages/opencv_dart/example/macos/Podfile index c795730d..b52666a1 100644 --- a/packages/opencv_dart/example/macos/Podfile +++ b/packages/opencv_dart/example/macos/Podfile @@ -1,4 +1,4 @@ -platform :osx, '10.14' +platform :osx, '10.15' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' From 931cc63e7719cc42356af7bb027c5cddffc2a9e1 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Mon, 14 Oct 2024 22:57:15 +0800 Subject: [PATCH 08/30] finish linux --- packages/dartcv/.gitignore | 3 + packages/dartcv/.pubignore | 15 ++ packages/dartcv/CHANGELOG.md | 2 +- packages/dartcv/LICENSE | 201 ++++++++++++++++++ packages/dartcv/README.md | 49 ++--- packages/dartcv/lib/src/g/types.g.dart | 2 +- packages/dartcv/pubspec.yaml | 8 +- packages/dartcv/test/gapi/structs_test.dart | 4 +- .../test/videoio/videoio_async_test.dart | 54 +++++ .../dartcv/test/videoio/videoio_test.dart | 66 ++++++ packages/opencv_core/pubspec.yaml | 5 +- packages/opencv_core/src/CMakeLists.txt | 31 ++- packages/opencv_core/windows/CMakeLists.txt | 6 + .../example/android/app/build.gradle | 2 +- packages/opencv_dart/linux/CMakeLists.txt | 2 +- packages/opencv_dart/pubspec.yaml | 7 +- packages/opencv_dart/src/CMakeLists.txt | 31 ++- packages/opencv_dart/windows/CMakeLists.txt | 6 + 18 files changed, 439 insertions(+), 55 deletions(-) create mode 100644 packages/dartcv/.pubignore create mode 100644 packages/dartcv/LICENSE create mode 100644 packages/dartcv/test/videoio/videoio_async_test.dart create mode 100644 packages/dartcv/test/videoio/videoio_test.dart diff --git a/packages/dartcv/.gitignore b/packages/dartcv/.gitignore index 3cceda55..eee74c38 100644 --- a/packages/dartcv/.gitignore +++ b/packages/dartcv/.gitignore @@ -5,3 +5,6 @@ # Avoid committing pubspec.lock for library packages; see # https://dart.dev/guides/libraries/private-files#pubspeclock. pubspec.lock + +test/models +libdartcv* diff --git a/packages/dartcv/.pubignore b/packages/dartcv/.pubignore new file mode 100644 index 00000000..01f0aa03 --- /dev/null +++ b/packages/dartcv/.pubignore @@ -0,0 +1,15 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ + +# Avoid committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock + +test/images +test/images_out +test/models +src/ +ffigen/ +Makefile +libdartcv* diff --git a/packages/dartcv/CHANGELOG.md b/packages/dartcv/CHANGELOG.md index effe43c8..b78d64c6 100644 --- a/packages/dartcv/CHANGELOG.md +++ b/packages/dartcv/CHANGELOG.md @@ -1,3 +1,3 @@ -## 1.0.0 +## 0.0.1 - Initial version. diff --git a/packages/dartcv/LICENSE b/packages/dartcv/LICENSE new file mode 100644 index 00000000..b900fe52 --- /dev/null +++ b/packages/dartcv/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2024] [rainyl] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/dartcv/README.md b/packages/dartcv/README.md index 8831761b..ccb294f0 100644 --- a/packages/dartcv/README.md +++ b/packages/dartcv/README.md @@ -1,39 +1,18 @@ - +[dartcv](https://pub.dev/packages/dartcv) is only for pure dart, for Flutter, use [opencv_core](https://pub.dev/packages/opencv_core), +if videoio module is required, use [opencv_dart](https://pub.dev/packages/opencv_dart) -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +## Install -## Features - -TODO: List what your package can do. Maybe include images, gifs, or videos. - -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. - -## Usage - -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. - -```dart -const like = 'sample'; -``` - -## Additional information - -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +- `dart pub add dartcv` or Add dartcv to `pubspec.yaml` +- Prepare libraries for your platform, you have 2 options (macos: please build from source.) + - build from source, see [workflows](https://github.com/rainyl/dartcv/tree/main/.github/workflows) + - download prebuilt libraries from [release](https://github.com/rainyl/dartcv/releases) + - move/copy the libraries to a directory, e.g., `~/.dartcv` +- Setup environment variables + - windows: append the above path to `PATH` + - linux: append the above path to `LD_LIBRARY_PATH` + - macos: append the above path to `DYLD_LIBRARY_PATH` diff --git a/packages/dartcv/lib/src/g/types.g.dart b/packages/dartcv/lib/src/g/types.g.dart index ebc17413..87ccba06 100644 --- a/packages/dartcv/lib/src/g/types.g.dart +++ b/packages/dartcv/lib/src/g/types.g.dart @@ -382,7 +382,7 @@ final class RotatedRect extends ffi.Struct { external CvSize2f size; - @ffi.Double() + @ffi.Float() external double angle; } diff --git a/packages/dartcv/pubspec.yaml b/packages/dartcv/pubspec.yaml index d5f71b6b..2275f2dc 100644 --- a/packages/dartcv/pubspec.yaml +++ b/packages/dartcv/pubspec.yaml @@ -1,6 +1,10 @@ name: dartcv -description: "OpenCV bindings for Dart language. dartcv is for pure dart only, for flutter, please use opencv_dart." -version: 1.0.0 +description: | + OpenCV bindings for Dart language. + dartcv is for pure dart only, + for flutter, please use [opencv_core](https://pub.dev/packages/opencv_core), + if you need videoio module, use [opencv_dart](https://pub.dev/packages/opencv_dart). +version: 0.0.1 homepage: https://github.com/rainyl/opencv_dart/packages/dartcv environment: diff --git a/packages/dartcv/test/gapi/structs_test.dart b/packages/dartcv/test/gapi/structs_test.dart index a7ab79ff..12538754 100644 --- a/packages/dartcv/test/gapi/structs_test.dart +++ b/packages/dartcv/test/gapi/structs_test.dart @@ -1,5 +1,7 @@ -import 'package:dartcv/gapi.dart' as cv_gapi; +@Skip('GAPI not finished') + import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv/gapi.dart' as cv_gapi; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/videoio/videoio_async_test.dart b/packages/dartcv/test/videoio/videoio_async_test.dart new file mode 100644 index 00000000..16a5d623 --- /dev/null +++ b/packages/dartcv/test/videoio/videoio_async_test.dart @@ -0,0 +1,54 @@ +import 'package:dartcv/dartcv.dart' as cv; +import 'package:test/test.dart'; + +void main() async { + // videoio + test('cv.VideoWriterAsync.emptyAsync', () async { + final writer = await cv.VideoWriterAsync.emptyAsync(); + expect(writer.isOpened, equals(false)); + await writer.openAsync("test/images/small2.mp4", "mp4v", 60, (400, 300)); + await writer.releaseAsync(); + + expect(await cv.VideoWriterAsync.fourccAsync("MJPG"), closeTo(1196444237, 1e-3)); + + writer.dispose(); + }); + + test('cv.VideoWriterAsync.openAsync', () async { + final writer = await cv.VideoWriterAsync.fromFileAsync("test/images/small2.mp4", "mp4v", 60, (400, 300)); + final frame = cv.Mat.ones(400, 300, cv.MatType.CV_8UC3); + await writer.writeAsync(frame); + await writer.releaseAsync(); + }); + + test('cv.VideoCaptureAsync.emptyAsync', () async { + final vc = await cv.VideoCaptureAsync.emptyAsync(); + expect(vc.isOpened, false); + final success = await vc.openAsync("test/images/small.mp4", apiPreference: cv.CAP_ANY); + expect(success, true); + await vc.releaseAsync(); + + vc.dispose(); + }); + + test('cv.VideoCaptureAsync.fromFileAsync', () async { + final vc = await cv.VideoCaptureAsync.fromFileAsync("test/images/small.mp4", apiPreference: cv.CAP_ANY); + final (success, frame) = await vc.readAsync(); + expect(success, true); + expect(frame.isEmpty, false); + expect(vc.codec, "h264"); + + expect(cv.VideoCapture.toCodec("h264"), closeTo(875967080, 1e-3)); + // cv.imwrite("cv.VideoCapture.fromFile.png", frame); + }); + + // Disable for github + test('cv.VideoCaptureAsync.fromDeviceAsync', skip: true, () async { + final vc = await cv.VideoCaptureAsync.fromDeviceAsync(0); + expect(vc.isOpened, true); + final (res, frame) = await vc.readAsync(); + expect(res, true); + expect(frame.isEmpty, false); + // cv.imwrite("cv.VideoCapture.fromDevice_1.png", frame); + }); +} diff --git a/packages/dartcv/test/videoio/videoio_test.dart b/packages/dartcv/test/videoio/videoio_test.dart new file mode 100644 index 00000000..2b10da6c --- /dev/null +++ b/packages/dartcv/test/videoio/videoio_test.dart @@ -0,0 +1,66 @@ +import 'package:dartcv/dartcv.dart' as cv; +import 'package:test/test.dart'; + +void main() async { + // videoio + test('cv.VideoWriter.empty', () { + final writer = cv.VideoWriter.empty(); + expect(writer.isOpened, equals(false)); + writer.open("test/images/small2.mp4", "mp4v", 60, (400, 300)); + writer.open("test/images/small2.mp4", "mp4v", 60, (400, 300), apiPreference: cv.CAP_FFMPEG); + writer.release(); + + expect(cv.VideoWriter.fourcc("MJPG"), closeTo(1196444237, 1e-3)); + + writer.dispose(); + }); + + test('cv.VideoWriter.fromFile', () { + final writer = cv.VideoWriter.fromFile("test/images/small2.mp4", "mp4v", 60, (400, 300)); + final frame = cv.Mat.ones(400, 300, cv.MatType.CV_8UC3); + writer.write(frame); + writer.release(); + final writer1 = cv.VideoWriter.fromFile( + "test/images/small2.mp4", + "mp4v", + 60, + (400, 300), + apiPreference: cv.CAP_FFMPEG, + ); + expect(writer1.isOpened, true); + }); + + test('cv.VideoCapture.empty', () { + final vc = cv.VideoCapture.empty(); + expect(vc.isOpened, false); + final success = vc.open("test/images/small.mp4", apiPreference: cv.CAP_ANY); + expect(success, true); + vc.release(); + + vc.dispose(); + }); + + test('cv.VideoCapture.fromFile', () { + final vc = cv.VideoCapture.fromFile("test/images/small.mp4", apiPreference: cv.CAP_ANY); + final (success, frame) = vc.read(); + expect(success, true); + expect(frame.isEmpty, false); + + expect(vc.getBackendName(), isNotEmpty); + + expect(vc.codec, "h264"); + + expect(cv.VideoCapture.toCodec("h264"), closeTo(875967080, 1e-3)); + // cv.imwrite("cv.VideoCapture.fromFile.png", frame); + }); + + // Disable for github + test('cv.VideoCapture.fromDevice', skip: true, () { + final vc = cv.VideoCapture.fromDevice(0); + expect(vc.isOpened, true); + final (res, frame) = vc.read(); + expect(res, true); + expect(frame.isEmpty, false); + // cv.imwrite("cv.VideoCapture.fromDevice_1.png", frame); + }); +} diff --git a/packages/opencv_core/pubspec.yaml b/packages/opencv_core/pubspec.yaml index 92a40eb8..06f563d7 100644 --- a/packages/opencv_core/pubspec.yaml +++ b/packages/opencv_core/pubspec.yaml @@ -4,6 +4,8 @@ description: | This plugin does NOT include highgui and videoio modules, if you need them, please use opencv_dart instead. version: 1.2.6 +opencv_version: 4.10.0+9 +dartcv_version: 4.10.0+2 homepage: https://github.com/rainyl/opencv_dart environment: @@ -13,8 +15,7 @@ environment: dependencies: flutter: sdk: flutter - dartcv: - path: ../dartcv + dartcv: ^0.0.1 dev_dependencies: test: ^1.25.2 diff --git a/packages/opencv_core/src/CMakeLists.txt b/packages/opencv_core/src/CMakeLists.txt index 975f0ea1..424ebe5e 100644 --- a/packages/opencv_core/src/CMakeLists.txt +++ b/packages/opencv_core/src/CMakeLists.txt @@ -1,7 +1,30 @@ cmake_minimum_required(VERSION 3.14) +get_filename_component(PROJ_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) + +macro(_find_version _version_var _version_file _regex_find _regex_replace) + # read versions + if(EXISTS ${_version_file}) + file(STRINGS ${_version_file} _version_string REGEX ${_regex_find}) + string(REGEX REPLACE ${_regex_replace} "\\1" _version_string "${_version_string}") + set(${_version_var} "${_version_string}") + else() + message(FATAL_ERROR "file ${_version_file} not found!") + endif() +endmacro() + +_find_version(_version_project "${PROJ_DIR}/pubspec.yaml" "^version: (.+)*$" "version: (.+)*$") +_find_version(_version_opencv "${PROJ_DIR}/pubspec.yaml" "^opencv_version: (.+)*$" "opencv_version: (.+)*$") +_find_version(_version_dartcv "${PROJ_DIR}/pubspec.yaml" "^dartcv_version: (.+)*$" "dartcv_version: (.+)*$") + +message(STATUS "Project Version: ${_version_project}") +message(STATUS "OpenCV Version: ${_version_opencv}") +message(STATUS "DartCv Version: ${_version_dartcv}") + project(dartcv LANGUAGES CXX VERSION 1.0.0) +set(PROJECT_VERSION "${_version_project}") + # Flutter doesn't support build android-x86, disable here # https://docs.flutter.dev/deployment/android#what-are-the-supported-target-architectures if(ANDROID AND(DEFINED ANDROID_ABI)) @@ -26,16 +49,16 @@ set(DARTCV_WITH_GAPI OFF) set(DARTCV_WORLD OFF) # TODO: read opencv_version from pubspec.yaml -set(OPENCV_VERSION "4.10.0+9") +set(OPENCV_VERSION "${_version_opencv}") set(DARTCV_DISABLE_DOWNLOAD_OPENCV OFF) include(FetchContent) FetchContent_Declare( - dartcv + libdartcv GIT_REPOSITORY https://github.com/rainyl/dartcv.git - GIT_TAG 61effe0762f7919b38f1da58d87c9aa541ee1569 + GIT_TAG ${_version_dartcv} ) -FetchContent_MakeAvailable(dartcv) +FetchContent_MakeAvailable(libdartcv) if(ANDROID) message(STATUS "Installing ${FFMPEG_LIB_PATHS} to ${CMAKE_INSTALL_PREFIX}") diff --git a/packages/opencv_core/windows/CMakeLists.txt b/packages/opencv_core/windows/CMakeLists.txt index e7207843..769fa454 100644 --- a/packages/opencv_core/windows/CMakeLists.txt +++ b/packages/opencv_core/windows/CMakeLists.txt @@ -8,6 +8,12 @@ cmake_minimum_required(VERSION 3.14) set(PROJECT_NAME "opencv_core") project(${PROJECT_NAME} LANGUAGES CXX) +# disable warnings +set (CMAKE_C_FLAGS "/wd4244 /D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_DEPRECATE ${CMAKE_C_FLAGS}") +set (CMAKE_C_FLAGS "/wd4244 /D_CRT_NONSTDC_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE ${CMAKE_C_FLAGS}") +set (CMAKE_CXX_FLAGS "/wd4244 /D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_DEPRECATE ${CMAKE_CXX_FLAGS}") +set (CMAKE_CXX_FLAGS "/wd4244 /D_CRT_NONSTDC_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE ${CMAKE_CXX_FLAGS}") + # Invoke the build for native code shared with the other target platforms. # This can be changed to accommodate different builds. add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") diff --git a/packages/opencv_dart/example/android/app/build.gradle b/packages/opencv_dart/example/android/app/build.gradle index 47e9ac6f..6d906e1f 100644 --- a/packages/opencv_dart/example/android/app/build.gradle +++ b/packages/opencv_dart/example/android/app/build.gradle @@ -24,7 +24,7 @@ android { applicationId = "dev.rainyl.opencv_dart_example" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion + minSdk = 24 targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName diff --git a/packages/opencv_dart/linux/CMakeLists.txt b/packages/opencv_dart/linux/CMakeLists.txt index fe398e5b..4126ff35 100644 --- a/packages/opencv_dart/linux/CMakeLists.txt +++ b/packages/opencv_dart/linux/CMakeLists.txt @@ -10,7 +10,7 @@ project(${PROJECT_NAME} LANGUAGES CXX VERSION 1.0.0) # Invoke the build for native code shared with the other target platforms. # This can be changed to accommodate different builds. -# add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") +add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") # List of absolute paths to libraries that should be bundled with the plugin. # This list could contain prebuilt libraries, or libraries created by an diff --git a/packages/opencv_dart/pubspec.yaml b/packages/opencv_dart/pubspec.yaml index c894d06f..d74f5324 100644 --- a/packages/opencv_dart/pubspec.yaml +++ b/packages/opencv_dart/pubspec.yaml @@ -5,7 +5,9 @@ description: | please use opencv_core instead. The most complete OpenCV bindings for Dart! With asynchronous support now! -version: 1.2.5 +version: 1.2.6 +opencv_version: 4.10.0+9 +dartcv_version: 4.10.0+2 homepage: https://github.com/rainyl/opencv_dart environment: @@ -15,8 +17,7 @@ environment: dependencies: flutter: sdk: flutter - dartcv: - path: ../dartcv + dartcv: 0.0.1 dev_dependencies: test: ^1.25.2 diff --git a/packages/opencv_dart/src/CMakeLists.txt b/packages/opencv_dart/src/CMakeLists.txt index 150c1fa0..544ff8b5 100644 --- a/packages/opencv_dart/src/CMakeLists.txt +++ b/packages/opencv_dart/src/CMakeLists.txt @@ -1,7 +1,30 @@ cmake_minimum_required(VERSION 3.14) +get_filename_component(PROJ_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) + +macro(_find_version _version_var _version_file _regex_find _regex_replace) + # read versions + if(EXISTS ${_version_file}) + file(STRINGS ${_version_file} _version_string REGEX ${_regex_find}) + string(REGEX REPLACE ${_regex_replace} "\\1" _version_string "${_version_string}") + set(${_version_var} "${_version_string}") + else() + message(FATAL_ERROR "file ${_version_file} not found!") + endif() +endmacro() + +_find_version(_version_project "${PROJ_DIR}/pubspec.yaml" "^version: (.+)*$" "version: (.+)*$") +_find_version(_version_opencv "${PROJ_DIR}/pubspec.yaml" "^opencv_version: (.+)*$" "opencv_version: (.+)*$") +_find_version(_version_dartcv "${PROJ_DIR}/pubspec.yaml" "^dartcv_version: (.+)*$" "dartcv_version: (.+)*$") + +message(STATUS "Project Version: ${_version_project}") +message(STATUS "OpenCV Version: ${_version_opencv}") +message(STATUS "DartCv Version: ${_version_dartcv}") + project(dartcv LANGUAGES CXX VERSION 1.0.0) +set(PROJECT_VERSION "${_version_project}") + # Flutter doesn't support build android-x86, disable here # https://docs.flutter.dev/deployment/android#what-are-the-supported-target-architectures if(ANDROID AND(DEFINED ANDROID_ABI)) @@ -26,16 +49,16 @@ set(DARTCV_WITH_GAPI OFF) set(DARTCV_WORLD OFF) # TODO: read opencv_version from pubspec.yaml -set(OPENCV_VERSION "4.10.0+9") +set(OPENCV_VERSION "${_version_opencv}") set(DARTCV_DISABLE_DOWNLOAD_OPENCV OFF) include(FetchContent) FetchContent_Declare( - dartcv + libdartcv GIT_REPOSITORY https://github.com/rainyl/dartcv.git - GIT_TAG 61effe0762f7919b38f1da58d87c9aa541ee1569 + GIT_TAG ${_version_dartcv} ) -FetchContent_MakeAvailable(dartcv) +FetchContent_MakeAvailable(libdartcv) if(ANDROID) message(STATUS "Installing ${FFMPEG_LIB_PATHS} to ${CMAKE_INSTALL_PREFIX}") diff --git a/packages/opencv_dart/windows/CMakeLists.txt b/packages/opencv_dart/windows/CMakeLists.txt index 74d792de..7c9e4b0f 100644 --- a/packages/opencv_dart/windows/CMakeLists.txt +++ b/packages/opencv_dart/windows/CMakeLists.txt @@ -22,6 +22,12 @@ set(FFMPEG_USE_STATIC_LIBS OFF) # This can be changed to accommodate different builds. add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared") +if(NOT FFMPEG_LIB_PATHS) + message(FATAL_ERROR "FFMPEG library paths not found!") +else() + message(STATUS "FFMPEG_LIB_PATHS: ${FFMPEG_LIB_PATHS}") +endif() + # List of absolute paths to libraries that should be bundled with the plugin. # This list could contain prebuilt libraries, or libraries created by an # external build triggered from this build file. From e2eba8204d74697845216b3e8833ea6275569311 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Mon, 14 Oct 2024 23:03:31 +0800 Subject: [PATCH 09/30] remove build actions --- .github/workflows/android.yaml | 66 ------------ .github/workflows/apple.yaml | 174 -------------------------------- .github/workflows/coverage.yaml | 45 +++++++++ .github/workflows/linux.yaml | 76 -------------- .github/workflows/windows.yaml | 77 -------------- 5 files changed, 45 insertions(+), 393 deletions(-) delete mode 100644 .github/workflows/android.yaml delete mode 100644 .github/workflows/apple.yaml create mode 100644 .github/workflows/coverage.yaml delete mode 100644 .github/workflows/linux.yaml delete mode 100644 .github/workflows/windows.yaml diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml deleted file mode 100644 index 11ad0691..00000000 --- a/.github/workflows/android.yaml +++ /dev/null @@ -1,66 +0,0 @@ -name: android - -on: - push: - tags: - - "v*.*.*" - pull_request: - branches: [ "main" ] - -jobs: - android: - name: android - runs-on: ubuntu-24.04 - strategy: - matrix: - abi: [armeabi-v7a, arm64-v8a, x86_64] - env: - COMMON_CMAKE_OPTIONS: | - -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_LATEST_HOME/build/cmake/android.toolchain.cmake \ - -DANDROID_USE_LEGACY_TOOLCHAIN_FILE=False \ - -DANDROID_PLATFORM=android-24 \ - -DCMAKE_BUILD_TYPE=Release \ - -DANDROID_STL=c++_static \ - -DANDROID_ARM_NEON=ON \ - steps: - - uses: actions/checkout@v4 - with: - repository: 'rainyl/dartcv' - ref: 'main' - - name: build - run: | - mkdir build && cd build - cmake -S ${{ github.workspace }} \ - ${{ env.COMMON_CMAKE_OPTIONS }} -DANDROID_ABI="${{ matrix.abi }}" \ - -DCMAKE_INSTALL_PREFIX="${{ matrix.abi }}" \ - - cmake --build . --config Release -j $(nproc) - cmake --build . --config Release --target install - - uses: actions/upload-artifact@v4 - name: upload - with: - path: build/${{ matrix.abi }} - name: libdartcv-android-${{ matrix.abi }} - - release: - name: android - runs-on: ubuntu-24.04 - steps: - - name: download - uses: actions/download-artifact@v4 - with: - path: libdartcv-android - pattern: libdartcv-android* - merge-multiple: true - - name: package - run: | - ls -R libdartcv-android - tar -C libdartcv-android -zcvf libdartcv-android.tar.gz . - - name: release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - prerelease: false - files: | - libdartcv-android.tar.gz diff --git a/.github/workflows/apple.yaml b/.github/workflows/apple.yaml deleted file mode 100644 index 23895aaa..00000000 --- a/.github/workflows/apple.yaml +++ /dev/null @@ -1,174 +0,0 @@ -name: apple - -on: - push: - tags: - - "v*.*.*" - pull_request: - branches: [ "main" ] - -env: - IOS_DEPLOYMENT_TARGET: '11.0' - MAC_DEPLOYMENT_TARGET: '11.0' - ENABLE_BITCODE: OFF - ENABLE_ARC: OFF - ENABLE_VISIBILITY: OFF - -jobs: - macos: - name: macos - strategy: - matrix: - osname: - - {os: macos-13, arch: x64, platform: MAC} - - {os: macos-14, arch: arm64, platform: MAC_ARM64} - runs-on: ${{ matrix.osname.os }} - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - name: setup - run: | - brew install --force --overwrite ninja ccache ffmpeg@6 nasm - brew link --overwrite ffmpeg@6 - - uses: robinraju/release-downloader@v1.10 - with: - repository: "rainyl/opencv.full" - tag: "4.10.0+6" - fileName: "libopencv-macos-${{ matrix.osname.arch }}.tar.gz" - out-file-path: "build/opencv" - extract: true - - name: build - run: | - cd build - cmake -S ${{ github.workspace }} \ - -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/profiles/ios.toolchain.cmake \ - -DDEPLOYMENT_TARGET=$MAC_DEPLOYMENT_TARGET \ - -DENABLE_BITCODE=$ENABLE_BITCODE \ - -DENABLE_ARC=$ENABLE_ARC \ - -DENABLE_VISIBILITY=$ENABLE_VISIBILITY \ - -DCMAKE_INSTALL_PREFIX=install \ - -DCMAKE_BUILD_TYPE=Release \ - -DPLATFORM=${{ matrix.osname.platform }} \ - -DCVD_PLATFORM_INSTALL_DIR="${{ github.workspace }}/macos" \ - -DOpenCV_DIR=${{ github.workspace }}/build/opencv/lib/cmake/opencv4 - - cmake --build . --config Release --target install - - name: package - run: | - tar -C build/install -zcvf libopencv_dart-macos-${{ matrix.osname.arch }}.tar.gz . - - uses: actions/upload-artifact@v4 - name: upload - with: - path: build/install/libopencv_dart.dylib - name: libopencv_dart-macos-${{ matrix.osname.arch }} - - uses: subosito/flutter-action@v2 - with: - flutter-version: '3.19.6' - channel: "stable" - - name: test - run: | - export OPENCV_DART_LIB_PATH="${{github.workspace}}/macos/libopencv_dart.dylib" - dart pub get - dart test -x skip-workflow,no-local-files - - name: release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - prerelease: false - files: | - libopencv_dart-macos-${{ matrix.osname.arch }}.tar.gz - release: - permissions: - contents: write # for softprops/action-gh-release to create a release - needs: [macos] - runs-on: macos-14 - steps: - - name: download - uses: actions/download-artifact@v4 - with: - path: artifacts - pattern: libopencv_dart-macos-* - merge-multiple: false - - name: lipo - run: | - ls -R - cd artifacts - lipo -create -output libopencv_dart.dylib */libopencv_dart.dylib - lipo -info libopencv_dart.dylib - tar -zcvf libopencv_dart-macos-os64.tar.gz libopencv_dart.dylib - - name: create-release - uses: softprops/action-gh-release@v2 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - prerelease: false - token: ${{ secrets.GITHUB_TOKEN }} - files: artifacts/libopencv_dart-macos-os64.tar.gz - ios: - name: ios - runs-on: macos-14 - env: - COMMON_CMAKE_OPTIONS: | - -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/profiles/ios.toolchain.cmake \ - -DDEPLOYMENT_TARGET=$IOS_DEPLOYMENT_TARGET \ - -DENABLE_BITCODE=$ENABLE_BITCODE \ - -DENABLE_ARC=$ENABLE_ARC \ - -DENABLE_VISIBILITY=$ENABLE_VISIBILITY \ - -DCMAKE_INSTALL_PREFIX=install \ - -DCMAKE_BUILD_TYPE=Release \ - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - uses: robinraju/release-downloader@v1.10 - with: - repository: "rainyl/opencv.full" - tag: "4.10.0+6" - fileName: "libopencv-ios-x64.tar.gz" - out-file-path: "build/opencv/x64" - extract: true - - uses: robinraju/release-downloader@v1.10 - with: - repository: "rainyl/opencv.full" - tag: "4.10.0+6" - fileName: "libopencv-ios-arm64.tar.gz" - out-file-path: "build/opencv/arm64" - extract: true - - name: build_simulator64 - run: | - mkdir -p build/x64 && cd build/x64 - cmake -S ${{ github.workspace }} \ - ${{ env.COMMON_CMAKE_OPTIONS }} -DPLATFORM=SIMULATOR64 \ - -DOpenCV_DIR=${{ github.workspace }}/build/opencv/x64/lib/cmake/opencv4 - - cmake --build . --config Release --target install - - name: build_os64 - run: | - mkdir -p build/os64 && cd build/os64 - cmake -S ${{ github.workspace }} \ - ${{ env.COMMON_CMAKE_OPTIONS }} -DPLATFORM=OS64 \ - -DOpenCV_DIR=${{ github.workspace }}/build/opencv/arm64/lib/cmake/opencv4 - - cmake --build . --config Release --target install - - name: package - run: | - xcodebuild -create-xcframework \ - -framework build/x64/install/opencv_dart.framework \ - -framework build/os64/install/opencv_dart.framework \ - -output opencv_dart.xcframework - tar -zcvf libopencv_dart-ios-os64.tar.gz opencv_dart.xcframework - - uses: actions/upload-artifact@v4 - name: upload - with: - path: libopencv_dart-ios-os64.tar.gz - name: libopencv_dart-ios-os64.tar.gz - - name: release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - prerelease: false - files: | - libopencv_dart-ios-os64.tar.gz diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml new file mode 100644 index 00000000..9591df0f --- /dev/null +++ b/.github/workflows/coverage.yaml @@ -0,0 +1,45 @@ +name: coverage + +on: + push: + branches: ["main"] + pull_request: + branches: [ "main" ] + +jobs: + windows: + name: windows + runs-on: windows-2019 + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - uses: robinraju/release-downloader@v1.10 + with: + repository: "rainyl/opencv_dart" + tag: "dnn_test_files" + fileName: "models.zip" + out-file-path: "packages/dartcv/test/" + extract: true + - uses: robinraju/release-downloader@v1.10 + with: + repository: "rainyl/dartcv" + latest: true + fileName: "libdartcv-windows-x64-vs2019.tar.gz" + out-file-path: "packages/dartcv/libdartcv" + extract: true + - uses: subosito/flutter-action@v2 + with: + channel: "stable" + - name: test coverage + run: | + cd "${{github.workspace}}\packages\dartcv" + $env:PATH="${{github.workspace}}\packages\dartcv\libdartcv\lib;$env:PATH" + dart pub global activate coverage + dart pub global run coverage:test_with_coverage --package . --package-name opencv_dart + - name: Upload to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: rainyl/opencv_dart + file: ./coverage/lcov.info diff --git a/.github/workflows/linux.yaml b/.github/workflows/linux.yaml deleted file mode 100644 index 1ed45069..00000000 --- a/.github/workflows/linux.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: linux - -on: - push: - tags: - - "v*.*.*" - pull_request: - branches: [ "main" ] - -jobs: - ubuntu: - name: ubuntu - runs-on: ubuntu-22.04 - strategy: - matrix: - arch: [x64] - env: - COMMON_CMAKE_OPTIONS: | - -DCMAKE_INSTALL_PREFIX=install \ - -DCMAKE_BUILD_TYPE=Release \ - -DCVD_PLATFORM_INSTALL_DIR="${{ github.workspace }}/linux" \ - - steps: - - name: setup - run: | - sudo apt-get update - - sudo apt-get install -y curl unzip build-essential \ - libgtk-3-dev ffmpeg libavcodec-dev \ - cmake ninja-build libavformat-dev libavutil-dev \ - libswscale-dev libgflags-dev \ - libjpeg-dev libpng-dev libtiff-dev - - uses: actions/checkout@v4 - with: - submodules: true - - uses: robinraju/release-downloader@v1.10 - with: - repository: "rainyl/opencv.full" - tag: "4.10.0+6" - fileName: "libopencv-linux-${{ matrix.arch }}.tar.gz" - out-file-path: "build/opencv" - extract: true - - name: build - run: | - cd build - cmake -S ${{ github.workspace }} \ - ${{ env.COMMON_CMAKE_OPTIONS }} \ - -DOpenCV_DIR=${{ github.workspace }}/build/opencv/lib/cmake/opencv4 - - cmake --build . --config Release -j $(nproc) - cmake --build . --config Release --target install - - name: package - run: | - tar -C build/install -zcvf libopencv_dart-linux-${{ matrix.arch }}.tar.gz . - - uses: actions/upload-artifact@v4 - name: upload - with: - path: libopencv_dart-linux-${{ matrix.arch }}.tar.gz - name: libopencv_dart-linux-${{ matrix.arch }}.tar.gz - - uses: subosito/flutter-action@v2 - with: - flutter-version: '3.19.6' - channel: "stable" - - name: test - run: | - export OPENCV_DART_LIB_PATH="${{github.workspace}}/linux/libopencv_dart.so" - dart pub get - dart test -x skip-workflow,no-local-files - - name: release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - prerelease: false - files: | - libopencv_dart-linux-${{ matrix.arch }}.tar.gz diff --git a/.github/workflows/windows.yaml b/.github/workflows/windows.yaml deleted file mode 100644 index 7c3c68f5..00000000 --- a/.github/workflows/windows.yaml +++ /dev/null @@ -1,77 +0,0 @@ -name: windows - -on: - push: - branches: ["main"] - tags: - - "v*.*.*" - pull_request: - branches: [ "main" ] - -jobs: - windows: - name: windows - runs-on: windows-2019 - strategy: - matrix: - arch: [x64] - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - uses: robinraju/release-downloader@v1.10 - with: - repository: "rainyl/opencv.full" - tag: "4.10.0+6" - fileName: "libopencv-windows-${{ matrix.arch }}.tar.gz" - out-file-path: "build/opencv" - extract: true - - name: build - run: | - cd build - cmake -DCMAKE_INSTALL_PREFIX=install ` - -DCMAKE_BUILD_TYPE=Release ` - -DCVD_PLATFORM_INSTALL_DIR="${{ github.workspace }}/windows" ` - -DOpenCV_DIR=${{ github.workspace }}/build/opencv .. - - cmake --build . --config Release -j $(nproc) - cmake --build . --config Release --target install - - name: package - run: | - tar -C build/install -zcvf libopencv_dart-windows-${{ matrix.arch }}.tar.gz . - - uses: actions/upload-artifact@v4 - name: upload - with: - path: libopencv_dart-windows-${{ matrix.arch }}.tar.gz - name: libopencv_dart-windows-${{ matrix.arch }}.tar.gz - - uses: robinraju/release-downloader@v1.10 - with: - repository: "rainyl/opencv_dart" - tag: "dnn_test_files" - fileName: "models.zip" - out-file-path: "test/" - extract: true - - uses: subosito/flutter-action@v2 - with: - channel: "stable" - - name: test coverage - run: | - cd "${{github.workspace}}" - ls windows - $env:PATH="${{github.workspace}}\windows;$env:PATH" - dart pub global activate coverage - dart pub global run coverage:test_with_coverage --package . --package-name opencv_dart - - name: Upload to Codecov - uses: codecov/codecov-action@v4.0.1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - slug: rainyl/opencv_dart - file: ./coverage/lcov.info - - name: release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - prerelease: false - files: | - libopencv_dart-windows-${{ matrix.arch }}.tar.gz From 3827203063e95af81d8c6a2088f75b2c0247c13b Mon Sep 17 00:00:00 2001 From: rainy liu Date: Tue, 15 Oct 2024 11:40:21 +0800 Subject: [PATCH 10/30] update pubignore --- packages/dartcv/.pubignore | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/dartcv/.pubignore b/packages/dartcv/.pubignore index 01f0aa03..9bbd05aa 100644 --- a/packages/dartcv/.pubignore +++ b/packages/dartcv/.pubignore @@ -10,6 +10,7 @@ test/images test/images_out test/models src/ +!lib/src ffigen/ Makefile libdartcv* From 28f10080ed99dbc80d52200a62a0184c2657298f Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sat, 19 Oct 2024 00:24:56 +0800 Subject: [PATCH 11/30] finish Mat and calib3d --- packages/dartcv/example/dartcv_example.dart | 2 +- packages/dartcv/ffigen/ffigen_calib3d.yaml | 11 +- packages/dartcv/ffigen/ffigen_const.yaml | 2 +- packages/dartcv/ffigen/ffigen_contrib.yaml | 18 +- packages/dartcv/ffigen/ffigen_core.yaml | 57 +- packages/dartcv/ffigen/ffigen_dnn.yaml | 13 +- packages/dartcv/ffigen/ffigen_features2d.yaml | 11 +- packages/dartcv/ffigen/ffigen_gapi.yaml | 9 +- packages/dartcv/ffigen/ffigen_highgui.yaml | 9 +- packages/dartcv/ffigen/ffigen_imgcodecs.yaml | 11 +- packages/dartcv/ffigen/ffigen_imgproc.yaml | 11 +- packages/dartcv/ffigen/ffigen_objdetect.yaml | 11 +- packages/dartcv/ffigen/ffigen_photo.yaml | 11 +- packages/dartcv/ffigen/ffigen_stitching.yaml | 11 +- packages/dartcv/ffigen/ffigen_types.yaml | 7 +- packages/dartcv/ffigen/ffigen_video.yaml | 11 +- packages/dartcv/ffigen/ffigen_videoio.yaml | 11 +- packages/dartcv/lib/src/calib3d/calib3d.dart | 110 +- .../dartcv/lib/src/calib3d/calib3d_async.dart | 391 +- packages/dartcv/lib/src/calib3d/fisheye.dart | 115 +- packages/dartcv/lib/src/core/base.dart | 2 +- packages/dartcv/lib/src/core/mat.dart | 338 +- packages/dartcv/lib/src/core/mat_async.dart | 172 +- packages/dartcv/lib/src/core/point.dart | 8 +- packages/dartcv/lib/src/core/rect.dart | 6 +- packages/dartcv/lib/src/core/rng.dart | 44 +- packages/dartcv/lib/src/core/rng_async.dart | 35 - packages/dartcv/lib/src/core/svd.dart | 47 +- packages/dartcv/lib/src/g/calib3d.g.dart | 906 +- packages/dartcv/lib/src/g/calib3d.yaml | 110 +- packages/dartcv/lib/src/g/contrib.g.dart | 6993 ++++-------- packages/dartcv/lib/src/g/contrib.yaml | 972 +- packages/dartcv/lib/src/g/core.g.dart | 9831 +++++++---------- packages/dartcv/lib/src/g/core.yaml | 1416 +-- packages/dartcv/lib/src/g/dnn.g.dart | 1409 +-- packages/dartcv/lib/src/g/dnn.yaml | 248 +- packages/dartcv/lib/src/g/features2d.g.dart | 1972 +--- packages/dartcv/lib/src/g/features2d.yaml | 294 +- packages/dartcv/lib/src/g/gapi.g.dart | 2 +- packages/dartcv/lib/src/g/gapi.yaml | 2 +- packages/dartcv/lib/src/g/highgui.g.dart | 450 +- packages/dartcv/lib/src/g/highgui.yaml | 104 +- packages/dartcv/lib/src/g/imgcodecs.g.dart | 254 +- packages/dartcv/lib/src/g/imgcodecs.yaml | 44 +- packages/dartcv/lib/src/g/imgproc.g.dart | 7793 +++++-------- packages/dartcv/lib/src/g/imgproc.yaml | 806 +- packages/dartcv/lib/src/g/objdetect.g.dart | 3045 ++--- packages/dartcv/lib/src/g/objdetect.yaml | 340 +- packages/dartcv/lib/src/g/photo.g.dart | 925 +- packages/dartcv/lib/src/g/photo.yaml | 136 +- packages/dartcv/lib/src/g/stitching.g.dart | 854 +- packages/dartcv/lib/src/g/stitching.yaml | 112 +- packages/dartcv/lib/src/g/types.yaml | 2 +- packages/dartcv/lib/src/g/video.g.dart | 2185 ++-- packages/dartcv/lib/src/g/video.yaml | 280 +- packages/dartcv/lib/src/g/videoio.g.dart | 898 +- packages/dartcv/lib/src/g/videoio.yaml | 146 +- packages/dartcv/pubspec.yaml | 2 +- packages/dartcv/test/calib3d_test.dart | 2 +- .../dartcv/test/contrib/aruco_async_test.dart | 2 +- packages/dartcv/test/contrib/aruco_test.dart | 2 +- .../test/contrib/img_hash_async_test.dart | 2 +- .../dartcv/test/contrib/img_hash_test.dart | 2 +- .../dartcv/test/contrib/quality_test.dart | 2 +- .../contrib/wechat_qrcode_async_test.dart | 2 +- .../test/contrib/wechat_qrcode_test.dart | 2 +- .../dartcv/test/contrib/ximgproc_test.dart | 2 +- .../dartcv/test/core/core_async_test.dart | 2 +- packages/dartcv/test/core/core_test.dart | 2 +- packages/dartcv/test/core/mat_async_test.dart | 2 +- packages/dartcv/test/core/mat_test.dart | 2 +- packages/dartcv/test/core/others_test.dart | 2 +- packages/dartcv/test/core/point_test.dart | 2 +- packages/dartcv/test/core/rng_test.dart | 2 +- packages/dartcv/test/core/vec_matcher.dart | 2 +- packages/dartcv/test/core/vec_test.dart | 2 +- packages/dartcv/test/dnn/dnn_async_test.dart | 2 +- packages/dartcv/test/dnn/dnn_test.dart | 2 +- .../features2d/features2d_async_test.dart | 2 +- .../test/features2d/features2d_test.dart | 2 +- packages/dartcv/test/gapi/structs_test.dart | 4 +- packages/dartcv/test/highgui_test.dart | 2 +- packages/dartcv/test/imgcodecs_test.dart | 2 +- packages/dartcv/test/imgproc/clahe_test.dart | 2 +- .../test/imgproc/imgproc_async_test.dart | 2 +- .../dartcv/test/imgproc/imgproc_test.dart | 2 +- .../dartcv/test/imgproc/subdiv2d_test.dart | 2 +- .../test/objdetect/objdetect_async_test.dart | 4 +- .../dartcv/test/objdetect/objdetect_test.dart | 4 +- packages/dartcv/test/perf_mat.dart | 2 +- .../dartcv/test/photo/photo_async_test.dart | 2 +- packages/dartcv/test/photo/photo_test.dart | 2 +- .../test/stitching/stitching_async_test.dart | 2 +- .../dartcv/test/stitching/stitching_test.dart | 2 +- packages/dartcv/test/svd_test.dart | 2 +- .../dartcv/test/video/video_async_test.dart | 2 +- packages/dartcv/test/video/video_test.dart | 2 +- .../test/videoio/videoio_async_test.dart | 2 +- .../dartcv/test/videoio/videoio_test.dart | 2 +- 99 files changed, 15324 insertions(+), 28779 deletions(-) delete mode 100644 packages/dartcv/lib/src/core/rng_async.dart diff --git a/packages/dartcv/example/dartcv_example.dart b/packages/dartcv/example/dartcv_example.dart index cae55e6d..fd7852de 100644 --- a/packages/dartcv/example/dartcv_example.dart +++ b/packages/dartcv/example/dartcv_example.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; void main() { final image = cv.Mat.zeros(3, 3, cv.MatType.CV_8UC3); diff --git a/packages/dartcv/ffigen/ffigen_calib3d.yaml b/packages/dartcv/ffigen/ffigen_calib3d.yaml index 6f906fda..b61eb811 100644 --- a/packages/dartcv/ffigen/ffigen_calib3d.yaml +++ b/packages/dartcv/ffigen/ffigen_calib3d.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/calib3d.g.dart symbol-file: - output: 'package:dartcv/src/g/calib3d.yaml' - import-path: 'package:dartcv/src/g/calib3d.g.dart' + output: 'package:dartcv4/src/g/calib3d.yaml' + import-path: 'package:dartcv4/src/g/calib3d.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/calib3d/calib3d.h - - ../src/dartcv/calib3d/calib3d_async.h include-directives: - ../src/dartcv/calib3d/calib3d.h - - ../src/dartcv/calib3d/calib3d_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" # exclude: # If you only use exclude, then everything not excluded is generated. # - "dispose" diff --git a/packages/dartcv/ffigen/ffigen_const.yaml b/packages/dartcv/ffigen/ffigen_const.yaml index 9d67521f..5ab8cbe3 100644 --- a/packages/dartcv/ffigen/ffigen_const.yaml +++ b/packages/dartcv/ffigen/ffigen_const.yaml @@ -4,7 +4,7 @@ description: | output: bindings: ../lib/src/g/constants.g.dart # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. compiler-opts: "" sort: true include-unused-typedefs: true diff --git a/packages/dartcv/ffigen/ffigen_contrib.yaml b/packages/dartcv/ffigen/ffigen_contrib.yaml index 361a62e4..87b68d07 100644 --- a/packages/dartcv/ffigen/ffigen_contrib.yaml +++ b/packages/dartcv/ffigen/ffigen_contrib.yaml @@ -4,41 +4,31 @@ description: | output: bindings: ../lib/src/g/contrib.g.dart symbol-file: - output: "package:dartcv/src/g/contrib.yaml" - import-path: "package:dartcv/src/g/contrib.g.dart" + output: "package:dartcv4/src/g/contrib.yaml" + import-path: "package:dartcv4/src/g/contrib.g.dart" # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - "package:dartcv/src/g/types.yaml" + - "package:dartcv4/src/g/types.yaml" compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/contrib/aruco.h - - ../src/dartcv/contrib/aruco_async.h - ../src/dartcv/contrib/img_hash.h - - ../src/dartcv/contrib/img_hash_async.h - ../src/dartcv/contrib/quality.h - - ../src/dartcv/contrib/quality_async.h - ../src/dartcv/contrib/wechat_qrcode.h - ../src/dartcv/contrib/ximgproc.h - - ../src/dartcv/contrib/ximgproc_async.h - ../src/dartcv/contrib/xobjdetect.h - - ../src/dartcv/contrib/wechat_qrcode_async.h include-directives: - ../src/dartcv/contrib/aruco.h - - ../src/dartcv/contrib/aruco_async.h - ../src/dartcv/contrib/img_hash.h - - ../src/dartcv/contrib/img_hash_async.h - ../src/dartcv/contrib/quality.h - - ../src/dartcv/contrib/quality_async.h - ../src/dartcv/contrib/wechat_qrcode.h - ../src/dartcv/contrib/ximgproc.h - - ../src/dartcv/contrib/ximgproc_async.h - ../src/dartcv/contrib/xobjdetect.h - - ../src/dartcv/contrib/wechat_qrcode_async.h functions: symbol-address: diff --git a/packages/dartcv/ffigen/ffigen_core.yaml b/packages/dartcv/ffigen/ffigen_core.yaml index 89878c15..47481cf8 100644 --- a/packages/dartcv/ffigen/ffigen_core.yaml +++ b/packages/dartcv/ffigen/ffigen_core.yaml @@ -4,62 +4,55 @@ description: | output: bindings: ../lib/src/g/core.g.dart symbol-file: - output: 'package:dartcv/src/g/core.yaml' - import-path: 'package:dartcv/src/g/core.g.dart' + output: 'package:dartcv4/src/g/core.yaml' + import-path: 'package:dartcv4/src/g/core.g.dart' import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/core/core.h - - ../src/dartcv/core/core_async.h - ../src/dartcv/core/exception.h + - ../src/dartcv/core/logging.h + - ../src/dartcv/core/mat.h - ../src/dartcv/core/svd.h - - ../src/dartcv/core/svd_async.h - - ../src/dartcv/core/vec.h - ../src/dartcv/core/version.h - - ../src/dartcv/core/logging.h include-directives: - ../src/dartcv/core/core.h - - ../src/dartcv/core/core_async.h - ../src/dartcv/core/exception.h + - ../src/dartcv/core/logging.h + - ../src/dartcv/core/mat.h - ../src/dartcv/core/svd.h - - ../src/dartcv/core/svd_async.h - - ../src/dartcv/core/vec.h - ../src/dartcv/core/version.h - - ../src/dartcv/core/logging.h functions: leaf: include: - - "Mat_Flags" - - "Mat_Type" - - "Mat_CountNonZero" - - "Mat_IsContinuous" - - "Mat_IsSubmatrix" - - "Mat_Rows" - - "Mat_Cols" - - "Mat_Channels" - - "Mat_Step" - - "Mat_Total" - - "Mat_Size" - - "Mat_ElemSize.*" - - "Mat_Dims" - - "Mat_Data" - - "Mat_Get.*" - - "Mat_Set.*" - # - "" - # - "" - # - "" - # - "" + - ".*_Mat_flags" + - ".*_Mat_type" + - ".*_Mat_countNonZero" + - ".*_Mat_isContinuous" + - ".*_Mat_isSubmatrix" + - ".*_Mat_rows" + - ".*_Mat_cols" + - ".*_Mat_channels" + - ".*_Mat_step" + - ".*_Mat_total" + - ".*_Mat_size" + - ".*_Mat_elemSize.*" + - ".*_Mat_dims" + - ".*_Mat_data" + - ".*_Mat_get.*" + - ".*_Mat_set.*" symbol-address: include: - ".*_Close.*" + - ".*_close.*" # exclude: # If you only use exclude, then everything not excluded is generated. # - "dispose" diff --git a/packages/dartcv/ffigen/ffigen_dnn.yaml b/packages/dartcv/ffigen/ffigen_dnn.yaml index 8a5f05fb..8c000f5f 100644 --- a/packages/dartcv/ffigen/ffigen_dnn.yaml +++ b/packages/dartcv/ffigen/ffigen_dnn.yaml @@ -4,30 +4,27 @@ description: | output: bindings: ../lib/src/g/dnn.g.dart symbol-file: - output: 'package:dartcv/src/g/dnn.yaml' - import-path: 'package:dartcv/src/g/dnn.g.dart' + output: 'package:dartcv4/src/g/dnn.yaml' + import-path: 'package:dartcv4/src/g/dnn.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - - ../src/dartcv/dnn/asyncarray.h - ../src/dartcv/dnn/dnn.h - - ../src/dartcv/dnn/dnn_async.h include-directives: - - ../src/dartcv/dnn/asyncarray.h - ../src/dartcv/dnn/dnn.h - - ../src/dartcv/dnn/dnn_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" # exclude: # If you only use exclude, then everything not excluded is generated. # - "dispose" diff --git a/packages/dartcv/ffigen/ffigen_features2d.yaml b/packages/dartcv/ffigen/ffigen_features2d.yaml index 8ca5185d..00dfdb01 100644 --- a/packages/dartcv/ffigen/ffigen_features2d.yaml +++ b/packages/dartcv/ffigen/ffigen_features2d.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/features2d.g.dart symbol-file: - output: 'package:dartcv/src/g/features2d.yaml' - import-path: 'package:dartcv/src/g/features2d.g.dart' + output: 'package:dartcv4/src/g/features2d.yaml' + import-path: 'package:dartcv4/src/g/features2d.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/features2d/features2d.h - - ../src/dartcv/features2d/features2d_async.h include-directives: - ../src/dartcv/features2d/features2d.h - - ../src/dartcv/features2d/features2d_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_gapi.yaml b/packages/dartcv/ffigen/ffigen_gapi.yaml index 5e63cf40..9640e65e 100644 --- a/packages/dartcv/ffigen/ffigen_gapi.yaml +++ b/packages/dartcv/ffigen/ffigen_gapi.yaml @@ -4,13 +4,13 @@ description: | output: bindings: ../lib/src/g/gapi.g.dart symbol-file: - output: 'package:dartcv/src/g/gapi.yaml' - import-path: 'package:dartcv/src/g/gapi.g.dart' + output: 'package:dartcv4/src/g/gapi.yaml' + import-path: 'package:dartcv4/src/g/gapi.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true @@ -24,6 +24,7 @@ functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_highgui.yaml b/packages/dartcv/ffigen/ffigen_highgui.yaml index 3b6d42db..d9d05cce 100644 --- a/packages/dartcv/ffigen/ffigen_highgui.yaml +++ b/packages/dartcv/ffigen/ffigen_highgui.yaml @@ -4,13 +4,13 @@ description: | output: bindings: ../lib/src/g/highgui.g.dart symbol-file: - output: 'package:dartcv/src/g/highgui.yaml' - import-path: 'package:dartcv/src/g/highgui.g.dart' + output: 'package:dartcv4/src/g/highgui.yaml' + import-path: 'package:dartcv4/src/g/highgui.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true @@ -24,6 +24,7 @@ functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_imgcodecs.yaml b/packages/dartcv/ffigen/ffigen_imgcodecs.yaml index 9a20db99..105f6fd5 100644 --- a/packages/dartcv/ffigen/ffigen_imgcodecs.yaml +++ b/packages/dartcv/ffigen/ffigen_imgcodecs.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/imgcodecs.g.dart symbol-file: - output: 'package:dartcv/src/g/imgcodecs.yaml' - import-path: 'package:dartcv/src/g/imgcodecs.g.dart' + output: 'package:dartcv4/src/g/imgcodecs.yaml' + import-path: 'package:dartcv4/src/g/imgcodecs.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/imgcodecs/imgcodecs.h - - ../src/dartcv/imgcodecs/imgcodecs_async.h include-directives: - ../src/dartcv/imgcodecs/imgcodecs.h - - ../src/dartcv/imgcodecs/imgcodecs_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_imgproc.yaml b/packages/dartcv/ffigen/ffigen_imgproc.yaml index 17d4e13d..284f342c 100644 --- a/packages/dartcv/ffigen/ffigen_imgproc.yaml +++ b/packages/dartcv/ffigen/ffigen_imgproc.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/imgproc.g.dart symbol-file: - output: 'package:dartcv/src/g/imgproc.yaml' - import-path: 'package:dartcv/src/g/imgproc.g.dart' + output: 'package:dartcv4/src/g/imgproc.yaml' + import-path: 'package:dartcv4/src/g/imgproc.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/imgproc/imgproc.h - - ../src/dartcv/imgproc/imgproc_async.h include-directives: - ../src/dartcv/imgproc/imgproc.h - - ../src/dartcv/imgproc/imgproc_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_objdetect.yaml b/packages/dartcv/ffigen/ffigen_objdetect.yaml index 30fa5fd0..3a43ec29 100644 --- a/packages/dartcv/ffigen/ffigen_objdetect.yaml +++ b/packages/dartcv/ffigen/ffigen_objdetect.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/objdetect.g.dart symbol-file: - output: 'package:dartcv/src/g/objdetect.yaml' - import-path: 'package:dartcv/src/g/objdetect.g.dart' + output: 'package:dartcv4/src/g/objdetect.yaml' + import-path: 'package:dartcv4/src/g/objdetect.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/objdetect/objdetect.h - - ../src/dartcv/objdetect/objdetect_async.h include-directives: - ../src/dartcv/objdetect/objdetect.h - - ../src/dartcv/objdetect/objdetect_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_photo.yaml b/packages/dartcv/ffigen/ffigen_photo.yaml index c6f9573d..8dda3404 100644 --- a/packages/dartcv/ffigen/ffigen_photo.yaml +++ b/packages/dartcv/ffigen/ffigen_photo.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/photo.g.dart symbol-file: - output: 'package:dartcv/src/g/photo.yaml' - import-path: 'package:dartcv/src/g/photo.g.dart' + output: 'package:dartcv4/src/g/photo.yaml' + import-path: 'package:dartcv4/src/g/photo.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/photo/photo.h - - ../src/dartcv/photo/photo_async.h include-directives: - ../src/dartcv/photo/photo.h - - ../src/dartcv/photo/photo_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_stitching.yaml b/packages/dartcv/ffigen/ffigen_stitching.yaml index 6002c1a3..c4d83b8a 100644 --- a/packages/dartcv/ffigen/ffigen_stitching.yaml +++ b/packages/dartcv/ffigen/ffigen_stitching.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/stitching.g.dart symbol-file: - output: 'package:dartcv/src/g/stitching.yaml' - import-path: 'package:dartcv/src/g/stitching.g.dart' + output: 'package:dartcv4/src/g/stitching.yaml' + import-path: 'package:dartcv4/src/g/stitching.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/stitching/stitching.h - - ../src/dartcv/stitching/stitching_async.h include-directives: - ../src/dartcv/stitching/stitching.h - - ../src/dartcv/stitching/stitching_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_types.yaml b/packages/dartcv/ffigen/ffigen_types.yaml index ed8bba0f..89ae149a 100644 --- a/packages/dartcv/ffigen/ffigen_types.yaml +++ b/packages/dartcv/ffigen/ffigen_types.yaml @@ -4,10 +4,10 @@ description: | output: bindings: ../lib/src/g/types.g.dart symbol-file: - output: 'package:dartcv/src/g/types.yaml' - import-path: 'package:dartcv/src/g/types.g.dart' + output: 'package:dartcv4/src/g/types.yaml' + import-path: 'package:dartcv4/src/g/types.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true @@ -21,6 +21,7 @@ functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" # exclude: # If you only use exclude, then everything not excluded is generated. # - "dispose" diff --git a/packages/dartcv/ffigen/ffigen_video.yaml b/packages/dartcv/ffigen/ffigen_video.yaml index 137656a4..cc6c3cbf 100644 --- a/packages/dartcv/ffigen/ffigen_video.yaml +++ b/packages/dartcv/ffigen/ffigen_video.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/video.g.dart symbol-file: - output: 'package:dartcv/src/g/video.yaml' - import-path: 'package:dartcv/src/g/video.g.dart' + output: 'package:dartcv4/src/g/video.yaml' + import-path: 'package:dartcv4/src/g/video.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/video/video.h - - ../src/dartcv/video/video_async.h include-directives: - ../src/dartcv/video/video.h - - ../src/dartcv/video/video_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/ffigen/ffigen_videoio.yaml b/packages/dartcv/ffigen/ffigen_videoio.yaml index 8a72ee44..1f2bd158 100644 --- a/packages/dartcv/ffigen/ffigen_videoio.yaml +++ b/packages/dartcv/ffigen/ffigen_videoio.yaml @@ -4,28 +4,27 @@ description: | output: bindings: ../lib/src/g/videoio.g.dart symbol-file: - output: 'package:dartcv/src/g/videoio.yaml' - import-path: 'package:dartcv/src/g/videoio.g.dart' + output: 'package:dartcv4/src/g/videoio.yaml' + import-path: 'package:dartcv4/src/g/videoio.g.dart' # ffi-native: -# assetId: 'package:dartcv/dartcv.dart' # Optional. +# assetId: 'package:dartcv4/dartcv.dart' # Optional. import: symbol-files: - - 'package:dartcv/src/g/types.yaml' + - 'package:dartcv4/src/g/types.yaml' compiler-opts: "-Isrc -Idartcv" sort: true include-unused-typedefs: true headers: entry-points: - ../src/dartcv/videoio/videoio.h - - ../src/dartcv/videoio/videoio_async.h include-directives: - ../src/dartcv/videoio/videoio.h - - ../src/dartcv/videoio/videoio_async.h functions: symbol-address: include: - ".*_Close.*" + - ".*_close.*" preamble: | // coverage:ignore-file diff --git a/packages/dartcv/lib/src/calib3d/calib3d.dart b/packages/dartcv/lib/src/calib3d/calib3d.dart index cee17595..f7cb565a 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d.dart @@ -33,21 +33,22 @@ import '../native_lib.dart' show ccalib3d; OutputArray? map1, OutputArray? map2, }) { - final p1 = map1?.ptr ?? calloc(); - final p2 = map2?.ptr ?? calloc(); + map1 ??= Mat.empty(); + map2 ??= Mat.empty(); cvRun( - () => ccalib3d.InitUndistortRectifyMap( + () => ccalib3d.cv_initUndistortRectifyMap( cameraMatrix.ref, distCoeffs.ref, R.ref, newCameraMatrix.ref, size.cvd.ref, m1type, - p1, - p2, + map1!.ref, + map2!.ref, + ffi.nullptr, ), ); - return (map1 ?? Mat.fromPointer(p1), map2 ?? Mat.fromPointer(p2)); + return (map1, map2); } /// GetOptimalNewCameraMatrixWithParams computes and returns the optimal new camera matrix based on the free scaling parameter. @@ -63,9 +64,9 @@ import '../native_lib.dart' show ccalib3d; bool centerPrincipalPoint = false, }) { final validPixROI = calloc(); - final matPtr = calloc(); + final rval = Mat.empty(); cvRun( - () => ccalib3d.GetOptimalNewCameraMatrixWithParams( + () => ccalib3d.cv_getOptimalNewCameraMatrix( cameraMatrix.ref, distCoeffs.ref, imageSize.cvd.ref, @@ -73,10 +74,11 @@ import '../native_lib.dart' show ccalib3d; newImgSize.cvd.ref, validPixROI, centerPrincipalPoint, - matPtr, + rval.ref, + ffi.nullptr, ), ); - return (Mat.fromPointer(matPtr), Rect.fromPointer(validPixROI)); + return (rval, Rect.fromPointer(validPixROI)); } // CalibrateCamera finds the camera intrinsic and extrinsic parameters from several views of a calibration pattern. @@ -99,7 +101,7 @@ import '../native_lib.dart' show ccalib3d; final cRmsErr = calloc(); cvRun( - () => ccalib3d.CalibrateCamera( + () => ccalib3d.cv_calibrateCamera( objectPoints.ref, imagePoints.ref, imageSize.cvd.ref, @@ -110,6 +112,7 @@ import '../native_lib.dart' show ccalib3d; flags, criteria.cvd.ref, cRmsErr, + ffi.nullptr, ), ); final rmsErr = cRmsErr.value; @@ -132,7 +135,16 @@ Mat undistort( }) { dst ??= Mat.empty(); newCameraMatrix ??= Mat.empty(); - cvRun(() => ccalib3d.Undistort(src.ref, dst!.ref, cameraMatrix.ref, distCoeffs.ref, newCameraMatrix!.ref)); + cvRun( + () => ccalib3d.cv_undistort( + src.ref, + dst!.ref, + cameraMatrix.ref, + distCoeffs.ref, + newCameraMatrix!.ref, + ffi.nullptr, + ), + ); return dst; } @@ -154,8 +166,16 @@ Mat undistortPoints( dst ??= Mat.empty(); final tc = criteria.cvd; cvRun( - () => - ccalib3d.UndistortPoints(src.ref, dst!.ref, cameraMatrix.ref, distCoeffs.ref, R!.ref, P!.ref, tc.ref), + () => ccalib3d.cv_undistortPoints( + src.ref, + dst!.ref, + cameraMatrix.ref, + distCoeffs.ref, + R!.ref, + P!.ref, + tc.ref, + ffi.nullptr, + ), ); return dst; } @@ -172,7 +192,16 @@ Mat undistortPoints( }) { corners ??= Mat.empty(); final r = calloc(); - cvRun(() => ccalib3d.FindChessboardCorners(image.ref, patternSize.cvd.ref, corners!.ref, flags, r)); + cvRun( + () => ccalib3d.cv_findChessboardCorners( + image.ref, + patternSize.cvd.ref, + corners!.ref, + flags, + r, + ffi.nullptr, + ), + ); final rval = r.value; calloc.free(r); return (rval, corners); @@ -188,7 +217,16 @@ Mat undistortPoints( }) { corners ??= Mat.empty(); final b = calloc(); - cvRun(() => ccalib3d.FindChessboardCornersSB(image.ref, patternSize.cvd.ref, corners!.ref, flags, b)); + cvRun( + () => ccalib3d.cv_findChessboardCornersSB( + image.ref, + patternSize.cvd.ref, + corners!.ref, + flags, + b, + ffi.nullptr, + ), + ); final rval = b.value; calloc.free(b); return (rval, corners); @@ -207,13 +245,14 @@ Mat undistortPoints( meta ??= Mat.empty(); final b = calloc(); cvRun( - () => ccalib3d.FindChessboardCornersSBWithMeta( + () => ccalib3d.cv_FindChessboardCornersSB_1( image.ref, patternSize.cvd.ref, corners!.ref, flags, meta!.ref, b, + ffi.nullptr, ), ); final rval = b.value; @@ -231,7 +270,15 @@ Mat drawChessboardCorners( InputArray corners, bool patternWasFound, ) { - cvRun(() => ccalib3d.DrawChessboardCorners(image.ref, patternSize.cvd.ref, corners.ref, patternWasFound)); + cvRun( + () => ccalib3d.cv_drawChessboardCorners( + image.ref, + patternSize.cvd.ref, + corners.ref, + patternWasFound, + ffi.nullptr, + ), + ); return image; } @@ -251,9 +298,9 @@ Mat drawChessboardCorners( OutputArray? inliers, }) { inliers ??= Mat.empty(); - final p = calloc(); + final rval = Mat.empty(); cvRun( - () => ccalib3d.EstimateAffinePartial2DWithParams( + () => ccalib3d.cv_estimateAffine2D_1( from.ref, to.ref, inliers!.ref, @@ -262,10 +309,11 @@ Mat drawChessboardCorners( maxIters, confidence, refineIters, - p, + rval.ref, + ffi.nullptr, ), ); - return (Mat.fromPointer(p), inliers); + return (rval, inliers); } // EstimateAffine2D Computes an optimal affine transformation between two 2D point sets. @@ -283,9 +331,9 @@ Mat drawChessboardCorners( OutputArray? inliers, }) { inliers ??= Mat.empty(); - final p = calloc(); + final rval = Mat.empty(); cvRun( - () => ccalib3d.EstimateAffine2DWithParams( + () => ccalib3d.cv_estimateAffine2D_1( from.ref, to.ref, inliers!.ref, @@ -294,10 +342,11 @@ Mat drawChessboardCorners( maxIters, confidence, refineIters, - p, + rval.ref, + ffi.nullptr, ), ); - return (Mat.fromPointer(p), inliers); + return (rval, inliers); } /// FindHomography finds an optimal homography matrix using 4 or more point pairs (as opposed to GetPerspectiveTransform, which uses exactly 4) @@ -314,9 +363,9 @@ Mat findHomography( double confidence = 0.995, }) { mask ??= Mat.empty(); - final mat = calloc(); + final mat = Mat.empty(); cvRun( - () => ccalib3d.FindHomography( + () => ccalib3d.cv_findHomography( srcPoints.ref, dstPoints.ref, method, @@ -324,8 +373,9 @@ Mat findHomography( mask!.ref, maxIters, confidence, - mat, + mat.ref, + ffi.nullptr, ), ); - return Mat.fromPointer(mat); + return mat; } diff --git a/packages/dartcv/lib/src/calib3d/calib3d_async.dart b/packages/dartcv/lib/src/calib3d/calib3d_async.dart index 76af3743..361b6120 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d_async.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d_async.dart @@ -16,6 +16,7 @@ import '../core/rect.dart'; import '../core/size.dart'; import '../core/termcriteria.dart'; import '../g/constants.g.dart'; +import '../g/types.g.dart' as cvg; import '../native_lib.dart' show ccalib3d; /// InitUndistortRectifyMap computes the joint undistortion and rectification transformation and represents the result in the form of maps for remap @@ -28,20 +29,26 @@ Future<(Mat, Mat)> initUndistortRectifyMapAsync( InputArray R, InputArray newCameraMatrix, (int, int) size, - int m1type, -) async => - cvRunAsync2<(Mat, Mat)>( - (callback) => ccalib3d.initUndistortRectifyMap_Async( - cameraMatrix.ref, - distCoeffs.ref, - R.ref, - newCameraMatrix.ref, - size.cvd.ref, - m1type, - callback, - ), - matCompleter2, - ); + int m1type, { + OutputArray? map1, + OutputArray? map2, +}) async { + map1 ??= Mat.empty(); + map2 ??= Mat.empty(); + return cvRunAsync0<(Mat, Mat)>( + (callback) => ccalib3d.cv_initUndistortRectifyMap( + cameraMatrix.ref, + distCoeffs.ref, + R.ref, + newCameraMatrix.ref, + size.cvd.ref, + m1type, + map1!.ref, + map2!.ref, + callback, + ), + (c) => c.complete((map1!, map2!))); +} /// GetOptimalNewCameraMatrixWithParams computes and returns the optimal new camera matrix based on the free scaling parameter. /// @@ -54,19 +61,24 @@ Future<(Mat rval, Rect validPixROI)> getOptimalNewCameraMatrixAsync( double alpha, { (int, int) newImgSize = (0, 0), bool centerPrincipalPoint = false, -}) async => - cvRunAsync2( - (callback) => ccalib3d.getOptimalNewCameraMatrix_Async( - cameraMatrix.ref, - distCoeffs.ref, - imageSize.cvd.ref, - alpha, - newImgSize.cvd.ref, - centerPrincipalPoint, - callback, - ), - (c, p, p1) => c.complete((Mat.fromPointer(p.cast()), Rect.fromPointer(p1.cast()))), - ); +}) { + final validPixROI = calloc(); + final rval = Mat.empty(); + return cvRunAsync0<(Mat, Rect)>( + (callback) => ccalib3d.cv_getOptimalNewCameraMatrix( + cameraMatrix.ref, + distCoeffs.ref, + imageSize.cvd.ref, + alpha, + newImgSize.cvd.ref, + validPixROI, + centerPrincipalPoint, + rval.ref, + callback, + ), + (c) => c.complete((rval, Rect.fromPointer(validPixROI))), + ); +} // CalibrateCamera finds the camera intrinsic and extrinsic parameters from several views of a calibration pattern. // @@ -82,26 +94,30 @@ Future<(double rmsErr, Mat cameraMatrix, Mat distCoeffs, Mat rvecs, Mat tvecs)> Mat? tvecs, int flags = 0, (int type, int count, double eps) criteria = (TERM_COUNT + TERM_EPS, 30, 1e-4), -}) async => - cvRunAsync3( - (callback) => ccalib3d.calibrateCamera_Async( - objectPoints.ref, - imagePoints.ref, - imageSize.cvd.ref, - cameraMatrix.ref, - distCoeffs.ref, - flags, - criteria.cvd.ref, - callback, - ), - (c, p, p1, p2) { - final rmsErr = p.cast().value; - calloc.free(p); - final rvecs = Mat.fromPointer(p1.cast()); - final tvecs = Mat.fromPointer(p2.cast()); - return c.complete((rmsErr, cameraMatrix, distCoeffs, rvecs, tvecs)); - }, - ); +}) { + rvecs ??= Mat.empty(); + tvecs ??= Mat.empty(); + final cRmsErr = calloc(); + + return cvRunAsync0( + (callback) => ccalib3d.cv_calibrateCamera( + objectPoints.ref, + imagePoints.ref, + imageSize.cvd.ref, + cameraMatrix.ref, + distCoeffs.ref, + rvecs!.ref, + tvecs!.ref, + flags, + criteria.cvd.ref, + cRmsErr, + callback, + ), (c) { + final rmsErr = cRmsErr.value; + calloc.free(cRmsErr); + return c.complete((rmsErr, cameraMatrix, distCoeffs, rvecs!, tvecs!)); + }); +} // Transforms an image to compensate for lens distortion. // The function transforms an image to compensate radial and tangential lens distortion. @@ -113,18 +129,23 @@ Future undistortAsync( InputArray src, InputArray cameraMatrix, InputArray distCoeffs, { + OutputArray? dst, InputArray? newCameraMatrix, -}) async => - cvRunAsync( - (callback) => ccalib3d.undistort_Async( - src.ref, - cameraMatrix.ref, - distCoeffs.ref, - newCameraMatrix?.ref ?? Mat.empty().ref, - callback, - ), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + newCameraMatrix ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccalib3d.cv_undistort( + src.ref, + dst!.ref, + cameraMatrix.ref, + distCoeffs.ref, + newCameraMatrix!.ref, + callback, + ), + (c) => c.complete(dst!), + ); +} // UndistortPoints transforms points to compensate for lens distortion // @@ -134,22 +155,29 @@ Future undistortPointsAsync( InputArray src, InputArray cameraMatrix, InputArray distCoeffs, { + OutputArray? dst, InputArray? R, InputArray? P, (int type, int count, double eps) criteria = (TERM_COUNT + TERM_EPS, 30, 1e-4), -}) async => - cvRunAsync( - (callback) => ccalib3d.undistortPoints_Async( - src.ref, - cameraMatrix.ref, - distCoeffs.ref, - R?.ref ?? Mat.empty().ref, - P?.ref ?? Mat.empty().ref, - criteria.cvd.ref, - callback, - ), - matCompleter, - ); +}) { + R ??= Mat.empty(); + P ??= Mat.empty(); + dst ??= Mat.empty(); + final tc = criteria.cvd; + return cvRunAsync0( + (callback) => ccalib3d.cv_undistortPoints( + src.ref, + dst!.ref, + cameraMatrix.ref, + distCoeffs.ref, + R!.ref, + P!.ref, + tc.ref, + callback, + ), + (c) => c.complete(dst!), + ); +} // FindChessboardCorners finds the positions of internal corners of the chessboard. // @@ -158,63 +186,78 @@ Future undistortPointsAsync( Future<(bool success, Mat corners)> findChessboardCornersAsync( InputArray image, (int, int) patternSize, { + OutputArray? corners, int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE, -}) async => - cvRunAsync2( - (callback) => ccalib3d.findChessboardCorners_Async( - image.ref, - patternSize.cvd.ref, - flags, - callback, - ), - (c, p, p1) { - final rval = p.cast().value; - calloc.free(p); - final corners = Mat.fromPointer(p1.cast()); - return c.complete((rval, corners)); - }, - ); +}) { + corners ??= Mat.empty(); + final r = calloc(); + return cvRunAsync0( + (callback) => ccalib3d.cv_findChessboardCorners( + image.ref, + patternSize.cvd.ref, + corners!.ref, + flags, + r, + callback, + ), (c) { + final rval = r.value; + calloc.free(r); + return c.complete((rval, corners!)); + }); +} // Finds the positions of internal corners of the chessboard using a sector based approach. // https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gadc5bcb05cb21cf1e50963df26986d7c9 Future<(bool, Mat corners)> findChessboardCornersSBAsync( InputArray image, (int, int) patternSize, - int flags, -) async => - cvRunAsync2( - (callback) => ccalib3d.findChessboardCornersSB_Async( - image.ref, - patternSize.cvd.ref, - flags, - callback, - ), - (c, p, p1) { - final rval = p.cast().value; - calloc.free(p); - final corners = Mat.fromPointer(p1.cast()); - return c.complete((rval, corners)); - }, - ); + int flags, { + OutputArray? corners, +}) { + corners ??= Mat.empty(); + final b = calloc(); + return cvRunAsync0( + (callback) => ccalib3d.cv_findChessboardCornersSB( + image.ref, + patternSize.cvd.ref, + corners!.ref, + flags, + b, + callback, + ), (c) { + final rval = b.value; + calloc.free(b); + return c.complete((rval, corners!)); + }); +} // Finds the positions of internal corners of the chessboard using a sector based approach. // https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gadc5bcb05cb21cf1e50963df26986d7c9 Future<(bool, Mat corners, Mat meta)> findChessboardCornersSBWithMetaAsync( InputArray image, (int, int) patternSize, - int flags, -) async => - cvRunAsync3( - (callback) => - ccalib3d.findChessboardCornersSBWithMeta_Async(image.ref, patternSize.cvd.ref, flags, callback), - (c, p, p1, p2) { - final rval = p.cast().value; - calloc.free(p); - final corners = Mat.fromPointer(p1.cast()); - final meta = Mat.fromPointer(p2.cast()); - return c.complete((rval, corners, meta)); - }, - ); + int flags, { + OutputArray? corners, + OutputArray? meta, +}) { + corners ??= Mat.empty(); + meta ??= Mat.empty(); + final b = calloc(); + return cvRunAsync0( + (callback) => ccalib3d.cv_FindChessboardCornersSB_1( + image.ref, + patternSize.cvd.ref, + corners!.ref, + flags, + meta!.ref, + b, + callback, + ), (c) { + final rval = b.value; + calloc.free(b); + return c.complete((rval, corners!, meta!)); + }); +} // DrawChessboardCorners renders the detected chessboard corners. // @@ -225,12 +268,18 @@ Future drawChessboardCornersAsync( (int, int) patternSize, InputArray corners, bool patternWasFound, -) async => - cvRunAsync0( - (callback) => - ccalib3d.drawChessboardCorners_Async(image.ref, patternSize.cvd.ref, patternWasFound, callback), - (c) => c.complete(image), - ); +) { + return cvRunAsync0( + (callback) => ccalib3d.cv_drawChessboardCorners( + image.ref, + patternSize.cvd.ref, + corners.ref, + patternWasFound, + callback, + ), + (c) => c.complete(image), + ); +} // EstimateAffinePartial2D computes an optimal limited affine transformation // with 4 degrees of freedom between two 2D point sets. @@ -245,20 +294,26 @@ Future<(Mat, Mat inliers)> estimateAffinePartial2DAsync( int maxIters = 2000, double confidence = 0.99, int refineIters = 10, -}) async => - cvRunAsync2( - (callback) => ccalib3d.estimateAffinePartial2DWithParams_Async( - from.ref, - to.ref, - method, - ransacReprojThreshold, - maxIters, - confidence, - refineIters, - callback, - ), - matCompleter2, - ); + OutputArray? inliers, +}) { + inliers ??= Mat.empty(); + final rval = Mat.empty(); + return cvRunAsync0( + (callback) => ccalib3d.cv_estimateAffine2D_1( + from.ref, + to.ref, + inliers!.ref, + method, + ransacReprojThreshold, + maxIters, + confidence, + refineIters, + rval.ref, + callback, + ), + (c) => c.complete((rval, inliers!)), + ); +} // EstimateAffine2D Computes an optimal affine transformation between two 2D point sets. // @@ -272,20 +327,26 @@ Future<(Mat, Mat inliers)> estimateAffine2DAsync( int maxIters = 2000, double confidence = 0.99, int refineIters = 10, -}) async => - cvRunAsync2( - (callback) => ccalib3d.estimateAffine2DWithParams_Async( - from.ref, - to.ref, - method, - ransacReprojThreshold, - maxIters, - confidence, - refineIters, - callback, - ), - matCompleter2, - ); + OutputArray? inliers, +}) { + inliers ??= Mat.empty(); + final rval = Mat.empty(); + return cvRunAsync0( + (callback) => ccalib3d.cv_estimateAffine2D_1( + from.ref, + to.ref, + inliers!.ref, + method, + ransacReprojThreshold, + maxIters, + confidence, + refineIters, + rval.ref, + callback, + ), + (c) => c.complete((rval, inliers!)), + ); +} /// FindHomography finds an optimal homography matrix using 4 or more point pairs (as opposed to GetPerspectiveTransform, which uses exactly 4) /// @@ -296,18 +357,24 @@ Future<(Mat, Mat)> findHomographyAsync( InputArray dstPoints, { int method = 0, double ransacReprojThreshold = 3, + OutputArray? mask, int maxIters = 2000, double confidence = 0.995, -}) async => - cvRunAsync2( - (callback) => ccalib3d.FindHomography_Async( - srcPoints.ref, - dstPoints.ref, - method, - ransacReprojThreshold, - maxIters, - confidence, - callback, - ), - matCompleter2, - ); +}) { + mask ??= Mat.empty(); + final mat = Mat.empty(); + return cvRunAsync0( + (callback) => ccalib3d.cv_findHomography( + srcPoints.ref, + dstPoints.ref, + method, + ransacReprojThreshold, + mask!.ref, + maxIters, + confidence, + mat.ref, + callback, + ), + (c) => c.complete((mat, mask!)), + ); +} diff --git a/packages/dartcv/lib/src/calib3d/fisheye.dart b/packages/dartcv/lib/src/calib3d/fisheye.dart index dd832269..c0366859 100644 --- a/packages/dartcv/lib/src/calib3d/fisheye.dart +++ b/packages/dartcv/lib/src/calib3d/fisheye.dart @@ -5,12 +5,10 @@ library cv.calib3d.fisheye; import 'dart:ffi' as ffi; -import 'package:ffi/ffi.dart'; import '../core/base.dart'; import '../core/mat.dart'; import '../core/size.dart'; -import '../g/types.g.dart' as cvg; import '../native_lib.dart' show ccalib3d; class Fisheye { @@ -25,18 +23,19 @@ class Fisheye { (int, int) newSize = (0, 0), }) { knew ??= Mat.empty(); - final p1 = undistorted?.ptr ?? calloc(); + undistorted ??= Mat.empty(); cvRun( - () => ccalib3d.Fisheye_UndistortImageWithParams( + () => ccalib3d.cv_fisheye_undistortImage_1( distorted.ref, - p1, + undistorted!.ref, K.ref, D.ref, knew!.ref, newSize.cvd.ref, + ffi.nullptr, ), ); - return undistorted ?? Mat.fromPointer(p1); + return undistorted; } /// async version of [undistortImage] @@ -44,20 +43,25 @@ class Fisheye { InputArray distorted, InputArray K, InputArray D, { + OutputArray? undistorted, InputArray? knew, (int, int) newSize = (0, 0), - }) => - cvRunAsync( - (callback) => ccalib3d.fisheye_undistortImageWithParams_Async( - distorted.ref, - K.ref, - D.ref, - knew?.ref ?? Mat.empty().ref, - newSize.cvd.ref, - callback, - ), - matCompleter, - ); + }) async { + knew ??= Mat.empty(); + undistorted ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccalib3d.cv_fisheye_undistortImage_1( + distorted.ref, + undistorted!.ref, + K.ref, + D.ref, + knew!.ref, + newSize.cvd.ref, + callback, + ), + (c) => c.complete(undistorted), + ); + } /// FisheyeUndistortPoints transforms points to compensate for fisheye lens distortion /// @@ -75,7 +79,15 @@ class Fisheye { P ??= Mat.empty(); undistorted ??= Mat.empty(); cvRun( - () => ccalib3d.Fisheye_UndistortPoints(distorted.ref, undistorted!.ref, K.ref, D.ref, R!.ref, P!.ref), + () => ccalib3d.cv_fisheye_undistortPoints( + distorted.ref, + undistorted!.ref, + K.ref, + D.ref, + R!.ref, + P!.ref, + ffi.nullptr, + ), ); return undistorted; } @@ -85,20 +97,26 @@ class Fisheye { InputArray distorted, InputArray K, InputArray D, { + OutputArray? undistorted, InputArray? R, InputArray? P, - }) async => - cvRunAsync( - (callback) => ccalib3d.fisheye_undistortPoints_Async( - distorted.ref, - K.ref, - D.ref, - R?.ref ?? Mat.empty().ref, - P?.ref ?? Mat.empty().ref, - callback, - ), - matCompleter, - ); + }) async { + R ??= Mat.empty(); + P ??= Mat.empty(); + undistorted ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccalib3d.cv_fisheye_undistortPoints( + distorted.ref, + undistorted!.ref, + K.ref, + D.ref, + R!.ref, + P!.ref, + callback, + ), + (c) => c.complete(undistorted), + ); + } /// EstimateNewCameraMatrixForUndistortRectify estimates new camera matrix for undistortion or rectification. /// @@ -116,7 +134,7 @@ class Fisheye { }) { P ??= Mat.empty(); cvRun( - () => ccalib3d.Fisheye_EstimateNewCameraMatrixForUndistortRectify( + () => ccalib3d.cv_fisheye_estimateNewCameraMatrixForUndistortRectify( K.ref, D.ref, imageSize.cvd.ref, @@ -125,6 +143,7 @@ class Fisheye { balance, newSize.cvd.ref, fovScale, + ffi.nullptr, ), ); return P; @@ -136,21 +155,25 @@ class Fisheye { InputArray D, (int, int) imageSize, InputArray R, { + OutputArray? P, double balance = 0.0, (int, int) newSize = (0, 0), double fovScale = 1.0, - }) async => - cvRunAsync( - (callback) => ccalib3d.fisheye_estimateNewCameraMatrixForUndistortRectify_Async( - K.ref, - D.ref, - imageSize.cvd.ref, - R.ref, - balance, - newSize.cvd.ref, - fovScale, - callback, - ), - matCompleter, - ); + }) async { + P ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccalib3d.cv_fisheye_estimateNewCameraMatrixForUndistortRectify( + K.ref, + D.ref, + imageSize.cvd.ref, + R.ref, + P!.ref, + balance, + newSize.cvd.ref, + fovScale, + callback, + ), + (c) => c.complete(P), + ); + } } diff --git a/packages/dartcv/lib/src/core/base.dart b/packages/dartcv/lib/src/core/base.dart index b81a7c81..86d0deff 100644 --- a/packages/dartcv/lib/src/core/base.dart +++ b/packages/dartcv/lib/src/core/base.dart @@ -73,7 +73,7 @@ void throwIfFailed(ffi.Pointer s) { final file = s.ref.file.cast().toDartString(); final funcName = s.ref.func.cast().toDartString(); final line = s.ref.line; - ccore.CvStatus_Close(s); + ccore.CvStatus_close(s); if (code != 0) { throw CvException(code, msg: msg, file: file, func: funcName, line: line); } diff --git a/packages/dartcv/lib/src/core/mat.dart b/packages/dartcv/lib/src/core/mat.dart index 633db710..80ce85ac 100644 --- a/packages/dartcv/lib/src/core/mat.dart +++ b/packages/dartcv/lib/src/core/mat.dart @@ -56,7 +56,7 @@ class Mat extends CvStruct { _ => throw UnsupportedError("Mat.fromList for MatType ${type.asString()} unsupported"), }; // copy - cvRun(() => ccore.Mat_NewFromBytes(rows, cols, type.value, xdata.asVoid(), p)); + cvRun(() => ccore.cv_Mat_create_6(rows, cols, type.value, xdata.asVoid(), p, ffi.nullptr)); xdata.dispose(); return Mat._(p); } @@ -113,7 +113,7 @@ class Mat extends CvStruct { factory Mat.empty() { final p = calloc(); - cvRun(() => ccore.Mat_New(p)); + cvRun(() => ccore.cv_Mat_create(p)); final mat = Mat._(p); return mat; } @@ -130,7 +130,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a3620c370690b5ca4d40c767be6fb4ceb factory Mat.fromScalar(int rows, int cols, MatType type, Scalar s) { final p = calloc(); - cvRun(() => ccore.Mat_NewFromScalar(s.ref, rows, cols, type.value, p)); + cvRun(() => ccore.cv_Mat_create_5(s.ref, rows, cols, type.value, p, ffi.nullptr)); final mat = Mat._(p); return mat; } @@ -145,13 +145,13 @@ class Mat extends CvStruct { final p = calloc(); switch (vec) { case VecPoint(): - cvRun(() => ccore.Mat_NewFromVecPoint(vec.ref, p)); + cvRun(() => ccore.cv_Mat_create_7(vec.ref, p, ffi.nullptr)); case VecPoint2f(): - cvRun(() => ccore.Mat_NewFromVecPoint2f(vec.ref, p)); + cvRun(() => ccore.cv_Mat_create_8(vec.ref, p, ffi.nullptr)); case VecPoint3f(): - cvRun(() => ccore.Mat_NewFromVecPoint3f(vec.ref, p)); + cvRun(() => ccore.cv_Mat_create_9(vec.ref, p, ffi.nullptr)); case VecPoint3i(): - cvRun(() => ccore.Mat_NewFromVecPoint3i(vec.ref, p)); + cvRun(() => ccore.cv_Mat_create_10(vec.ref, p, ffi.nullptr)); case VecU8() when rows != null && cols != null && type != null: case VecI8() when rows != null && cols != null && type != null: case VecU16() when rows != null && cols != null && type != null: @@ -160,7 +160,7 @@ class Mat extends CvStruct { case VecF32() when rows != null && cols != null && type != null: case VecF64() when rows != null && cols != null && type != null: case VecF16() when rows != null && cols != null && type != null: - cvRun(() => ccore.Mat_NewFromBytes(rows, cols, type.value, vec.asVoid(), p)); + cvRun(() => ccore.cv_Mat_create_6(rows, cols, type.value, vec.asVoid(), p, ffi.nullptr)); default: throw UnsupportedError("Unsupported Vec type ${vec.runtimeType}"); } @@ -171,7 +171,7 @@ class Mat extends CvStruct { type = type ?? MatType.CV_8UC3; final scalar = Scalar(b.toDouble(), g.toDouble(), r.toDouble(), 0); final p = calloc(); - cvRun(() => ccore.Mat_NewFromScalar(scalar.ref, rows, cols, type!.value, p)); + cvRun(() => ccore.cv_Mat_create_5(scalar.ref, rows, cols, type!.value, p, ffi.nullptr)); final mat = Mat._(p); return mat; } @@ -182,7 +182,7 @@ class Mat extends CvStruct { factory Mat.fromRange(Mat mat, int rowStart, int rowEnd, {int colStart = 0, int? colEnd}) { final p = calloc(); colEnd ??= mat.cols; - cvRun(() => ccore.Mat_FromRange(mat.ref, rowStart, rowEnd, colStart, colEnd!, p)); + cvRun(() => ccore.cv_Mat_create_12(mat.ref, rowStart, rowEnd, colStart, colEnd!, p, ffi.nullptr)); return Mat._(p); } @@ -207,7 +207,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a458874f0ab8946136254da37ba06b78b factory Mat.eye(int rows, int cols, MatType type) { final p = calloc(); - cvRun(() => ccore.Eye(rows, cols, type.value, p)); + cvRun(() => ccore.cv_Mat_eye(rows, cols, type.value, p, ffi.nullptr)); final mat = Mat._(p); return mat; } @@ -234,7 +234,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a56daa006391a670e9cb0cd08e3168c99 factory Mat.zeros(int rows, int cols, MatType type) { final p = calloc(); - cvRun(() => ccore.Zeros(rows, cols, type.value, p)); + cvRun(() => ccore.cv_Mat_zeros(rows, cols, type.value, p, ffi.nullptr)); final mat = Mat._(p); return mat; } @@ -258,7 +258,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a5e10227b777425407986727e2d26fcdc factory Mat.ones(int rows, int cols, MatType type) { final p = calloc(); - cvRun(() => ccore.Ones(rows, cols, type.value, p)); + cvRun(() => ccore.cv_Mat_ones(rows, cols, type.value, p, ffi.nullptr)); final mat = Mat._(p); return mat; } @@ -267,7 +267,7 @@ class Mat extends CvStruct { mean ??= Scalar.all(0); std ??= Scalar.all(1); final mat = Mat.create(rows: rows, cols: cols, type: type); - cvRun(() => ccore.RandN(mat.ref, mean!.ref, std!.ref)); + cvRun(() => ccore.cv_randn(mat.ref, mean!.ref, std!.ref, ffi.nullptr)); return mat; } @@ -275,7 +275,7 @@ class Mat extends CvStruct { low ??= Scalar.all(0); high ??= Scalar.all(256); final mat = Mat.create(rows: rows, cols: cols, type: type); - cvRun(() => ccore.RandU(mat.ref, low!.ref, high!.ref)); + cvRun(() => ccore.cv_randu(mat.ref, low!.ref, high!.ref, ffi.nullptr)); return mat; } @@ -292,7 +292,7 @@ class Mat extends CvStruct { int pcols, ) { final p = calloc(); - cvRun(() => ccore.Mat_FromPtr(m, rows, cols, type, prows, pcols, p)); + cvRun(() => ccore.cv_Mat_create_11(m, rows, cols, type, prows, pcols, p, ffi.nullptr)); final mat = Mat._(p); return mat; } @@ -300,27 +300,27 @@ class Mat extends CvStruct { //!SECTION Constructors //SECTION - Properties - MatType get type => MatType(ccore.Mat_Type(ref)); + MatType get type => MatType(ccore.cv_Mat_type(ref)); - int get flags => ccore.Mat_Flags(ref); + int get flags => ccore.cv_Mat_flags(ref); int get width => cols; int get height => rows; - int get cols => ccore.Mat_Cols(ref); - int get rows => ccore.Mat_Rows(ref); - int get channels => ccore.Mat_Channels(ref); - int get total => ccore.Mat_Total(ref); - bool get isEmpty => ccore.Mat_Empty(ref); - bool get isContinus => ccore.Mat_IsContinuous(ref); - bool get isSubmatrix => ccore.Mat_IsSubmatrix(ref); + int get cols => ccore.cv_Mat_cols(ref); + int get rows => ccore.cv_Mat_rows(ref); + int get channels => ccore.cv_Mat_channels(ref); + int get total => ccore.cv_Mat_total(ref); + bool get isEmpty => ccore.cv_Mat_empty(ref); + bool get isContinus => ccore.cv_Mat_isContinuous(ref); + bool get isSubmatrix => ccore.cv_Mat_isSubmatrix(ref); (int, int, int) get step { - final ms = ccore.Mat_Step(ref); + final ms = ccore.cv_Mat_step(ref); return (ms.p[0], ms.p[1], ms.p[2]); } - int get elemSize => ccore.Mat_ElemSize(ref); - int get elemSize1 => ccore.Mat_ElemSize1(ref); - int get dims => ccore.Mat_Dims(ref); + int get elemSize => ccore.cv_Mat_elemSize(ref); + int get elemSize1 => ccore.cv_Mat_elemSize1(ref); + int get dims => ccore.cv_Mat_dims(ref); /// Get a view of native data, and will be GCed when the Mat is GCed. Uint8List get data => dataPtr.asTypedList(total * elemSize); @@ -328,10 +328,10 @@ class Mat extends CvStruct { /// Get the data pointer of the Mat /// /// DO NOT free the pointer, the native memory is managed by [Mat] - ffi.Pointer get dataPtr => ccore.Mat_Data(ref).cast(); + ffi.Pointer get dataPtr => ccore.cv_Mat_data(ref).cast(); /// Mat.size - VecI32 get size => VecI32.fromPointer(ccore.Mat_Size(ref)); + VecI32 get size => VecI32.fromPointer(ccore.cv_Mat_size(ref)); /// ([rows], [cols], [channels]) List get shape => [rows, cols, channels]; @@ -339,7 +339,7 @@ class Mat extends CvStruct { /// only for [channels] == 1 int get countNoneZero { cvAssert(channels == 1, "countNoneZero only for channels == 1"); - return ccore.Mat_CountNonZero(ref); + return ccore.cv_countNonZero(ref); } //!SECTION - Properties @@ -396,59 +396,59 @@ class Mat extends CvStruct { T atVec(int row, int col) { // Vec2b, Vec3b, Vec4b if (T == Vec2b) { - return Vec2b.fromPointer(ccore.Mat_GetVec2b(ref, row, col)) as T; + return Vec2b.fromPointer(ccore.cv_Mat_get_Vec2b(ref, row, col)) as T; } else if (T == Vec3b) { - return Vec3b.fromPointer(ccore.Mat_GetVec3b(ref, row, col)) as T; + return Vec3b.fromPointer(ccore.cv_Mat_get_Vec3b(ref, row, col)) as T; } else if (T == Vec4b) { - return Vec4b.fromPointer(ccore.Mat_GetVec4b(ref, row, col)) as T; + return Vec4b.fromPointer(ccore.cv_Mat_get_Vec4b(ref, row, col)) as T; } // Vec2w, Vec3w, Vec4w else if (T == Vec2w) { - return Vec2w.fromPointer(ccore.Mat_GetVec2w(ref, row, col)) as T; + return Vec2w.fromPointer(ccore.cv_Mat_get_Vec2w(ref, row, col)) as T; } else if (T == Vec3w) { - return Vec3w.fromPointer(ccore.Mat_GetVec3w(ref, row, col)) as T; + return Vec3w.fromPointer(ccore.cv_Mat_get_Vec3w(ref, row, col)) as T; } else if (T == Vec4w) { - return Vec4w.fromPointer(ccore.Mat_GetVec4w(ref, row, col)) as T; + return Vec4w.fromPointer(ccore.cv_Mat_get_Vec4w(ref, row, col)) as T; } // Vec2s, Vec3s, Vec4s else if (T == Vec2s) { - return Vec2s.fromPointer(ccore.Mat_GetVec2s(ref, row, col)) as T; + return Vec2s.fromPointer(ccore.cv_Mat_get_Vec2s(ref, row, col)) as T; } else if (T == Vec3s) { - return Vec3s.fromPointer(ccore.Mat_GetVec3s(ref, row, col)) as T; + return Vec3s.fromPointer(ccore.cv_Mat_get_Vec3s(ref, row, col)) as T; } else if (T == Vec4s) { - return Vec4s.fromPointer(ccore.Mat_GetVec4s(ref, row, col)) as T; + return Vec4s.fromPointer(ccore.cv_Mat_get_Vec4s(ref, row, col)) as T; } // Vec2i, Vec3i, Vec4i, Vec6i, Vec8i else if (T == Vec2i) { - return Vec2i.fromPointer(ccore.Mat_GetVec2i(ref, row, col)) as T; + return Vec2i.fromPointer(ccore.cv_Mat_get_Vec2i(ref, row, col)) as T; } else if (T == Vec3i) { - return Vec3i.fromPointer(ccore.Mat_GetVec3i(ref, row, col)) as T; + return Vec3i.fromPointer(ccore.cv_Mat_get_Vec3i(ref, row, col)) as T; } else if (T == Vec4i) { - return Vec4i.fromPointer(ccore.Mat_GetVec4i(ref, row, col)) as T; + return Vec4i.fromPointer(ccore.cv_Mat_get_Vec4i(ref, row, col)) as T; } else if (T == Vec6i) { - return Vec6i.fromPointer(ccore.Mat_GetVec6i(ref, row, col)) as T; + return Vec6i.fromPointer(ccore.cv_Mat_get_Vec6i(ref, row, col)) as T; } else if (T == Vec8i) { - return Vec8i.fromPointer(ccore.Mat_GetVec8i(ref, row, col)) as T; + return Vec8i.fromPointer(ccore.cv_Mat_get_Vec8i(ref, row, col)) as T; } // Vec2f, Vec3f, Vec4f, Vec6f else if (T == Vec2f) { - return Vec2f.fromPointer(ccore.Mat_GetVec2f(ref, row, col)) as T; + return Vec2f.fromPointer(ccore.cv_Mat_get_Vec2f(ref, row, col)) as T; } else if (T == Vec3f) { - return Vec3f.fromPointer(ccore.Mat_GetVec3f(ref, row, col)) as T; + return Vec3f.fromPointer(ccore.cv_Mat_get_Vec3f(ref, row, col)) as T; } else if (T == Vec4f) { - return Vec4f.fromPointer(ccore.Mat_GetVec4f(ref, row, col)) as T; + return Vec4f.fromPointer(ccore.cv_Mat_get_Vec4f(ref, row, col)) as T; } else if (T == Vec6f) { - return Vec6f.fromPointer(ccore.Mat_GetVec6f(ref, row, col)) as T; + return Vec6f.fromPointer(ccore.cv_Mat_get_Vec6f(ref, row, col)) as T; } // Vec2d, Vec3d, Vec4d, Vec6d else if (T == Vec2d) { - return Vec2d.fromPointer(ccore.Mat_GetVec2d(ref, row, col)) as T; + return Vec2d.fromPointer(ccore.cv_Mat_get_Vec2d(ref, row, col)) as T; } else if (T == Vec3d) { - return Vec3d.fromPointer(ccore.Mat_GetVec3d(ref, row, col)) as T; + return Vec3d.fromPointer(ccore.cv_Mat_get_Vec3d(ref, row, col)) as T; } else if (T == Vec4d) { - return Vec4d.fromPointer(ccore.Mat_GetVec4d(ref, row, col)) as T; + return Vec4d.fromPointer(ccore.cv_Mat_get_Vec4d(ref, row, col)) as T; } else if (T == Vec6d) { - return Vec6d.fromPointer(ccore.Mat_GetVec6d(ref, row, col)) as T; + return Vec6d.fromPointer(ccore.cv_Mat_get_Vec6d(ref, row, col)) as T; } else { throw UnsupportedError("at<$T>() for ${type.asString()} is not supported!"); } @@ -481,54 +481,54 @@ class Mat extends CvStruct { switch (val) { // Vec2b, Vec3b, Vec4b case Vec2b(): - cvRun(() => ccore.Mat_SetVec2b(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec2b(ref, row, col, val.ref); case Vec3b(): - cvRun(() => ccore.Mat_SetVec3b(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec3b(ref, row, col, val.ref); case Vec4b(): - cvRun(() => ccore.Mat_SetVec4b(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec4b(ref, row, col, val.ref); // Vec2w, Vec3w, Vec4w case Vec2w(): - cvRun(() => ccore.Mat_SetVec2w(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec2w(ref, row, col, val.ref); case Vec3w(): - cvRun(() => ccore.Mat_SetVec3w(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec3w(ref, row, col, val.ref); case Vec4w(): - cvRun(() => ccore.Mat_SetVec4w(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec4w(ref, row, col, val.ref); // Vec2s, Vec3s, Vec4s case Vec2s(): - cvRun(() => ccore.Mat_SetVec2s(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec2s(ref, row, col, val.ref); case Vec3s(): - cvRun(() => ccore.Mat_SetVec3s(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec3s(ref, row, col, val.ref); case Vec4s(): - cvRun(() => ccore.Mat_SetVec4s(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec4s(ref, row, col, val.ref); // Vec2i, Vec3i, Vec4i, Vec6i, Vec8i case Vec2i(): - cvRun(() => ccore.Mat_SetVec2i(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec2i(ref, row, col, val.ref); case Vec3i(): - cvRun(() => ccore.Mat_SetVec3i(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec3i(ref, row, col, val.ref); case Vec4i(): - cvRun(() => ccore.Mat_SetVec4i(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec4i(ref, row, col, val.ref); case Vec6i(): - cvRun(() => ccore.Mat_SetVec6i(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec6i(ref, row, col, val.ref); case Vec8i(): - cvRun(() => ccore.Mat_SetVec8i(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec8i(ref, row, col, val.ref); // Vec2f, Vec3f, Vec4f, Vec6f case Vec2f(): - cvRun(() => ccore.Mat_SetVec2f(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec2f(ref, row, col, val.ref); case Vec3f(): - cvRun(() => ccore.Mat_SetVec3f(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec3f(ref, row, col, val.ref); case Vec4f(): - cvRun(() => ccore.Mat_SetVec4f(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec4f(ref, row, col, val.ref); case Vec6f(): - cvRun(() => ccore.Mat_SetVec6f(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec6f(ref, row, col, val.ref); // Vec2d, Vec3d, Vec4d, Vec6d case Vec2d(): - cvRun(() => ccore.Mat_SetVec2d(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec2d(ref, row, col, val.ref); case Vec3d(): - cvRun(() => ccore.Mat_SetVec3d(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec3d(ref, row, col, val.ref); case Vec4d(): - cvRun(() => ccore.Mat_SetVec4d(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec4d(ref, row, col, val.ref); case Vec6d(): - cvRun(() => ccore.Mat_SetVec6d(ref, row, col, val.ref)); + ccore.cv_Mat_set_Vec6d(ref, row, col, val.ref); default: throw UnsupportedError("setVec<$T>() for ${type.asString()} is not supported!"); } @@ -615,9 +615,9 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a8b2912f6a6f5d55a3c9a7aae9134d862 ffi.Pointer ptrAt(int i0, [int? i1, int? i2]) { return switch ((i1, i2)) { - (null, null) => ccore.Mat_Ptr_u8_1(ref, i0).cast(), - (final int i1, null) => ccore.Mat_Ptr_u8_2(ref, i0, i1).cast(), - (final int i1, final int i2) => ccore.Mat_Ptr_u8_3(ref, i0, i1, i2).cast(), + (null, null) => ccore.cv_Mat_ptr_uchar_1(ref, i0).cast(), + (final int i1, null) => ccore.cv_Mat_ptr_uchar_2(ref, i0, i1).cast(), + (final int i1, final int i2) => ccore.cv_Mat_ptr_uchar_3(ref, i0, i1, i2).cast(), _ => throw UnsupportedError("ptrAt<$T>() for i1=$i1, i2=$i2 is not supported!"), }; } @@ -769,42 +769,42 @@ class Mat extends CvStruct { }; } - Mat addMat(Mat other, {bool inplace = false}) => _opMat(other, ccore.Mat_AddMat, inplace: inplace); + Mat addMat(Mat other, {bool inplace = false}) => _opMat(other, ccore.cv_Mat_op_add_mat, inplace: inplace); Mat addU8(int val, {bool inplace = false}) { // no bound check in release mode assert(type.depth == MatType.CV_8U && val >= CV_U8_MIN && val <= CV_U8_MAX); - return _opInt(val, ccore.Mat_AddUChar, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_add_u8, inplace: inplace); } Mat addI8(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_8S && val >= CV_I8_MIN && val <= CV_I8_MAX); - return _opInt(val, ccore.Mat_AddSChar, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_add_i8, inplace: inplace); } Mat addI16(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_16S && val >= CV_I16_MIN && val <= CV_I16_MAX); - return _opInt(val, ccore.Mat_AddI16, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_add_i16, inplace: inplace); } Mat addU16(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_16U && val >= CV_U16_MIN && val <= CV_U16_MAX); - return _opInt(val, ccore.Mat_AddU16, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_add_u16, inplace: inplace); } Mat addI32(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_32S && val >= CV_I32_MIN && val <= CV_I32_MAX); - return _opInt(val, ccore.Mat_AddI32, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_add_i32, inplace: inplace); } Mat addF32(double val, {bool inplace = false}) { assert(type.depth == MatType.CV_32F && val <= CV_F32_MAX); - return _opDouble(val, ccore.Mat_AddFloat, inplace: inplace); + return _opDouble(val, ccore.cv_Mat_op_add_f32, inplace: inplace); } Mat addF64(double val, {bool inplace = false}) { assert(type.depth == MatType.CV_64F && val <= CV_F64_MAX); - return _opDouble(val, ccore.Mat_AddF64, inplace: inplace); + return _opDouble(val, ccore.cv_Mat_op_add_f64, inplace: inplace); } // TODO - addF16 @@ -836,41 +836,41 @@ class Mat extends CvStruct { } Mat subtractMat(Mat other, {bool inplace = false}) => - _opMat(other, ccore.Mat_SubtractMat, inplace: inplace); + _opMat(other, ccore.cv_Mat_op_sub_mat, inplace: inplace); Mat subtractU8(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_8U && val >= CV_U8_MIN && val <= CV_U8_MAX); - return _opInt(val, ccore.Mat_SubtractUChar, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_sub_u8, inplace: inplace); } Mat subtractI8(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_8S && val >= CV_I8_MIN && val <= CV_I8_MAX); - return _opInt(val, ccore.Mat_SubtractSChar, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_sub_i8, inplace: inplace); } Mat subtractI32(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_32S && val >= CV_I32_MIN && val <= CV_I32_MAX); - return _opInt(val, ccore.Mat_SubtractI32, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_sub_i32, inplace: inplace); } Mat subtractI16(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_16S && val >= CV_I16_MIN && val <= CV_I16_MAX); - return _opInt(val, ccore.Mat_SubtractI16, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_sub_i16, inplace: inplace); } Mat subtractU16(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_16U && val >= CV_U16_MIN && val <= CV_U16_MAX); - return _opInt(val, ccore.Mat_SubtractU16, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_sub_u16, inplace: inplace); } Mat subtractF32(double val, {bool inplace = false}) { assert(type.depth == MatType.CV_32F && val <= CV_F32_MAX); - return _opDouble(val, ccore.Mat_SubtractFloat, inplace: inplace); + return _opDouble(val, ccore.cv_Mat_op_sub_f32, inplace: inplace); } Mat subtractF64(double val, {bool inplace = false}) { assert(type.depth == MatType.CV_64F && val <= CV_F64_MAX); - return _opDouble(val, ccore.Mat_SubtractF64, inplace: inplace); + return _opDouble(val, ccore.cv_Mat_op_sub_f64, inplace: inplace); } // TODO - subtractF16 @@ -906,41 +906,41 @@ class Mat extends CvStruct { /// /// Wrapper for `Mat &operator*=(Mat &a, const Mat &b)` Mat multiplyMat(Mat other, {bool inplace = false}) => - _opMat(other, ccore.Mat_MultiplyMat, inplace: inplace); + _opMat(other, ccore.cv_Mat_op_mul_mat, inplace: inplace); Mat multiplyU8(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_8U && val >= CV_U8_MIN && val <= CV_U8_MAX); - return _opInt(val, ccore.Mat_MultiplyUChar, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_mul_u8, inplace: inplace); } Mat multiplyI8(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_8S && val >= CV_I8_MIN && val <= CV_I8_MAX); - return _opInt(val, ccore.Mat_MultiplySChar, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_mul_i8, inplace: inplace); } Mat multiplyI16(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_16S && val >= CV_I16_MIN && val <= CV_I16_MAX); - return _opInt(val, ccore.Mat_MultiplyI16, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_mul_i16, inplace: inplace); } Mat multiplyU16(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_16U && val >= CV_U16_MIN && val <= CV_U16_MAX); - return _opInt(val, ccore.Mat_MultiplyU16, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_mul_u16, inplace: inplace); } Mat multiplyI32(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_32S && val >= CV_I32_MIN && val <= CV_I32_MAX); - return _opInt(val, ccore.Mat_MultiplyI32, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_mul_i32, inplace: inplace); } Mat multiplyF32(double val, {bool inplace = false}) { assert(type.depth == MatType.CV_32F && val <= CV_F32_MAX); - return _opDouble(val, ccore.Mat_MultiplyFloat, inplace: inplace); + return _opDouble(val, ccore.cv_Mat_op_mul_f32, inplace: inplace); } Mat multiplyF64(double val, {bool inplace = false}) { assert(type.depth == MatType.CV_64F && val <= CV_F64_MAX); - return _opDouble(val, ccore.Mat_MultiplyF64, inplace: inplace); + return _opDouble(val, ccore.cv_Mat_op_mul_f64, inplace: inplace); } // TODO - multiplyF16 @@ -970,41 +970,42 @@ class Mat extends CvStruct { }; } - Mat divideMat(Mat other, {bool inplace = false}) => _opMat(other, ccore.Mat_DivideMat, inplace: inplace); + Mat divideMat(Mat other, {bool inplace = false}) => + _opMat(other, ccore.cv_Mat_op_div_mat, inplace: inplace); Mat divideU8(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_8U && val >= CV_U8_MIN && val <= CV_U8_MAX); - return _opInt(val, ccore.Mat_DivideUChar, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_div_u8, inplace: inplace); } Mat divideI8(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_8S && val >= CV_I8_MIN && val <= CV_I8_MAX); - return _opInt(val, ccore.Mat_DivideSChar, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_div_i8, inplace: inplace); } Mat divideI16(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_16S && val >= CV_I16_MIN && val <= CV_I16_MAX); - return _opInt(val, ccore.Mat_DivideI16, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_div_i16, inplace: inplace); } Mat divideU16(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_16U && val >= CV_U16_MIN && val <= CV_U16_MAX); - return _opInt(val, ccore.Mat_DivideU16, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_div_u16, inplace: inplace); } Mat divideI32(int val, {bool inplace = false}) { assert(type.depth == MatType.CV_32S && val >= CV_I32_MIN && val <= CV_I32_MAX); - return _opInt(val, ccore.Mat_DivideI32, inplace: inplace); + return _opInt(val, ccore.cv_Mat_op_div_i32, inplace: inplace); } Mat divideF32(double val, {bool inplace = false}) { assert(type.depth == MatType.CV_32F && val <= CV_F32_MAX); - return _opDouble(val, ccore.Mat_DivideFloat, inplace: inplace); + return _opDouble(val, ccore.cv_Mat_op_div_f32, inplace: inplace); } Mat divideF64(double val, {bool inplace = false}) { assert(type.depth == MatType.CV_64F && val <= CV_F64_MAX); - return _opDouble(val, ccore.Mat_DivideF64, inplace: inplace); + return _opDouble(val, ccore.cv_Mat_op_div_f64, inplace: inplace); } // TODO - divideF16 @@ -1035,9 +1036,9 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a9e8ea7f2a254814de7713286b6640d77 Mat adjustROI(int dtop, int dbottom, int dleft, int dright) { - final p = calloc(); - cvRun(() => ccore.Mat_AdjustROI(ref, dtop, dbottom, dleft, dright, p)); - return Mat._(p); + final p = Mat.empty(); + cvRun(() => ccore.cv_Mat_adjustROI(ref, dtop, dbottom, dleft, dright, p.ref, ffi.nullptr)); + return p; } /// Locates the matrix header within a parent matrix. @@ -1053,7 +1054,7 @@ class Mat extends CvStruct { (Size wholeSize, Point ofs) locateROI() { final pWholeSize = calloc(); final pOfs = calloc(); - cvRun(() => ccore.Mat_LocateROI(ref, pWholeSize, pOfs)); + cvRun(() => ccore.cv_Mat_locateROI(ref, pWholeSize, pOfs, ffi.nullptr)); return (Size.fromPointer(pWholeSize), Point.fromPointer(pOfs)); } @@ -1067,9 +1068,9 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a23df02a07ffbfa4aa59c19bc003919fe Mat col(int x) { - final p = calloc(); - cvRun(() => ccore.Mat_Col(ref, x, p)); - return Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_col(ref, x, dst.ref, ffi.nullptr)); + return dst; } /// Creates a matrix header for the specified matrix row. @@ -1089,21 +1090,20 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a4b22e1c23af7a7f2eef8fa478cfa7434 Mat row(int y) { - final p = calloc(); - cvRun(() => ccore.Mat_Row(ref, y, p)); - return Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_row(ref, y, dst.ref, ffi.nullptr)); + return dst; } Mat transpose({bool inplace = false}) { final dst = inplace ? this : Mat.empty(); - cvRun(() => ccore.Mat_Transpose(ref, dst.ref)); + cvRun(() => ccore.cv_Mat_t(ref, dst.ref, ffi.nullptr)); return dst; } Mat clone() { - final p = calloc(); - cvRun(() => ccore.Mat_Clone(ref, p)); - final dst = Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_clone(ref, dst.ref, ffi.nullptr)); return dst; } @@ -1126,12 +1126,12 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a33fd5d125b4c302b0c9aa86980791a77 void copyTo(Mat dst, {Mat? mask}) => mask == null - ? cvRun(() => ccore.Mat_CopyTo(ref, dst.ref)) - : cvRun(() => ccore.Mat_CopyToWithMask(ref, dst.ref, mask.ref)); + ? cvRun(() => ccore.cv_Mat_copyTo(ref, dst.ref, ffi.nullptr)) + : cvRun(() => ccore.cv_Mat_copyTo_1(ref, dst.ref, mask.ref, ffi.nullptr)); @Deprecated("use copyTo instead") void copyToWithMask(Mat dst, Mat mask) { - cvRun(() => ccore.Mat_CopyToWithMask(ref, dst.ref, mask.ref)); + cvRun(() => ccore.cv_Mat_copyTo_1(ref, dst.ref, mask.ref, ffi.nullptr)); } /// Converts an array to another data type with optional scaling. @@ -1149,7 +1149,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#adf88c60c5b4980e05bb556080916978b Mat convertTo(MatType type, {double alpha = 1, double beta = 0}) { final dst = Mat.empty(); - cvRun(() => ccore.Mat_ConvertToWithParams(ref, dst.ref, type.value, alpha, beta)); + cvRun(() => ccore.cv_Mat_convertTo_1(ref, dst.ref, type.value, alpha, beta, ffi.nullptr)); return dst; } @@ -1161,17 +1161,16 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a385c09827713dc3e6d713bfad8460706 Mat mul(Mat other, {bool inplace = false, double scale = 1.0}) { - final p = inplace ? ptr : calloc(); - cvRun(() => ccore.Mat_Mul(ref, other.ref, p, scale)); - return inplace ? this : Mat._(p); + final dst = inplace ? this : Mat.empty(); + cvRun(() => ccore.cv_Mat_mul(ref, other.ref, dst.ref, scale)); + return dst; } /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#aa7ec97373406215f2d4bc72cc1d27036 Mat region(Rect rect) { cvAssert(rect.right <= width && rect.bottom <= height); - final p = calloc(); - cvRun(() => ccore.Mat_Region(ref, rect.ref, p)); - final dst = Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_region(ref, rect.ref, dst.ref, ffi.nullptr)); return dst; } @@ -1188,28 +1187,22 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a4eb96e3251417fa88b78e2abd6cfd7d8 Mat reshape(int cn, [int rows = 0]) { - final p = calloc(); - cvRun(() => ccore.Mat_Reshape(ref, cn, rows, p)); - final dst = Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_reshape(ref, cn, rows, dst.ref, ffi.nullptr)); return dst; } /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#ab2e41a510891e548f744832cf9b8ab89 Mat reshapeTo(int cn, List newshape) { - final p = calloc(); - cvRun(() => ccore.Mat_ReshapeByVec(ref, cn, newshape.i32.ref, p)); - return Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_reshape_1(ref, cn, newshape.i32.ref, dst.ref, ffi.nullptr)); + return dst; } Mat rotate(int rotationCode, {bool inplace = false}) { - if (inplace) { - cvRun(() => ccore.Rotate(ref, ref, rotationCode)); - return this; - } else { - final dst = clone(); - cvRun(() => ccore.Rotate(ref, dst.ref, rotationCode)); - return dst; - } + final dst = inplace ? this : clone(); + cvRun(() => ccore.cv_rotate(ref, ref, rotationCode, ffi.nullptr)); + return dst; } /// Creates a matrix header for the specified row span. @@ -1219,9 +1212,8 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#aa6542193430356ad631a9beabc624107 Mat rowRange(int start, int end) { - final p = calloc(); - cvRun(() => ccore.Mat_rowRange(ref, start, end, p)); - final dst = Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_rowRange(ref, start, end, dst.ref, ffi.nullptr)); return dst; } @@ -1232,25 +1224,23 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#aadc8f9210fe4dec50513746c246fa8d9 Mat colRange(int start, int end) { - final p = calloc(); - cvRun(() => ccore.Mat_colRange(ref, start, end, p)); - final dst = Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_colRange(ref, start, end, dst.ref, ffi.nullptr)); return dst; } @Deprecated("Use convertTo instead") Mat convertToFp16() { - final p = calloc(); - cvRun(() => ccore.Mat_ConvertFp16(ref, p)); - final dst = Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_convertFp16(ref, dst.ref, ffi.nullptr)); return dst; } Scalar mean({Mat? mask}) { final s = calloc(); mask == null - ? cvRun(() => ccore.Mat_Mean(ref, s)) - : cvRun(() => ccore.Mat_MeanWithMask(ref, mask.ref, s)); + ? cvRun(() => ccore.cv_Mat_mean(ref, s, ffi.nullptr)) + : cvRun(() => ccore.cv_Mat_mean_1(ref, mask.ref, s, ffi.nullptr)); return Scalar.fromPointer(s); } @@ -1260,7 +1250,7 @@ class Mat extends CvStruct { Scalar stdDev() { final mean = calloc(); final sd = calloc(); - cvRun(() => ccore.Mat_MeanStdDev(ref, mean, sd)); + cvRun(() => ccore.cv_meanStdDev(ref, mean, sd, ffi.nullptr)); return Scalar.fromPointer(sd); } @@ -1270,21 +1260,20 @@ class Mat extends CvStruct { /// Calculates a square root of array elements. Mat sqrt() { cvAssert(type.depth == MatType.CV_32F || type.depth == MatType.CV_64F); - final p = calloc(); - cvRun(() => ccore.Mat_Sqrt(ref, p)); - final dst = Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_sqrt(ref, dst.ref, ffi.nullptr)); return dst; } /// Sum calculates the per-channel pixel sum of an image. Scalar sum() { final s = calloc(); - cvRun(() => ccore.Mat_Sum(ref, s)); + cvRun(() => ccore.cv_sum(ref, s, ffi.nullptr)); return Scalar.fromPointer(s); } /// PatchNaNs converts NaN's to zeros. - void patchNaNs({double val = 0}) => cvRun(() => ccore.Mat_PatchNaNs(ref, val)); + void patchNaNs({double val = 0}) => cvRun(() => ccore.cv_Mat_patchNaNs(ref, val, ffi.nullptr)); /// Sets all or some of the array elements to the specified value. /// @@ -1298,7 +1287,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a030678ffd9ca6e12127b3fd1337bf6e2 Mat setTo(Scalar value, {Mat? mask}) { mask ??= Mat.empty(); - cvRun(() => ccore.Mat_SetTo(ref, value.ref, mask!.ref)); + cvRun(() => ccore.cv_Mat_setTo(ref, value.ref, mask!.ref, ffi.nullptr)); return this; } @@ -1311,9 +1300,9 @@ class Mat extends CvStruct { /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#aaa428c60ccb6d8ea5de18f63dfac8e11 Mat t() { - final p = calloc(); - cvRun(() => ccore.Mat_T(ref, p)); - return Mat._(p); + final dst = Mat.empty(); + cvRun(() => ccore.cv_Mat_t(ref, dst.ref, ffi.nullptr)); + return dst; } /// This Method converts single-channel Mat to 2D List @@ -1346,7 +1335,8 @@ class Mat extends CvStruct { bool multiLine = true, }) { final p = calloc>(); - cvRun(() => ccore.Mat_toString(ref, fmtType, f16Precision, f32Precision, f64Precision, multiLine, p)); + cvRun( + () => ccore.cv_Mat_toFmtString(ref, fmtType, f16Precision, f32Precision, f64Precision, multiLine, p)); final rval = p.value.toDartString(); calloc.free(p); return rval; @@ -1356,14 +1346,14 @@ class Mat extends CvStruct { String toString() => "Mat(addr=0x${ptr.address.toRadixString(16)}, " "type=${type.asString()}, rows=$rows, cols=$cols, channels=$channels)"; - static final finalizer = OcvFinalizer(ccore.addresses.Mat_Close); + static final finalizer = OcvFinalizer(ccore.addresses.cv_Mat_close); @Deprecated("NOT recommended, call [dispose] instead") - void release() => cvRun(() => ccore.Mat_Release(ptr)); + void release() => cvRun(() => ccore.cv_Mat_release(ref)); void dispose() { finalizer.detach(this); - ccore.Mat_Close(ptr); + ccore.cv_Mat_close(ptr); } @override diff --git a/packages/dartcv/lib/src/core/mat_async.dart b/packages/dartcv/lib/src/core/mat_async.dart index 30f84cd7..0d442b34 100644 --- a/packages/dartcv/lib/src/core/mat_async.dart +++ b/packages/dartcv/lib/src/core/mat_async.dart @@ -3,34 +3,27 @@ // that can be found in the LICENSE file. import 'dart:async'; +import 'dart:ffi' as ffi; +import 'package:ffi/ffi.dart'; + +import '../g/types.g.dart' as cvg; import '../native_lib.dart' show ccore; import 'base.dart'; import 'mat.dart'; import 'mat_type.dart'; -import 'point.dart'; import 'rect.dart'; import 'scalar.dart'; -import 'vec.dart'; extension MatAsync on Mat { - static Future emptyAsync() async => cvRunAsync(ccore.Mat_New_Async, matCompleter); - - static Future fromScalarAsync(int rows, int cols, MatType type, Scalar s) async => cvRunAsync( - (callback) => ccore.Mat_NewFromScalar_Async(s.ref, rows, cols, type.value, callback), - matCompleter, - ); - - static Future fromVecAsync(Vec vec) async { - if (vec is VecPoint) { - return cvRunAsync((callback) => ccore.Mat_NewFromVecPoint_Async(vec.ref, callback), matCompleter); - } else if (vec is VecPoint2f) { - return cvRunAsync((callback) => ccore.Mat_NewFromVecPoint2f_Async(vec.ref, callback), matCompleter); - } else if (vec is VecPoint3f) { - return cvRunAsync((callback) => ccore.Mat_NewFromVecPoint3f_Async(vec.ref, callback), matCompleter); - } else { - throw UnsupportedError("Unsupported Vec type ${vec.runtimeType}"); - } + static Future emptyAsync() async => Mat.empty(); + + static Future fromScalarAsync(int rows, int cols, MatType type, Scalar s) { + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_Mat_create_5(s.ref, rows, cols, type.value, p, callback), + (c) => c.complete(Mat.fromPointer(p)), + ); } static Future createAsync({ @@ -48,71 +41,122 @@ extension MatAsync on Mat { Scalar(b.toDouble(), g.toDouble(), r.toDouble(), 0), ); - static Future eyeAsync(int rows, int cols, MatType type) async => - cvRunAsync((callback) => ccore.Mat_Eye_Async(rows, cols, type.value, callback), matCompleter); + static Future eyeAsync(int rows, int cols, MatType type) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_Mat_eye(rows, cols, type.value, p, callback), + (c) => c.complete(Mat.fromPointer(p)), + ); + } - static Future zerosAsync(int rows, int cols, MatType type) async => - cvRunAsync((callback) => ccore.Mat_Zeros_Async(rows, cols, type.value, callback), matCompleter); + static Future zerosAsync(int rows, int cols, MatType type) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_Mat_zeros(rows, cols, type.value, p, callback), + (c) => c.complete(Mat.fromPointer(p)), + ); + } - static Future onesAsync(int rows, int cols, MatType type) async => - cvRunAsync((callback) => ccore.Mat_Ones_Async(rows, cols, type.value, callback), matCompleter); + static Future onesAsync(int rows, int cols, MatType type) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_Mat_ones(rows, cols, type.value, p, callback), + (c) => c.complete(Mat.fromPointer(p)), + ); + } - Future cloneAsync() async => - cvRunAsync((callback) => ccore.Mat_Clone_Async(ref, callback), matCompleter); + Future cloneAsync() async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_Mat_clone(ref, dst.ref, callback), + (c) => c.complete(dst), + ); + } Future copyToAsync(Mat dst, {Mat? mask}) async => cvRunAsync0( (callback) => mask == null - ? ccore.Mat_CopyTo_Async(ref, dst.ref, callback) - : ccore.Mat_CopyToWithMask_Async(ref, dst.ref, mask.ref, callback), + ? ccore.cv_Mat_copyTo(ref, dst.ref, callback) + : ccore.cv_Mat_copyTo_1(ref, dst.ref, mask.ref, callback), voidCompleter, ); - Future convertToAsync(MatType type, {double alpha = 1, double beta = 0}) async => cvRunAsync( - (callback) => ccore.Mat_ConvertToWithParams_Async(ref, type.value, alpha, beta, callback), - matCompleter, - ); + Future convertToAsync(MatType type, {double alpha = 1, double beta = 0}) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_Mat_convertTo_1(ref, dst.ref, type.value, alpha, beta, callback), + (c) => c.complete(dst), + ); + } - Future regionAsync(Rect rect) async => cvRunAsync( - (callback) => ccore.Mat_Region_Async(ref, rect.ref, callback), - matCompleter, - ); + Future regionAsync(Rect rect) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_Mat_region(ref, rect.ref, dst.ref, callback), + (c) => c.complete(dst), + ); + } - Future reshapeAsync(int cn, int rows) async => cvRunAsync( - (callback) => ccore.Mat_Reshape_Async(ref, cn, rows, callback), - matCompleter, - ); + Future reshapeAsync(int cn, [int rows = 0]) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_Mat_reshape(ref, cn, rows, dst.ref, callback), + (c) => c.complete(dst), + ); + } - Future rotateAsync(int rotationCode) async => cvRunAsync( - (callback) => ccore.core_Rotate_Async(ref, rotationCode, callback), - matCompleter, - ); + Future rotateAsync(int rotationCode, {bool inplace = false}) async { + final dst = inplace ? this : clone(); + return cvRunAsync0( + (callback) => ccore.cv_rotate(ref, dst.ref, rotationCode, callback), + (c) => c.complete(dst), + ); + } - Future rowRangeAsync(int start, int end) async => cvRunAsync( - (callback) => ccore.core_rowRange_Async(ref, start, end, callback), - matCompleter, - ); + Future rowRangeAsync(int start, int end) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_rowRange(ref, start, end, dst.ref, callback), + (c) => c.complete(dst), + ); + } - Future colRangeAsync(int start, int end) async => cvRunAsync( - (callback) => ccore.core_colRange_Async(ref, start, end, callback), - matCompleter, - ); + Future colRangeAsync(int start, int end) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_colRange(ref, start, end, dst.ref, callback), + (c) => c.complete(dst), + ); + } - Future meanAsync({Mat? mask}) async => cvRunAsync( - (callback) => mask == null - ? ccore.core_Mean_Async(ref, callback) - : ccore.core_MeanWithMask_Async(ref, mask.ref, callback), - scalarCompleter, - ); + Future meanAsync({Mat? mask}) { + final s = calloc(); + return cvRunAsync0( + (callback) { + return mask == null + ? ccore.cv_Mat_mean(ref, s, callback) + : ccore.cv_Mat_mean_1(ref, mask.ref, s, callback); + }, + (c) => c.complete(Scalar.fromPointer(s)), + ); + } /// Calculates a square root of array elements. - Future sqrtAsync() async => - cvRunAsync((callback) => ccore.core_Sqrt_Async(ref, callback), matCompleter); + Future sqrtAsync() async { + cvAssert(type.depth == MatType.CV_32F || type.depth == MatType.CV_64F); + final dst = Mat.empty(); + return cvRunAsync0((callback) => ccore.cv_Mat_sqrt(ref, dst.ref, callback), (c) => c.complete(dst)); + } /// Sum calculates the per-channel pixel sum of an image. - Future sumAsync() async => - cvRunAsync((callback) => ccore.core_Sum_Async(ref, callback), scalarCompleter); + Future sumAsync() async { + final s = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_sum(ref, s, callback), + (c) => c.complete(Scalar.fromPointer(s)), + ); + } /// PatchNaNs converts NaN's to zeros. Future patchNaNsAsync({double val = 0.0}) async => - cvRunAsync0((callback) => ccore.core_PatchNaNs_Async(ref, val, callback), voidCompleter); + cvRunAsync0((callback) => ccore.cv_Mat_patchNaNs(ref, val, callback), voidCompleter); } diff --git a/packages/dartcv/lib/src/core/point.dart b/packages/dartcv/lib/src/core/point.dart index 44991443..9e33200a 100644 --- a/packages/dartcv/lib/src/core/point.dart +++ b/packages/dartcv/lib/src/core/point.dart @@ -186,7 +186,7 @@ class VecPoint extends Vec { factory VecPoint.fromMat(Mat mat) { final p = calloc(); - cvRun(() => ccore.Mat_toVecPoint(mat.ref, p)); + cvRun(() => ccore.cv_Mat_toVecPoint(mat.ref, p, ffi.nullptr)); return VecPoint.fromPointer(p); } @@ -266,7 +266,7 @@ class VecPoint2f extends Vec { factory VecPoint2f.fromMat(Mat mat) { final p = calloc(); - cvRun(() => ccore.Mat_toVecPoint2f(mat.ref, p)); + cvRun(() => ccore.cv_Mat_toVecPoint2f(mat.ref, p, ffi.nullptr)); return VecPoint2f.fromPointer(p); } @@ -346,7 +346,7 @@ class VecPoint3f extends Vec { factory VecPoint3f.fromMat(Mat mat) { final p = calloc(); - cvRun(() => ccore.Mat_toVecPoint3f(mat.ref, p)); + cvRun(() => ccore.cv_Mat_toVecPoint3f(mat.ref, p, ffi.nullptr)); return VecPoint3f.fromPointer(p); } @@ -427,7 +427,7 @@ class VecPoint3i extends Vec { factory VecPoint3i.fromMat(Mat mat) { final p = calloc(); - cvRun(() => ccore.Mat_toVecPoint3i(mat.ref, p)); + cvRun(() => ccore.cv_Mat_toVecPoint3i(mat.ref, p, ffi.nullptr)); return VecPoint3i.fromPointer(p); } diff --git a/packages/dartcv/lib/src/core/rect.dart b/packages/dartcv/lib/src/core/rect.dart index 0ca07f1e..eb5f19f9 100644 --- a/packages/dartcv/lib/src/core/rect.dart +++ b/packages/dartcv/lib/src/core/rect.dart @@ -141,19 +141,19 @@ class RotatedRect extends CvStruct { VecPoint2f get points { final pts = calloc(); - cvRun(() => ccore.RotatedRect_Points(ptr.ref, pts)); + cvRun(() => ccore.cv_RotatedRect_points(ptr.ref, pts)); return VecPoint2f.fromPointer(pts); } Rect get boundingRect { final rect = calloc(); - cvRun(() => ccore.RotatedRect_BoundingRect(ptr.ref, rect)); + cvRun(() => ccore.cv_RotatedRect_boundingRect(ptr.ref, rect)); return Rect.fromPointer(rect); } Rect2f get boundingRect2f { final rect = calloc(); - cvRun(() => ccore.RotatedRect_BoundingRect2f(ptr.ref, rect)); + cvRun(() => ccore.cv_RotatedRect_boundingRect2f(ptr.ref, rect)); return Rect2f.fromPointer(rect); } diff --git a/packages/dartcv/lib/src/core/rng.dart b/packages/dartcv/lib/src/core/rng.dart index 9b440146..e9235cff 100644 --- a/packages/dartcv/lib/src/core/rng.dart +++ b/packages/dartcv/lib/src/core/rng.dart @@ -18,7 +18,7 @@ class Rng extends CvStruct { factory Rng() { final p = calloc(); - cvRun(() => ccore.Rng_New(p)); + cvRun(() => ccore.cv_RNG_create(p)); final rng = Rng._(p); return rng; } @@ -27,16 +27,16 @@ class Rng extends CvStruct { factory Rng.fromSeed(int seed) { final p = calloc(); - cvRun(() => ccore.Rng_NewWithState(seed, p)); + cvRun(() => ccore.cv_RNG_create_1(seed, p)); final rng = Rng._(p); return rng; } - static final finalizer = OcvFinalizer(ccore.addresses.Rng_Close); + static final finalizer = OcvFinalizer(ccore.addresses.cv_RNG_close); void dispose() { finalizer.detach(this); - ccore.Rng_Close(ptr); + ccore.cv_RNG_close(ptr); } /// Fills arrays with random numbers. @@ -50,15 +50,39 @@ class Rng extends CvStruct { bool inplace = false, }) { if (inplace) { - cvRun(() => ccore.RNG_Fill(ref, mat.ref, distType, a, b, saturateRange)); + cvRun(() => ccore.cv_RNG_fill(ref, mat.ref, distType, a, b, saturateRange, ffi.nullptr)); return mat; } else { final m = mat.clone(); - cvRun(() => ccore.RNG_Fill(ref, m.ref, distType, a, b, saturateRange)); + cvRun(() => ccore.cv_RNG_fill(ref, m.ref, distType, a, b, saturateRange, ffi.nullptr)); return m; } } + /// Fills arrays with random numbers. + /// https://docs.opencv.org/4.x/d1/dd6/classcv_1_1RNG.html#ad26f2b09d9868cf108e84c9814aa682d + Future fillAsync( + Mat mat, + int distType, + double a, + double b, { + bool saturateRange = false, + bool inplace = false, + }) async { + if (inplace) { + return cvRunAsync0( + (callback) => ccore.cv_RNG_fill(ref, mat.ref, distType, a, b, saturateRange, callback), + (c) => c.complete(mat), + ); + } else { + final m = mat.clone(); + return cvRunAsync0( + (callback) => ccore.cv_RNG_fill(ref, m.ref, distType, a, b, saturateRange, callback), + (c) => c.complete(mat), + ); + } + } + /// The method transforms the state using the MWC algorithm and returns /// the next random number from the Gaussian distribution N(0,sigma) . /// That is, the mean value of the returned random numbers is zero and @@ -69,7 +93,7 @@ class Rng extends CvStruct { final p = calloc(); try { while (true) { - cvRun(() => ccore.RNG_Gaussian(ref, sigma, p)); + cvRun(() => ccore.cv_RNG_gaussian(ref, sigma, p)); yield p.value; count++; @@ -87,7 +111,7 @@ class Rng extends CvStruct { final p = calloc(); try { while (true) { - cvRun(() => ccore.RNG_Next(ref, p)); + cvRun(() => ccore.cv_RNG_next(ref, p)); yield p.value; count++; @@ -110,7 +134,7 @@ class Rng extends CvStruct { final p = calloc(); try { while (true) { - cvRun(() => ccore.RNG_Uniform(ref, a, b, p)); + cvRun(() => ccore.cv_RNG_uniform(ref, a, b, p)); yield p.value; count++; @@ -123,7 +147,7 @@ class Rng extends CvStruct { final p = calloc(); try { while (true) { - cvRun(() => ccore.RNG_UniformDouble(ref, a.toDouble(), b.toDouble(), p)); + cvRun(() => ccore.cv_RNG_uniformDouble(ref, a.toDouble(), b.toDouble(), p)); yield p.value; count++; diff --git a/packages/dartcv/lib/src/core/rng_async.dart b/packages/dartcv/lib/src/core/rng_async.dart deleted file mode 100644 index 34c68d8c..00000000 --- a/packages/dartcv/lib/src/core/rng_async.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2024, rainyl and all contributors. All rights reserved. -// Use of this source code is governed by a Apache-2.0 license -// that can be found in the LICENSE file. - -import '../native_lib.dart' show ccore; -import 'base.dart'; -import 'mat.dart'; -import 'mat_async.dart'; -import 'rng.dart'; - -extension RngAsync on Rng { - /// Fills arrays with random numbers. - /// https://docs.opencv.org/4.x/d1/dd6/classcv_1_1RNG.html#ad26f2b09d9868cf108e84c9814aa682d - Future fillAsync( - Mat mat, - int distType, - double a, - double b, { - bool saturateRange = false, - bool inplace = false, - }) async { - if (inplace) { - return cvRunAsync0( - (callback) => ccore.RNG_Fill_Async(ref, mat.ref, distType, a, b, saturateRange, callback), - (c) => c.complete(mat), - ); - } else { - final m = await mat.cloneAsync(); - return cvRunAsync0( - (callback) => ccore.RNG_Fill_Async(ref, m.ref, distType, a, b, saturateRange, callback), - (c) => c.complete(m), - ); - } - } -} diff --git a/packages/dartcv/lib/src/core/svd.dart b/packages/dartcv/lib/src/core/svd.dart index 5bb5a558..0c152490 100644 --- a/packages/dartcv/lib/src/core/svd.dart +++ b/packages/dartcv/lib/src/core/svd.dart @@ -6,9 +6,6 @@ library cv.svd; import 'dart:ffi' as ffi; -import 'package:ffi/ffi.dart'; - -import '../g/core.g.dart' as cvg; import '../native_lib.dart' show ccore; import 'base.dart'; import 'mat.dart'; @@ -22,25 +19,41 @@ class SVD { /// /// https://docs.opencv.org/4.1.2/df/df7/classcv_1_1SVD.html#a76f0b2044df458160292045a3d3714c6 static (Mat w, Mat u, Mat vt) compute(Mat src, {Mat? w, Mat? u, Mat? vt, int flags = 0}) { - final pw = w?.ptr ?? calloc(); - final pu = u?.ptr ?? calloc(); - final pvt = vt?.ptr ?? calloc(); - cvRun(() => ccore.SVD_Compute(src.ref, pw, pu, pvt, flags)); - return (w ?? Mat.fromPointer(pw), u ?? Mat.fromPointer(pu), vt ?? Mat.fromPointer(pvt)); + w ??= Mat.empty(); + u ??= Mat.empty(); + vt ??= Mat.empty(); + cvRun(() => ccore.cv_SVD_Compute(src.ref, w!.ref, u!.ref, vt!.ref, flags, ffi.nullptr)); + return (w, u, vt); } /// async version of [compute] - static Future<(Mat w, Mat u, Mat vt)> computeAsync(Mat src, {int flags = 0}) async => - cvRunAsync3((callback) => ccore.SVD_Compute_Async(src.ref, flags, callback), matCompleter3); + static Future<(Mat w, Mat u, Mat vt)> computeAsync( + Mat src, { + Mat? w, + Mat? u, + Mat? vt, + int flags = 0, + }) async { + w ??= Mat.empty(); + u ??= Mat.empty(); + vt ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_SVD_Compute(src.ref, w!.ref, u!.ref, vt!.ref, flags, callback), + (c) => c.complete((w!, u!, vt!)), + ); + } static Mat backSubst(Mat w, Mat u, Mat vt, Mat rhs, {Mat? dst}) { - final pdst = dst?.ptr ?? calloc(); - cvRun(() => ccore.SVD_backSubst(w.ref, u.ref, vt.ref, rhs.ref, pdst)); - return dst ?? Mat.fromPointer(pdst); + dst ??= Mat.empty(); + cvRun(() => ccore.cv_SVD_backSubst(w.ref, u.ref, vt.ref, rhs.ref, dst!.ref, ffi.nullptr)); + return dst; } - static Future backSubstAsync(Mat w, Mat u, Mat vt, Mat rhs, {Mat? dst}) async => cvRunAsync( - (callback) => ccore.SVD_backSubst_Async(w.ref, u.ref, vt.ref, rhs.ref, callback), - matCompleter, - ); + static Future backSubstAsync(Mat w, Mat u, Mat vt, Mat rhs, {Mat? dst}) async { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_SVD_backSubst(w.ref, u.ref, vt.ref, rhs.ref, dst!.ref, callback), + (c) => c.complete(dst), + ); + } } diff --git a/packages/dartcv/lib/src/g/calib3d.g.dart b/packages/dartcv/lib/src/g/calib3d.g.dart index ff54cbbe..f4be06c4 100644 --- a/packages/dartcv/lib/src/g/calib3d.g.dart +++ b/packages/dartcv/lib/src/g/calib3d.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Calib3d /// @@ -30,7 +30,42 @@ class CvNativeCalib3d { lookup) : _lookup = lookup; - ffi.Pointer CalibrateCamera( + ffi.Pointer cv_FindChessboardCornersSB_1( + Mat image, + CvSize patternSize, + Mat corners, + int flags, + Mat meta, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_FindChessboardCornersSB_1( + image, + patternSize, + corners, + flags, + meta, + rval, + callback, + ); + } + + late final _cv_FindChessboardCornersSB_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, + CvSize, + Mat, + ffi.Int, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_FindChessboardCornersSB_1'); + late final _cv_FindChessboardCornersSB_1 = + _cv_FindChessboardCornersSB_1Ptr.asFunction< + ffi.Pointer Function(Mat, CvSize, Mat, int, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_calibrateCamera( VecVecPoint3f objectPoints, VecVecPoint2f imagePoints, CvSize imageSize, @@ -41,8 +76,9 @@ class CvNativeCalib3d { int flag, TermCriteria criteria, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CalibrateCamera( + return _cv_calibrateCamera( objectPoints, imagePoints, imageSize, @@ -53,10 +89,11 @@ class CvNativeCalib3d { flag, criteria, rval, + callback, ); } - late final _CalibrateCameraPtr = _lookup< + late final _cv_calibrateCameraPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VecVecPoint3f, @@ -68,53 +105,70 @@ class CvNativeCalib3d { Mat, ffi.Int, TermCriteria, - ffi.Pointer)>>('CalibrateCamera'); - late final _CalibrateCamera = _CalibrateCameraPtr.asFunction< - ffi.Pointer Function(VecVecPoint3f, VecVecPoint2f, CvSize, Mat, - Mat, Mat, Mat, int, TermCriteria, ffi.Pointer)>(); - - ffi.Pointer DrawChessboardCorners( + ffi.Pointer, + imp1.CvCallback_0)>>('cv_calibrateCamera'); + late final _cv_calibrateCamera = _cv_calibrateCameraPtr.asFunction< + ffi.Pointer Function( + VecVecPoint3f, + VecVecPoint2f, + CvSize, + Mat, + Mat, + Mat, + Mat, + int, + TermCriteria, + ffi.Pointer, + imp1.CvCallback_0)>(); + + ffi.Pointer cv_drawChessboardCorners( Mat image, CvSize patternSize, Mat corners, bool patternWasFound, + imp1.CvCallback_0 callback, ) { - return _DrawChessboardCorners( + return _cv_drawChessboardCorners( image, patternSize, corners, patternWasFound, + callback, ); } - late final _DrawChessboardCornersPtr = _lookup< + late final _cv_drawChessboardCornersPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Mat, CvSize, Mat, ffi.Bool, + imp1.CvCallback_0)>>('cv_drawChessboardCorners'); + late final _cv_drawChessboardCorners = + _cv_drawChessboardCornersPtr.asFunction< ffi.Pointer Function( - Mat, CvSize, Mat, ffi.Bool)>>('DrawChessboardCorners'); - late final _DrawChessboardCorners = _DrawChessboardCornersPtr.asFunction< - ffi.Pointer Function(Mat, CvSize, Mat, bool)>(); + Mat, CvSize, Mat, bool, imp1.CvCallback_0)>(); - ffi.Pointer EstimateAffine2D( + ffi.Pointer cv_estimateAffine2D( VecPoint2f from, VecPoint2f to, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _EstimateAffine2D( + return _cv_estimateAffine2D( from, to, rval, + callback, ); } - late final _EstimateAffine2DPtr = _lookup< + late final _cv_estimateAffine2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - VecPoint2f, VecPoint2f, ffi.Pointer)>>('EstimateAffine2D'); - late final _EstimateAffine2D = _EstimateAffine2DPtr.asFunction< + ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, + imp1.CvCallback_0)>>('cv_estimateAffine2D'); + late final _cv_estimateAffine2D = _cv_estimateAffine2DPtr.asFunction< ffi.Pointer Function( - VecPoint2f, VecPoint2f, ffi.Pointer)>(); + VecPoint2f, VecPoint2f, Mat, imp1.CvCallback_0)>(); - ffi.Pointer EstimateAffine2DWithParams( + ffi.Pointer cv_estimateAffine2D_1( VecPoint2f from, VecPoint2f to, Mat inliers, @@ -123,9 +177,10 @@ class CvNativeCalib3d { int maxIters, double confidence, int refineIters, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _EstimateAffine2DWithParams( + return _cv_estimateAffine2D_1( from, to, inliers, @@ -135,10 +190,11 @@ class CvNativeCalib3d { confidence, refineIters, rval, + callback, ); } - late final _EstimateAffine2DWithParamsPtr = _lookup< + late final _cv_estimateAffine2D_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VecPoint2f, @@ -149,33 +205,36 @@ class CvNativeCalib3d { ffi.Size, ffi.Double, ffi.Size, - ffi.Pointer)>>('EstimateAffine2DWithParams'); - late final _EstimateAffine2DWithParams = - _EstimateAffine2DWithParamsPtr.asFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, int, - double, int, double, int, ffi.Pointer)>(); + Mat, + imp1.CvCallback_0)>>('cv_estimateAffine2D_1'); + late final _cv_estimateAffine2D_1 = _cv_estimateAffine2D_1Ptr.asFunction< + ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, int, double, + int, double, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer EstimateAffinePartial2D( + ffi.Pointer cv_estimateAffinePartial2D( VecPoint2f from, VecPoint2f to, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _EstimateAffinePartial2D( + return _cv_estimateAffinePartial2D( from, to, rval, + callback, ); } - late final _EstimateAffinePartial2DPtr = _lookup< + late final _cv_estimateAffinePartial2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, - ffi.Pointer)>>('EstimateAffinePartial2D'); - late final _EstimateAffinePartial2D = _EstimateAffinePartial2DPtr.asFunction< - ffi.Pointer Function( - VecPoint2f, VecPoint2f, ffi.Pointer)>(); + ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, + imp1.CvCallback_0)>>('cv_estimateAffinePartial2D'); + late final _cv_estimateAffinePartial2D = + _cv_estimateAffinePartial2DPtr.asFunction< + ffi.Pointer Function( + VecPoint2f, VecPoint2f, Mat, imp1.CvCallback_0)>(); - ffi.Pointer EstimateAffinePartial2DWithParams( + ffi.Pointer cv_estimateAffinePartial2D_1( VecPoint2f from, VecPoint2f to, Mat inliers, @@ -184,9 +243,10 @@ class CvNativeCalib3d { int maxIters, double confidence, int refineIters, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _EstimateAffinePartial2DWithParams( + return _cv_estimateAffinePartial2D_1( from, to, inliers, @@ -196,10 +256,11 @@ class CvNativeCalib3d { confidence, refineIters, rval, + callback, ); } - late final _EstimateAffinePartial2DWithParamsPtr = _lookup< + late final _cv_estimateAffinePartial2D_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VecPoint2f, @@ -210,88 +271,78 @@ class CvNativeCalib3d { ffi.Size, ffi.Double, ffi.Size, - ffi.Pointer)>>('EstimateAffinePartial2DWithParams'); - late final _EstimateAffinePartial2DWithParams = - _EstimateAffinePartial2DWithParamsPtr.asFunction< + Mat, + imp1.CvCallback_0)>>('cv_estimateAffinePartial2D_1'); + late final _cv_estimateAffinePartial2D_1 = + _cv_estimateAffinePartial2D_1Ptr.asFunction< ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, int, - double, int, double, int, ffi.Pointer)>(); + double, int, double, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer FindChessboardCorners( - Mat image, - CvSize patternSize, - Mat corners, - int flags, - ffi.Pointer rval, - ) { - return _FindChessboardCorners( - image, - patternSize, - corners, - flags, - rval, - ); - } - - late final _FindChessboardCornersPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, Mat, ffi.Int, - ffi.Pointer)>>('FindChessboardCorners'); - late final _FindChessboardCorners = _FindChessboardCornersPtr.asFunction< - ffi.Pointer Function( - Mat, CvSize, Mat, int, ffi.Pointer)>(); - - ffi.Pointer FindChessboardCornersSB( + ffi.Pointer cv_findChessboardCorners( Mat image, CvSize patternSize, Mat corners, int flags, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _FindChessboardCornersSB( + return _cv_findChessboardCorners( image, patternSize, corners, flags, rval, + callback, ); } - late final _FindChessboardCornersSBPtr = _lookup< + late final _cv_findChessboardCornersPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, Mat, ffi.Int, - ffi.Pointer)>>('FindChessboardCornersSB'); - late final _FindChessboardCornersSB = _FindChessboardCornersSBPtr.asFunction< - ffi.Pointer Function( - Mat, CvSize, Mat, int, ffi.Pointer)>(); - - ffi.Pointer FindChessboardCornersSBWithMeta( + ffi.Pointer Function( + Mat, + CvSize, + Mat, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_findChessboardCorners'); + late final _cv_findChessboardCorners = + _cv_findChessboardCornersPtr.asFunction< + ffi.Pointer Function(Mat, CvSize, Mat, int, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_findChessboardCornersSB( Mat image, CvSize patternSize, Mat corners, int flags, - Mat meta, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _FindChessboardCornersSBWithMeta( + return _cv_findChessboardCornersSB( image, patternSize, corners, flags, - meta, rval, + callback, ); } - late final _FindChessboardCornersSBWithMetaPtr = _lookup< + late final _cv_findChessboardCornersSBPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, Mat, ffi.Int, Mat, - ffi.Pointer)>>('FindChessboardCornersSBWithMeta'); - late final _FindChessboardCornersSBWithMeta = - _FindChessboardCornersSBWithMetaPtr.asFunction< ffi.Pointer Function( - Mat, CvSize, Mat, int, Mat, ffi.Pointer)>(); - - ffi.Pointer FindHomography( + Mat, + CvSize, + Mat, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_findChessboardCornersSB'); + late final _cv_findChessboardCornersSB = + _cv_findChessboardCornersSBPtr.asFunction< + ffi.Pointer Function(Mat, CvSize, Mat, int, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_findHomography( Mat src, Mat dst, int method, @@ -299,9 +350,10 @@ class CvNativeCalib3d { Mat mask, int maxIters, double confidence, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _FindHomography( + return _cv_findHomography( src, dst, method, @@ -310,46 +362,27 @@ class CvNativeCalib3d { maxIters, confidence, rval, - ); - } - - late final _FindHomographyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Double, Mat, - ffi.Int, ffi.Double, ffi.Pointer)>>('FindHomography'); - late final _FindHomography = _FindHomographyPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, double, Mat, int, double, ffi.Pointer)>(); - - ffi.Pointer FindHomography_Async( - Mat src, - Mat dst, - int method, - double ransacReprojThreshold, - int maxIters, - double confidence, - imp1.CvCallback_2 callback, - ) { - return _FindHomography_Async( - src, - dst, - method, - ransacReprojThreshold, - maxIters, - confidence, callback, ); } - late final _FindHomography_AsyncPtr = _lookup< + late final _cv_findHomographyPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Double, ffi.Int, - ffi.Double, imp1.CvCallback_2)>>('FindHomography_Async'); - late final _FindHomography_Async = _FindHomography_AsyncPtr.asFunction< + ffi.Pointer Function( + Mat, + Mat, + ffi.Int, + ffi.Double, + Mat, + ffi.Int, + ffi.Double, + Mat, + imp1.CvCallback_0)>>('cv_findHomography'); + late final _cv_findHomography = _cv_findHomographyPtr.asFunction< ffi.Pointer Function( - Mat, Mat, int, double, int, double, imp1.CvCallback_2)>(); + Mat, Mat, int, double, Mat, int, double, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Fisheye_EstimateNewCameraMatrixForUndistortRectify( + ffi.Pointer cv_fisheye_estimateNewCameraMatrixForUndistortRectify( Mat k, Mat d, CvSize imgSize, @@ -358,8 +391,9 @@ class CvNativeCalib3d { double balance, CvSize newSize, double fovScale, + imp1.CvCallback_0 callback, ) { - return _Fisheye_EstimateNewCameraMatrixForUndistortRectify( + return _cv_fisheye_estimateNewCameraMatrixForUndistortRectify( k, d, imgSize, @@ -368,93 +402,105 @@ class CvNativeCalib3d { balance, newSize, fovScale, + callback, ); } - late final _Fisheye_EstimateNewCameraMatrixForUndistortRectifyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, CvSize, Mat, Mat, ffi.Double, CvSize, ffi.Double)>>( - 'Fisheye_EstimateNewCameraMatrixForUndistortRectify'); - late final _Fisheye_EstimateNewCameraMatrixForUndistortRectify = - _Fisheye_EstimateNewCameraMatrixForUndistortRectifyPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, CvSize, Mat, Mat, double, CvSize, double)>(); - - ffi.Pointer Fisheye_UndistortImage( + late final _cv_fisheye_estimateNewCameraMatrixForUndistortRectifyPtr = + _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, CvSize, Mat, Mat, + ffi.Double, CvSize, ffi.Double, imp1.CvCallback_0)>>( + 'cv_fisheye_estimateNewCameraMatrixForUndistortRectify'); + late final _cv_fisheye_estimateNewCameraMatrixForUndistortRectify = + _cv_fisheye_estimateNewCameraMatrixForUndistortRectifyPtr.asFunction< + ffi.Pointer Function(Mat, Mat, CvSize, Mat, Mat, double, + CvSize, double, imp1.CvCallback_0)>(); + + ffi.Pointer cv_fisheye_undistortImage( Mat distorted, Mat undistorted, Mat k, Mat d, + imp1.CvCallback_0 callback, ) { - return _Fisheye_UndistortImage( + return _cv_fisheye_undistortImage( distorted, undistorted, k, d, + callback, ); } - late final _Fisheye_UndistortImagePtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Mat, Mat)>>( - 'Fisheye_UndistortImage'); - late final _Fisheye_UndistortImage = _Fisheye_UndistortImagePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat)>(); + late final _cv_fisheye_undistortImagePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, + imp1.CvCallback_0)>>('cv_fisheye_undistortImage'); + late final _cv_fisheye_undistortImage = + _cv_fisheye_undistortImagePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Fisheye_UndistortImageWithParams( + ffi.Pointer cv_fisheye_undistortImage_1( Mat distorted, - ffi.Pointer undistorted, + Mat undistorted, Mat k, Mat d, Mat knew, CvSize size, + imp1.CvCallback_0 callback, ) { - return _Fisheye_UndistortImageWithParams( + return _cv_fisheye_undistortImage_1( distorted, undistorted, k, d, knew, size, + callback, ); } - late final _Fisheye_UndistortImageWithParamsPtr = _lookup< + late final _cv_fisheye_undistortImage_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, Mat, Mat, Mat, - CvSize)>>('Fisheye_UndistortImageWithParams'); - late final _Fisheye_UndistortImageWithParams = - _Fisheye_UndistortImageWithParamsPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, Mat, CvSize, + imp1.CvCallback_0)>>('cv_fisheye_undistortImage_1'); + late final _cv_fisheye_undistortImage_1 = + _cv_fisheye_undistortImage_1Ptr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, Mat, Mat, Mat, CvSize)>(); + Mat, Mat, Mat, Mat, Mat, CvSize, imp1.CvCallback_0)>(); - ffi.Pointer Fisheye_UndistortPoints( + ffi.Pointer cv_fisheye_undistortPoints( Mat distorted, Mat undistorted, Mat k, Mat d, Mat R, Mat P, + imp1.CvCallback_0 callback, ) { - return _Fisheye_UndistortPoints( + return _cv_fisheye_undistortPoints( distorted, undistorted, k, d, R, P, + callback, ); } - late final _Fisheye_UndistortPointsPtr = _lookup< + late final _cv_fisheye_undistortPointsPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, Mat, Mat, + imp1.CvCallback_0)>>('cv_fisheye_undistortPoints'); + late final _cv_fisheye_undistortPoints = + _cv_fisheye_undistortPointsPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, Mat, Mat, Mat)>>('Fisheye_UndistortPoints'); - late final _Fisheye_UndistortPoints = _Fisheye_UndistortPointsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, Mat, Mat)>(); + Mat, Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer GetOptimalNewCameraMatrixWithParams( + ffi.Pointer cv_getOptimalNewCameraMatrix( Mat cameraMatrix, Mat distCoeffs, CvSize size, @@ -462,9 +508,10 @@ class CvNativeCalib3d { CvSize newImgSize, ffi.Pointer validPixROI, bool centerPrincipalPoint, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _GetOptimalNewCameraMatrixWithParams( + return _cv_getOptimalNewCameraMatrix( cameraMatrix, distCoeffs, size, @@ -473,10 +520,11 @@ class CvNativeCalib3d { validPixROI, centerPrincipalPoint, rval, + callback, ); } - late final _GetOptimalNewCameraMatrixWithParamsPtr = _lookup< + late final _cv_getOptimalNewCameraMatrixPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( Mat, @@ -486,23 +534,25 @@ class CvNativeCalib3d { CvSize, ffi.Pointer, ffi.Bool, - ffi.Pointer)>>('GetOptimalNewCameraMatrixWithParams'); - late final _GetOptimalNewCameraMatrixWithParams = - _GetOptimalNewCameraMatrixWithParamsPtr.asFunction< + Mat, + imp1.CvCallback_0)>>('cv_getOptimalNewCameraMatrix'); + late final _cv_getOptimalNewCameraMatrix = + _cv_getOptimalNewCameraMatrixPtr.asFunction< ffi.Pointer Function(Mat, Mat, CvSize, double, CvSize, - ffi.Pointer, bool, ffi.Pointer)>(); + ffi.Pointer, bool, Mat, imp1.CvCallback_0)>(); - ffi.Pointer InitUndistortRectifyMap( + ffi.Pointer cv_initUndistortRectifyMap( Mat cameraMatrix, Mat distCoeffs, Mat r, Mat newCameraMatrix, CvSize size, int m1type, - ffi.Pointer map1, - ffi.Pointer map2, + Mat map1, + Mat map2, + imp1.CvCallback_0 callback, ) { - return _InitUndistortRectifyMap( + return _cv_initUndistortRectifyMap( cameraMatrix, distCoeffs, r, @@ -511,493 +561,58 @@ class CvNativeCalib3d { m1type, map1, map2, + callback, ); } - late final _InitUndistortRectifyMapPtr = _lookup< + late final _cv_initUndistortRectifyMapPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, Mat, Mat, Mat, CvSize, ffi.Int, - ffi.Pointer, ffi.Pointer)>>('InitUndistortRectifyMap'); - late final _InitUndistortRectifyMap = _InitUndistortRectifyMapPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, CvSize, int, - ffi.Pointer, ffi.Pointer)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_initUndistortRectifyMap'); + late final _cv_initUndistortRectifyMap = + _cv_initUndistortRectifyMapPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, CvSize, int, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Undistort( + ffi.Pointer cv_undistort( Mat src, Mat dst, Mat cameraMatrix, Mat distCoeffs, Mat newCameraMatrix, + imp1.CvCallback_0 callback, ) { - return _Undistort( + return _cv_undistort( src, dst, cameraMatrix, distCoeffs, newCameraMatrix, - ); - } - - late final _UndistortPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, Mat)>>('Undistort'); - late final _Undistort = _UndistortPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, Mat)>(); - - ffi.Pointer UndistortPoints( - Mat distorted, - Mat undistorted, - Mat k, - Mat d, - Mat r, - Mat p, - TermCriteria criteria, - ) { - return _UndistortPoints( - distorted, - undistorted, - k, - d, - r, - p, - criteria, - ); - } - - late final _UndistortPointsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, Mat, Mat, TermCriteria)>>('UndistortPoints'); - late final _UndistortPoints = _UndistortPointsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, Mat, Mat, TermCriteria)>(); - - ffi.Pointer calibrateCamera_Async( - VecVecPoint3f objectPoints, - VecVecPoint2f imagePoints, - CvSize imageSize, - Mat cameraMatrix, - Mat distCoeffs, - int flag, - TermCriteria criteria, - imp1.CvCallback_3 callback, - ) { - return _calibrateCamera_Async( - objectPoints, - imagePoints, - imageSize, - cameraMatrix, - distCoeffs, - flag, - criteria, - callback, - ); - } - - late final _calibrateCamera_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecVecPoint3f, - VecVecPoint2f, - CvSize, - Mat, - Mat, - ffi.Int, - TermCriteria, - imp1.CvCallback_3)>>('calibrateCamera_Async'); - late final _calibrateCamera_Async = _calibrateCamera_AsyncPtr.asFunction< - ffi.Pointer Function(VecVecPoint3f, VecVecPoint2f, CvSize, Mat, - Mat, int, TermCriteria, imp1.CvCallback_3)>(); - - ffi.Pointer drawChessboardCorners_Async( - Mat image, - CvSize patternSize, - bool patternWasFound, - imp1.CvCallback_0 callback, - ) { - return _drawChessboardCorners_Async( - image, - patternSize, - patternWasFound, - callback, - ); - } - - late final _drawChessboardCorners_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, ffi.Bool, - imp1.CvCallback_0)>>('drawChessboardCorners_Async'); - late final _drawChessboardCorners_Async = - _drawChessboardCorners_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvSize, bool, imp1.CvCallback_0)>(); - - ffi.Pointer estimateAffine2DWithParams_Async( - VecPoint2f from, - VecPoint2f to, - int method, - double ransacReprojThreshold, - int maxIters, - double confidence, - int refineIters, - imp1.CvCallback_2 callback, - ) { - return _estimateAffine2DWithParams_Async( - from, - to, - method, - ransacReprojThreshold, - maxIters, - confidence, - refineIters, callback, ); } - late final _estimateAffine2DWithParams_AsyncPtr = _lookup< + late final _cv_undistortPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VecPoint2f, - VecPoint2f, - ffi.Int, - ffi.Double, - ffi.Size, - ffi.Double, - ffi.Size, - imp1.CvCallback_2)>>('estimateAffine2DWithParams_Async'); - late final _estimateAffine2DWithParams_Async = - _estimateAffine2DWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, int, double, - int, double, int, imp1.CvCallback_2)>(); - - ffi.Pointer estimateAffine2D_Async( - VecPoint2f from, - VecPoint2f to, - imp1.CvCallback_1 callback, - ) { - return _estimateAffine2D_Async( - from, - to, - callback, - ); - } - - late final _estimateAffine2D_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, - imp1.CvCallback_1)>>('estimateAffine2D_Async'); - late final _estimateAffine2D_Async = _estimateAffine2D_AsyncPtr.asFunction< + Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_undistort'); + late final _cv_undistort = _cv_undistortPtr.asFunction< ffi.Pointer Function( - VecPoint2f, VecPoint2f, imp1.CvCallback_1)>(); - - ffi.Pointer estimateAffinePartial2DWithParams_Async( - VecPoint2f from, - VecPoint2f to, - int method, - double ransacReprojThreshold, - int maxIters, - double confidence, - int refineIters, - imp1.CvCallback_2 callback, - ) { - return _estimateAffinePartial2DWithParams_Async( - from, - to, - method, - ransacReprojThreshold, - maxIters, - confidence, - refineIters, - callback, - ); - } - - late final _estimateAffinePartial2DWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint2f, - VecPoint2f, - ffi.Int, - ffi.Double, - ffi.Size, - ffi.Double, - ffi.Size, - imp1.CvCallback_2)>>('estimateAffinePartial2DWithParams_Async'); - late final _estimateAffinePartial2DWithParams_Async = - _estimateAffinePartial2DWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, int, double, - int, double, int, imp1.CvCallback_2)>(); - - ffi.Pointer estimateAffinePartial2D_Async( - VecPoint2f from, - VecPoint2f to, - imp1.CvCallback_1 callback, - ) { - return _estimateAffinePartial2D_Async( - from, - to, - callback, - ); - } - - late final _estimateAffinePartial2D_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, - imp1.CvCallback_1)>>('estimateAffinePartial2D_Async'); - late final _estimateAffinePartial2D_Async = - _estimateAffinePartial2D_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint2f, VecPoint2f, imp1.CvCallback_1)>(); - - ffi.Pointer findChessboardCornersSBWithMeta_Async( - Mat image, - CvSize patternSize, - int flags, - imp1.CvCallback_3 callback, - ) { - return _findChessboardCornersSBWithMeta_Async( - image, - patternSize, - flags, - callback, - ); - } - - late final _findChessboardCornersSBWithMeta_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, ffi.Int, - imp1.CvCallback_3)>>('findChessboardCornersSBWithMeta_Async'); - late final _findChessboardCornersSBWithMeta_Async = - _findChessboardCornersSBWithMeta_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvSize, int, imp1.CvCallback_3)>(); - - ffi.Pointer findChessboardCornersSB_Async( - Mat image, - CvSize patternSize, - int flags, - imp1.CvCallback_2 callback, - ) { - return _findChessboardCornersSB_Async( - image, - patternSize, - flags, - callback, - ); - } - - late final _findChessboardCornersSB_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, ffi.Int, - imp1.CvCallback_2)>>('findChessboardCornersSB_Async'); - late final _findChessboardCornersSB_Async = - _findChessboardCornersSB_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvSize, int, imp1.CvCallback_2)>(); - - ffi.Pointer findChessboardCorners_Async( - Mat image, - CvSize patternSize, - int flags, - imp1.CvCallback_2 callback, - ) { - return _findChessboardCorners_Async( - image, - patternSize, - flags, - callback, - ); - } - - late final _findChessboardCorners_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, ffi.Int, - imp1.CvCallback_2)>>('findChessboardCorners_Async'); - late final _findChessboardCorners_Async = - _findChessboardCorners_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvSize, int, imp1.CvCallback_2)>(); - - ffi.Pointer - fisheye_estimateNewCameraMatrixForUndistortRectify_Async( - Mat k, - Mat d, - CvSize imgSize, - Mat r, - double balance, - CvSize newSize, - double fovScale, - imp1.CvCallback_1 p, - ) { - return _fisheye_estimateNewCameraMatrixForUndistortRectify_Async( - k, - d, - imgSize, - r, - balance, - newSize, - fovScale, - p, - ); - } + Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - late final _fisheye_estimateNewCameraMatrixForUndistortRectify_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvSize, Mat, - ffi.Double, CvSize, ffi.Double, imp1.CvCallback_1)>>( - 'fisheye_estimateNewCameraMatrixForUndistortRectify_Async'); - late final _fisheye_estimateNewCameraMatrixForUndistortRectify_Async = - _fisheye_estimateNewCameraMatrixForUndistortRectify_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvSize, Mat, double, CvSize, - double, imp1.CvCallback_1)>(); - - ffi.Pointer fisheye_undistortImageWithParams_Async( - Mat distorted, - Mat k, - Mat d, - Mat knew, - CvSize size, - imp1.CvCallback_1 callback, - ) { - return _fisheye_undistortImageWithParams_Async( - distorted, - k, - d, - knew, - size, - callback, - ); - } - - late final _fisheye_undistortImageWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, CvSize, - imp1.CvCallback_1)>>('fisheye_undistortImageWithParams_Async'); - late final _fisheye_undistortImageWithParams_Async = - _fisheye_undistortImageWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, CvSize, imp1.CvCallback_1)>(); - - ffi.Pointer fisheye_undistortImage_Async( - Mat distorted, - Mat k, - Mat d, - imp1.CvCallback_1 callback, - ) { - return _fisheye_undistortImage_Async( - distorted, - k, - d, - callback, - ); - } - - late final _fisheye_undistortImage_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_1)>>('fisheye_undistortImage_Async'); - late final _fisheye_undistortImage_Async = - _fisheye_undistortImage_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer fisheye_undistortPoints_Async( - Mat distorted, - Mat k, - Mat d, - Mat R, - Mat P, - imp1.CvCallback_1 callback, - ) { - return _fisheye_undistortPoints_Async( - distorted, - k, - d, - R, - P, - callback, - ); - } - - late final _fisheye_undistortPoints_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, Mat, - imp1.CvCallback_1)>>('fisheye_undistortPoints_Async'); - late final _fisheye_undistortPoints_Async = - _fisheye_undistortPoints_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer getOptimalNewCameraMatrix_Async( - Mat cameraMatrix, - Mat distCoeffs, - CvSize size, - double alpha, - CvSize newImgSize, - bool centerPrincipalPoint, - imp1.CvCallback_2 callback, - ) { - return _getOptimalNewCameraMatrix_Async( - cameraMatrix, - distCoeffs, - size, - alpha, - newImgSize, - centerPrincipalPoint, - callback, - ); - } - - late final _getOptimalNewCameraMatrix_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvSize, ffi.Double, CvSize, - ffi.Bool, imp1.CvCallback_2)>>('getOptimalNewCameraMatrix_Async'); - late final _getOptimalNewCameraMatrix_Async = - _getOptimalNewCameraMatrix_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, CvSize, double, CvSize, bool, imp1.CvCallback_2)>(); - - ffi.Pointer initUndistortRectifyMap_Async( - Mat cameraMatrix, - Mat distCoeffs, - Mat r, - Mat newCameraMatrix, - CvSize size, - int m1type, - imp1.CvCallback_2 callback, - ) { - return _initUndistortRectifyMap_Async( - cameraMatrix, - distCoeffs, - r, - newCameraMatrix, - size, - m1type, - callback, - ); - } - - late final _initUndistortRectifyMap_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, CvSize, ffi.Int, - imp1.CvCallback_2)>>('initUndistortRectifyMap_Async'); - late final _initUndistortRectifyMap_Async = - _initUndistortRectifyMap_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, CvSize, int, imp1.CvCallback_2)>(); - - ffi.Pointer undistortPoints_Async( + ffi.Pointer cv_undistortPoints( Mat distorted, + Mat undistorted, Mat k, Mat d, Mat r, Mat p, TermCriteria criteria, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _undistortPoints_Async( + return _cv_undistortPoints( distorted, + undistorted, k, d, r, @@ -1007,36 +622,13 @@ class CvNativeCalib3d { ); } - late final _undistortPoints_AsyncPtr = _lookup< + late final _cv_undistortPointsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, Mat, TermCriteria, - imp1.CvCallback_1)>>('undistortPoints_Async'); - late final _undistortPoints_Async = _undistortPoints_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, Mat, Mat, + TermCriteria, imp1.CvCallback_0)>>('cv_undistortPoints'); + late final _cv_undistortPoints = _cv_undistortPointsPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, Mat, Mat, TermCriteria, imp1.CvCallback_1)>(); - - ffi.Pointer undistort_Async( - Mat src, - Mat cameraMatrix, - Mat distCoeffs, - Mat newCameraMatrix, - imp1.CvCallback_1 callback, - ) { - return _undistort_Async( - src, - cameraMatrix, - distCoeffs, - newCameraMatrix, - callback, - ); - } - - late final _undistort_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, imp1.CvCallback_1)>>('undistort_Async'); - late final _undistort_Async = _undistort_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, Mat, Mat, Mat, TermCriteria, imp1.CvCallback_0)>(); } typedef CvRect = imp1.CvRect; diff --git a/packages/dartcv/lib/src/g/calib3d.yaml b/packages/dartcv/lib/src/g/calib3d.yaml index 6eaa2f2a..7cd399e2 100644 --- a/packages/dartcv/lib/src/g/calib3d.yaml +++ b/packages/dartcv/lib/src/g/calib3d.yaml @@ -1,81 +1,45 @@ format_version: 1.0.0 files: - package:dartcv/src/g/calib3d.g.dart: + package:dartcv4/src/g/calib3d.g.dart: used-config: ffi-native: false symbols: - c:@F@CalibrateCamera: - name: CalibrateCamera - c:@F@DrawChessboardCorners: - name: DrawChessboardCorners - c:@F@EstimateAffine2D: - name: EstimateAffine2D - c:@F@EstimateAffine2DWithParams: - name: EstimateAffine2DWithParams - c:@F@EstimateAffinePartial2D: - name: EstimateAffinePartial2D - c:@F@EstimateAffinePartial2DWithParams: - name: EstimateAffinePartial2DWithParams - c:@F@FindChessboardCorners: - name: FindChessboardCorners - c:@F@FindChessboardCornersSB: - name: FindChessboardCornersSB - c:@F@FindChessboardCornersSBWithMeta: - name: FindChessboardCornersSBWithMeta - c:@F@FindHomography: - name: FindHomography - c:@F@FindHomography_Async: - name: FindHomography_Async - c:@F@Fisheye_EstimateNewCameraMatrixForUndistortRectify: - name: Fisheye_EstimateNewCameraMatrixForUndistortRectify - c:@F@Fisheye_UndistortImage: - name: Fisheye_UndistortImage - c:@F@Fisheye_UndistortImageWithParams: - name: Fisheye_UndistortImageWithParams - c:@F@Fisheye_UndistortPoints: - name: Fisheye_UndistortPoints - c:@F@GetOptimalNewCameraMatrixWithParams: - name: GetOptimalNewCameraMatrixWithParams - c:@F@InitUndistortRectifyMap: - name: InitUndistortRectifyMap - c:@F@Undistort: - name: Undistort - c:@F@UndistortPoints: - name: UndistortPoints - c:@F@calibrateCamera_Async: - name: calibrateCamera_Async - c:@F@drawChessboardCorners_Async: - name: drawChessboardCorners_Async - c:@F@estimateAffine2DWithParams_Async: - name: estimateAffine2DWithParams_Async - c:@F@estimateAffine2D_Async: - name: estimateAffine2D_Async - c:@F@estimateAffinePartial2DWithParams_Async: - name: estimateAffinePartial2DWithParams_Async - c:@F@estimateAffinePartial2D_Async: - name: estimateAffinePartial2D_Async - c:@F@findChessboardCornersSBWithMeta_Async: - name: findChessboardCornersSBWithMeta_Async - c:@F@findChessboardCornersSB_Async: - name: findChessboardCornersSB_Async - c:@F@findChessboardCorners_Async: - name: findChessboardCorners_Async - c:@F@fisheye_estimateNewCameraMatrixForUndistortRectify_Async: - name: fisheye_estimateNewCameraMatrixForUndistortRectify_Async - c:@F@fisheye_undistortImageWithParams_Async: - name: fisheye_undistortImageWithParams_Async - c:@F@fisheye_undistortImage_Async: - name: fisheye_undistortImage_Async - c:@F@fisheye_undistortPoints_Async: - name: fisheye_undistortPoints_Async - c:@F@getOptimalNewCameraMatrix_Async: - name: getOptimalNewCameraMatrix_Async - c:@F@initUndistortRectifyMap_Async: - name: initUndistortRectifyMap_Async - c:@F@undistortPoints_Async: - name: undistortPoints_Async - c:@F@undistort_Async: - name: undistort_Async + c:@F@cv_FindChessboardCornersSB_1: + name: cv_FindChessboardCornersSB_1 + c:@F@cv_calibrateCamera: + name: cv_calibrateCamera + c:@F@cv_drawChessboardCorners: + name: cv_drawChessboardCorners + c:@F@cv_estimateAffine2D: + name: cv_estimateAffine2D + c:@F@cv_estimateAffine2D_1: + name: cv_estimateAffine2D_1 + c:@F@cv_estimateAffinePartial2D: + name: cv_estimateAffinePartial2D + c:@F@cv_estimateAffinePartial2D_1: + name: cv_estimateAffinePartial2D_1 + c:@F@cv_findChessboardCorners: + name: cv_findChessboardCorners + c:@F@cv_findChessboardCornersSB: + name: cv_findChessboardCornersSB + c:@F@cv_findHomography: + name: cv_findHomography + c:@F@cv_fisheye_estimateNewCameraMatrixForUndistortRectify: + name: cv_fisheye_estimateNewCameraMatrixForUndistortRectify + c:@F@cv_fisheye_undistortImage: + name: cv_fisheye_undistortImage + c:@F@cv_fisheye_undistortImage_1: + name: cv_fisheye_undistortImage_1 + c:@F@cv_fisheye_undistortPoints: + name: cv_fisheye_undistortPoints + c:@F@cv_getOptimalNewCameraMatrix: + name: cv_getOptimalNewCameraMatrix + c:@F@cv_initUndistortRectifyMap: + name: cv_initUndistortRectifyMap + c:@F@cv_undistort: + name: cv_undistort + c:@F@cv_undistortPoints: + name: cv_undistortPoints c:types.h@T@CvRect: name: CvRect c:types.h@T@CvSize: diff --git a/packages/dartcv/lib/src/g/contrib.g.dart b/packages/dartcv/lib/src/g/contrib.g.dart index fae26b57..1b4686d9 100644 --- a/packages/dartcv/lib/src/g/contrib.g.dart +++ b/packages/dartcv/lib/src/g/contrib.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Contrib /// @@ -30,4786 +30,2848 @@ class CvNativeContrib { lookup) : _lookup = lookup; - void ArucoDetectorParameters_Close( - ArucoDetectorParametersPtr ap, + void cv_aruco_arucoDetector_close( + ArucoDetectorPtr ad, ) { - return _ArucoDetectorParameters_Close( - ap, + return _cv_aruco_arucoDetector_close( + ad, ); } - late final _ArucoDetectorParameters_ClosePtr = _lookup< - ffi.NativeFunction>( - 'ArucoDetectorParameters_Close'); - late final _ArucoDetectorParameters_Close = _ArucoDetectorParameters_ClosePtr - .asFunction(); + late final _cv_aruco_arucoDetector_closePtr = + _lookup>( + 'cv_aruco_arucoDetector_close'); + late final _cv_aruco_arucoDetector_close = _cv_aruco_arucoDetector_closePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_Create( - ffi.Pointer rval, + ffi.Pointer cv_aruco_arucoDetector_create( + ffi.Pointer rval, ) { - return _ArucoDetectorParameters_Create( + return _cv_aruco_arucoDetector_create( rval, ); } - late final _ArucoDetectorParameters_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>( - 'ArucoDetectorParameters_Create'); - late final _ArucoDetectorParameters_Create = - _ArucoDetectorParameters_CreatePtr.asFunction< + late final _cv_aruco_arucoDetector_createPtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>(); + ffi.Pointer)>>('cv_aruco_arucoDetector_create'); + late final _cv_aruco_arucoDetector_create = _cv_aruco_arucoDetector_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer ArucoDetectorParameters_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _ArucoDetectorParameters_Create_Async( - callback, - ); - } - - late final _ArucoDetectorParameters_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_Create_Async'); - late final _ArucoDetectorParameters_Create_Async = - _ArucoDetectorParameters_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer ArucoDetectorParameters_GetAdaptiveThreshConstant( - ArucoDetectorParameters ap, - ffi.Pointer rval, + ffi.Pointer cv_aruco_arucoDetector_create_1( + ArucoDictionary dictionary, + ArucoDetectorParams params, + ffi.Pointer rval, ) { - return _ArucoDetectorParameters_GetAdaptiveThreshConstant( - ap, + return _cv_aruco_arucoDetector_create_1( + dictionary, + params, rval, ); } - late final _ArucoDetectorParameters_GetAdaptiveThreshConstantPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAdaptiveThreshConstant'); - late final _ArucoDetectorParameters_GetAdaptiveThreshConstant = - _ArucoDetectorParameters_GetAdaptiveThreshConstantPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_arucoDetector_create_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ArucoDictionary, ArucoDetectorParams, + ffi.Pointer)>>('cv_aruco_arucoDetector_create_1'); + late final _cv_aruco_arucoDetector_create_1 = + _cv_aruco_arucoDetector_create_1Ptr.asFunction< + ffi.Pointer Function(ArucoDictionary, ArucoDetectorParams, + ffi.Pointer)>(); - ffi.Pointer ArucoDetectorParameters_GetAdaptiveThreshConstant_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + ffi.Pointer cv_aruco_arucoDetector_detectMarkers( + ArucoDetector ad, + Mat inputArr, + ffi.Pointer markerCorners, + ffi.Pointer markerIds, + ffi.Pointer rejectedCandidates, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_GetAdaptiveThreshConstant_Async( - ap, + return _cv_aruco_arucoDetector_detectMarkers( + ad, + inputArr, + markerCorners, + markerIds, + rejectedCandidates, callback, ); } - late final _ArucoDetectorParameters_GetAdaptiveThreshConstant_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAdaptiveThreshConstant_Async'); - late final _ArucoDetectorParameters_GetAdaptiveThreshConstant_Async = - _ArucoDetectorParameters_GetAdaptiveThreshConstant_AsyncPtr.asFunction< + late final _cv_aruco_arucoDetector_detectMarkersPtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + ArucoDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_aruco_arucoDetector_detectMarkers'); + late final _cv_aruco_arucoDetector_detectMarkers = + _cv_aruco_arucoDetector_detectMarkersPtr.asFunction< + ffi.Pointer Function( + ArucoDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_arucoDictionary_close( + ArucoDictionaryPtr self, ) { - return _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax( - ap, - rval, + return _cv_aruco_arucoDictionary_close( + self, ); } - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMaxPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax'); - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax = - _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMaxPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_arucoDictionary_closePtr = + _lookup>( + 'cv_aruco_arucoDictionary_close'); + late final _cv_aruco_arucoDictionary_close = + _cv_aruco_arucoDictionary_closePtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_close( + ArucoDetectorParamsPtr ap, ) { - return _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_Async( + return _cv_aruco_detectorParameters_close( ap, - callback, ); } - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_Async'); - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_Async = - _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_closePtr = + _lookup>( + 'cv_aruco_detectorParameters_close'); + late final _cv_aruco_detectorParameters_close = + _cv_aruco_detectorParameters_closePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin( - ArucoDetectorParameters ap, - ffi.Pointer rval, + ffi.Pointer cv_aruco_detectorParameters_create( + ffi.Pointer rval, ) { - return _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin( - ap, + return _cv_aruco_detectorParameters_create( rval, ); } - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMinPtr = _lookup< + late final _cv_aruco_detectorParameters_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin'); - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin = - _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMinPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + ffi.Pointer)>>( + 'cv_aruco_detectorParameters_create'); + late final _cv_aruco_detectorParameters_create = + _cv_aruco_detectorParameters_createPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer - ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_adaptiveThreshConstant( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_adaptiveThreshConstant( + self, ); } - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_Async'); - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_Async = - _ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_adaptiveThreshConstantPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_adaptiveThreshConstant'); + late final _cv_aruco_detectorParameters_get_adaptiveThreshConstant = + _cv_aruco_detectorParameters_get_adaptiveThreshConstantPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep( - ArucoDetectorParameters ap, - ffi.Pointer rval, + int cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMax( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep( - ap, - rval, + return _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMax( + self, ); } - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeStepPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep'); - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep = - _ArucoDetectorParameters_GetAdaptiveThreshWinSizeStepPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMaxPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMax'); + late final _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMax = + _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMaxPtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + int cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMin( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMin( + self, ); } - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_Async'); - late final _ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_Async = - _ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMinPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMin'); + late final _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMin = + _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMinPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagCriticalRad( - ArucoDetectorParameters ap, - ffi.Pointer rval, + int cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStep( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagCriticalRad( - ap, - rval, + return _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStep( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagCriticalRadPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAprilTagCriticalRad'); - late final _ArucoDetectorParameters_GetAprilTagCriticalRad = - _ArucoDetectorParameters_GetAprilTagCriticalRadPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStepPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStep'); + late final _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStep = + _cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStepPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagCriticalRad_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_aprilTagCriticalRad( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagCriticalRad_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_aprilTagCriticalRad( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagCriticalRad_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAprilTagCriticalRad_Async'); - late final _ArucoDetectorParameters_GetAprilTagCriticalRad_Async = - _ArucoDetectorParameters_GetAprilTagCriticalRad_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_aprilTagCriticalRadPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_aprilTagCriticalRad'); + late final _cv_aruco_detectorParameters_get_aprilTagCriticalRad = + _cv_aruco_detectorParameters_get_aprilTagCriticalRadPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagDeglitch( - ArucoDetectorParameters ap, - ffi.Pointer rval, + int cv_aruco_detectorParameters_get_aprilTagDeglitch( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagDeglitch( - ap, - rval, + return _cv_aruco_detectorParameters_get_aprilTagDeglitch( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagDeglitchPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAprilTagDeglitch'); - late final _ArucoDetectorParameters_GetAprilTagDeglitch = - _ArucoDetectorParameters_GetAprilTagDeglitchPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_aprilTagDeglitchPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_aprilTagDeglitch'); + late final _cv_aruco_detectorParameters_get_aprilTagDeglitch = + _cv_aruco_detectorParameters_get_aprilTagDeglitchPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagDeglitch_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_aprilTagMaxLineFitMse( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagDeglitch_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_aprilTagMaxLineFitMse( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagDeglitch_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAprilTagDeglitch_Async'); - late final _ArucoDetectorParameters_GetAprilTagDeglitch_Async = - _ArucoDetectorParameters_GetAprilTagDeglitch_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_aprilTagMaxLineFitMsePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_aprilTagMaxLineFitMse'); + late final _cv_aruco_detectorParameters_get_aprilTagMaxLineFitMse = + _cv_aruco_detectorParameters_get_aprilTagMaxLineFitMsePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagMaxLineFitMse( - ArucoDetectorParameters ap, - ffi.Pointer rval, + int cv_aruco_detectorParameters_get_aprilTagMaxNmaxima( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagMaxLineFitMse( - ap, - rval, + return _cv_aruco_detectorParameters_get_aprilTagMaxNmaxima( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagMaxLineFitMsePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAprilTagMaxLineFitMse'); - late final _ArucoDetectorParameters_GetAprilTagMaxLineFitMse = - _ArucoDetectorParameters_GetAprilTagMaxLineFitMsePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_aprilTagMaxNmaximaPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_aprilTagMaxNmaxima'); + late final _cv_aruco_detectorParameters_get_aprilTagMaxNmaxima = + _cv_aruco_detectorParameters_get_aprilTagMaxNmaximaPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagMaxLineFitMse_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + int cv_aruco_detectorParameters_get_aprilTagMinClusterPixels( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagMaxLineFitMse_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_aprilTagMinClusterPixels( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagMaxLineFitMse_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAprilTagMaxLineFitMse_Async'); - late final _ArucoDetectorParameters_GetAprilTagMaxLineFitMse_Async = - _ArucoDetectorParameters_GetAprilTagMaxLineFitMse_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_aprilTagMinClusterPixelsPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_aprilTagMinClusterPixels'); + late final _cv_aruco_detectorParameters_get_aprilTagMinClusterPixels = + _cv_aruco_detectorParameters_get_aprilTagMinClusterPixelsPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagMaxNmaxima( - ArucoDetectorParameters ap, - ffi.Pointer rval, + int cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiff( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagMaxNmaxima( - ap, - rval, + return _cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiff( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagMaxNmaximaPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAprilTagMaxNmaxima'); - late final _ArucoDetectorParameters_GetAprilTagMaxNmaxima = - _ArucoDetectorParameters_GetAprilTagMaxNmaximaPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiffPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiff'); + late final _cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiff = + _cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiffPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagMaxNmaxima_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_aprilTagQuadDecimate( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagMaxNmaxima_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_aprilTagQuadDecimate( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagMaxNmaxima_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAprilTagMaxNmaxima_Async'); - late final _ArucoDetectorParameters_GetAprilTagMaxNmaxima_Async = - _ArucoDetectorParameters_GetAprilTagMaxNmaxima_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_aprilTagQuadDecimatePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_aprilTagQuadDecimate'); + late final _cv_aruco_detectorParameters_get_aprilTagQuadDecimate = + _cv_aruco_detectorParameters_get_aprilTagQuadDecimatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagMinClusterPixels( - ArucoDetectorParameters ap, - ffi.Pointer rval, + double cv_aruco_detectorParameters_get_aprilTagQuadSigma( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagMinClusterPixels( - ap, - rval, + return _cv_aruco_detectorParameters_get_aprilTagQuadSigma( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagMinClusterPixelsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAprilTagMinClusterPixels'); - late final _ArucoDetectorParameters_GetAprilTagMinClusterPixels = - _ArucoDetectorParameters_GetAprilTagMinClusterPixelsPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_aprilTagQuadSigmaPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_aprilTagQuadSigma'); + late final _cv_aruco_detectorParameters_get_aprilTagQuadSigma = + _cv_aruco_detectorParameters_get_aprilTagQuadSigmaPtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetAprilTagMinClusterPixels_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + int cv_aruco_detectorParameters_get_cornerRefinementMaxIterations( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagMinClusterPixels_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_cornerRefinementMaxIterations( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagMinClusterPixels_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAprilTagMinClusterPixels_Async'); - late final _ArucoDetectorParameters_GetAprilTagMinClusterPixels_Async = - _ArucoDetectorParameters_GetAprilTagMinClusterPixels_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_cornerRefinementMaxIterationsPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_cornerRefinementMaxIterations'); + late final _cv_aruco_detectorParameters_get_cornerRefinementMaxIterations = + _cv_aruco_detectorParameters_get_cornerRefinementMaxIterationsPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff( - ArucoDetectorParameters ap, - ffi.Pointer rval, + int cv_aruco_detectorParameters_get_cornerRefinementMethod( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff( - ap, - rval, + return _cv_aruco_detectorParameters_get_cornerRefinementMethod( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiffPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff'); - late final _ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff = - _ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiffPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_cornerRefinementMethodPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_cornerRefinementMethod'); + late final _cv_aruco_detectorParameters_get_cornerRefinementMethod = + _cv_aruco_detectorParameters_get_cornerRefinementMethodPtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_cornerRefinementMinAccuracy( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_cornerRefinementMinAccuracy( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_Async'); - late final _ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_Async = - _ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_cornerRefinementMinAccuracyPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_cornerRefinementMinAccuracy'); + late final _cv_aruco_detectorParameters_get_cornerRefinementMinAccuracy = + _cv_aruco_detectorParameters_get_cornerRefinementMinAccuracyPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagQuadDecimate( - ArucoDetectorParameters ap, - ffi.Pointer rval, + int cv_aruco_detectorParameters_get_cornerRefinementWinSize( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagQuadDecimate( - ap, - rval, + return _cv_aruco_detectorParameters_get_cornerRefinementWinSize( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagQuadDecimatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAprilTagQuadDecimate'); - late final _ArucoDetectorParameters_GetAprilTagQuadDecimate = - _ArucoDetectorParameters_GetAprilTagQuadDecimatePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_cornerRefinementWinSizePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_cornerRefinementWinSize'); + late final _cv_aruco_detectorParameters_get_cornerRefinementWinSize = + _cv_aruco_detectorParameters_get_cornerRefinementWinSizePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagQuadDecimate_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + bool cv_aruco_detectorParameters_get_detectInvertedMarker( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagQuadDecimate_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_detectInvertedMarker( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagQuadDecimate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAprilTagQuadDecimate_Async'); - late final _ArucoDetectorParameters_GetAprilTagQuadDecimate_Async = - _ArucoDetectorParameters_GetAprilTagQuadDecimate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_detectInvertedMarkerPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_detectInvertedMarker'); + late final _cv_aruco_detectorParameters_get_detectInvertedMarker = + _cv_aruco_detectorParameters_get_detectInvertedMarkerPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagQuadSigma( - ArucoDetectorParameters ap, - ffi.Pointer rval, + double cv_aruco_detectorParameters_get_errorCorrectionRate( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagQuadSigma( - ap, - rval, + return _cv_aruco_detectorParameters_get_errorCorrectionRate( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagQuadSigmaPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetAprilTagQuadSigma'); - late final _ArucoDetectorParameters_GetAprilTagQuadSigma = - _ArucoDetectorParameters_GetAprilTagQuadSigmaPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_errorCorrectionRatePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_errorCorrectionRate'); + late final _cv_aruco_detectorParameters_get_errorCorrectionRate = + _cv_aruco_detectorParameters_get_errorCorrectionRatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetAprilTagQuadSigma_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + int cv_aruco_detectorParameters_get_markerBorderBits( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetAprilTagQuadSigma_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_markerBorderBits( + self, ); } - late final _ArucoDetectorParameters_GetAprilTagQuadSigma_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetAprilTagQuadSigma_Async'); - late final _ArucoDetectorParameters_GetAprilTagQuadSigma_Async = - _ArucoDetectorParameters_GetAprilTagQuadSigma_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_markerBorderBitsPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_markerBorderBits'); + late final _cv_aruco_detectorParameters_get_markerBorderBits = + _cv_aruco_detectorParameters_get_markerBorderBitsPtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetCornerRefinementMaxIterations( - ArucoDetectorParameters ap, - ffi.Pointer rval, + double cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRate( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetCornerRefinementMaxIterations( - ap, - rval, + return _cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRate( + self, ); } - late final _ArucoDetectorParameters_GetCornerRefinementMaxIterationsPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetCornerRefinementMaxIterations'); - late final _ArucoDetectorParameters_GetCornerRefinementMaxIterations = - _ArucoDetectorParameters_GetCornerRefinementMaxIterationsPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRatePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRate'); + late final _cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRate = + _cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRatePtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetCornerRefinementMaxIterations_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_maxMarkerPerimeterRate( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetCornerRefinementMaxIterations_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_maxMarkerPerimeterRate( + self, ); } - late final _ArucoDetectorParameters_GetCornerRefinementMaxIterations_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetCornerRefinementMaxIterations_Async'); - late final _ArucoDetectorParameters_GetCornerRefinementMaxIterations_Async = - _ArucoDetectorParameters_GetCornerRefinementMaxIterations_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_maxMarkerPerimeterRatePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_maxMarkerPerimeterRate'); + late final _cv_aruco_detectorParameters_get_maxMarkerPerimeterRate = + _cv_aruco_detectorParameters_get_maxMarkerPerimeterRatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetCornerRefinementMethod( - ArucoDetectorParameters ap, - ffi.Pointer rval, + double cv_aruco_detectorParameters_get_minCornerDistanceRate( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetCornerRefinementMethod( - ap, - rval, + return _cv_aruco_detectorParameters_get_minCornerDistanceRate( + self, ); } - late final _ArucoDetectorParameters_GetCornerRefinementMethodPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetCornerRefinementMethod'); - late final _ArucoDetectorParameters_GetCornerRefinementMethod = - _ArucoDetectorParameters_GetCornerRefinementMethodPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_minCornerDistanceRatePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_minCornerDistanceRate'); + late final _cv_aruco_detectorParameters_get_minCornerDistanceRate = + _cv_aruco_detectorParameters_get_minCornerDistanceRatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetCornerRefinementMethod_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + int cv_aruco_detectorParameters_get_minDistanceToBorder( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetCornerRefinementMethod_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_minDistanceToBorder( + self, ); } - late final _ArucoDetectorParameters_GetCornerRefinementMethod_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetCornerRefinementMethod_Async'); - late final _ArucoDetectorParameters_GetCornerRefinementMethod_Async = - _ArucoDetectorParameters_GetCornerRefinementMethod_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_minDistanceToBorderPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_minDistanceToBorder'); + late final _cv_aruco_detectorParameters_get_minDistanceToBorder = + _cv_aruco_detectorParameters_get_minDistanceToBorderPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetCornerRefinementMinAccuracy( - ArucoDetectorParameters ap, - ffi.Pointer rval, + double cv_aruco_detectorParameters_get_minMarkerDistanceRate( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetCornerRefinementMinAccuracy( - ap, - rval, + return _cv_aruco_detectorParameters_get_minMarkerDistanceRate( + self, ); } - late final _ArucoDetectorParameters_GetCornerRefinementMinAccuracyPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetCornerRefinementMinAccuracy'); - late final _ArucoDetectorParameters_GetCornerRefinementMinAccuracy = - _ArucoDetectorParameters_GetCornerRefinementMinAccuracyPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_minMarkerDistanceRatePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_minMarkerDistanceRate'); + late final _cv_aruco_detectorParameters_get_minMarkerDistanceRate = + _cv_aruco_detectorParameters_get_minMarkerDistanceRatePtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetCornerRefinementMinAccuracy_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_minMarkerPerimeterRate( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetCornerRefinementMinAccuracy_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_minMarkerPerimeterRate( + self, ); } - late final _ArucoDetectorParameters_GetCornerRefinementMinAccuracy_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetCornerRefinementMinAccuracy_Async'); - late final _ArucoDetectorParameters_GetCornerRefinementMinAccuracy_Async = - _ArucoDetectorParameters_GetCornerRefinementMinAccuracy_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_minMarkerPerimeterRatePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_minMarkerPerimeterRate'); + late final _cv_aruco_detectorParameters_get_minMarkerPerimeterRate = + _cv_aruco_detectorParameters_get_minMarkerPerimeterRatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetCornerRefinementWinSize( - ArucoDetectorParameters ap, - ffi.Pointer rval, + double cv_aruco_detectorParameters_get_minOtsuStdDev( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetCornerRefinementWinSize( - ap, - rval, + return _cv_aruco_detectorParameters_get_minOtsuStdDev( + self, ); } - late final _ArucoDetectorParameters_GetCornerRefinementWinSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetCornerRefinementWinSize'); - late final _ArucoDetectorParameters_GetCornerRefinementWinSize = - _ArucoDetectorParameters_GetCornerRefinementWinSizePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_minOtsuStdDevPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_minOtsuStdDev'); + late final _cv_aruco_detectorParameters_get_minOtsuStdDev = + _cv_aruco_detectorParameters_get_minOtsuStdDevPtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetCornerRefinementWinSize_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCell( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetCornerRefinementWinSize_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCell( + self, ); } - late final _ArucoDetectorParameters_GetCornerRefinementWinSize_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetCornerRefinementWinSize_Async'); - late final _ArucoDetectorParameters_GetCornerRefinementWinSize_Async = - _ArucoDetectorParameters_GetCornerRefinementWinSize_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCellPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCell'); + late final _cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCell = + _cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCellPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetDetectInvertedMarker( - ArucoDetectorParameters ap, - ffi.Pointer rval, + int cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCell( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetDetectInvertedMarker( - ap, - rval, + return _cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCell( + self, ); } - late final _ArucoDetectorParameters_GetDetectInvertedMarkerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetDetectInvertedMarker'); - late final _ArucoDetectorParameters_GetDetectInvertedMarker = - _ArucoDetectorParameters_GetDetectInvertedMarkerPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCellPtr = + _lookup>( + 'cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCell'); + late final _cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCell = + _cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCellPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetDetectInvertedMarker_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + double cv_aruco_detectorParameters_get_polygonalApproxAccuracyRate( + ArucoDetectorParams self, ) { - return _ArucoDetectorParameters_GetDetectInvertedMarker_Async( - ap, - callback, + return _cv_aruco_detectorParameters_get_polygonalApproxAccuracyRate( + self, ); } - late final _ArucoDetectorParameters_GetDetectInvertedMarker_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetDetectInvertedMarker_Async'); - late final _ArucoDetectorParameters_GetDetectInvertedMarker_Async = - _ArucoDetectorParameters_GetDetectInvertedMarker_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_get_polygonalApproxAccuracyRatePtr = + _lookup>( + 'cv_aruco_detectorParameters_get_polygonalApproxAccuracyRate'); + late final _cv_aruco_detectorParameters_get_polygonalApproxAccuracyRate = + _cv_aruco_detectorParameters_get_polygonalApproxAccuracyRatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetErrorCorrectionRate( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_adaptiveThreshConstant( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetErrorCorrectionRate( - ap, - rval, + return _cv_aruco_detectorParameters_set_adaptiveThreshConstant( + self, + value, ); } - late final _ArucoDetectorParameters_GetErrorCorrectionRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetErrorCorrectionRate'); - late final _ArucoDetectorParameters_GetErrorCorrectionRate = - _ArucoDetectorParameters_GetErrorCorrectionRatePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_adaptiveThreshConstantPtr = + _lookup< + ffi.NativeFunction< + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_adaptiveThreshConstant'); + late final _cv_aruco_detectorParameters_set_adaptiveThreshConstant = + _cv_aruco_detectorParameters_set_adaptiveThreshConstantPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetErrorCorrectionRate_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMax( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetErrorCorrectionRate_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMax( + self, + value, ); } - late final _ArucoDetectorParameters_GetErrorCorrectionRate_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetErrorCorrectionRate_Async'); - late final _ArucoDetectorParameters_GetErrorCorrectionRate_Async = - _ArucoDetectorParameters_GetErrorCorrectionRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMaxPtr = + _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMax'); + late final _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMax = + _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMaxPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMarkerBorderBits( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMin( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMarkerBorderBits( - ap, - rval, + return _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMin( + self, + value, ); } - late final _ArucoDetectorParameters_GetMarkerBorderBitsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetMarkerBorderBits'); - late final _ArucoDetectorParameters_GetMarkerBorderBits = - _ArucoDetectorParameters_GetMarkerBorderBitsPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMinPtr = + _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMin'); + late final _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMin = + _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMinPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMarkerBorderBits_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStep( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMarkerBorderBits_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStep( + self, + value, ); } - late final _ArucoDetectorParameters_GetMarkerBorderBits_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetMarkerBorderBits_Async'); - late final _ArucoDetectorParameters_GetMarkerBorderBits_Async = - _ArucoDetectorParameters_GetMarkerBorderBits_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStepPtr = + _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStep'); + late final _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStep = + _cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStepPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_aprilTagCriticalRad( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate( - ap, - rval, + return _cv_aruco_detectorParameters_set_aprilTagCriticalRad( + self, + value, ); } - late final _ArucoDetectorParameters_GetMaxErroneousBitsInBorderRatePtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate'); - late final _ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate = - _ArucoDetectorParameters_GetMaxErroneousBitsInBorderRatePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_aprilTagCriticalRadPtr = _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_aprilTagCriticalRad'); + late final _cv_aruco_detectorParameters_set_aprilTagCriticalRad = + _cv_aruco_detectorParameters_set_aprilTagCriticalRadPtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_aprilTagDeglitch( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_aprilTagDeglitch( + self, + value, + ); + } + + late final _cv_aruco_detectorParameters_set_aprilTagDeglitchPtr = _lookup< + ffi.NativeFunction>( + 'cv_aruco_detectorParameters_set_aprilTagDeglitch'); + late final _cv_aruco_detectorParameters_set_aprilTagDeglitch = + _cv_aruco_detectorParameters_set_aprilTagDeglitchPtr + .asFunction(); + + void cv_aruco_detectorParameters_set_aprilTagMaxLineFitMse( + ArucoDetectorParams self, + double value, + ) { + return _cv_aruco_detectorParameters_set_aprilTagMaxLineFitMse( + self, + value, ); } - late final _ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_AsyncPtr = + late final _cv_aruco_detectorParameters_set_aprilTagMaxLineFitMsePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_Async'); - late final _ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_Async = - _ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Float)>>( + 'cv_aruco_detectorParameters_set_aprilTagMaxLineFitMse'); + late final _cv_aruco_detectorParameters_set_aprilTagMaxLineFitMse = + _cv_aruco_detectorParameters_set_aprilTagMaxLineFitMsePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMaxMarkerPerimeterRate( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_aprilTagMaxNmaxima( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMaxMarkerPerimeterRate( - ap, - rval, + return _cv_aruco_detectorParameters_set_aprilTagMaxNmaxima( + self, + value, ); } - late final _ArucoDetectorParameters_GetMaxMarkerPerimeterRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetMaxMarkerPerimeterRate'); - late final _ArucoDetectorParameters_GetMaxMarkerPerimeterRate = - _ArucoDetectorParameters_GetMaxMarkerPerimeterRatePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_aprilTagMaxNmaximaPtr = _lookup< + ffi.NativeFunction>( + 'cv_aruco_detectorParameters_set_aprilTagMaxNmaxima'); + late final _cv_aruco_detectorParameters_set_aprilTagMaxNmaxima = + _cv_aruco_detectorParameters_set_aprilTagMaxNmaximaPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMaxMarkerPerimeterRate_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_aprilTagMinClusterPixels( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMaxMarkerPerimeterRate_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_aprilTagMinClusterPixels( + self, + value, ); } - late final _ArucoDetectorParameters_GetMaxMarkerPerimeterRate_AsyncPtr = + late final _cv_aruco_detectorParameters_set_aprilTagMinClusterPixelsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetMaxMarkerPerimeterRate_Async'); - late final _ArucoDetectorParameters_GetMaxMarkerPerimeterRate_Async = - _ArucoDetectorParameters_GetMaxMarkerPerimeterRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_aprilTagMinClusterPixels'); + late final _cv_aruco_detectorParameters_set_aprilTagMinClusterPixels = + _cv_aruco_detectorParameters_set_aprilTagMinClusterPixelsPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinCornerDistanceRate( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiff( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMinCornerDistanceRate( - ap, - rval, + return _cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiff( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinCornerDistanceRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetMinCornerDistanceRate'); - late final _ArucoDetectorParameters_GetMinCornerDistanceRate = - _ArucoDetectorParameters_GetMinCornerDistanceRatePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiffPtr = + _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiff'); + late final _cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiff = + _cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiffPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinCornerDistanceRate_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_aprilTagQuadDecimate( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetMinCornerDistanceRate_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_aprilTagQuadDecimate( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinCornerDistanceRate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetMinCornerDistanceRate_Async'); - late final _ArucoDetectorParameters_GetMinCornerDistanceRate_Async = - _ArucoDetectorParameters_GetMinCornerDistanceRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_set_aprilTagQuadDecimatePtr = _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_aprilTagQuadDecimate'); + late final _cv_aruco_detectorParameters_set_aprilTagQuadDecimate = + _cv_aruco_detectorParameters_set_aprilTagQuadDecimatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinDistanceToBorder( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_aprilTagQuadSigma( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetMinDistanceToBorder( - ap, - rval, + return _cv_aruco_detectorParameters_set_aprilTagQuadSigma( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinDistanceToBorderPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetMinDistanceToBorder'); - late final _ArucoDetectorParameters_GetMinDistanceToBorder = - _ArucoDetectorParameters_GetMinDistanceToBorderPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_aprilTagQuadSigmaPtr = _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_aprilTagQuadSigma'); + late final _cv_aruco_detectorParameters_set_aprilTagQuadSigma = + _cv_aruco_detectorParameters_set_aprilTagQuadSigmaPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinDistanceToBorder_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_cornerRefinementMaxIterations( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMinDistanceToBorder_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_cornerRefinementMaxIterations( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinDistanceToBorder_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetMinDistanceToBorder_Async'); - late final _ArucoDetectorParameters_GetMinDistanceToBorder_Async = - _ArucoDetectorParameters_GetMinDistanceToBorder_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_set_cornerRefinementMaxIterationsPtr = + _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_cornerRefinementMaxIterations'); + late final _cv_aruco_detectorParameters_set_cornerRefinementMaxIterations = + _cv_aruco_detectorParameters_set_cornerRefinementMaxIterationsPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinMarkerDistanceRate( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_cornerRefinementMethod( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMinMarkerDistanceRate( - ap, - rval, + return _cv_aruco_detectorParameters_set_cornerRefinementMethod( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinMarkerDistanceRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetMinMarkerDistanceRate'); - late final _ArucoDetectorParameters_GetMinMarkerDistanceRate = - _ArucoDetectorParameters_GetMinMarkerDistanceRatePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_cornerRefinementMethodPtr = + _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_cornerRefinementMethod'); + late final _cv_aruco_detectorParameters_set_cornerRefinementMethod = + _cv_aruco_detectorParameters_set_cornerRefinementMethodPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinMarkerDistanceRate_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_cornerRefinementMinAccuracy( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetMinMarkerDistanceRate_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_cornerRefinementMinAccuracy( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinMarkerDistanceRate_AsyncPtr = + late final _cv_aruco_detectorParameters_set_cornerRefinementMinAccuracyPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetMinMarkerDistanceRate_Async'); - late final _ArucoDetectorParameters_GetMinMarkerDistanceRate_Async = - _ArucoDetectorParameters_GetMinMarkerDistanceRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_cornerRefinementMinAccuracy'); + late final _cv_aruco_detectorParameters_set_cornerRefinementMinAccuracy = + _cv_aruco_detectorParameters_set_cornerRefinementMinAccuracyPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinMarkerPerimeterRate( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_cornerRefinementWinSize( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMinMarkerPerimeterRate( - ap, - rval, + return _cv_aruco_detectorParameters_set_cornerRefinementWinSize( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinMarkerPerimeterRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetMinMarkerPerimeterRate'); - late final _ArucoDetectorParameters_GetMinMarkerPerimeterRate = - _ArucoDetectorParameters_GetMinMarkerPerimeterRatePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_cornerRefinementWinSizePtr = + _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_cornerRefinementWinSize'); + late final _cv_aruco_detectorParameters_set_cornerRefinementWinSize = + _cv_aruco_detectorParameters_set_cornerRefinementWinSizePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinMarkerPerimeterRate_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_detectInvertedMarker( + ArucoDetectorParams self, + bool value, ) { - return _ArucoDetectorParameters_GetMinMarkerPerimeterRate_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_detectInvertedMarker( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinMarkerPerimeterRate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetMinMarkerPerimeterRate_Async'); - late final _ArucoDetectorParameters_GetMinMarkerPerimeterRate_Async = - _ArucoDetectorParameters_GetMinMarkerPerimeterRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_set_detectInvertedMarkerPtr = _lookup< + ffi.NativeFunction>( + 'cv_aruco_detectorParameters_set_detectInvertedMarker'); + late final _cv_aruco_detectorParameters_set_detectInvertedMarker = + _cv_aruco_detectorParameters_set_detectInvertedMarkerPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinOtsuStdDev( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_errorCorrectionRate( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetMinOtsuStdDev( - ap, - rval, + return _cv_aruco_detectorParameters_set_errorCorrectionRate( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinOtsuStdDevPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetMinOtsuStdDev'); - late final _ArucoDetectorParameters_GetMinOtsuStdDev = - _ArucoDetectorParameters_GetMinOtsuStdDevPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + late final _cv_aruco_detectorParameters_set_errorCorrectionRatePtr = _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_errorCorrectionRate'); + late final _cv_aruco_detectorParameters_set_errorCorrectionRate = + _cv_aruco_detectorParameters_set_errorCorrectionRatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetMinOtsuStdDev_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_markerBorderBits( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetMinOtsuStdDev_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_markerBorderBits( + self, + value, ); } - late final _ArucoDetectorParameters_GetMinOtsuStdDev_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetMinOtsuStdDev_Async'); - late final _ArucoDetectorParameters_GetMinOtsuStdDev_Async = - _ArucoDetectorParameters_GetMinOtsuStdDev_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_set_markerBorderBitsPtr = _lookup< + ffi.NativeFunction>( + 'cv_aruco_detectorParameters_set_markerBorderBits'); + late final _cv_aruco_detectorParameters_set_markerBorderBits = + _cv_aruco_detectorParameters_set_markerBorderBitsPtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRate( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell( - ap, - rval, + return _cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRate( + self, + value, ); } - late final _ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCellPtr = + late final _cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell'); - late final _ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell = - _ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCellPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRate'); + late final _cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRate = + _cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRatePtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_maxMarkerPerimeterRate( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_maxMarkerPerimeterRate( + self, + value, ); } - late final _ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_AsyncPtr = + late final _cv_aruco_detectorParameters_set_maxMarkerPerimeterRatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_Async'); - late final _ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_Async = - _ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_maxMarkerPerimeterRate'); + late final _cv_aruco_detectorParameters_set_maxMarkerPerimeterRate = + _cv_aruco_detectorParameters_set_maxMarkerPerimeterRatePtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_minCornerDistanceRate( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell( - ap, - rval, + return _cv_aruco_detectorParameters_set_minCornerDistanceRate( + self, + value, ); } - late final _ArucoDetectorParameters_GetPerspectiveRemovePixelPerCellPtr = + late final _cv_aruco_detectorParameters_set_minCornerDistanceRatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell'); - late final _ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell = - _ArucoDetectorParameters_GetPerspectiveRemovePixelPerCellPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_minCornerDistanceRate'); + late final _cv_aruco_detectorParameters_set_minCornerDistanceRate = + _cv_aruco_detectorParameters_set_minCornerDistanceRatePtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_minDistanceToBorder( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_minDistanceToBorder( + self, + value, ); } - late final _ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_Async'); - late final _ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_Async = - _ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + late final _cv_aruco_detectorParameters_set_minDistanceToBorderPtr = _lookup< + ffi.NativeFunction>( + 'cv_aruco_detectorParameters_set_minDistanceToBorder'); + late final _cv_aruco_detectorParameters_set_minDistanceToBorder = + _cv_aruco_detectorParameters_set_minDistanceToBorderPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_GetPolygonalApproxAccuracyRate( - ArucoDetectorParameters ap, - ffi.Pointer rval, + void cv_aruco_detectorParameters_set_minMarkerDistanceRate( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetPolygonalApproxAccuracyRate( - ap, - rval, + return _cv_aruco_detectorParameters_set_minMarkerDistanceRate( + self, + value, ); } - late final _ArucoDetectorParameters_GetPolygonalApproxAccuracyRatePtr = + late final _cv_aruco_detectorParameters_set_minMarkerDistanceRatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>>( - 'ArucoDetectorParameters_GetPolygonalApproxAccuracyRate'); - late final _ArucoDetectorParameters_GetPolygonalApproxAccuracyRate = - _ArucoDetectorParameters_GetPolygonalApproxAccuracyRatePtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Pointer)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_minMarkerDistanceRate'); + late final _cv_aruco_detectorParameters_set_minMarkerDistanceRate = + _cv_aruco_detectorParameters_set_minMarkerDistanceRatePtr + .asFunction(); - ffi.Pointer - ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_Async( - ArucoDetectorParameters ap, - imp1.CvCallback_1 callback, + void cv_aruco_detectorParameters_set_minMarkerPerimeterRate( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_Async( - ap, - callback, + return _cv_aruco_detectorParameters_set_minMarkerPerimeterRate( + self, + value, ); } - late final _ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_AsyncPtr = + late final _cv_aruco_detectorParameters_set_minMarkerPerimeterRatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>>( - 'ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_Async'); - late final _ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_Async = - _ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, imp1.CvCallback_1)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_minMarkerPerimeterRate'); + late final _cv_aruco_detectorParameters_set_minMarkerPerimeterRate = + _cv_aruco_detectorParameters_set_minMarkerPerimeterRatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_SetAdaptiveThreshConstant( - ArucoDetectorParameters ap, - double adaptiveThreshConstant, + void cv_aruco_detectorParameters_set_minOtsuStdDev( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_SetAdaptiveThreshConstant( - ap, - adaptiveThreshConstant, + return _cv_aruco_detectorParameters_set_minOtsuStdDev( + self, + value, ); } - late final _ArucoDetectorParameters_SetAdaptiveThreshConstantPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double)>>( - 'ArucoDetectorParameters_SetAdaptiveThreshConstant'); - late final _ArucoDetectorParameters_SetAdaptiveThreshConstant = - _ArucoDetectorParameters_SetAdaptiveThreshConstantPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetAdaptiveThreshConstant_Async( - ArucoDetectorParameters ap, - double adaptiveThreshConstant, - imp1.CvCallback_0 callback, + late final _cv_aruco_detectorParameters_set_minOtsuStdDevPtr = _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_minOtsuStdDev'); + late final _cv_aruco_detectorParameters_set_minOtsuStdDev = + _cv_aruco_detectorParameters_set_minOtsuStdDevPtr + .asFunction(); + + void cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCell( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_SetAdaptiveThreshConstant_Async( - ap, - adaptiveThreshConstant, - callback, + return _cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCell( + self, + value, ); } - late final _ArucoDetectorParameters_SetAdaptiveThreshConstant_AsyncPtr = + late final _cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCellPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAdaptiveThreshConstant_Async'); - late final _ArucoDetectorParameters_SetAdaptiveThreshConstant_Async = - _ArucoDetectorParameters_SetAdaptiveThreshConstant_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCell'); + late final _cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCell = + _cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCellPtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax( - ArucoDetectorParameters ap, - int adaptiveThreshWinSizeMax, + void cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCell( + ArucoDetectorParams self, + int value, ) { - return _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax( - ap, - adaptiveThreshWinSizeMax, + return _cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCell( + self, + value, ); } - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMaxPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax'); - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax = - _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMaxPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer - ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_Async( - ArucoDetectorParameters ap, - int adaptiveThreshWinSizeMax, - imp1.CvCallback_0 callback, + late final _cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCellPtr = + _lookup< + ffi + .NativeFunction>( + 'cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCell'); + late final _cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCell = + _cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCellPtr + .asFunction(); + + void cv_aruco_detectorParameters_set_polygonalApproxAccuracyRate( + ArucoDetectorParams self, + double value, ) { - return _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_Async( - ap, - adaptiveThreshWinSizeMax, - callback, + return _cv_aruco_detectorParameters_set_polygonalApproxAccuracyRate( + self, + value, ); } - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_AsyncPtr = + late final _cv_aruco_detectorParameters_set_polygonalApproxAccuracyRatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_Async'); - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_Async = - _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); + ffi.Void Function(ArucoDetectorParams, ffi.Double)>>( + 'cv_aruco_detectorParameters_set_polygonalApproxAccuracyRate'); + late final _cv_aruco_detectorParameters_set_polygonalApproxAccuracyRate = + _cv_aruco_detectorParameters_set_polygonalApproxAccuracyRatePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin( - ArucoDetectorParameters ap, - int adaptiveThreshWinSizeMin, + ffi.Pointer cv_aruco_drawDetectedMarkers( + Mat image, + VecVecPoint2f markerCorners, + VecI32 markerIds, + Scalar borderColor, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin( - ap, - adaptiveThreshWinSizeMin, + return _cv_aruco_drawDetectedMarkers( + image, + markerCorners, + markerIds, + borderColor, + callback, ); } - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMinPtr = _lookup< + late final _cv_aruco_drawDetectedMarkersPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin'); - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin = - _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMinPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer - ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_Async( - ArucoDetectorParameters ap, - int adaptiveThreshWinSizeMin, + ffi.Pointer Function(Mat, VecVecPoint2f, VecI32, Scalar, + imp1.CvCallback_0)>>('cv_aruco_drawDetectedMarkers'); + late final _cv_aruco_drawDetectedMarkers = + _cv_aruco_drawDetectedMarkersPtr.asFunction< + ffi.Pointer Function( + Mat, VecVecPoint2f, VecI32, Scalar, imp1.CvCallback_0)>(); + + ffi.Pointer cv_aruco_generateImageMarker( + int dictionaryId, + int id, + int sidePixels, + int borderBits, + Mat dst, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_Async( - ap, - adaptiveThreshWinSizeMin, + return _cv_aruco_generateImageMarker( + dictionaryId, + id, + sidePixels, + borderBits, + dst, callback, ); } - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_Async'); - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_Async = - _ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_AsyncPtr.asFunction< + late final _cv_aruco_generateImageMarkerPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, ffi.Int, + Mat, imp1.CvCallback_0)>>('cv_aruco_generateImageMarker'); + late final _cv_aruco_generateImageMarker = + _cv_aruco_generateImageMarkerPtr.asFunction< ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); + int, int, int, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep( - ArucoDetectorParameters ap, - int adaptiveThreshWinSizeStep, + ffi.Pointer cv_aruco_getPredefinedDictionary( + int dictionaryId, + ffi.Pointer rval, ) { - return _ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep( - ap, - adaptiveThreshWinSizeStep, + return _cv_aruco_getPredefinedDictionary( + dictionaryId, + rval, ); } - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeStepPtr = _lookup< + late final _cv_aruco_getPredefinedDictionaryPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int)>>( - 'ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep'); - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep = - _ArucoDetectorParameters_SetAdaptiveThreshWinSizeStepPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer - ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_Async( - ArucoDetectorParameters ap, - int adaptiveThreshWinSizeStep, - imp1.CvCallback_0 callback, + ffi.Int, ffi.Pointer)>>( + 'cv_aruco_getPredefinedDictionary'); + late final _cv_aruco_getPredefinedDictionary = + _cv_aruco_getPredefinedDictionaryPtr.asFunction< + ffi.Pointer Function(int, ffi.Pointer)>(); + + void cv_img_hash_BlockMeanHash_close( + BlockMeanHashPtr self, ) { - return _ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_Async( - ap, - adaptiveThreshWinSizeStep, - callback, + return _cv_img_hash_BlockMeanHash_close( + self, ); } - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_Async'); - late final _ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_Async = - _ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); + late final _cv_img_hash_BlockMeanHash_closePtr = + _lookup>( + 'cv_img_hash_BlockMeanHash_close'); + late final _cv_img_hash_BlockMeanHash_close = + _cv_img_hash_BlockMeanHash_closePtr + .asFunction(); - ffi.Pointer ArucoDetectorParameters_SetAprilTagCriticalRad( - ArucoDetectorParameters ap, - double aprilTagCriticalRad, + ffi.Pointer cv_img_hash_BlockMeanHash_compare( + BlockMeanHash self, + Mat hashOne, + Mat hashTwo, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagCriticalRad( - ap, - aprilTagCriticalRad, + return _cv_img_hash_BlockMeanHash_compare( + self, + hashOne, + hashTwo, + rval, + callback, ); } - late final _ArucoDetectorParameters_SetAprilTagCriticalRadPtr = _lookup< + late final _cv_img_hash_BlockMeanHash_comparePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Float)>>('ArucoDetectorParameters_SetAprilTagCriticalRad'); - late final _ArucoDetectorParameters_SetAprilTagCriticalRad = - _ArucoDetectorParameters_SetAprilTagCriticalRadPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetAprilTagCriticalRad_Async( - ArucoDetectorParameters ap, - double aprilTagCriticalRad, + ffi.Pointer Function( + BlockMeanHash, + Mat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_img_hash_BlockMeanHash_compare'); + late final _cv_img_hash_BlockMeanHash_compare = + _cv_img_hash_BlockMeanHash_comparePtr.asFunction< + ffi.Pointer Function(BlockMeanHash, Mat, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_img_hash_BlockMeanHash_compute( + BlockMeanHash self, + Mat inputArr, + Mat outputArr, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagCriticalRad_Async( - ap, - aprilTagCriticalRad, + return _cv_img_hash_BlockMeanHash_compute( + self, + inputArr, + outputArr, callback, ); } - late final _ArucoDetectorParameters_SetAprilTagCriticalRad_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Float, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAprilTagCriticalRad_Async'); - late final _ArucoDetectorParameters_SetAprilTagCriticalRad_Async = - _ArucoDetectorParameters_SetAprilTagCriticalRad_AsyncPtr.asFunction< + late final _cv_img_hash_BlockMeanHash_computePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(BlockMeanHash, Mat, Mat, + imp1.CvCallback_0)>>('cv_img_hash_BlockMeanHash_compute'); + late final _cv_img_hash_BlockMeanHash_compute = + _cv_img_hash_BlockMeanHash_computePtr.asFunction< ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); + BlockMeanHash, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetAprilTagDeglitch( - ArucoDetectorParameters ap, - int aprilTagDeglitch, + ffi.Pointer cv_img_hash_BlockMeanHash_create( + int mode, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagDeglitch( - ap, - aprilTagDeglitch, + return _cv_img_hash_BlockMeanHash_create( + mode, + rval, + callback, ); } - late final _ArucoDetectorParameters_SetAprilTagDeglitchPtr = _lookup< + late final _cv_img_hash_BlockMeanHash_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetAprilTagDeglitch'); - late final _ArucoDetectorParameters_SetAprilTagDeglitch = - _ArucoDetectorParameters_SetAprilTagDeglitchPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer ArucoDetectorParameters_SetAprilTagDeglitch_Async( - ArucoDetectorParameters ap, - int aprilTagDeglitch, + ffi.Pointer Function(ffi.Int, ffi.Pointer, + imp1.CvCallback_0)>>('cv_img_hash_BlockMeanHash_create'); + late final _cv_img_hash_BlockMeanHash_create = + _cv_img_hash_BlockMeanHash_createPtr.asFunction< + ffi.Pointer Function( + int, ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_img_hash_BlockMeanHash_getMean( + BlockMeanHash self, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagDeglitch_Async( - ap, - aprilTagDeglitch, + return _cv_img_hash_BlockMeanHash_getMean( + self, + rval, callback, ); } - late final _ArucoDetectorParameters_SetAprilTagDeglitch_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAprilTagDeglitch_Async'); - late final _ArucoDetectorParameters_SetAprilTagDeglitch_Async = - _ArucoDetectorParameters_SetAprilTagDeglitch_AsyncPtr.asFunction< + late final _cv_img_hash_BlockMeanHash_getMeanPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(BlockMeanHash, ffi.Pointer, + imp1.CvCallback_0)>>('cv_img_hash_BlockMeanHash_getMean'); + late final _cv_img_hash_BlockMeanHash_getMean = + _cv_img_hash_BlockMeanHash_getMeanPtr.asFunction< ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); + BlockMeanHash, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetAprilTagMaxLineFitMse( - ArucoDetectorParameters ap, - double aprilTagMaxLineFitMse, + ffi.Pointer cv_img_hash_BlockMeanHash_setMode( + BlockMeanHash self, + int mode, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagMaxLineFitMse( - ap, - aprilTagMaxLineFitMse, + return _cv_img_hash_BlockMeanHash_setMode( + self, + mode, + callback, ); } - late final _ArucoDetectorParameters_SetAprilTagMaxLineFitMsePtr = _lookup< + late final _cv_img_hash_BlockMeanHash_setModePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Float)>>('ArucoDetectorParameters_SetAprilTagMaxLineFitMse'); - late final _ArucoDetectorParameters_SetAprilTagMaxLineFitMse = - _ArucoDetectorParameters_SetAprilTagMaxLineFitMsePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetAprilTagMaxLineFitMse_Async( - ArucoDetectorParameters ap, - double aprilTagMaxLineFitMse, + ffi.Pointer Function(BlockMeanHash, ffi.Int, + imp1.CvCallback_0)>>('cv_img_hash_BlockMeanHash_setMode'); + late final _cv_img_hash_BlockMeanHash_setMode = + _cv_img_hash_BlockMeanHash_setModePtr.asFunction< + ffi.Pointer Function( + BlockMeanHash, int, imp1.CvCallback_0)>(); + + ffi.Pointer cv_img_hash_averageHash_compare( + Mat a, + Mat b, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagMaxLineFitMse_Async( - ap, - aprilTagMaxLineFitMse, + return _cv_img_hash_averageHash_compare( + a, + b, + rval, callback, ); } - late final _ArucoDetectorParameters_SetAprilTagMaxLineFitMse_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Float, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAprilTagMaxLineFitMse_Async'); - late final _ArucoDetectorParameters_SetAprilTagMaxLineFitMse_Async = - _ArucoDetectorParameters_SetAprilTagMaxLineFitMse_AsyncPtr.asFunction< + late final _cv_img_hash_averageHash_comparePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_img_hash_averageHash_compare'); + late final _cv_img_hash_averageHash_compare = + _cv_img_hash_averageHash_comparePtr.asFunction< ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); + Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetAprilTagMaxNmaxima( - ArucoDetectorParameters ap, - int aprilTagMaxNmaxima, + ffi.Pointer cv_img_hash_averageHash_compute( + Mat inputArr, + Mat outputArr, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagMaxNmaxima( - ap, - aprilTagMaxNmaxima, + return _cv_img_hash_averageHash_compute( + inputArr, + outputArr, + callback, ); } - late final _ArucoDetectorParameters_SetAprilTagMaxNmaximaPtr = _lookup< + late final _cv_img_hash_averageHash_computePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetAprilTagMaxNmaxima'); - late final _ArucoDetectorParameters_SetAprilTagMaxNmaxima = - _ArucoDetectorParameters_SetAprilTagMaxNmaximaPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer ArucoDetectorParameters_SetAprilTagMaxNmaxima_Async( - ArucoDetectorParameters ap, - int aprilTagMaxNmaxima, + ffi.Pointer Function( + Mat, Mat, imp1.CvCallback_0)>>('cv_img_hash_averageHash_compute'); + late final _cv_img_hash_averageHash_compute = + _cv_img_hash_averageHash_computePtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_img_hash_colorMomentHash_compare( + Mat a, + Mat b, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagMaxNmaxima_Async( - ap, - aprilTagMaxNmaxima, + return _cv_img_hash_colorMomentHash_compare( + a, + b, + rval, callback, ); } - late final _ArucoDetectorParameters_SetAprilTagMaxNmaxima_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAprilTagMaxNmaxima_Async'); - late final _ArucoDetectorParameters_SetAprilTagMaxNmaxima_Async = - _ArucoDetectorParameters_SetAprilTagMaxNmaxima_AsyncPtr.asFunction< + late final _cv_img_hash_colorMomentHash_comparePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_img_hash_colorMomentHash_compare'); + late final _cv_img_hash_colorMomentHash_compare = + _cv_img_hash_colorMomentHash_comparePtr.asFunction< ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); + Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetAprilTagMinClusterPixels( - ArucoDetectorParameters ap, - int aprilTagMinClusterPixels, + ffi.Pointer cv_img_hash_colorMomentHash_compute( + Mat inputArr, + Mat outputArr, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagMinClusterPixels( - ap, - aprilTagMinClusterPixels, + return _cv_img_hash_colorMomentHash_compute( + inputArr, + outputArr, + callback, ); } - late final _ArucoDetectorParameters_SetAprilTagMinClusterPixelsPtr = _lookup< + late final _cv_img_hash_colorMomentHash_computePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetAprilTagMinClusterPixels'); - late final _ArucoDetectorParameters_SetAprilTagMinClusterPixels = - _ArucoDetectorParameters_SetAprilTagMinClusterPixelsPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer - ArucoDetectorParameters_SetAprilTagMinClusterPixels_Async( - ArucoDetectorParameters ap, - int aprilTagMinClusterPixels, + ffi.Pointer Function(Mat, Mat, + imp1.CvCallback_0)>>('cv_img_hash_colorMomentHash_compute'); + late final _cv_img_hash_colorMomentHash_compute = + _cv_img_hash_colorMomentHash_computePtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_img_hash_marrHildrethHash_compare( + Mat a, + Mat b, + double alpha, + double scale, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagMinClusterPixels_Async( - ap, - aprilTagMinClusterPixels, + return _cv_img_hash_marrHildrethHash_compare( + a, + b, + alpha, + scale, + rval, callback, ); } - late final _ArucoDetectorParameters_SetAprilTagMinClusterPixels_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAprilTagMinClusterPixels_Async'); - late final _ArucoDetectorParameters_SetAprilTagMinClusterPixels_Async = - _ArucoDetectorParameters_SetAprilTagMinClusterPixels_AsyncPtr.asFunction< + late final _cv_img_hash_marrHildrethHash_comparePtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff( - ArucoDetectorParameters ap, - int aprilTagMinWhiteBlackDiff, - ) { - return _ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff( - ap, - aprilTagMinWhiteBlackDiff, - ); - } - - late final _ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiffPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int)>>( - 'ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff'); - late final _ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff = - _ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiffPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer - ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_Async( - ArucoDetectorParameters ap, - int aprilTagMinWhiteBlackDiff, + Mat, + Mat, + ffi.Float, + ffi.Float, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_img_hash_marrHildrethHash_compare'); + late final _cv_img_hash_marrHildrethHash_compare = + _cv_img_hash_marrHildrethHash_comparePtr.asFunction< + ffi.Pointer Function(Mat, Mat, double, double, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_img_hash_marrHildrethHash_compute( + Mat inputArr, + Mat outputArr, + double alpha, + double scale, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_Async( - ap, - aprilTagMinWhiteBlackDiff, + return _cv_img_hash_marrHildrethHash_compute( + inputArr, + outputArr, + alpha, + scale, callback, ); } - late final _ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_Async'); - late final _ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_Async = - _ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_AsyncPtr.asFunction< + late final _cv_img_hash_marrHildrethHash_computePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, + imp1.CvCallback_0)>>('cv_img_hash_marrHildrethHash_compute'); + late final _cv_img_hash_marrHildrethHash_compute = + _cv_img_hash_marrHildrethHash_computePtr.asFunction< ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); + Mat, Mat, double, double, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetAprilTagQuadDecimate( - ArucoDetectorParameters ap, - double aprilTagQuadDecimate, + ffi.Pointer cv_img_hash_pHash_compare( + Mat a, + Mat b, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagQuadDecimate( - ap, - aprilTagQuadDecimate, + return _cv_img_hash_pHash_compare( + a, + b, + rval, + callback, ); } - late final _ArucoDetectorParameters_SetAprilTagQuadDecimatePtr = _lookup< + late final _cv_img_hash_pHash_comparePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Float)>>('ArucoDetectorParameters_SetAprilTagQuadDecimate'); - late final _ArucoDetectorParameters_SetAprilTagQuadDecimate = - _ArucoDetectorParameters_SetAprilTagQuadDecimatePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetAprilTagQuadDecimate_Async( - ArucoDetectorParameters ap, - double aprilTagQuadDecimate, + ffi.Pointer Function(Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_img_hash_pHash_compare'); + late final _cv_img_hash_pHash_compare = + _cv_img_hash_pHash_comparePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_img_hash_pHash_compute( + Mat inputArr, + Mat outputArr, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagQuadDecimate_Async( - ap, - aprilTagQuadDecimate, + return _cv_img_hash_pHash_compute( + inputArr, + outputArr, callback, ); } - late final _ArucoDetectorParameters_SetAprilTagQuadDecimate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Float, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAprilTagQuadDecimate_Async'); - late final _ArucoDetectorParameters_SetAprilTagQuadDecimate_Async = - _ArucoDetectorParameters_SetAprilTagQuadDecimate_AsyncPtr.asFunction< + late final _cv_img_hash_pHash_computePtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_img_hash_pHash_compute'); + late final _cv_img_hash_pHash_compute = + _cv_img_hash_pHash_computePtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetAprilTagQuadSigma( - ArucoDetectorParameters ap, - double aprilTagQuadSigma, + ffi.Pointer cv_img_hash_radialVarianceHash_compare( + Mat a, + Mat b, + double sigma, + int numOfAngleLine, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagQuadSigma( - ap, - aprilTagQuadSigma, + return _cv_img_hash_radialVarianceHash_compare( + a, + b, + sigma, + numOfAngleLine, + rval, + callback, ); } - late final _ArucoDetectorParameters_SetAprilTagQuadSigmaPtr = _lookup< + late final _cv_img_hash_radialVarianceHash_comparePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Float)>>('ArucoDetectorParameters_SetAprilTagQuadSigma'); - late final _ArucoDetectorParameters_SetAprilTagQuadSigma = - _ArucoDetectorParameters_SetAprilTagQuadSigmaPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetAprilTagQuadSigma_Async( - ArucoDetectorParameters ap, - double aprilTagQuadSigma, + ffi.Pointer Function( + Mat, + Mat, + ffi.Double, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_img_hash_radialVarianceHash_compare'); + late final _cv_img_hash_radialVarianceHash_compare = + _cv_img_hash_radialVarianceHash_comparePtr.asFunction< + ffi.Pointer Function(Mat, Mat, double, int, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_img_hash_radialVarianceHash_compute( + Mat inputArr, + Mat outputArr, + double sigma, + int numOfAngleLine, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetAprilTagQuadSigma_Async( - ap, - aprilTagQuadSigma, + return _cv_img_hash_radialVarianceHash_compute( + inputArr, + outputArr, + sigma, + numOfAngleLine, callback, ); } - late final _ArucoDetectorParameters_SetAprilTagQuadSigma_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Float, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetAprilTagQuadSigma_Async'); - late final _ArucoDetectorParameters_SetAprilTagQuadSigma_Async = - _ArucoDetectorParameters_SetAprilTagQuadSigma_AsyncPtr.asFunction< + late final _cv_img_hash_radialVarianceHash_computePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Int, + imp1.CvCallback_0)>>('cv_img_hash_radialVarianceHash_compute'); + late final _cv_img_hash_radialVarianceHash_compute = + _cv_img_hash_radialVarianceHash_computePtr.asFunction< ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); + Mat, Mat, double, int, imp1.CvCallback_0)>(); - ffi.Pointer - ArucoDetectorParameters_SetCornerRefinementMaxIterations( - ArucoDetectorParameters ap, - int cornerRefinementMaxIterations, + void cv_quality_QualityBRISQUE_close( + QualityBRISQUEPtr self, ) { - return _ArucoDetectorParameters_SetCornerRefinementMaxIterations( - ap, - cornerRefinementMaxIterations, + return _cv_quality_QualityBRISQUE_close( + self, ); } - late final _ArucoDetectorParameters_SetCornerRefinementMaxIterationsPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int)>>( - 'ArucoDetectorParameters_SetCornerRefinementMaxIterations'); - late final _ArucoDetectorParameters_SetCornerRefinementMaxIterations = - _ArucoDetectorParameters_SetCornerRefinementMaxIterationsPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer - ArucoDetectorParameters_SetCornerRefinementMaxIterations_Async( - ArucoDetectorParameters ap, - int cornerRefinementMaxIterations, + late final _cv_quality_QualityBRISQUE_closePtr = + _lookup>( + 'cv_quality_QualityBRISQUE_close'); + late final _cv_quality_QualityBRISQUE_close = + _cv_quality_QualityBRISQUE_closePtr + .asFunction(); + + ffi.Pointer cv_quality_QualityBRISQUE_compute( + QualityBRISQUE self, + Mat img, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetCornerRefinementMaxIterations_Async( - ap, - cornerRefinementMaxIterations, + return _cv_quality_QualityBRISQUE_compute( + self, + img, + rval, callback, ); } - late final _ArucoDetectorParameters_SetCornerRefinementMaxIterations_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetCornerRefinementMaxIterations_Async'); - late final _ArucoDetectorParameters_SetCornerRefinementMaxIterations_Async = - _ArucoDetectorParameters_SetCornerRefinementMaxIterations_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); + late final _cv_quality_QualityBRISQUE_computePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + QualityBRISQUE, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityBRISQUE_compute'); + late final _cv_quality_QualityBRISQUE_compute = + _cv_quality_QualityBRISQUE_computePtr.asFunction< + ffi.Pointer Function( + QualityBRISQUE, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetCornerRefinementMethod( - ArucoDetectorParameters ap, - int cornerRefinementMethod, + ffi.Pointer cv_quality_QualityBRISQUE_computeFeatures_static( + Mat img, + Mat features, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetCornerRefinementMethod( - ap, - cornerRefinementMethod, + return _cv_quality_QualityBRISQUE_computeFeatures_static( + img, + features, + callback, ); } - late final _ArucoDetectorParameters_SetCornerRefinementMethodPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetCornerRefinementMethod'); - late final _ArucoDetectorParameters_SetCornerRefinementMethod = - _ArucoDetectorParameters_SetCornerRefinementMethodPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer ArucoDetectorParameters_SetCornerRefinementMethod_Async( - ArucoDetectorParameters ap, - int cornerRefinementMethod, + late final _cv_quality_QualityBRISQUE_computeFeatures_staticPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>>( + 'cv_quality_QualityBRISQUE_computeFeatures_static'); + late final _cv_quality_QualityBRISQUE_computeFeatures_static = + _cv_quality_QualityBRISQUE_computeFeatures_staticPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_quality_QualityBRISQUE_compute_static( + Mat img, + ffi.Pointer model_file, + ffi.Pointer range_file, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetCornerRefinementMethod_Async( - ap, - cornerRefinementMethod, + return _cv_quality_QualityBRISQUE_compute_static( + img, + model_file, + range_file, + rval, callback, ); } - late final _ArucoDetectorParameters_SetCornerRefinementMethod_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetCornerRefinementMethod_Async'); - late final _ArucoDetectorParameters_SetCornerRefinementMethod_Async = - _ArucoDetectorParameters_SetCornerRefinementMethod_AsyncPtr.asFunction< + late final _cv_quality_QualityBRISQUE_compute_staticPtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityBRISQUE_compute_static'); + late final _cv_quality_QualityBRISQUE_compute_static = + _cv_quality_QualityBRISQUE_compute_staticPtr.asFunction< + ffi.Pointer Function(Mat, ffi.Pointer, + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ArucoDetectorParameters_SetCornerRefinementMinAccuracy( - ArucoDetectorParameters ap, - double cornerRefinementMinAccuracy, + ffi.Pointer cv_quality_QualityBRISQUE_create( + ffi.Pointer model_file, + ffi.Pointer range_file, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ArucoDetectorParameters_SetCornerRefinementMinAccuracy( - ap, - cornerRefinementMinAccuracy, + return _cv_quality_QualityBRISQUE_create( + model_file, + range_file, + rval, + callback, ); } - late final _ArucoDetectorParameters_SetCornerRefinementMinAccuracyPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double)>>( - 'ArucoDetectorParameters_SetCornerRefinementMinAccuracy'); - late final _ArucoDetectorParameters_SetCornerRefinementMinAccuracy = - _ArucoDetectorParameters_SetCornerRefinementMinAccuracyPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer - ArucoDetectorParameters_SetCornerRefinementMinAccuracy_Async( - ArucoDetectorParameters ap, - double cornerRefinementMinAccuracy, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetCornerRefinementMinAccuracy_Async( - ap, - cornerRefinementMinAccuracy, - callback, - ); - } - - late final _ArucoDetectorParameters_SetCornerRefinementMinAccuracy_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetCornerRefinementMinAccuracy_Async'); - late final _ArucoDetectorParameters_SetCornerRefinementMinAccuracy_Async = - _ArucoDetectorParameters_SetCornerRefinementMinAccuracy_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetCornerRefinementWinSize( - ArucoDetectorParameters ap, - int cornerRefinementWinSize, - ) { - return _ArucoDetectorParameters_SetCornerRefinementWinSize( - ap, - cornerRefinementWinSize, - ); - } - - late final _ArucoDetectorParameters_SetCornerRefinementWinSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetCornerRefinementWinSize'); - late final _ArucoDetectorParameters_SetCornerRefinementWinSize = - _ArucoDetectorParameters_SetCornerRefinementWinSizePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer - ArucoDetectorParameters_SetCornerRefinementWinSize_Async( - ArucoDetectorParameters ap, - int cornerRefinementWinSize, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetCornerRefinementWinSize_Async( - ap, - cornerRefinementWinSize, - callback, - ); - } - - late final _ArucoDetectorParameters_SetCornerRefinementWinSize_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetCornerRefinementWinSize_Async'); - late final _ArucoDetectorParameters_SetCornerRefinementWinSize_Async = - _ArucoDetectorParameters_SetCornerRefinementWinSize_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetDetectInvertedMarker( - ArucoDetectorParameters ap, - bool detectInvertedMarker, - ) { - return _ArucoDetectorParameters_SetDetectInvertedMarker( - ap, - detectInvertedMarker, - ); - } - - late final _ArucoDetectorParameters_SetDetectInvertedMarkerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Bool)>>('ArucoDetectorParameters_SetDetectInvertedMarker'); - late final _ArucoDetectorParameters_SetDetectInvertedMarker = - _ArucoDetectorParameters_SetDetectInvertedMarkerPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, bool)>(); - - ffi.Pointer ArucoDetectorParameters_SetDetectInvertedMarker_Async( - ArucoDetectorParameters ap, - bool detectInvertedMarker, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetDetectInvertedMarker_Async( - ap, - detectInvertedMarker, - callback, - ); - } - - late final _ArucoDetectorParameters_SetDetectInvertedMarker_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Bool, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetDetectInvertedMarker_Async'); - late final _ArucoDetectorParameters_SetDetectInvertedMarker_Async = - _ArucoDetectorParameters_SetDetectInvertedMarker_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, bool, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetErrorCorrectionRate( - ArucoDetectorParameters ap, - double errorCorrectionRate, - ) { - return _ArucoDetectorParameters_SetErrorCorrectionRate( - ap, - errorCorrectionRate, - ); - } - - late final _ArucoDetectorParameters_SetErrorCorrectionRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Double)>>('ArucoDetectorParameters_SetErrorCorrectionRate'); - late final _ArucoDetectorParameters_SetErrorCorrectionRate = - _ArucoDetectorParameters_SetErrorCorrectionRatePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetErrorCorrectionRate_Async( - ArucoDetectorParameters ap, - double errorCorrectionRate, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetErrorCorrectionRate_Async( - ap, - errorCorrectionRate, - callback, - ); - } - - late final _ArucoDetectorParameters_SetErrorCorrectionRate_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetErrorCorrectionRate_Async'); - late final _ArucoDetectorParameters_SetErrorCorrectionRate_Async = - _ArucoDetectorParameters_SetErrorCorrectionRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetMarkerBorderBits( - ArucoDetectorParameters ap, - int markerBorderBits, - ) { - return _ArucoDetectorParameters_SetMarkerBorderBits( - ap, - markerBorderBits, - ); - } - - late final _ArucoDetectorParameters_SetMarkerBorderBitsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetMarkerBorderBits'); - late final _ArucoDetectorParameters_SetMarkerBorderBits = - _ArucoDetectorParameters_SetMarkerBorderBitsPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer ArucoDetectorParameters_SetMarkerBorderBits_Async( - ArucoDetectorParameters ap, - int markerBorderBits, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetMarkerBorderBits_Async( - ap, - markerBorderBits, - callback, - ); - } - - late final _ArucoDetectorParameters_SetMarkerBorderBits_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetMarkerBorderBits_Async'); - late final _ArucoDetectorParameters_SetMarkerBorderBits_Async = - _ArucoDetectorParameters_SetMarkerBorderBits_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate( - ArucoDetectorParameters ap, - double maxErroneousBitsInBorderRate, - ) { - return _ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate( - ap, - maxErroneousBitsInBorderRate, - ); - } - - late final _ArucoDetectorParameters_SetMaxErroneousBitsInBorderRatePtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double)>>( - 'ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate'); - late final _ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate = - _ArucoDetectorParameters_SetMaxErroneousBitsInBorderRatePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer - ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_Async( - ArucoDetectorParameters ap, - double maxErroneousBitsInBorderRate, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_Async( - ap, - maxErroneousBitsInBorderRate, - callback, - ); - } - - late final _ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_Async'); - late final _ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_Async = - _ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetMaxMarkerPerimeterRate( - ArucoDetectorParameters ap, - double maxMarkerPerimeterRate, - ) { - return _ArucoDetectorParameters_SetMaxMarkerPerimeterRate( - ap, - maxMarkerPerimeterRate, - ); - } - - late final _ArucoDetectorParameters_SetMaxMarkerPerimeterRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double)>>( - 'ArucoDetectorParameters_SetMaxMarkerPerimeterRate'); - late final _ArucoDetectorParameters_SetMaxMarkerPerimeterRate = - _ArucoDetectorParameters_SetMaxMarkerPerimeterRatePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetMaxMarkerPerimeterRate_Async( - ArucoDetectorParameters ap, - double maxMarkerPerimeterRate, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetMaxMarkerPerimeterRate_Async( - ap, - maxMarkerPerimeterRate, - callback, - ); - } - - late final _ArucoDetectorParameters_SetMaxMarkerPerimeterRate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetMaxMarkerPerimeterRate_Async'); - late final _ArucoDetectorParameters_SetMaxMarkerPerimeterRate_Async = - _ArucoDetectorParameters_SetMaxMarkerPerimeterRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinCornerDistanceRate( - ArucoDetectorParameters ap, - double minCornerDistanceRate, - ) { - return _ArucoDetectorParameters_SetMinCornerDistanceRate( - ap, - minCornerDistanceRate, - ); - } - - late final _ArucoDetectorParameters_SetMinCornerDistanceRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Double)>>('ArucoDetectorParameters_SetMinCornerDistanceRate'); - late final _ArucoDetectorParameters_SetMinCornerDistanceRate = - _ArucoDetectorParameters_SetMinCornerDistanceRatePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinCornerDistanceRate_Async( - ArucoDetectorParameters ap, - double minCornerDistanceRate, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetMinCornerDistanceRate_Async( - ap, - minCornerDistanceRate, - callback, - ); - } - - late final _ArucoDetectorParameters_SetMinCornerDistanceRate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetMinCornerDistanceRate_Async'); - late final _ArucoDetectorParameters_SetMinCornerDistanceRate_Async = - _ArucoDetectorParameters_SetMinCornerDistanceRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinDistanceToBorder( - ArucoDetectorParameters ap, - int minDistanceToBorder, - ) { - return _ArucoDetectorParameters_SetMinDistanceToBorder( - ap, - minDistanceToBorder, - ); - } - - late final _ArucoDetectorParameters_SetMinDistanceToBorderPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Int)>>('ArucoDetectorParameters_SetMinDistanceToBorder'); - late final _ArucoDetectorParameters_SetMinDistanceToBorder = - _ArucoDetectorParameters_SetMinDistanceToBorderPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinDistanceToBorder_Async( - ArucoDetectorParameters ap, - int minDistanceToBorder, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetMinDistanceToBorder_Async( - ap, - minDistanceToBorder, - callback, - ); - } - - late final _ArucoDetectorParameters_SetMinDistanceToBorder_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetMinDistanceToBorder_Async'); - late final _ArucoDetectorParameters_SetMinDistanceToBorder_Async = - _ArucoDetectorParameters_SetMinDistanceToBorder_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinMarkerDistanceRate( - ArucoDetectorParameters ap, - double minMarkerDistanceRate, - ) { - return _ArucoDetectorParameters_SetMinMarkerDistanceRate( - ap, - minMarkerDistanceRate, - ); - } - - late final _ArucoDetectorParameters_SetMinMarkerDistanceRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Double)>>('ArucoDetectorParameters_SetMinMarkerDistanceRate'); - late final _ArucoDetectorParameters_SetMinMarkerDistanceRate = - _ArucoDetectorParameters_SetMinMarkerDistanceRatePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinMarkerDistanceRate_Async( - ArucoDetectorParameters ap, - double minMarkerDistanceRate, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetMinMarkerDistanceRate_Async( - ap, - minMarkerDistanceRate, - callback, - ); - } - - late final _ArucoDetectorParameters_SetMinMarkerDistanceRate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetMinMarkerDistanceRate_Async'); - late final _ArucoDetectorParameters_SetMinMarkerDistanceRate_Async = - _ArucoDetectorParameters_SetMinMarkerDistanceRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinMarkerPerimeterRate( - ArucoDetectorParameters ap, - double minMarkerPerimeterRate, - ) { - return _ArucoDetectorParameters_SetMinMarkerPerimeterRate( - ap, - minMarkerPerimeterRate, - ); - } - - late final _ArucoDetectorParameters_SetMinMarkerPerimeterRatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double)>>( - 'ArucoDetectorParameters_SetMinMarkerPerimeterRate'); - late final _ArucoDetectorParameters_SetMinMarkerPerimeterRate = - _ArucoDetectorParameters_SetMinMarkerPerimeterRatePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinMarkerPerimeterRate_Async( - ArucoDetectorParameters ap, - double minMarkerPerimeterRate, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetMinMarkerPerimeterRate_Async( - ap, - minMarkerPerimeterRate, - callback, - ); - } - - late final _ArucoDetectorParameters_SetMinMarkerPerimeterRate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetMinMarkerPerimeterRate_Async'); - late final _ArucoDetectorParameters_SetMinMarkerPerimeterRate_Async = - _ArucoDetectorParameters_SetMinMarkerPerimeterRate_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinOtsuStdDev( - ArucoDetectorParameters ap, - double minOtsuStdDev, - ) { - return _ArucoDetectorParameters_SetMinOtsuStdDev( - ap, - minOtsuStdDev, - ); - } - - late final _ArucoDetectorParameters_SetMinOtsuStdDevPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetectorParameters, - ffi.Double)>>('ArucoDetectorParameters_SetMinOtsuStdDev'); - late final _ArucoDetectorParameters_SetMinOtsuStdDev = - _ArucoDetectorParameters_SetMinOtsuStdDevPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer ArucoDetectorParameters_SetMinOtsuStdDev_Async( - ArucoDetectorParameters ap, - double minOtsuStdDev, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetMinOtsuStdDev_Async( - ap, - minOtsuStdDev, - callback, - ); - } - - late final _ArucoDetectorParameters_SetMinOtsuStdDev_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetMinOtsuStdDev_Async'); - late final _ArucoDetectorParameters_SetMinOtsuStdDev_Async = - _ArucoDetectorParameters_SetMinOtsuStdDev_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer - ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell( - ArucoDetectorParameters ap, - double perspectiveRemoveIgnoredMarginPerCell, - ) { - return _ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell( - ap, - perspectiveRemoveIgnoredMarginPerCell, - ); - } - - late final _ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCellPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double)>>( - 'ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell'); - late final _ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell = - _ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCellPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double)>(); - - ffi.Pointer - ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_Async( - ArucoDetectorParameters ap, - double perspectiveRemoveIgnoredMarginPerCell, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_Async( - ap, - perspectiveRemoveIgnoredMarginPerCell, - callback, - ); - } - - late final _ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_Async'); - late final _ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_Async = - _ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - ffi.Pointer - ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell( - ArucoDetectorParameters ap, - int perspectiveRemovePixelPerCell, - ) { - return _ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell( - ap, - perspectiveRemovePixelPerCell, - ); - } - - late final _ArucoDetectorParameters_SetPerspectiveRemovePixelPerCellPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int)>>( - 'ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell'); - late final _ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell = - _ArucoDetectorParameters_SetPerspectiveRemovePixelPerCellPtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, int)>(); - - ffi.Pointer - ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_Async( - ArucoDetectorParameters ap, - int perspectiveRemovePixelPerCell, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_Async( - ap, - perspectiveRemovePixelPerCell, - callback, - ); - } - - late final _ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Int, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_Async'); - late final _ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_Async = - _ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, int, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoDetectorParameters_SetPolygonalApproxAccuracyRate( - ArucoDetectorParameters ap, - double polygonalApproxAccuracyRate, - ) { - return _ArucoDetectorParameters_SetPolygonalApproxAccuracyRate( - ap, - polygonalApproxAccuracyRate, - ); - } - - late final _ArucoDetectorParameters_SetPolygonalApproxAccuracyRatePtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double)>>( - 'ArucoDetectorParameters_SetPolygonalApproxAccuracyRate'); - late final _ArucoDetectorParameters_SetPolygonalApproxAccuracyRate = - _ArucoDetectorParameters_SetPolygonalApproxAccuracyRatePtr.asFunction< - ffi.Pointer Function(ArucoDetectorParameters, double)>(); - - ffi.Pointer - ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_Async( - ArucoDetectorParameters ap, - double polygonalApproxAccuracyRate, - imp1.CvCallback_0 callback, - ) { - return _ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_Async( - ap, - polygonalApproxAccuracyRate, - callback, - ); - } - - late final _ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetectorParameters, ffi.Double, imp1.CvCallback_0)>>( - 'ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_Async'); - late final _ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_Async = - _ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_AsyncPtr - .asFunction< - ffi.Pointer Function( - ArucoDetectorParameters, double, imp1.CvCallback_0)>(); - - void ArucoDetector_Close( - ArucoDetectorPtr ad, - ) { - return _ArucoDetector_Close( - ad, - ); - } - - late final _ArucoDetector_ClosePtr = - _lookup>( - 'ArucoDetector_Close'); - late final _ArucoDetector_Close = - _ArucoDetector_ClosePtr.asFunction(); - - ffi.Pointer ArucoDetector_DetectMarkers( - ArucoDetector ad, - Mat inputArr, - ffi.Pointer markerCorners, - ffi.Pointer markerIds, - ffi.Pointer rejectedCandidates, - ) { - return _ArucoDetector_DetectMarkers( - ad, - inputArr, - markerCorners, - markerIds, - rejectedCandidates, - ); - } - - late final _ArucoDetector_DetectMarkersPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDetector, - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('ArucoDetector_DetectMarkers'); - late final _ArucoDetector_DetectMarkers = - _ArucoDetector_DetectMarkersPtr.asFunction< - ffi.Pointer Function( - ArucoDetector, - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>(); - - ffi.Pointer ArucoDetector_DetectMarkers_Async( - ArucoDetector ad, - Mat inputArr, - imp1.CvCallback_3 callback, - ) { - return _ArucoDetector_DetectMarkers_Async( - ad, - inputArr, - callback, - ); - } - - late final _ArucoDetector_DetectMarkers_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ArucoDetector, Mat, - imp1.CvCallback_3)>>('ArucoDetector_DetectMarkers_Async'); - late final _ArucoDetector_DetectMarkers_Async = - _ArucoDetector_DetectMarkers_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDetector, Mat, imp1.CvCallback_3)>(); - - ffi.Pointer ArucoDetector_New( - ffi.Pointer rval, - ) { - return _ArucoDetector_New( - rval, - ); - } - - late final _ArucoDetector_NewPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('ArucoDetector_New'); - late final _ArucoDetector_New = _ArucoDetector_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer ArucoDetector_NewWithParams( - ArucoDictionary dictionary, - ArucoDetectorParameters params, - ffi.Pointer rval, - ) { - return _ArucoDetector_NewWithParams( - dictionary, - params, - rval, - ); - } - - late final _ArucoDetector_NewWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDictionary, - ArucoDetectorParameters, - ffi.Pointer)>>('ArucoDetector_NewWithParams'); - late final _ArucoDetector_NewWithParams = - _ArucoDetector_NewWithParamsPtr.asFunction< - ffi.Pointer Function(ArucoDictionary, - ArucoDetectorParameters, ffi.Pointer)>(); - - ffi.Pointer ArucoDetector_NewWithParams_Async( - ArucoDictionary dictionary, - ArucoDetectorParameters params, - imp1.CvCallback_1 callback, - ) { - return _ArucoDetector_NewWithParams_Async( - dictionary, - params, - callback, - ); - } - - late final _ArucoDetector_NewWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ArucoDictionary, - ArucoDetectorParameters, - imp1.CvCallback_1)>>('ArucoDetector_NewWithParams_Async'); - late final _ArucoDetector_NewWithParams_Async = - _ArucoDetector_NewWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - ArucoDictionary, ArucoDetectorParameters, imp1.CvCallback_1)>(); - - ffi.Pointer ArucoDetector_New_Async( - imp1.CvCallback_1 callback, - ) { - return _ArucoDetector_New_Async( - callback, - ); - } - - late final _ArucoDetector_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'ArucoDetector_New_Async'); - late final _ArucoDetector_New_Async = _ArucoDetector_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - void ArucoDictionary_Close( - ArucoDictionaryPtr self, - ) { - return _ArucoDictionary_Close( - self, - ); - } - - late final _ArucoDictionary_ClosePtr = - _lookup>( - 'ArucoDictionary_Close'); - late final _ArucoDictionary_Close = - _ArucoDictionary_ClosePtr.asFunction(); - - ffi.Pointer ArucoDrawDetectedMarkers( - Mat image, - VecVecPoint2f markerCorners, - VecI32 markerIds, - Scalar borderColor, - ) { - return _ArucoDrawDetectedMarkers( - image, - markerCorners, - markerIds, - borderColor, - ); - } - - late final _ArucoDrawDetectedMarkersPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, VecVecPoint2f, VecI32, Scalar)>>('ArucoDrawDetectedMarkers'); - late final _ArucoDrawDetectedMarkers = - _ArucoDrawDetectedMarkersPtr.asFunction< - ffi.Pointer Function(Mat, VecVecPoint2f, VecI32, Scalar)>(); - - ffi.Pointer ArucoDrawDetectedMarkers_Async( - Mat image, - VecVecPoint2f markerCorners, - VecI32 markerIds, - Scalar borderColor, - imp1.CvCallback_0 callback, - ) { - return _ArucoDrawDetectedMarkers_Async( - image, - markerCorners, - markerIds, - borderColor, - callback, - ); - } - - late final _ArucoDrawDetectedMarkers_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, VecVecPoint2f, VecI32, Scalar, - imp1.CvCallback_0)>>('ArucoDrawDetectedMarkers_Async'); - late final _ArucoDrawDetectedMarkers_Async = - _ArucoDrawDetectedMarkers_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, VecVecPoint2f, VecI32, Scalar, imp1.CvCallback_0)>(); - - ffi.Pointer ArucoGenerateImageMarker( - int dictionaryId, - int id, - int sidePixels, - int borderBits, - ffi.Pointer img, - ) { - return _ArucoGenerateImageMarker( - dictionaryId, - id, - sidePixels, - borderBits, - img, - ); - } - - late final _ArucoGenerateImageMarkerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('ArucoGenerateImageMarker'); - late final _ArucoGenerateImageMarker = - _ArucoGenerateImageMarkerPtr.asFunction< - ffi.Pointer Function( - int, int, int, int, ffi.Pointer)>(); - - ffi.Pointer ArucoGenerateImageMarker_Async( - int dictionaryId, - int id, - int sidePixels, - int borderBits, - imp1.CvCallback_1 callback, - ) { - return _ArucoGenerateImageMarker_Async( - dictionaryId, - id, - sidePixels, - borderBits, - callback, - ); - } - - late final _ArucoGenerateImageMarker_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('ArucoGenerateImageMarker_Async'); - late final _ArucoGenerateImageMarker_Async = - _ArucoGenerateImageMarker_AsyncPtr.asFunction< - ffi.Pointer Function( - int, int, int, int, imp1.CvCallback_1)>(); - - void BlockMeanHash_Close( - BlockMeanHashPtr self, - ) { - return _BlockMeanHash_Close( - self, - ); - } - - late final _BlockMeanHash_ClosePtr = - _lookup>( - 'BlockMeanHash_Close'); - late final _BlockMeanHash_Close = - _BlockMeanHash_ClosePtr.asFunction(); - - ffi.Pointer BlockMeanHash_Compare( - BlockMeanHash self, - Mat hashOne, - Mat hashTwo, - ffi.Pointer rval, - ) { - return _BlockMeanHash_Compare( - self, - hashOne, - hashTwo, - rval, - ); - } - - late final _BlockMeanHash_ComparePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BlockMeanHash, Mat, Mat, - ffi.Pointer)>>('BlockMeanHash_Compare'); - late final _BlockMeanHash_Compare = _BlockMeanHash_ComparePtr.asFunction< - ffi.Pointer Function( - BlockMeanHash, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer BlockMeanHash_Compare_Async( - BlockMeanHash self, - Mat hashOne, - Mat hashTwo, - imp1.CvCallback_1 callback, - ) { - return _BlockMeanHash_Compare_Async( - self, - hashOne, - hashTwo, - callback, - ); - } - - late final _BlockMeanHash_Compare_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BlockMeanHash, Mat, Mat, - imp1.CvCallback_1)>>('BlockMeanHash_Compare_Async'); - late final _BlockMeanHash_Compare_Async = - _BlockMeanHash_Compare_AsyncPtr.asFunction< - ffi.Pointer Function( - BlockMeanHash, Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer BlockMeanHash_Compute( - BlockMeanHash self, - Mat inputArr, - ffi.Pointer outputArr, - ) { - return _BlockMeanHash_Compute( - self, - inputArr, - outputArr, - ); - } - - late final _BlockMeanHash_ComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - BlockMeanHash, Mat, ffi.Pointer)>>('BlockMeanHash_Compute'); - late final _BlockMeanHash_Compute = _BlockMeanHash_ComputePtr.asFunction< - ffi.Pointer Function(BlockMeanHash, Mat, ffi.Pointer)>(); - - ffi.Pointer BlockMeanHash_Compute_Async( - BlockMeanHash self, - Mat inputArr, - imp1.CvCallback_1 callback, - ) { - return _BlockMeanHash_Compute_Async( - self, - inputArr, - callback, - ); - } - - late final _BlockMeanHash_Compute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BlockMeanHash, Mat, - imp1.CvCallback_1)>>('BlockMeanHash_Compute_Async'); - late final _BlockMeanHash_Compute_Async = - _BlockMeanHash_Compute_AsyncPtr.asFunction< - ffi.Pointer Function( - BlockMeanHash, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer BlockMeanHash_Create( - int mode, - ffi.Pointer rval, - ) { - return _BlockMeanHash_Create( - mode, - rval, - ); - } - - late final _BlockMeanHash_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Pointer)>>('BlockMeanHash_Create'); - late final _BlockMeanHash_Create = _BlockMeanHash_CreatePtr.asFunction< - ffi.Pointer Function(int, ffi.Pointer)>(); - - ffi.Pointer BlockMeanHash_Create_Async( - int mode, - imp1.CvCallback_1 callback, - ) { - return _BlockMeanHash_Create_Async( - mode, - callback, - ); - } - - late final _BlockMeanHash_Create_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, imp1.CvCallback_1)>>('BlockMeanHash_Create_Async'); - late final _BlockMeanHash_Create_Async = _BlockMeanHash_Create_AsyncPtr - .asFunction Function(int, imp1.CvCallback_1)>(); - - ffi.Pointer BlockMeanHash_GetMean( - BlockMeanHash self, - ffi.Pointer> rval, - ffi.Pointer length, - ) { - return _BlockMeanHash_GetMean( - self, - rval, - length, - ); - } - - late final _BlockMeanHash_GetMeanPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - BlockMeanHash, - ffi.Pointer>, - ffi.Pointer)>>('BlockMeanHash_GetMean'); - late final _BlockMeanHash_GetMean = _BlockMeanHash_GetMeanPtr.asFunction< - ffi.Pointer Function(BlockMeanHash, - ffi.Pointer>, ffi.Pointer)>(); - - ffi.Pointer BlockMeanHash_GetMean_Async( - BlockMeanHash self, - imp1.CvCallback_1 callback, - ) { - return _BlockMeanHash_GetMean_Async( - self, - callback, - ); - } - - late final _BlockMeanHash_GetMean_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BlockMeanHash, - imp1.CvCallback_1)>>('BlockMeanHash_GetMean_Async'); - late final _BlockMeanHash_GetMean_Async = - _BlockMeanHash_GetMean_AsyncPtr.asFunction< - ffi.Pointer Function(BlockMeanHash, imp1.CvCallback_1)>(); - - ffi.Pointer BlockMeanHash_SetMode( - BlockMeanHash self, - int mode, - ) { - return _BlockMeanHash_SetMode( - self, - mode, - ); - } - - late final _BlockMeanHash_SetModePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - BlockMeanHash, ffi.Int)>>('BlockMeanHash_SetMode'); - late final _BlockMeanHash_SetMode = _BlockMeanHash_SetModePtr.asFunction< - ffi.Pointer Function(BlockMeanHash, int)>(); - - ffi.Pointer BlockMeanHash_SetMode_Async( - BlockMeanHash self, - int mode, - imp1.CvCallback_0 callback, - ) { - return _BlockMeanHash_SetMode_Async( - self, - mode, - callback, - ); - } - - late final _BlockMeanHash_SetMode_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BlockMeanHash, ffi.Int, - imp1.CvCallback_0)>>('BlockMeanHash_SetMode_Async'); - late final _BlockMeanHash_SetMode_Async = - _BlockMeanHash_SetMode_AsyncPtr.asFunction< - ffi.Pointer Function( - BlockMeanHash, int, imp1.CvCallback_0)>(); - - void QualityBRISQUE_close( - QualityBRISQUEPtr self, - ) { - return _QualityBRISQUE_close( - self, - ); - } - - late final _QualityBRISQUE_closePtr = - _lookup>( - 'QualityBRISQUE_close'); - late final _QualityBRISQUE_close = - _QualityBRISQUE_closePtr.asFunction(); - - ffi.Pointer QualityBRISQUE_compute( - QualityBRISQUE self, - Mat img, - ffi.Pointer rval, - ) { - return _QualityBRISQUE_compute( - self, - img, - rval, - ); - } - - late final _QualityBRISQUE_computePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(QualityBRISQUE, Mat, - ffi.Pointer)>>('QualityBRISQUE_compute'); - late final _QualityBRISQUE_compute = _QualityBRISQUE_computePtr.asFunction< - ffi.Pointer Function( - QualityBRISQUE, Mat, ffi.Pointer)>(); - - ffi.Pointer QualityBRISQUE_computeFeatures_static( - Mat img, - Mat features, - ) { - return _QualityBRISQUE_computeFeatures_static( - img, - features, - ); - } - - late final _QualityBRISQUE_computeFeatures_staticPtr = - _lookup Function(Mat, Mat)>>( - 'QualityBRISQUE_computeFeatures_static'); - late final _QualityBRISQUE_computeFeatures_static = - _QualityBRISQUE_computeFeatures_staticPtr.asFunction< - ffi.Pointer Function(Mat, Mat)>(); - - ffi.Pointer QualityBRISQUE_computeFeatures_static_async( - Mat img, - Mat features, - imp1.CvCallback_0 callback, - ) { - return _QualityBRISQUE_computeFeatures_static_async( - img, - features, - callback, - ); - } - - late final _QualityBRISQUE_computeFeatures_static_asyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>>( - 'QualityBRISQUE_computeFeatures_static_async'); - late final _QualityBRISQUE_computeFeatures_static_async = - _QualityBRISQUE_computeFeatures_static_asyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer QualityBRISQUE_compute_async( - QualityBRISQUE self, - Mat img, - imp1.CvCallback_1 callback, - ) { - return _QualityBRISQUE_compute_async( - self, - img, - callback, - ); - } - - late final _QualityBRISQUE_compute_asyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(QualityBRISQUE, Mat, - imp1.CvCallback_1)>>('QualityBRISQUE_compute_async'); - late final _QualityBRISQUE_compute_async = - _QualityBRISQUE_compute_asyncPtr.asFunction< - ffi.Pointer Function( - QualityBRISQUE, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer QualityBRISQUE_compute_static( - Mat img, - ffi.Pointer model_file, - ffi.Pointer range_file, - ffi.Pointer rval, - ) { - return _QualityBRISQUE_compute_static( - img, - model_file, - range_file, - rval, - ); - } - - late final _QualityBRISQUE_compute_staticPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('QualityBRISQUE_compute_static'); - late final _QualityBRISQUE_compute_static = - _QualityBRISQUE_compute_staticPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, - ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer QualityBRISQUE_compute_static_async( - Mat img, - ffi.Pointer model_file, - ffi.Pointer range_file, - imp1.CvCallback_1 callback, - ) { - return _QualityBRISQUE_compute_static_async( - img, - model_file, - range_file, - callback, - ); - } - - late final _QualityBRISQUE_compute_static_asyncPtr = _lookup< + late final _cv_quality_QualityBRISQUE_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Pointer, ffi.Pointer, - imp1.CvCallback_1)>>('QualityBRISQUE_compute_static_async'); - late final _QualityBRISQUE_compute_static_async = - _QualityBRISQUE_compute_static_asyncPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, - ffi.Pointer, imp1.CvCallback_1)>(); - - ffi.Pointer QualityBRISQUE_create( - ffi.Pointer model_file, - ffi.Pointer range_file, - ffi.Pointer rval, - ) { - return _QualityBRISQUE_create( - model_file, - range_file, - rval, - ); - } - - late final _QualityBRISQUE_createPtr = _lookup< - ffi.NativeFunction< + ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityBRISQUE_create'); + late final _cv_quality_QualityBRISQUE_create = + _cv_quality_QualityBRISQUE_createPtr.asFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer, - ffi.Pointer)>>('QualityBRISQUE_create'); - late final _QualityBRISQUE_create = _QualityBRISQUE_createPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + imp1.CvCallback_0)>(); - void QualityGMSD_close( + void cv_quality_QualityGMSD_close( QualityGMSDPtr self, ) { - return _QualityGMSD_close( + return _cv_quality_QualityGMSD_close( self, ); } - late final _QualityGMSD_closePtr = + late final _cv_quality_QualityGMSD_closePtr = _lookup>( - 'QualityGMSD_close'); - late final _QualityGMSD_close = - _QualityGMSD_closePtr.asFunction(); + 'cv_quality_QualityGMSD_close'); + late final _cv_quality_QualityGMSD_close = _cv_quality_QualityGMSD_closePtr + .asFunction(); - ffi.Pointer QualityGMSD_compute( + ffi.Pointer cv_quality_QualityGMSD_compute( QualityGMSD self, Mat cmp, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QualityGMSD_compute( + return _cv_quality_QualityGMSD_compute( self, cmp, rval, - ); - } - - late final _QualityGMSD_computePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QualityGMSD, Mat, ffi.Pointer)>>('QualityGMSD_compute'); - late final _QualityGMSD_compute = _QualityGMSD_computePtr.asFunction< - ffi.Pointer Function(QualityGMSD, Mat, ffi.Pointer)>(); - - ffi.Pointer QualityGMSD_compute_async( - QualityGMSD self, - Mat cmp, - imp1.CvCallback_1 callback, - ) { - return _QualityGMSD_compute_async( - self, - cmp, callback, ); } - late final _QualityGMSD_compute_asyncPtr = _lookup< + late final _cv_quality_QualityGMSD_computePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(QualityGMSD, Mat, - imp1.CvCallback_1)>>('QualityGMSD_compute_async'); - late final _QualityGMSD_compute_async = - _QualityGMSD_compute_asyncPtr.asFunction< + ffi.Pointer Function(QualityGMSD, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityGMSD_compute'); + late final _cv_quality_QualityGMSD_compute = + _cv_quality_QualityGMSD_computePtr.asFunction< ffi.Pointer Function( - QualityGMSD, Mat, imp1.CvCallback_1)>(); + QualityGMSD, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer QualityGMSD_compute_static( + ffi.Pointer cv_quality_QualityGMSD_compute_static( Mat ref, Mat cmp, Mat qualityMap, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QualityGMSD_compute_static( + return _cv_quality_QualityGMSD_compute_static( ref, cmp, qualityMap, rval, - ); - } - - late final _QualityGMSD_compute_staticPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - ffi.Pointer)>>('QualityGMSD_compute_static'); - late final _QualityGMSD_compute_static = - _QualityGMSD_compute_staticPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer QualityGMSD_compute_static_async( - Mat ref, - Mat cmp, - Mat qualityMap, - imp1.CvCallback_1 callback, - ) { - return _QualityGMSD_compute_static_async( - ref, - cmp, - qualityMap, callback, ); } - late final _QualityGMSD_compute_static_asyncPtr = _lookup< + late final _cv_quality_QualityGMSD_compute_staticPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_1)>>('QualityGMSD_compute_static_async'); - late final _QualityGMSD_compute_static_async = - _QualityGMSD_compute_static_asyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityGMSD_compute_static'); + late final _cv_quality_QualityGMSD_compute_static = + _cv_quality_QualityGMSD_compute_staticPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer QualityGMSD_create( + ffi.Pointer cv_quality_QualityGMSD_create( Mat ref, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QualityGMSD_create( + return _cv_quality_QualityGMSD_create( ref, rval, + callback, ); } - late final _QualityGMSD_createPtr = _lookup< + late final _cv_quality_QualityGMSD_createPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityGMSD_create'); + late final _cv_quality_QualityGMSD_create = + _cv_quality_QualityGMSD_createPtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer)>>('QualityGMSD_create'); - late final _QualityGMSD_create = _QualityGMSD_createPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - void QualityMSE_close( + void cv_quality_QualityMSE_close( QualityMSEPtr self, ) { - return _QualityMSE_close( + return _cv_quality_QualityMSE_close( self, ); } - late final _QualityMSE_closePtr = + late final _cv_quality_QualityMSE_closePtr = _lookup>( - 'QualityMSE_close'); - late final _QualityMSE_close = - _QualityMSE_closePtr.asFunction(); + 'cv_quality_QualityMSE_close'); + late final _cv_quality_QualityMSE_close = _cv_quality_QualityMSE_closePtr + .asFunction(); - ffi.Pointer QualityMSE_compute( + ffi.Pointer cv_quality_QualityMSE_compute( QualityMSE self, Mat cmpImgs, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QualityMSE_compute( - self, - cmpImgs, - rval, - ); - } - - late final _QualityMSE_computePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QualityMSE, Mat, ffi.Pointer)>>('QualityMSE_compute'); - late final _QualityMSE_compute = _QualityMSE_computePtr.asFunction< - ffi.Pointer Function(QualityMSE, Mat, ffi.Pointer)>(); - - ffi.Pointer QualityMSE_compute_async( - QualityMSE self, - Mat cmpImgs, - imp1.CvCallback_1 callback, - ) { - return _QualityMSE_compute_async( + return _cv_quality_QualityMSE_compute( self, cmpImgs, - callback, - ); - } - - late final _QualityMSE_compute_asyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QualityMSE, Mat, imp1.CvCallback_1)>>('QualityMSE_compute_async'); - late final _QualityMSE_compute_async = - _QualityMSE_compute_asyncPtr.asFunction< - ffi.Pointer Function(QualityMSE, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer QualityMSE_compute_static( - Mat ref, - Mat cmp, - Mat qualityMap, - ffi.Pointer rval, - ) { - return _QualityMSE_compute_static( - ref, - cmp, - qualityMap, - rval, - ); - } - - late final _QualityMSE_compute_staticPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - ffi.Pointer)>>('QualityMSE_compute_static'); - late final _QualityMSE_compute_static = - _QualityMSE_compute_staticPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer QualityMSE_compute_static_async( - Mat ref, - Mat cmp, - Mat qualityMap, - imp1.CvCallback_1 callback, - ) { - return _QualityMSE_compute_static_async( - ref, - cmp, - qualityMap, - callback, - ); - } - - late final _QualityMSE_compute_static_asyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_1)>>('QualityMSE_compute_static_async'); - late final _QualityMSE_compute_static_async = - _QualityMSE_compute_static_asyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer QualityMSE_create( - Mat ref, - ffi.Pointer rval, - ) { - return _QualityMSE_create( - ref, - rval, - ); - } - - late final _QualityMSE_createPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('QualityMSE_create'); - late final _QualityMSE_create = _QualityMSE_createPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); - - void QualityPSNR_close( - QualityPSNRPtr self, - ) { - return _QualityPSNR_close( - self, - ); - } - - late final _QualityPSNR_closePtr = - _lookup>( - 'QualityPSNR_close'); - late final _QualityPSNR_close = - _QualityPSNR_closePtr.asFunction(); - - ffi.Pointer QualityPSNR_compute( - QualityPSNR self, - Mat cmp, - ffi.Pointer rval, - ) { - return _QualityPSNR_compute( - self, - cmp, - rval, - ); - } - - late final _QualityPSNR_computePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QualityPSNR, Mat, ffi.Pointer)>>('QualityPSNR_compute'); - late final _QualityPSNR_compute = _QualityPSNR_computePtr.asFunction< - ffi.Pointer Function(QualityPSNR, Mat, ffi.Pointer)>(); - - ffi.Pointer QualityPSNR_compute_async( - QualityPSNR self, - Mat cmp, - imp1.CvCallback_1 callback, - ) { - return _QualityPSNR_compute_async( - self, - cmp, - callback, - ); - } - - late final _QualityPSNR_compute_asyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(QualityPSNR, Mat, - imp1.CvCallback_1)>>('QualityPSNR_compute_async'); - late final _QualityPSNR_compute_async = - _QualityPSNR_compute_asyncPtr.asFunction< - ffi.Pointer Function( - QualityPSNR, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer QualityPSNR_compute_static( - Mat ref, - Mat cmp, - double maxPixelValue, - Mat qualityMap, - ffi.Pointer rval, - ) { - return _QualityPSNR_compute_static( - ref, - cmp, - maxPixelValue, - qualityMap, - rval, - ); - } - - late final _QualityPSNR_compute_staticPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, Mat, - ffi.Pointer)>>('QualityPSNR_compute_static'); - late final _QualityPSNR_compute_static = - _QualityPSNR_compute_staticPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, Mat, ffi.Pointer)>(); - - ffi.Pointer QualityPSNR_compute_static_async( - Mat ref, - Mat cmp, - double maxPixelValue, - Mat qualityMap, - imp1.CvCallback_1 callback, - ) { - return _QualityPSNR_compute_static_async( - ref, - cmp, - maxPixelValue, - qualityMap, - callback, - ); - } - - late final _QualityPSNR_compute_static_asyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, Mat, - imp1.CvCallback_1)>>('QualityPSNR_compute_static_async'); - late final _QualityPSNR_compute_static_async = - _QualityPSNR_compute_static_asyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer QualityPSNR_create( - Mat ref, - double maxPixelValue, - ffi.Pointer rval, - ) { - return _QualityPSNR_create( - ref, - maxPixelValue, - rval, - ); - } - - late final _QualityPSNR_createPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, - ffi.Pointer)>>('QualityPSNR_create'); - late final _QualityPSNR_create = _QualityPSNR_createPtr.asFunction< - ffi.Pointer Function(Mat, double, ffi.Pointer)>(); - - double QualityPSNR_getMaxPixelValue( - QualityPSNR self, - ) { - return _QualityPSNR_getMaxPixelValue( - self, - ); - } - - late final _QualityPSNR_getMaxPixelValuePtr = - _lookup>( - 'QualityPSNR_getMaxPixelValue'); - late final _QualityPSNR_getMaxPixelValue = _QualityPSNR_getMaxPixelValuePtr - .asFunction(); - - void QualityPSNR_setMaxPixelValue( - QualityPSNR self, - double maxPixelValue, - ) { - return _QualityPSNR_setMaxPixelValue( - self, - maxPixelValue, - ); - } - - late final _QualityPSNR_setMaxPixelValuePtr = - _lookup>( - 'QualityPSNR_setMaxPixelValue'); - late final _QualityPSNR_setMaxPixelValue = _QualityPSNR_setMaxPixelValuePtr - .asFunction(); - - void QualitySSIM_close( - QualitySSIMPtr self, - ) { - return _QualitySSIM_close( - self, - ); - } - - late final _QualitySSIM_closePtr = - _lookup>( - 'QualitySSIM_close'); - late final _QualitySSIM_close = - _QualitySSIM_closePtr.asFunction(); - - ffi.Pointer QualitySSIM_compute( - QualitySSIM self, - Mat cmp, - ffi.Pointer rval, - ) { - return _QualitySSIM_compute( - self, - cmp, - rval, - ); - } - - late final _QualitySSIM_computePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QualitySSIM, Mat, ffi.Pointer)>>('QualitySSIM_compute'); - late final _QualitySSIM_compute = _QualitySSIM_computePtr.asFunction< - ffi.Pointer Function(QualitySSIM, Mat, ffi.Pointer)>(); - - ffi.Pointer QualitySSIM_compute_async( - QualitySSIM self, - Mat cmp, - imp1.CvCallback_1 callback, - ) { - return _QualitySSIM_compute_async( - self, - cmp, - callback, - ); - } - - late final _QualitySSIM_compute_asyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(QualitySSIM, Mat, - imp1.CvCallback_1)>>('QualitySSIM_compute_async'); - late final _QualitySSIM_compute_async = - _QualitySSIM_compute_asyncPtr.asFunction< - ffi.Pointer Function( - QualitySSIM, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer QualitySSIM_compute_static( - Mat ref, - Mat cmp, - Mat qualityMap, - ffi.Pointer rval, - ) { - return _QualitySSIM_compute_static( - ref, - cmp, - qualityMap, rval, + callback, ); } - late final _QualitySSIM_compute_staticPtr = _lookup< + late final _cv_quality_QualityMSE_computePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - ffi.Pointer)>>('QualitySSIM_compute_static'); - late final _QualitySSIM_compute_static = - _QualitySSIM_compute_staticPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer)>(); + ffi.Pointer Function(QualityMSE, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityMSE_compute'); + late final _cv_quality_QualityMSE_compute = + _cv_quality_QualityMSE_computePtr.asFunction< + ffi.Pointer Function( + QualityMSE, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer QualitySSIM_compute_static_async( + ffi.Pointer cv_quality_QualityMSE_compute_static( Mat ref, Mat cmp, Mat qualityMap, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QualitySSIM_compute_static_async( + return _cv_quality_QualityMSE_compute_static( ref, cmp, qualityMap, + rval, callback, ); } - late final _QualitySSIM_compute_static_asyncPtr = _lookup< + late final _cv_quality_QualityMSE_compute_staticPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_1)>>('QualitySSIM_compute_static_async'); - late final _QualitySSIM_compute_static_async = - _QualitySSIM_compute_static_asyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityMSE_compute_static'); + late final _cv_quality_QualityMSE_compute_static = + _cv_quality_QualityMSE_compute_staticPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer QualitySSIM_create( + ffi.Pointer cv_quality_QualityMSE_create( Mat ref, - ffi.Pointer rval, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QualitySSIM_create( + return _cv_quality_QualityMSE_create( ref, rval, + callback, ); } - late final _QualitySSIM_createPtr = _lookup< + late final _cv_quality_QualityMSE_createPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityMSE_create'); + late final _cv_quality_QualityMSE_create = + _cv_quality_QualityMSE_createPtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer)>>('QualitySSIM_create'); - late final _QualitySSIM_create = _QualitySSIM_createPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - void WBDetector_Close( - PtrWBDetectorPtr self, + void cv_quality_QualityPSNR_close( + QualityPSNRPtr self, ) { - return _WBDetector_Close( + return _cv_quality_QualityPSNR_close( self, ); } - late final _WBDetector_ClosePtr = - _lookup>( - 'WBDetector_Close'); - late final _WBDetector_Close = - _WBDetector_ClosePtr.asFunction(); + late final _cv_quality_QualityPSNR_closePtr = + _lookup>( + 'cv_quality_QualityPSNR_close'); + late final _cv_quality_QualityPSNR_close = _cv_quality_QualityPSNR_closePtr + .asFunction(); - ffi.Pointer WBDetector_Create( - ffi.Pointer rval, + ffi.Pointer cv_quality_QualityPSNR_compute( + QualityPSNR self, + Mat cmp, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _WBDetector_Create( + return _cv_quality_QualityPSNR_compute( + self, + cmp, rval, + callback, ); } - late final _WBDetector_CreatePtr = _lookup< + late final _cv_quality_QualityPSNR_computePtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(QualityPSNR, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityPSNR_compute'); + late final _cv_quality_QualityPSNR_compute = + _cv_quality_QualityPSNR_computePtr.asFunction< ffi.Pointer Function( - ffi.Pointer)>>('WBDetector_Create'); - late final _WBDetector_Create = _WBDetector_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + QualityPSNR, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer WBDetector_Detect( - ffi.Pointer self, - Mat img, - ffi.Pointer bbox, - ffi.Pointer confidences, + ffi.Pointer cv_quality_QualityPSNR_compute_static( + Mat ref, + Mat cmp, + double maxPixelValue, + Mat qualityMap, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _WBDetector_Detect( - self, - img, - bbox, - confidences, + return _cv_quality_QualityPSNR_compute_static( + ref, + cmp, + maxPixelValue, + qualityMap, + rval, + callback, ); } - late final _WBDetector_DetectPtr = _lookup< + late final _cv_quality_QualityPSNR_compute_staticPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer, ffi.Pointer)>>('WBDetector_Detect'); - late final _WBDetector_Detect = _WBDetector_DetectPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer WBDetector_Read( - ffi.Pointer self, - ffi.Pointer filename, + ffi.Pointer Function( + Mat, + Mat, + ffi.Double, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityPSNR_compute_static'); + late final _cv_quality_QualityPSNR_compute_static = + _cv_quality_QualityPSNR_compute_staticPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_quality_QualityPSNR_create( + Mat ref, + double maxPixelValue, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _WBDetector_Read( - self, - filename, + return _cv_quality_QualityPSNR_create( + ref, + maxPixelValue, + rval, + callback, ); } - late final _WBDetector_ReadPtr = _lookup< + late final _cv_quality_QualityPSNR_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('WBDetector_Read'); - late final _WBDetector_Read = _WBDetector_ReadPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer Function( + Mat, + ffi.Double, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualityPSNR_create'); + late final _cv_quality_QualityPSNR_create = + _cv_quality_QualityPSNR_createPtr.asFunction< + ffi.Pointer Function( + Mat, double, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer WBDetector_Train( - ffi.Pointer self, - ffi.Pointer pos_samples, - ffi.Pointer neg_imgs, + double cv_quality_QualityPSNR_getMaxPixelValue( + QualityPSNR self, ) { - return _WBDetector_Train( + return _cv_quality_QualityPSNR_getMaxPixelValue( self, - pos_samples, - neg_imgs, ); } - late final _WBDetector_TrainPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('WBDetector_Train'); - late final _WBDetector_Train = _WBDetector_TrainPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer)>(); + late final _cv_quality_QualityPSNR_getMaxPixelValuePtr = + _lookup>( + 'cv_quality_QualityPSNR_getMaxPixelValue'); + late final _cv_quality_QualityPSNR_getMaxPixelValue = + _cv_quality_QualityPSNR_getMaxPixelValuePtr + .asFunction(); - ffi.Pointer WBDetector_Write( - ffi.Pointer self, - ffi.Pointer filename, + void cv_quality_QualityPSNR_setMaxPixelValue( + QualityPSNR self, + double maxPixelValue, ) { - return _WBDetector_Write( + return _cv_quality_QualityPSNR_setMaxPixelValue( self, - filename, + maxPixelValue, ); } - late final _WBDetector_WritePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('WBDetector_Write'); - late final _WBDetector_Write = _WBDetector_WritePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + late final _cv_quality_QualityPSNR_setMaxPixelValuePtr = + _lookup>( + 'cv_quality_QualityPSNR_setMaxPixelValue'); + late final _cv_quality_QualityPSNR_setMaxPixelValue = + _cv_quality_QualityPSNR_setMaxPixelValuePtr + .asFunction(); - void WeChatQRCode_Close( - WeChatQRCodePtr self, + void cv_quality_QualitySSIM_close( + QualitySSIMPtr self, ) { - return _WeChatQRCode_Close( + return _cv_quality_QualitySSIM_close( self, ); } - late final _WeChatQRCode_ClosePtr = - _lookup>( - 'WeChatQRCode_Close'); - late final _WeChatQRCode_Close = - _WeChatQRCode_ClosePtr.asFunction(); + late final _cv_quality_QualitySSIM_closePtr = + _lookup>( + 'cv_quality_QualitySSIM_close'); + late final _cv_quality_QualitySSIM_close = _cv_quality_QualitySSIM_closePtr + .asFunction(); - ffi.Pointer WeChatQRCode_DetectAndDecode( - ffi.Pointer self, - Mat img, - ffi.Pointer points, - ffi.Pointer rval, + ffi.Pointer cv_quality_QualitySSIM_compute( + QualitySSIM self, + Mat cmp, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _WeChatQRCode_DetectAndDecode( + return _cv_quality_QualitySSIM_compute( self, - img, - points, + cmp, rval, + callback, ); } - late final _WeChatQRCode_DetectAndDecodePtr = _lookup< + late final _cv_quality_QualitySSIM_computePtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(QualitySSIM, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualitySSIM_compute'); + late final _cv_quality_QualitySSIM_compute = + _cv_quality_QualitySSIM_computePtr.asFunction< ffi.Pointer Function( - ffi.Pointer, - Mat, - ffi.Pointer, - ffi.Pointer)>>('WeChatQRCode_DetectAndDecode'); - late final _WeChatQRCode_DetectAndDecode = - _WeChatQRCode_DetectAndDecodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer WeChatQRCode_DetectAndDecode_Async( - ffi.Pointer self, - Mat img, - imp1.CvCallback_2 callback, + QualitySSIM, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_quality_QualitySSIM_compute_static( + Mat ref, + Mat cmp, + Mat qualityMap, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _WeChatQRCode_DetectAndDecode_Async( - self, - img, + return _cv_quality_QualitySSIM_compute_static( + ref, + cmp, + qualityMap, + rval, callback, ); } - late final _WeChatQRCode_DetectAndDecode_AsyncPtr = _lookup< + late final _cv_quality_QualitySSIM_compute_staticPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - imp1.CvCallback_2)>>('WeChatQRCode_DetectAndDecode_Async'); - late final _WeChatQRCode_DetectAndDecode_Async = - _WeChatQRCode_DetectAndDecode_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualitySSIM_compute_static'); + late final _cv_quality_QualitySSIM_compute_static = + _cv_quality_QualitySSIM_compute_staticPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, Mat, imp1.CvCallback_2)>(); + Mat, Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer WeChatQRCode_GetScaleFactor( - ffi.Pointer self, - ffi.Pointer rval, + ffi.Pointer cv_quality_QualitySSIM_create( + Mat ref, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _WeChatQRCode_GetScaleFactor( - self, + return _cv_quality_QualitySSIM_create( + ref, rval, + callback, ); } - late final _WeChatQRCode_GetScaleFactorPtr = _lookup< + late final _cv_quality_QualitySSIM_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('WeChatQRCode_GetScaleFactor'); - late final _WeChatQRCode_GetScaleFactor = - _WeChatQRCode_GetScaleFactorPtr.asFunction< + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_quality_QualitySSIM_create'); + late final _cv_quality_QualitySSIM_create = + _cv_quality_QualitySSIM_createPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer WeChatQRCode_GetScaleFactor_Async( - ffi.Pointer self, - imp1.CvCallback_1 callback, + void cv_wechat_qrcode_WeChatQRCode_close( + WeChatQRCodePtr self, ) { - return _WeChatQRCode_GetScaleFactor_Async( + return _cv_wechat_qrcode_WeChatQRCode_close( self, - callback, ); } - late final _WeChatQRCode_GetScaleFactor_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - imp1.CvCallback_1)>>('WeChatQRCode_GetScaleFactor_Async'); - late final _WeChatQRCode_GetScaleFactor_Async = - _WeChatQRCode_GetScaleFactor_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, imp1.CvCallback_1)>(); + late final _cv_wechat_qrcode_WeChatQRCode_closePtr = + _lookup>( + 'cv_wechat_qrcode_WeChatQRCode_close'); + late final _cv_wechat_qrcode_WeChatQRCode_close = + _cv_wechat_qrcode_WeChatQRCode_closePtr + .asFunction(); - ffi.Pointer WeChatQRCode_New( + ffi.Pointer cv_wechat_qrcode_WeChatQRCode_create( ffi.Pointer qrcode, ) { - return _WeChatQRCode_New( + return _cv_wechat_qrcode_WeChatQRCode_create( qrcode, ); } - late final _WeChatQRCode_NewPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('WeChatQRCode_New'); - late final _WeChatQRCode_New = _WeChatQRCode_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + late final _cv_wechat_qrcode_WeChatQRCode_createPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer)>>( + 'cv_wechat_qrcode_WeChatQRCode_create'); + late final _cv_wechat_qrcode_WeChatQRCode_create = + _cv_wechat_qrcode_WeChatQRCode_createPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer WeChatQRCode_NewWithParams( + ffi.Pointer cv_wechat_qrcode_WeChatQRCode_create_1( ffi.Pointer detector_prototxt_path, ffi.Pointer detector_caffe_model_path, ffi.Pointer super_resolution_prototxt_path, ffi.Pointer super_resolution_caffe_model_path, ffi.Pointer qrcode, + imp1.CvCallback_0 callback, ) { - return _WeChatQRCode_NewWithParams( + return _cv_wechat_qrcode_WeChatQRCode_create_1( detector_prototxt_path, detector_caffe_model_path, super_resolution_prototxt_path, super_resolution_caffe_model_path, qrcode, - ); - } - - late final _WeChatQRCode_NewWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('WeChatQRCode_NewWithParams'); - late final _WeChatQRCode_NewWithParams = - _WeChatQRCode_NewWithParamsPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>(); - - ffi.Pointer WeChatQRCode_NewWithParams_Async( - ffi.Pointer detector_prototxt_path, - ffi.Pointer detector_caffe_model_path, - ffi.Pointer super_resolution_prototxt_path, - ffi.Pointer super_resolution_caffe_model_path, - imp1.CvCallback_1 callback, - ) { - return _WeChatQRCode_NewWithParams_Async( - detector_prototxt_path, - detector_caffe_model_path, - super_resolution_prototxt_path, - super_resolution_caffe_model_path, callback, ); } - late final _WeChatQRCode_NewWithParams_AsyncPtr = _lookup< + late final _cv_wechat_qrcode_WeChatQRCode_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer, - imp1.CvCallback_1)>>('WeChatQRCode_NewWithParams_Async'); - late final _WeChatQRCode_NewWithParams_Async = - _WeChatQRCode_NewWithParams_AsyncPtr.asFunction< + ffi.Pointer, + imp1.CvCallback_0)>>('cv_wechat_qrcode_WeChatQRCode_create_1'); + late final _cv_wechat_qrcode_WeChatQRCode_create_1 = + _cv_wechat_qrcode_WeChatQRCode_create_1Ptr.asFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer, - imp1.CvCallback_1)>(); - - ffi.Pointer WeChatQRCode_New_Async( - imp1.CvCallback_1 callback, - ) { - return _WeChatQRCode_New_Async( - callback, - ); - } - - late final _WeChatQRCode_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'WeChatQRCode_New_Async'); - late final _WeChatQRCode_New_Async = _WeChatQRCode_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer WeChatQRCode_SetScaleFactor( - ffi.Pointer self, - double scale_factor, - ) { - return _WeChatQRCode_SetScaleFactor( - self, - scale_factor, - ); - } + ffi.Pointer, + imp1.CvCallback_0)>(); - late final _WeChatQRCode_SetScaleFactorPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Float)>>('WeChatQRCode_SetScaleFactor'); - late final _WeChatQRCode_SetScaleFactor = - _WeChatQRCode_SetScaleFactorPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, double)>(); - - ffi.Pointer WeChatQRCode_SetScaleFactor_Async( - ffi.Pointer self, - double scale_factor, + ffi.Pointer cv_wechat_qrcode_WeChatQRCode_detectAndDecode( + WeChatQRCode self, + Mat img, + ffi.Pointer points, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _WeChatQRCode_SetScaleFactor_Async( + return _cv_wechat_qrcode_WeChatQRCode_detectAndDecode( self, - scale_factor, + img, + points, + rval, callback, ); } - late final _WeChatQRCode_SetScaleFactor_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Float, - imp1.CvCallback_0)>>('WeChatQRCode_SetScaleFactor_Async'); - late final _WeChatQRCode_SetScaleFactor_Async = - _WeChatQRCode_SetScaleFactor_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, double, imp1.CvCallback_0)>(); - - ffi.Pointer averageHashCompare( - Mat a, - Mat b, - ffi.Pointer rval, + late final _cv_wechat_qrcode_WeChatQRCode_detectAndDecodePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + WeChatQRCode, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>( + 'cv_wechat_qrcode_WeChatQRCode_detectAndDecode'); + late final _cv_wechat_qrcode_WeChatQRCode_detectAndDecode = + _cv_wechat_qrcode_WeChatQRCode_detectAndDecodePtr.asFunction< + ffi.Pointer Function(WeChatQRCode, Mat, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_wechat_qrcode_WeChatQRCode_getScaleFactor( + WeChatQRCode self, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _averageHashCompare( - a, - b, + return _cv_wechat_qrcode_WeChatQRCode_getScaleFactor( + self, rval, - ); - } - - late final _averageHashComparePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Pointer)>>('averageHashCompare'); - late final _averageHashCompare = _averageHashComparePtr.asFunction< - ffi.Pointer Function(Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer averageHashCompare_Async( - Mat a, - Mat b, - imp1.CvCallback_1 callback, - ) { - return _averageHashCompare_Async( - a, - b, callback, ); } - late final _averageHashCompare_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('averageHashCompare_Async'); - late final _averageHashCompare_Async = - _averageHashCompare_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer averageHashCompute( - Mat inputArr, - ffi.Pointer outputArr, - ) { - return _averageHashCompute( - inputArr, - outputArr, - ); - } - - late final _averageHashComputePtr = _lookup< - ffi.NativeFunction< + late final _cv_wechat_qrcode_WeChatQRCode_getScaleFactorPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + WeChatQRCode, ffi.Pointer, imp1.CvCallback_0)>>( + 'cv_wechat_qrcode_WeChatQRCode_getScaleFactor'); + late final _cv_wechat_qrcode_WeChatQRCode_getScaleFactor = + _cv_wechat_qrcode_WeChatQRCode_getScaleFactorPtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer)>>('averageHashCompute'); - late final _averageHashCompute = _averageHashComputePtr - .asFunction Function(Mat, ffi.Pointer)>(); + WeChatQRCode, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer averageHashCompute_Async( - Mat inputArr, - imp1.CvCallback_1 callback, + ffi.Pointer cv_wechat_qrcode_WeChatQRCode_setScaleFactor( + WeChatQRCode self, + double scale_factor, + imp1.CvCallback_0 callback, ) { - return _averageHashCompute_Async( - inputArr, + return _cv_wechat_qrcode_WeChatQRCode_setScaleFactor( + self, + scale_factor, callback, ); } - late final _averageHashCompute_AsyncPtr = _lookup< - ffi.NativeFunction< + late final _cv_wechat_qrcode_WeChatQRCode_setScaleFactorPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + WeChatQRCode, ffi.Float, imp1.CvCallback_0)>>( + 'cv_wechat_qrcode_WeChatQRCode_setScaleFactor'); + late final _cv_wechat_qrcode_WeChatQRCode_setScaleFactor = + _cv_wechat_qrcode_WeChatQRCode_setScaleFactorPtr.asFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('averageHashCompute_Async'); - late final _averageHashCompute_Async = _averageHashCompute_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + WeChatQRCode, double, imp1.CvCallback_0)>(); - ffi.Pointer colorMomentHashCompare( - Mat a, - Mat b, - ffi.Pointer rval, + double cv_ximgproc_EdgeBoxes_getAlpha( + EdgeBoxes self, ) { - return _colorMomentHashCompare( - a, - b, - rval, + return _cv_ximgproc_EdgeBoxes_getAlpha( + self, ); } - late final _colorMomentHashComparePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Pointer)>>('colorMomentHashCompare'); - late final _colorMomentHashCompare = _colorMomentHashComparePtr.asFunction< - ffi.Pointer Function(Mat, Mat, ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_getAlphaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getAlpha'); + late final _cv_ximgproc_EdgeBoxes_getAlpha = + _cv_ximgproc_EdgeBoxes_getAlphaPtr + .asFunction(); - ffi.Pointer colorMomentHashCompare_Async( - Mat a, - Mat b, - imp1.CvCallback_1 callback, + double cv_ximgproc_EdgeBoxes_getBeta( + EdgeBoxes self, ) { - return _colorMomentHashCompare_Async( - a, - b, - callback, + return _cv_ximgproc_EdgeBoxes_getBeta( + self, ); } - late final _colorMomentHashCompare_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('colorMomentHashCompare_Async'); - late final _colorMomentHashCompare_Async = - _colorMomentHashCompare_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_getBetaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getBeta'); + late final _cv_ximgproc_EdgeBoxes_getBeta = _cv_ximgproc_EdgeBoxes_getBetaPtr + .asFunction(); - ffi.Pointer colorMomentHashCompute( - Mat inputArr, - ffi.Pointer outputArr, + ffi.Pointer cv_ximgproc_EdgeBoxes_getBoundingBoxes( + EdgeBoxes self, + Mat edge_map, + Mat orientation_map, + ffi.Pointer boxes, + ffi.Pointer scores, + imp1.CvCallback_0 callback, ) { - return _colorMomentHashCompute( - inputArr, - outputArr, + return _cv_ximgproc_EdgeBoxes_getBoundingBoxes( + self, + edge_map, + orientation_map, + boxes, + scores, + callback, ); } - late final _colorMomentHashComputePtr = _lookup< + late final _cv_ximgproc_EdgeBoxes_getBoundingBoxesPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Pointer)>>('colorMomentHashCompute'); - late final _colorMomentHashCompute = _colorMomentHashComputePtr - .asFunction Function(Mat, ffi.Pointer)>(); + EdgeBoxes, + Mat, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeBoxes_getBoundingBoxes'); + late final _cv_ximgproc_EdgeBoxes_getBoundingBoxes = + _cv_ximgproc_EdgeBoxes_getBoundingBoxesPtr.asFunction< + ffi.Pointer Function(EdgeBoxes, Mat, Mat, + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer colorMomentHashCompute_Async( - Mat inputArr, - imp1.CvCallback_1 callback, + double cv_ximgproc_EdgeBoxes_getClusterMinMag( + EdgeBoxes self, ) { - return _colorMomentHashCompute_Async( - inputArr, - callback, + return _cv_ximgproc_EdgeBoxes_getClusterMinMag( + self, ); } - late final _colorMomentHashCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('colorMomentHashCompute_Async'); - late final _colorMomentHashCompute_Async = _colorMomentHashCompute_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_getClusterMinMagPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getClusterMinMag'); + late final _cv_ximgproc_EdgeBoxes_getClusterMinMag = + _cv_ximgproc_EdgeBoxes_getClusterMinMagPtr + .asFunction(); - ffi.Pointer getPredefinedDictionary( - int dictionaryId, - ffi.Pointer rval, + double cv_ximgproc_EdgeBoxes_getEdgeMergeThr( + EdgeBoxes self, ) { - return _getPredefinedDictionary( - dictionaryId, - rval, + return _cv_ximgproc_EdgeBoxes_getEdgeMergeThr( + self, ); } - late final _getPredefinedDictionaryPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, - ffi.Pointer)>>('getPredefinedDictionary'); - late final _getPredefinedDictionary = _getPredefinedDictionaryPtr.asFunction< - ffi.Pointer Function(int, ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_getEdgeMergeThrPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getEdgeMergeThr'); + late final _cv_ximgproc_EdgeBoxes_getEdgeMergeThr = + _cv_ximgproc_EdgeBoxes_getEdgeMergeThrPtr + .asFunction(); - ffi.Pointer getPredefinedDictionary_Async( - int dictionaryId, - imp1.CvCallback_1 callback, + double cv_ximgproc_EdgeBoxes_getEdgeMinMag( + EdgeBoxes self, ) { - return _getPredefinedDictionary_Async( - dictionaryId, - callback, + return _cv_ximgproc_EdgeBoxes_getEdgeMinMag( + self, ); } - late final _getPredefinedDictionary_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, imp1.CvCallback_1)>>('getPredefinedDictionary_Async'); - late final _getPredefinedDictionary_Async = _getPredefinedDictionary_AsyncPtr - .asFunction Function(int, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_getEdgeMinMagPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getEdgeMinMag'); + late final _cv_ximgproc_EdgeBoxes_getEdgeMinMag = + _cv_ximgproc_EdgeBoxes_getEdgeMinMagPtr + .asFunction(); - ffi.Pointer marrHildrethHashCompare( - Mat a, - Mat b, - double alpha, - double scale, - ffi.Pointer rval, + double cv_ximgproc_EdgeBoxes_getEta( + EdgeBoxes self, ) { - return _marrHildrethHashCompare( - a, - b, - alpha, - scale, - rval, + return _cv_ximgproc_EdgeBoxes_getEta( + self, ); } - late final _marrHildrethHashComparePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, - ffi.Pointer)>>('marrHildrethHashCompare'); - late final _marrHildrethHashCompare = _marrHildrethHashComparePtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, double, ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_getEtaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getEta'); + late final _cv_ximgproc_EdgeBoxes_getEta = + _cv_ximgproc_EdgeBoxes_getEtaPtr.asFunction(); - ffi.Pointer marrHildrethHashCompare_Async( - Mat a, - Mat b, - double alpha, - double scale, - imp1.CvCallback_1 callback, + double cv_ximgproc_EdgeBoxes_getGamma( + EdgeBoxes self, ) { - return _marrHildrethHashCompare_Async( - a, - b, - alpha, - scale, - callback, + return _cv_ximgproc_EdgeBoxes_getGamma( + self, ); } - late final _marrHildrethHashCompare_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('marrHildrethHashCompare_Async'); - late final _marrHildrethHashCompare_Async = - _marrHildrethHashCompare_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, double, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_getGammaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getGamma'); + late final _cv_ximgproc_EdgeBoxes_getGamma = + _cv_ximgproc_EdgeBoxes_getGammaPtr + .asFunction(); - ffi.Pointer marrHildrethHashCompute( - Mat inputArr, - ffi.Pointer outputArr, - double alpha, - double scale, + double cv_ximgproc_EdgeBoxes_getKappa( + EdgeBoxes self, ) { - return _marrHildrethHashCompute( - inputArr, - outputArr, - alpha, - scale, + return _cv_ximgproc_EdgeBoxes_getKappa( + self, ); } - late final _marrHildrethHashComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, ffi.Float, - ffi.Float)>>('marrHildrethHashCompute'); - late final _marrHildrethHashCompute = _marrHildrethHashComputePtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, double, double)>(); + late final _cv_ximgproc_EdgeBoxes_getKappaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getKappa'); + late final _cv_ximgproc_EdgeBoxes_getKappa = + _cv_ximgproc_EdgeBoxes_getKappaPtr + .asFunction(); - ffi.Pointer marrHildrethHashCompute_Async( - Mat inputArr, - double alpha, - double scale, - imp1.CvCallback_1 callback, + double cv_ximgproc_EdgeBoxes_getMaxAspectRatio( + EdgeBoxes self, ) { - return _marrHildrethHashCompute_Async( - inputArr, - alpha, - scale, - callback, + return _cv_ximgproc_EdgeBoxes_getMaxAspectRatio( + self, ); } - late final _marrHildrethHashCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('marrHildrethHashCompute_Async'); - late final _marrHildrethHashCompute_Async = - _marrHildrethHashCompute_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, double, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_getMaxAspectRatioPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getMaxAspectRatio'); + late final _cv_ximgproc_EdgeBoxes_getMaxAspectRatio = + _cv_ximgproc_EdgeBoxes_getMaxAspectRatioPtr + .asFunction(); - ffi.Pointer pHashCompare( - Mat a, - Mat b, - ffi.Pointer rval, + int cv_ximgproc_EdgeBoxes_getMaxBoxes( + EdgeBoxes self, ) { - return _pHashCompare( - a, - b, - rval, + return _cv_ximgproc_EdgeBoxes_getMaxBoxes( + self, ); } - late final _pHashComparePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Pointer)>>('pHashCompare'); - late final _pHashCompare = _pHashComparePtr.asFunction< - ffi.Pointer Function(Mat, Mat, ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_getMaxBoxesPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getMaxBoxes'); + late final _cv_ximgproc_EdgeBoxes_getMaxBoxes = + _cv_ximgproc_EdgeBoxes_getMaxBoxesPtr + .asFunction(); - ffi.Pointer pHashCompare_Async( - Mat a, - Mat b, - imp1.CvCallback_1 callback, + double cv_ximgproc_EdgeBoxes_getMinBoxArea( + EdgeBoxes self, ) { - return _pHashCompare_Async( - a, - b, - callback, + return _cv_ximgproc_EdgeBoxes_getMinBoxArea( + self, ); } - late final _pHashCompare_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('pHashCompare_Async'); - late final _pHashCompare_Async = _pHashCompare_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_getMinBoxAreaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getMinBoxArea'); + late final _cv_ximgproc_EdgeBoxes_getMinBoxArea = + _cv_ximgproc_EdgeBoxes_getMinBoxAreaPtr + .asFunction(); - ffi.Pointer pHashCompute( - Mat inputArr, - ffi.Pointer outputArr, + double cv_ximgproc_EdgeBoxes_getMinScore( + EdgeBoxes self, ) { - return _pHashCompute( - inputArr, - outputArr, + return _cv_ximgproc_EdgeBoxes_getMinScore( + self, ); } - late final _pHashComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('pHashCompute'); - late final _pHashCompute = _pHashComputePtr - .asFunction Function(Mat, ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_getMinScorePtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_getMinScore'); + late final _cv_ximgproc_EdgeBoxes_getMinScore = + _cv_ximgproc_EdgeBoxes_getMinScorePtr + .asFunction(); - ffi.Pointer pHashCompute_Async( - Mat inputArr, - imp1.CvCallback_1 callback, + void cv_ximgproc_EdgeBoxes_setAlpha( + EdgeBoxes self, + double value, ) { - return _pHashCompute_Async( - inputArr, - callback, + return _cv_ximgproc_EdgeBoxes_setAlpha( + self, + value, ); } - late final _pHashCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('pHashCompute_Async'); - late final _pHashCompute_Async = _pHashCompute_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_setAlphaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setAlpha'); + late final _cv_ximgproc_EdgeBoxes_setAlpha = + _cv_ximgproc_EdgeBoxes_setAlphaPtr + .asFunction(); - ffi.Pointer radialVarianceHashCompare( - Mat a, - Mat b, - double sigma, - int numOfAngleLine, - ffi.Pointer rval, + void cv_ximgproc_EdgeBoxes_setBeta( + EdgeBoxes self, + double value, ) { - return _radialVarianceHashCompare( - a, - b, - sigma, - numOfAngleLine, - rval, + return _cv_ximgproc_EdgeBoxes_setBeta( + self, + value, ); } - late final _radialVarianceHashComparePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Int, - ffi.Pointer)>>('radialVarianceHashCompare'); - late final _radialVarianceHashCompare = - _radialVarianceHashComparePtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, int, ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_setBetaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setBeta'); + late final _cv_ximgproc_EdgeBoxes_setBeta = _cv_ximgproc_EdgeBoxes_setBetaPtr + .asFunction(); - ffi.Pointer radialVarianceHashCompare_Async( - Mat a, - Mat b, - double sigma, - int numOfAngleLine, - imp1.CvCallback_1 callback, + void cv_ximgproc_EdgeBoxes_setClusterMinMag( + EdgeBoxes self, + double value, ) { - return _radialVarianceHashCompare_Async( - a, - b, - sigma, - numOfAngleLine, - callback, + return _cv_ximgproc_EdgeBoxes_setClusterMinMag( + self, + value, ); } - late final _radialVarianceHashCompare_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('radialVarianceHashCompare_Async'); - late final _radialVarianceHashCompare_Async = - _radialVarianceHashCompare_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, int, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_setClusterMinMagPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setClusterMinMag'); + late final _cv_ximgproc_EdgeBoxes_setClusterMinMag = + _cv_ximgproc_EdgeBoxes_setClusterMinMagPtr + .asFunction(); - ffi.Pointer radialVarianceHashCompute( - Mat inputArr, - ffi.Pointer outputArr, - double sigma, - int numOfAngleLine, + void cv_ximgproc_EdgeBoxes_setEdgeMergeThr( + EdgeBoxes self, + double value, ) { - return _radialVarianceHashCompute( - inputArr, - outputArr, - sigma, - numOfAngleLine, + return _cv_ximgproc_EdgeBoxes_setEdgeMergeThr( + self, + value, ); } - late final _radialVarianceHashComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, ffi.Double, - ffi.Int)>>('radialVarianceHashCompute'); - late final _radialVarianceHashCompute = - _radialVarianceHashComputePtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, double, int)>(); + late final _cv_ximgproc_EdgeBoxes_setEdgeMergeThrPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setEdgeMergeThr'); + late final _cv_ximgproc_EdgeBoxes_setEdgeMergeThr = + _cv_ximgproc_EdgeBoxes_setEdgeMergeThrPtr + .asFunction(); - ffi.Pointer radialVarianceHashCompute_Async( - Mat inputArr, - double sigma, - int numOfAngleLine, - imp1.CvCallback_1 callback, + void cv_ximgproc_EdgeBoxes_setEdgeMinMag( + EdgeBoxes self, + double value, ) { - return _radialVarianceHashCompute_Async( - inputArr, - sigma, - numOfAngleLine, - callback, + return _cv_ximgproc_EdgeBoxes_setEdgeMinMag( + self, + value, ); } - late final _radialVarianceHashCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('radialVarianceHashCompute_Async'); - late final _radialVarianceHashCompute_Async = - _radialVarianceHashCompute_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, int, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_setEdgeMinMagPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setEdgeMinMag'); + late final _cv_ximgproc_EdgeBoxes_setEdgeMinMag = + _cv_ximgproc_EdgeBoxes_setEdgeMinMagPtr + .asFunction(); - ffi.Pointer ximgproc_EdgeBoxes_getBoundingBoxes( + void cv_ximgproc_EdgeBoxes_setEta( EdgeBoxes self, - Mat edge_map, - Mat orientation_map, - ffi.Pointer boxes, - ffi.Pointer scores, + double value, ) { - return _ximgproc_EdgeBoxes_getBoundingBoxes( + return _cv_ximgproc_EdgeBoxes_setEta( self, - edge_map, - orientation_map, - boxes, - scores, + value, ); } - late final _ximgproc_EdgeBoxes_getBoundingBoxesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - EdgeBoxes, - Mat, - Mat, - ffi.Pointer, - ffi.Pointer)>>('ximgproc_EdgeBoxes_getBoundingBoxes'); - late final _ximgproc_EdgeBoxes_getBoundingBoxes = - _ximgproc_EdgeBoxes_getBoundingBoxesPtr.asFunction< - ffi.Pointer Function(EdgeBoxes, Mat, Mat, - ffi.Pointer, ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_setEtaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setEta'); + late final _cv_ximgproc_EdgeBoxes_setEta = _cv_ximgproc_EdgeBoxes_setEtaPtr + .asFunction(); - void ximgproc_EdgeDrawing_Close( - EdgeDrawingPtr self, + void cv_ximgproc_EdgeBoxes_setGamma( + EdgeBoxes self, + double value, ) { - return _ximgproc_EdgeDrawing_Close( + return _cv_ximgproc_EdgeBoxes_setGamma( self, + value, ); } - late final _ximgproc_EdgeDrawing_ClosePtr = - _lookup>( - 'ximgproc_EdgeDrawing_Close'); - late final _ximgproc_EdgeDrawing_Close = _ximgproc_EdgeDrawing_ClosePtr - .asFunction(); + late final _cv_ximgproc_EdgeBoxes_setGammaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setGamma'); + late final _cv_ximgproc_EdgeBoxes_setGamma = + _cv_ximgproc_EdgeBoxes_setGammaPtr + .asFunction(); - ffi.Pointer ximgproc_EdgeDrawing_Create( - ffi.Pointer rval, + void cv_ximgproc_EdgeBoxes_setKappa( + EdgeBoxes self, + double value, ) { - return _ximgproc_EdgeDrawing_Create( - rval, + return _cv_ximgproc_EdgeBoxes_setKappa( + self, + value, ); } - late final _ximgproc_EdgeDrawing_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('ximgproc_EdgeDrawing_Create'); - late final _ximgproc_EdgeDrawing_Create = _ximgproc_EdgeDrawing_CreatePtr - .asFunction Function(ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_setKappaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setKappa'); + late final _cv_ximgproc_EdgeBoxes_setKappa = + _cv_ximgproc_EdgeBoxes_setKappaPtr + .asFunction(); - ffi.Pointer ximgproc_EdgeDrawing_Create_Async( - imp1.CvCallback_1 callback, + void cv_ximgproc_EdgeBoxes_setMaxAspectRatio( + EdgeBoxes self, + double value, ) { - return _ximgproc_EdgeDrawing_Create_Async( - callback, + return _cv_ximgproc_EdgeBoxes_setMaxAspectRatio( + self, + value, ); } - late final _ximgproc_EdgeDrawing_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'ximgproc_EdgeDrawing_Create_Async'); - late final _ximgproc_EdgeDrawing_Create_Async = - _ximgproc_EdgeDrawing_Create_AsyncPtr - .asFunction Function(imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeBoxes_setMaxAspectRatioPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setMaxAspectRatio'); + late final _cv_ximgproc_EdgeBoxes_setMaxAspectRatio = + _cv_ximgproc_EdgeBoxes_setMaxAspectRatioPtr + .asFunction(); - ffi.Pointer ximgproc_EdgeDrawing_detectEdges( - EdgeDrawing self, - Mat src, + void cv_ximgproc_EdgeBoxes_setMaxBoxes( + EdgeBoxes self, + int value, ) { - return _ximgproc_EdgeDrawing_detectEdges( + return _cv_ximgproc_EdgeBoxes_setMaxBoxes( self, - src, + value, ); } - late final _ximgproc_EdgeDrawing_detectEdgesPtr = _lookup< - ffi.NativeFunction Function(EdgeDrawing, Mat)>>( - 'ximgproc_EdgeDrawing_detectEdges'); - late final _ximgproc_EdgeDrawing_detectEdges = - _ximgproc_EdgeDrawing_detectEdgesPtr - .asFunction Function(EdgeDrawing, Mat)>(); + late final _cv_ximgproc_EdgeBoxes_setMaxBoxesPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setMaxBoxes'); + late final _cv_ximgproc_EdgeBoxes_setMaxBoxes = + _cv_ximgproc_EdgeBoxes_setMaxBoxesPtr + .asFunction(); - ffi.Pointer ximgproc_EdgeDrawing_detectEdges_Async( - EdgeDrawing self, - Mat src, - imp1.CvCallback_0 callback, + void cv_ximgproc_EdgeBoxes_setMinBoxArea( + EdgeBoxes self, + double value, ) { - return _ximgproc_EdgeDrawing_detectEdges_Async( + return _cv_ximgproc_EdgeBoxes_setMinBoxArea( self, - src, - callback, + value, ); } - late final _ximgproc_EdgeDrawing_detectEdges_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, Mat, - imp1.CvCallback_0)>>('ximgproc_EdgeDrawing_detectEdges_Async'); - late final _ximgproc_EdgeDrawing_detectEdges_Async = - _ximgproc_EdgeDrawing_detectEdges_AsyncPtr.asFunction< - ffi.Pointer Function( - EdgeDrawing, Mat, imp1.CvCallback_0)>(); + late final _cv_ximgproc_EdgeBoxes_setMinBoxAreaPtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setMinBoxArea'); + late final _cv_ximgproc_EdgeBoxes_setMinBoxArea = + _cv_ximgproc_EdgeBoxes_setMinBoxAreaPtr + .asFunction(); - ffi.Pointer ximgproc_EdgeDrawing_detectEllipses( - EdgeDrawing self, - ffi.Pointer ellipses, + void cv_ximgproc_EdgeBoxes_setMinScore( + EdgeBoxes self, + double value, ) { - return _ximgproc_EdgeDrawing_detectEllipses( + return _cv_ximgproc_EdgeBoxes_setMinScore( self, - ellipses, + value, ); } - late final _ximgproc_EdgeDrawing_detectEllipsesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - ffi.Pointer)>>('ximgproc_EdgeDrawing_detectEllipses'); - late final _ximgproc_EdgeDrawing_detectEllipses = - _ximgproc_EdgeDrawing_detectEllipsesPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, ffi.Pointer)>(); + late final _cv_ximgproc_EdgeBoxes_setMinScorePtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_setMinScore'); + late final _cv_ximgproc_EdgeBoxes_setMinScore = + _cv_ximgproc_EdgeBoxes_setMinScorePtr + .asFunction(); - ffi.Pointer ximgproc_EdgeDrawing_detectEllipses_Async( - EdgeDrawing self, - imp1.CvCallback_1 callback, + void cv_ximgproc_EdgeDrawing_close( + EdgeDrawingPtr self, ) { - return _ximgproc_EdgeDrawing_detectEllipses_Async( + return _cv_ximgproc_EdgeDrawing_close( self, - callback, ); } - late final _ximgproc_EdgeDrawing_detectEllipses_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - imp1.CvCallback_1)>>('ximgproc_EdgeDrawing_detectEllipses_Async'); - late final _ximgproc_EdgeDrawing_detectEllipses_Async = - _ximgproc_EdgeDrawing_detectEllipses_AsyncPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeDrawing_closePtr = + _lookup>( + 'cv_ximgproc_EdgeDrawing_close'); + late final _cv_ximgproc_EdgeDrawing_close = _cv_ximgproc_EdgeDrawing_closePtr + .asFunction(); - ffi.Pointer ximgproc_EdgeDrawing_detectLines( - EdgeDrawing self, - ffi.Pointer lines, + ffi.Pointer cv_ximgproc_EdgeDrawing_create( + ffi.Pointer rval, ) { - return _ximgproc_EdgeDrawing_detectLines( - self, - lines, + return _cv_ximgproc_EdgeDrawing_create( + rval, ); } - late final _ximgproc_EdgeDrawing_detectLinesPtr = _lookup< + late final _cv_ximgproc_EdgeDrawing_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - ffi.Pointer)>>('ximgproc_EdgeDrawing_detectLines'); - late final _ximgproc_EdgeDrawing_detectLines = - _ximgproc_EdgeDrawing_detectLinesPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, ffi.Pointer)>(); + ffi.Pointer Function( + ffi.Pointer)>>('cv_ximgproc_EdgeDrawing_create'); + late final _cv_ximgproc_EdgeDrawing_create = + _cv_ximgproc_EdgeDrawing_createPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer ximgproc_EdgeDrawing_detectLines_Async( + ffi.Pointer cv_ximgproc_EdgeDrawing_detectEdges( EdgeDrawing self, - imp1.CvCallback_1 callback, + Mat src, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_detectLines_Async( + return _cv_ximgproc_EdgeDrawing_detectEdges( self, + src, callback, ); } - late final _ximgproc_EdgeDrawing_detectLines_AsyncPtr = _lookup< + late final _cv_ximgproc_EdgeDrawing_detectEdgesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - imp1.CvCallback_1)>>('ximgproc_EdgeDrawing_detectLines_Async'); - late final _ximgproc_EdgeDrawing_detectLines_Async = - _ximgproc_EdgeDrawing_detectLines_AsyncPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, imp1.CvCallback_1)>(); + ffi.Pointer Function(EdgeDrawing, Mat, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeDrawing_detectEdges'); + late final _cv_ximgproc_EdgeDrawing_detectEdges = + _cv_ximgproc_EdgeDrawing_detectEdgesPtr.asFunction< + ffi.Pointer Function( + EdgeDrawing, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_EdgeDrawing_getEdgeImage( + ffi.Pointer cv_ximgproc_EdgeDrawing_detectEllipses( EdgeDrawing self, - ffi.Pointer dst, + Mat ellipses, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_getEdgeImage( + return _cv_ximgproc_EdgeDrawing_detectEllipses( self, - dst, + ellipses, + callback, ); } - late final _ximgproc_EdgeDrawing_getEdgeImagePtr = _lookup< + late final _cv_ximgproc_EdgeDrawing_detectEllipsesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - ffi.Pointer)>>('ximgproc_EdgeDrawing_getEdgeImage'); - late final _ximgproc_EdgeDrawing_getEdgeImage = - _ximgproc_EdgeDrawing_getEdgeImagePtr.asFunction< - ffi.Pointer Function(EdgeDrawing, ffi.Pointer)>(); + ffi.Pointer Function(EdgeDrawing, Mat, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeDrawing_detectEllipses'); + late final _cv_ximgproc_EdgeDrawing_detectEllipses = + _cv_ximgproc_EdgeDrawing_detectEllipsesPtr.asFunction< + ffi.Pointer Function( + EdgeDrawing, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_EdgeDrawing_getEdgeImage_Async( + ffi.Pointer cv_ximgproc_EdgeDrawing_detectLines( EdgeDrawing self, - imp1.CvCallback_1 callback, + Mat lines, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_getEdgeImage_Async( + return _cv_ximgproc_EdgeDrawing_detectLines( self, + lines, callback, ); } - late final _ximgproc_EdgeDrawing_getEdgeImage_AsyncPtr = _lookup< + late final _cv_ximgproc_EdgeDrawing_detectLinesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - imp1.CvCallback_1)>>('ximgproc_EdgeDrawing_getEdgeImage_Async'); - late final _ximgproc_EdgeDrawing_getEdgeImage_Async = - _ximgproc_EdgeDrawing_getEdgeImage_AsyncPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, imp1.CvCallback_1)>(); + ffi.Pointer Function(EdgeDrawing, Mat, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeDrawing_detectLines'); + late final _cv_ximgproc_EdgeDrawing_detectLines = + _cv_ximgproc_EdgeDrawing_detectLinesPtr.asFunction< + ffi.Pointer Function( + EdgeDrawing, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_EdgeDrawing_getGradientImage( + ffi.Pointer cv_ximgproc_EdgeDrawing_getEdgeImage( EdgeDrawing self, - ffi.Pointer dst, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_getGradientImage( + return _cv_ximgproc_EdgeDrawing_getEdgeImage( self, dst, + callback, ); } - late final _ximgproc_EdgeDrawing_getGradientImagePtr = _lookup< + late final _cv_ximgproc_EdgeDrawing_getEdgeImagePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - ffi.Pointer)>>('ximgproc_EdgeDrawing_getGradientImage'); - late final _ximgproc_EdgeDrawing_getGradientImage = - _ximgproc_EdgeDrawing_getGradientImagePtr.asFunction< - ffi.Pointer Function(EdgeDrawing, ffi.Pointer)>(); + ffi.Pointer Function(EdgeDrawing, Mat, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeDrawing_getEdgeImage'); + late final _cv_ximgproc_EdgeDrawing_getEdgeImage = + _cv_ximgproc_EdgeDrawing_getEdgeImagePtr.asFunction< + ffi.Pointer Function( + EdgeDrawing, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_EdgeDrawing_getGradientImage_Async( + ffi.Pointer cv_ximgproc_EdgeDrawing_getGradientImage( EdgeDrawing self, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_getGradientImage_Async( + return _cv_ximgproc_EdgeDrawing_getGradientImage( self, + dst, callback, ); } - late final _ximgproc_EdgeDrawing_getGradientImage_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, imp1.CvCallback_1)>>( - 'ximgproc_EdgeDrawing_getGradientImage_Async'); - late final _ximgproc_EdgeDrawing_getGradientImage_Async = - _ximgproc_EdgeDrawing_getGradientImage_AsyncPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, imp1.CvCallback_1)>(); + late final _cv_ximgproc_EdgeDrawing_getGradientImagePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(EdgeDrawing, Mat, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeDrawing_getGradientImage'); + late final _cv_ximgproc_EdgeDrawing_getGradientImage = + _cv_ximgproc_EdgeDrawing_getGradientImagePtr.asFunction< + ffi.Pointer Function( + EdgeDrawing, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_EdgeDrawing_getParams( + ffi.Pointer cv_ximgproc_EdgeDrawing_getParams( EdgeDrawing self, ffi.Pointer params, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_getParams( + return _cv_ximgproc_EdgeDrawing_getParams( self, params, + callback, ); } - late final _ximgproc_EdgeDrawing_getParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - EdgeDrawing, ffi.Pointer)>>( - 'ximgproc_EdgeDrawing_getParams'); - late final _ximgproc_EdgeDrawing_getParams = - _ximgproc_EdgeDrawing_getParamsPtr.asFunction< + late final _cv_ximgproc_EdgeDrawing_getParamsPtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - EdgeDrawing, ffi.Pointer)>(); + EdgeDrawing, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeDrawing_getParams'); + late final _cv_ximgproc_EdgeDrawing_getParams = + _cv_ximgproc_EdgeDrawing_getParamsPtr.asFunction< + ffi.Pointer Function(EdgeDrawing, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_EdgeDrawing_getSegmentIndicesOfLines( + ffi.Pointer cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLines( EdgeDrawing self, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_getSegmentIndicesOfLines( + return _cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLines( self, rval, - ); - } - - late final _ximgproc_EdgeDrawing_getSegmentIndicesOfLinesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - EdgeDrawing, ffi.Pointer)>>( - 'ximgproc_EdgeDrawing_getSegmentIndicesOfLines'); - late final _ximgproc_EdgeDrawing_getSegmentIndicesOfLines = - _ximgproc_EdgeDrawing_getSegmentIndicesOfLinesPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, ffi.Pointer)>(); - - ffi.Pointer ximgproc_EdgeDrawing_getSegmentIndicesOfLines_Async( - EdgeDrawing self, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_EdgeDrawing_getSegmentIndicesOfLines_Async( - self, callback, ); } - late final _ximgproc_EdgeDrawing_getSegmentIndicesOfLines_AsyncPtr = _lookup< + late final _cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLinesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, imp1.CvCallback_1)>>( - 'ximgproc_EdgeDrawing_getSegmentIndicesOfLines_Async'); - late final _ximgproc_EdgeDrawing_getSegmentIndicesOfLines_Async = - _ximgproc_EdgeDrawing_getSegmentIndicesOfLines_AsyncPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, imp1.CvCallback_1)>(); + ffi.Pointer Function( + EdgeDrawing, ffi.Pointer, imp1.CvCallback_0)>>( + 'cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLines'); + late final _cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLines = + _cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLinesPtr.asFunction< + ffi.Pointer Function( + EdgeDrawing, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_EdgeDrawing_getSegments( + ffi.Pointer cv_ximgproc_EdgeDrawing_getSegments( EdgeDrawing self, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_getSegments( + return _cv_ximgproc_EdgeDrawing_getSegments( self, rval, - ); - } - - late final _ximgproc_EdgeDrawing_getSegmentsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - ffi.Pointer)>>('ximgproc_EdgeDrawing_getSegments'); - late final _ximgproc_EdgeDrawing_getSegments = - _ximgproc_EdgeDrawing_getSegmentsPtr.asFunction< - ffi.Pointer Function( - EdgeDrawing, ffi.Pointer)>(); - - ffi.Pointer ximgproc_EdgeDrawing_getSegments_Async( - EdgeDrawing self, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_EdgeDrawing_getSegments_Async( - self, callback, ); } - late final _ximgproc_EdgeDrawing_getSegments_AsyncPtr = _lookup< + late final _cv_ximgproc_EdgeDrawing_getSegmentsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - imp1.CvCallback_1)>>('ximgproc_EdgeDrawing_getSegments_Async'); - late final _ximgproc_EdgeDrawing_getSegments_Async = - _ximgproc_EdgeDrawing_getSegments_AsyncPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, imp1.CvCallback_1)>(); + ffi.Pointer Function(EdgeDrawing, ffi.Pointer, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeDrawing_getSegments'); + late final _cv_ximgproc_EdgeDrawing_getSegments = + _cv_ximgproc_EdgeDrawing_getSegmentsPtr.asFunction< + ffi.Pointer Function( + EdgeDrawing, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_EdgeDrawing_setParams( + ffi.Pointer cv_ximgproc_EdgeDrawing_setParams( EdgeDrawing self, EdgeDrawingParams params, + imp1.CvCallback_0 callback, ) { - return _ximgproc_EdgeDrawing_setParams( + return _cv_ximgproc_EdgeDrawing_setParams( self, params, + callback, ); } - late final _ximgproc_EdgeDrawing_setParamsPtr = _lookup< + late final _cv_ximgproc_EdgeDrawing_setParamsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(EdgeDrawing, - EdgeDrawingParams)>>('ximgproc_EdgeDrawing_setParams'); - late final _ximgproc_EdgeDrawing_setParams = - _ximgproc_EdgeDrawing_setParamsPtr.asFunction< - ffi.Pointer Function(EdgeDrawing, EdgeDrawingParams)>(); + ffi.Pointer Function(EdgeDrawing, EdgeDrawingParams, + imp1.CvCallback_0)>>('cv_ximgproc_EdgeDrawing_setParams'); + late final _cv_ximgproc_EdgeDrawing_setParams = + _cv_ximgproc_EdgeDrawing_setParamsPtr.asFunction< + ffi.Pointer Function( + EdgeDrawing, EdgeDrawingParams, imp1.CvCallback_0)>(); - void ximgproc_GraphSegmentation_Close( + void cv_ximgproc_GraphSegmentation_close( GraphSegmentationPtr self, ) { - return _ximgproc_GraphSegmentation_Close( + return _cv_ximgproc_GraphSegmentation_close( self, ); } - late final _ximgproc_GraphSegmentation_ClosePtr = + late final _cv_ximgproc_GraphSegmentation_closePtr = _lookup>( - 'ximgproc_GraphSegmentation_Close'); - late final _ximgproc_GraphSegmentation_Close = - _ximgproc_GraphSegmentation_ClosePtr + 'cv_ximgproc_GraphSegmentation_close'); + late final _cv_ximgproc_GraphSegmentation_close = + _cv_ximgproc_GraphSegmentation_closePtr .asFunction(); - ffi.Pointer ximgproc_GraphSegmentation_Create( + ffi.Pointer cv_ximgproc_GraphSegmentation_create( double sigma, double k, int min_size, ffi.Pointer rval, ) { - return _ximgproc_GraphSegmentation_Create( + return _cv_ximgproc_GraphSegmentation_create( sigma, k, min_size, @@ -4817,320 +2879,229 @@ class CvNativeContrib { ); } - late final _ximgproc_GraphSegmentation_CreatePtr = _lookup< + late final _cv_ximgproc_GraphSegmentation_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Float, ffi.Float, ffi.Int, ffi.Pointer)>>( - 'ximgproc_GraphSegmentation_Create'); - late final _ximgproc_GraphSegmentation_Create = - _ximgproc_GraphSegmentation_CreatePtr.asFunction< + 'cv_ximgproc_GraphSegmentation_create'); + late final _cv_ximgproc_GraphSegmentation_create = + _cv_ximgproc_GraphSegmentation_createPtr.asFunction< ffi.Pointer Function( double, double, int, ffi.Pointer)>(); - ffi.Pointer ximgproc_GraphSegmentation_Create_Async( - double sigma, - double k, - int min_size, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_GraphSegmentation_Create_Async( - sigma, - k, - min_size, - callback, - ); - } - - late final _ximgproc_GraphSegmentation_Create_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Float, ffi.Float, ffi.Int, - imp1.CvCallback_1)>>('ximgproc_GraphSegmentation_Create_Async'); - late final _ximgproc_GraphSegmentation_Create_Async = - _ximgproc_GraphSegmentation_Create_AsyncPtr.asFunction< - ffi.Pointer Function( - double, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer ximgproc_GraphSegmentation_getK( + double cv_ximgproc_GraphSegmentation_getK( GraphSegmentation self, - ffi.Pointer rval, ) { - return _ximgproc_GraphSegmentation_getK( + return _cv_ximgproc_GraphSegmentation_getK( self, - rval, ); } - late final _ximgproc_GraphSegmentation_getKPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(GraphSegmentation, - ffi.Pointer)>>('ximgproc_GraphSegmentation_getK'); - late final _ximgproc_GraphSegmentation_getK = - _ximgproc_GraphSegmentation_getKPtr.asFunction< - ffi.Pointer Function( - GraphSegmentation, ffi.Pointer)>(); + late final _cv_ximgproc_GraphSegmentation_getKPtr = + _lookup>( + 'cv_ximgproc_GraphSegmentation_getK'); + late final _cv_ximgproc_GraphSegmentation_getK = + _cv_ximgproc_GraphSegmentation_getKPtr + .asFunction(); - ffi.Pointer ximgproc_GraphSegmentation_getMinSize( + int cv_ximgproc_GraphSegmentation_getMinSize( GraphSegmentation self, - ffi.Pointer rval, ) { - return _ximgproc_GraphSegmentation_getMinSize( + return _cv_ximgproc_GraphSegmentation_getMinSize( self, - rval, ); } - late final _ximgproc_GraphSegmentation_getMinSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(GraphSegmentation, - ffi.Pointer)>>('ximgproc_GraphSegmentation_getMinSize'); - late final _ximgproc_GraphSegmentation_getMinSize = - _ximgproc_GraphSegmentation_getMinSizePtr.asFunction< - ffi.Pointer Function( - GraphSegmentation, ffi.Pointer)>(); + late final _cv_ximgproc_GraphSegmentation_getMinSizePtr = + _lookup>( + 'cv_ximgproc_GraphSegmentation_getMinSize'); + late final _cv_ximgproc_GraphSegmentation_getMinSize = + _cv_ximgproc_GraphSegmentation_getMinSizePtr + .asFunction(); - ffi.Pointer ximgproc_GraphSegmentation_getSigma( + double cv_ximgproc_GraphSegmentation_getSigma( GraphSegmentation self, - ffi.Pointer rval, ) { - return _ximgproc_GraphSegmentation_getSigma( + return _cv_ximgproc_GraphSegmentation_getSigma( self, - rval, ); } - late final _ximgproc_GraphSegmentation_getSigmaPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(GraphSegmentation, - ffi.Pointer)>>('ximgproc_GraphSegmentation_getSigma'); - late final _ximgproc_GraphSegmentation_getSigma = - _ximgproc_GraphSegmentation_getSigmaPtr.asFunction< - ffi.Pointer Function( - GraphSegmentation, ffi.Pointer)>(); + late final _cv_ximgproc_GraphSegmentation_getSigmaPtr = + _lookup>( + 'cv_ximgproc_GraphSegmentation_getSigma'); + late final _cv_ximgproc_GraphSegmentation_getSigma = + _cv_ximgproc_GraphSegmentation_getSigmaPtr + .asFunction(); - ffi.Pointer ximgproc_GraphSegmentation_processImage( + ffi.Pointer cv_ximgproc_GraphSegmentation_processImage( GraphSegmentation self, Mat src, - ffi.Pointer dst, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _ximgproc_GraphSegmentation_processImage( + return _cv_ximgproc_GraphSegmentation_processImage( self, src, dst, - ); - } - - late final _ximgproc_GraphSegmentation_processImagePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(GraphSegmentation, Mat, - ffi.Pointer)>>('ximgproc_GraphSegmentation_processImage'); - late final _ximgproc_GraphSegmentation_processImage = - _ximgproc_GraphSegmentation_processImagePtr.asFunction< - ffi.Pointer Function( - GraphSegmentation, Mat, ffi.Pointer)>(); - - ffi.Pointer ximgproc_GraphSegmentation_processImage_Async( - GraphSegmentation self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_GraphSegmentation_processImage_Async( - self, - src, callback, ); } - late final _ximgproc_GraphSegmentation_processImage_AsyncPtr = _lookup< + late final _cv_ximgproc_GraphSegmentation_processImagePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - GraphSegmentation, Mat, imp1.CvCallback_1)>>( - 'ximgproc_GraphSegmentation_processImage_Async'); - late final _ximgproc_GraphSegmentation_processImage_Async = - _ximgproc_GraphSegmentation_processImage_AsyncPtr.asFunction< + GraphSegmentation, Mat, Mat, imp1.CvCallback_0)>>( + 'cv_ximgproc_GraphSegmentation_processImage'); + late final _cv_ximgproc_GraphSegmentation_processImage = + _cv_ximgproc_GraphSegmentation_processImagePtr.asFunction< ffi.Pointer Function( - GraphSegmentation, Mat, imp1.CvCallback_1)>(); + GraphSegmentation, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_GraphSegmentation_setK( + void cv_ximgproc_GraphSegmentation_setK( GraphSegmentation self, double val, ) { - return _ximgproc_GraphSegmentation_setK( + return _cv_ximgproc_GraphSegmentation_setK( self, val, ); } - late final _ximgproc_GraphSegmentation_setKPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(GraphSegmentation, - ffi.Float)>>('ximgproc_GraphSegmentation_setK'); - late final _ximgproc_GraphSegmentation_setK = - _ximgproc_GraphSegmentation_setKPtr.asFunction< - ffi.Pointer Function(GraphSegmentation, double)>(); + late final _cv_ximgproc_GraphSegmentation_setKPtr = _lookup< + ffi.NativeFunction>( + 'cv_ximgproc_GraphSegmentation_setK'); + late final _cv_ximgproc_GraphSegmentation_setK = + _cv_ximgproc_GraphSegmentation_setKPtr + .asFunction(); - ffi.Pointer ximgproc_GraphSegmentation_setMinSize( + void cv_ximgproc_GraphSegmentation_setMinSize( GraphSegmentation self, int val, ) { - return _ximgproc_GraphSegmentation_setMinSize( + return _cv_ximgproc_GraphSegmentation_setMinSize( self, val, ); } - late final _ximgproc_GraphSegmentation_setMinSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(GraphSegmentation, - ffi.Int)>>('ximgproc_GraphSegmentation_setMinSize'); - late final _ximgproc_GraphSegmentation_setMinSize = - _ximgproc_GraphSegmentation_setMinSizePtr - .asFunction Function(GraphSegmentation, int)>(); + late final _cv_ximgproc_GraphSegmentation_setMinSizePtr = _lookup< + ffi.NativeFunction>( + 'cv_ximgproc_GraphSegmentation_setMinSize'); + late final _cv_ximgproc_GraphSegmentation_setMinSize = + _cv_ximgproc_GraphSegmentation_setMinSizePtr + .asFunction(); - ffi.Pointer ximgproc_GraphSegmentation_setSigma( + void cv_ximgproc_GraphSegmentation_setSigma( GraphSegmentation self, double val, ) { - return _ximgproc_GraphSegmentation_setSigma( + return _cv_ximgproc_GraphSegmentation_setSigma( self, val, ); } - late final _ximgproc_GraphSegmentation_setSigmaPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(GraphSegmentation, - ffi.Double)>>('ximgproc_GraphSegmentation_setSigma'); - late final _ximgproc_GraphSegmentation_setSigma = - _ximgproc_GraphSegmentation_setSigmaPtr.asFunction< - ffi.Pointer Function(GraphSegmentation, double)>(); + late final _cv_ximgproc_GraphSegmentation_setSigmaPtr = _lookup< + ffi.NativeFunction>( + 'cv_ximgproc_GraphSegmentation_setSigma'); + late final _cv_ximgproc_GraphSegmentation_setSigma = + _cv_ximgproc_GraphSegmentation_setSigmaPtr + .asFunction(); - ffi.Pointer ximgproc_PeiLinNormalization( + ffi.Pointer cv_ximgproc_PeiLinNormalization( Mat I, - ffi.Pointer dst, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _ximgproc_PeiLinNormalization( + return _cv_ximgproc_PeiLinNormalization( I, dst, - ); - } - - late final _ximgproc_PeiLinNormalizationPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('ximgproc_PeiLinNormalization'); - late final _ximgproc_PeiLinNormalization = _ximgproc_PeiLinNormalizationPtr - .asFunction Function(Mat, ffi.Pointer)>(); - - ffi.Pointer ximgproc_PeiLinNormalization_Async( - Mat I, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_PeiLinNormalization_Async( - I, callback, ); } - late final _ximgproc_PeiLinNormalization_AsyncPtr = _lookup< + late final _cv_ximgproc_PeiLinNormalizationPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('ximgproc_PeiLinNormalization_Async'); - late final _ximgproc_PeiLinNormalization_Async = - _ximgproc_PeiLinNormalization_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_ximgproc_PeiLinNormalization'); + late final _cv_ximgproc_PeiLinNormalization = + _cv_ximgproc_PeiLinNormalizationPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_RFFeatureGetter_Clear( + ffi.Pointer cv_ximgproc_RFFeatureGetter_clear( RFFeatureGetter self, ) { - return _ximgproc_RFFeatureGetter_Clear( + return _cv_ximgproc_RFFeatureGetter_clear( self, ); } - late final _ximgproc_RFFeatureGetter_ClearPtr = _lookup< + late final _cv_ximgproc_RFFeatureGetter_clearPtr = _lookup< ffi.NativeFunction Function(RFFeatureGetter)>>( - 'ximgproc_RFFeatureGetter_Clear'); - late final _ximgproc_RFFeatureGetter_Clear = - _ximgproc_RFFeatureGetter_ClearPtr + 'cv_ximgproc_RFFeatureGetter_clear'); + late final _cv_ximgproc_RFFeatureGetter_clear = + _cv_ximgproc_RFFeatureGetter_clearPtr .asFunction Function(RFFeatureGetter)>(); - void ximgproc_RFFeatureGetter_Close( + void cv_ximgproc_RFFeatureGetter_close( RFFeatureGetterPtr self, ) { - return _ximgproc_RFFeatureGetter_Close( + return _cv_ximgproc_RFFeatureGetter_close( self, ); } - late final _ximgproc_RFFeatureGetter_ClosePtr = + late final _cv_ximgproc_RFFeatureGetter_closePtr = _lookup>( - 'ximgproc_RFFeatureGetter_Close'); - late final _ximgproc_RFFeatureGetter_Close = - _ximgproc_RFFeatureGetter_ClosePtr + 'cv_ximgproc_RFFeatureGetter_close'); + late final _cv_ximgproc_RFFeatureGetter_close = + _cv_ximgproc_RFFeatureGetter_closePtr .asFunction(); - ffi.Pointer ximgproc_RFFeatureGetter_Create( + ffi.Pointer cv_ximgproc_RFFeatureGetter_create( ffi.Pointer rval, ) { - return _ximgproc_RFFeatureGetter_Create( + return _cv_ximgproc_RFFeatureGetter_create( rval, ); } - late final _ximgproc_RFFeatureGetter_CreatePtr = _lookup< + late final _cv_ximgproc_RFFeatureGetter_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer)>>( - 'ximgproc_RFFeatureGetter_Create'); - late final _ximgproc_RFFeatureGetter_Create = - _ximgproc_RFFeatureGetter_CreatePtr.asFunction< + 'cv_ximgproc_RFFeatureGetter_create'); + late final _cv_ximgproc_RFFeatureGetter_create = + _cv_ximgproc_RFFeatureGetter_createPtr.asFunction< ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer ximgproc_RFFeatureGetter_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _ximgproc_RFFeatureGetter_Create_Async( - callback, - ); - } - - late final _ximgproc_RFFeatureGetter_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'ximgproc_RFFeatureGetter_Create_Async'); - late final _ximgproc_RFFeatureGetter_Create_Async = - _ximgproc_RFFeatureGetter_Create_AsyncPtr - .asFunction Function(imp1.CvCallback_1)>(); - - ffi.Pointer ximgproc_RFFeatureGetter_Empty( + bool cv_ximgproc_RFFeatureGetter_empty( RFFeatureGetter self, - ffi.Pointer rval, ) { - return _ximgproc_RFFeatureGetter_Empty( + return _cv_ximgproc_RFFeatureGetter_empty( self, - rval, ); } - late final _ximgproc_RFFeatureGetter_EmptyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(RFFeatureGetter, - ffi.Pointer)>>('ximgproc_RFFeatureGetter_Empty'); - late final _ximgproc_RFFeatureGetter_Empty = - _ximgproc_RFFeatureGetter_EmptyPtr.asFunction< - ffi.Pointer Function( - RFFeatureGetter, ffi.Pointer)>(); + late final _cv_ximgproc_RFFeatureGetter_emptyPtr = + _lookup>( + 'cv_ximgproc_RFFeatureGetter_empty'); + late final _cv_ximgproc_RFFeatureGetter_empty = + _cv_ximgproc_RFFeatureGetter_emptyPtr + .asFunction(); - ffi.Pointer ximgproc_RFFeatureGetter_getFeatures( + ffi.Pointer cv_ximgproc_RFFeatureGetter_getFeatures( RFFeatureGetter self, Mat src, - ffi.Pointer features, + Mat features, int gnrmRad, int gsmthRad, int shrink, int outNum, int gradNum, + imp1.CvCallback_0 callback, ) { - return _ximgproc_RFFeatureGetter_getFeatures( + return _cv_ximgproc_RFFeatureGetter_getFeatures( self, src, features, @@ -5139,237 +3110,145 @@ class CvNativeContrib { shrink, outNum, gradNum, + callback, ); } - late final _ximgproc_RFFeatureGetter_getFeaturesPtr = _lookup< + late final _cv_ximgproc_RFFeatureGetter_getFeaturesPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( RFFeatureGetter, Mat, - ffi.Pointer, + Mat, + ffi.Int, ffi.Int, ffi.Int, ffi.Int, ffi.Int, - ffi.Int)>>('ximgproc_RFFeatureGetter_getFeatures'); - late final _ximgproc_RFFeatureGetter_getFeatures = - _ximgproc_RFFeatureGetter_getFeaturesPtr.asFunction< - ffi.Pointer Function(RFFeatureGetter, Mat, ffi.Pointer, - int, int, int, int, int)>(); + imp1.CvCallback_0)>>('cv_ximgproc_RFFeatureGetter_getFeatures'); + late final _cv_ximgproc_RFFeatureGetter_getFeatures = + _cv_ximgproc_RFFeatureGetter_getFeaturesPtr.asFunction< + ffi.Pointer Function(RFFeatureGetter, Mat, Mat, int, int, + int, int, int, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_RFFeatureGetter_getFeatures_Async( - RFFeatureGetter self, - Mat src, - int gnrmRad, - int gsmthRad, - int shrink, - int outNum, - int gradNum, - imp1.CvCallback_1 callback, + void cv_ximgproc_StructuredEdgeDetection_close( + StructuredEdgeDetectionPtr self, ) { - return _ximgproc_RFFeatureGetter_getFeatures_Async( + return _cv_ximgproc_StructuredEdgeDetection_close( self, - src, - gnrmRad, - gsmthRad, - shrink, - outNum, - gradNum, - callback, ); } - late final _ximgproc_RFFeatureGetter_getFeatures_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(RFFeatureGetter, Mat, ffi.Int, - ffi.Int, ffi.Int, ffi.Int, ffi.Int, imp1.CvCallback_1)>>( - 'ximgproc_RFFeatureGetter_getFeatures_Async'); - late final _ximgproc_RFFeatureGetter_getFeatures_Async = - _ximgproc_RFFeatureGetter_getFeatures_AsyncPtr.asFunction< - ffi.Pointer Function(RFFeatureGetter, Mat, int, int, int, - int, int, imp1.CvCallback_1)>(); - - void ximgproc_StructuredEdgeDetection_Close( - StructuredEdgeDetectionPtr self, + late final _cv_ximgproc_StructuredEdgeDetection_closePtr = _lookup< + ffi.NativeFunction>( + 'cv_ximgproc_StructuredEdgeDetection_close'); + late final _cv_ximgproc_StructuredEdgeDetection_close = + _cv_ximgproc_StructuredEdgeDetection_closePtr + .asFunction(); + + ffi.Pointer cv_ximgproc_StructuredEdgeDetection_computeOrientation( + StructuredEdgeDetection self, + Mat src, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _ximgproc_StructuredEdgeDetection_Close( + return _cv_ximgproc_StructuredEdgeDetection_computeOrientation( self, + src, + dst, + callback, ); } - late final _ximgproc_StructuredEdgeDetection_ClosePtr = _lookup< - ffi.NativeFunction>( - 'ximgproc_StructuredEdgeDetection_Close'); - late final _ximgproc_StructuredEdgeDetection_Close = - _ximgproc_StructuredEdgeDetection_ClosePtr - .asFunction(); + late final _cv_ximgproc_StructuredEdgeDetection_computeOrientationPtr = + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + StructuredEdgeDetection, Mat, Mat, imp1.CvCallback_0)>>( + 'cv_ximgproc_StructuredEdgeDetection_computeOrientation'); + late final _cv_ximgproc_StructuredEdgeDetection_computeOrientation = + _cv_ximgproc_StructuredEdgeDetection_computeOrientationPtr.asFunction< + ffi.Pointer Function( + StructuredEdgeDetection, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_StructuredEdgeDetection_Create( + ffi.Pointer cv_ximgproc_StructuredEdgeDetection_create( ffi.Pointer model, ffi.Pointer rval, ) { - return _ximgproc_StructuredEdgeDetection_Create( + return _cv_ximgproc_StructuredEdgeDetection_create( model, rval, ); } - late final _ximgproc_StructuredEdgeDetection_CreatePtr = _lookup< + late final _cv_ximgproc_StructuredEdgeDetection_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, ffi.Pointer)>>( - 'ximgproc_StructuredEdgeDetection_Create'); - late final _ximgproc_StructuredEdgeDetection_Create = - _ximgproc_StructuredEdgeDetection_CreatePtr.asFunction< + 'cv_ximgproc_StructuredEdgeDetection_create'); + late final _cv_ximgproc_StructuredEdgeDetection_create = + _cv_ximgproc_StructuredEdgeDetection_createPtr.asFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer ximgproc_StructuredEdgeDetection_Create_1( + ffi.Pointer cv_ximgproc_StructuredEdgeDetection_create_1( ffi.Pointer model, RFFeatureGetter howToGetFeatures, ffi.Pointer rval, ) { - return _ximgproc_StructuredEdgeDetection_Create_1( + return _cv_ximgproc_StructuredEdgeDetection_create_1( model, howToGetFeatures, rval, ); } - late final _ximgproc_StructuredEdgeDetection_Create_1Ptr = _lookup< + late final _cv_ximgproc_StructuredEdgeDetection_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, RFFeatureGetter, ffi.Pointer)>>( - 'ximgproc_StructuredEdgeDetection_Create_1'); - late final _ximgproc_StructuredEdgeDetection_Create_1 = - _ximgproc_StructuredEdgeDetection_Create_1Ptr.asFunction< + 'cv_ximgproc_StructuredEdgeDetection_create_1'); + late final _cv_ximgproc_StructuredEdgeDetection_create_1 = + _cv_ximgproc_StructuredEdgeDetection_create_1Ptr.asFunction< ffi.Pointer Function(ffi.Pointer, RFFeatureGetter, ffi.Pointer)>(); - ffi.Pointer ximgproc_StructuredEdgeDetection_Create_Async( - ffi.Pointer model, - RFFeatureGetter howToGetFeatures, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_StructuredEdgeDetection_Create_Async( - model, - howToGetFeatures, - callback, - ); - } - - late final _ximgproc_StructuredEdgeDetection_Create_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, RFFeatureGetter, imp1.CvCallback_1)>>( - 'ximgproc_StructuredEdgeDetection_Create_Async'); - late final _ximgproc_StructuredEdgeDetection_Create_Async = - _ximgproc_StructuredEdgeDetection_Create_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, RFFeatureGetter, imp1.CvCallback_1)>(); - - ffi.Pointer ximgproc_StructuredEdgeDetection_computeOrientation( - StructuredEdgeDetection self, - Mat src, - ffi.Pointer dst, - ) { - return _ximgproc_StructuredEdgeDetection_computeOrientation( - self, - src, - dst, - ); - } - - late final _ximgproc_StructuredEdgeDetection_computeOrientationPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - StructuredEdgeDetection, Mat, ffi.Pointer)>>( - 'ximgproc_StructuredEdgeDetection_computeOrientation'); - late final _ximgproc_StructuredEdgeDetection_computeOrientation = - _ximgproc_StructuredEdgeDetection_computeOrientationPtr.asFunction< - ffi.Pointer Function( - StructuredEdgeDetection, Mat, ffi.Pointer)>(); - - ffi.Pointer - ximgproc_StructuredEdgeDetection_computeOrientation_Async( - StructuredEdgeDetection self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_StructuredEdgeDetection_computeOrientation_Async( - self, - src, - callback, - ); - } - - late final _ximgproc_StructuredEdgeDetection_computeOrientation_AsyncPtr = - _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - StructuredEdgeDetection, Mat, imp1.CvCallback_1)>>( - 'ximgproc_StructuredEdgeDetection_computeOrientation_Async'); - late final _ximgproc_StructuredEdgeDetection_computeOrientation_Async = - _ximgproc_StructuredEdgeDetection_computeOrientation_AsyncPtr.asFunction< - ffi.Pointer Function( - StructuredEdgeDetection, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer ximgproc_StructuredEdgeDetection_detectEdges( + ffi.Pointer cv_ximgproc_StructuredEdgeDetection_detectEdges( StructuredEdgeDetection self, Mat src, - ffi.Pointer dst, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _ximgproc_StructuredEdgeDetection_detectEdges( + return _cv_ximgproc_StructuredEdgeDetection_detectEdges( self, src, dst, - ); - } - - late final _ximgproc_StructuredEdgeDetection_detectEdgesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - StructuredEdgeDetection, Mat, ffi.Pointer)>>( - 'ximgproc_StructuredEdgeDetection_detectEdges'); - late final _ximgproc_StructuredEdgeDetection_detectEdges = - _ximgproc_StructuredEdgeDetection_detectEdgesPtr.asFunction< - ffi.Pointer Function( - StructuredEdgeDetection, Mat, ffi.Pointer)>(); - - ffi.Pointer ximgproc_StructuredEdgeDetection_detectEdges_Async( - StructuredEdgeDetection self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_StructuredEdgeDetection_detectEdges_Async( - self, - src, callback, ); } - late final _ximgproc_StructuredEdgeDetection_detectEdges_AsyncPtr = _lookup< + late final _cv_ximgproc_StructuredEdgeDetection_detectEdgesPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - StructuredEdgeDetection, Mat, imp1.CvCallback_1)>>( - 'ximgproc_StructuredEdgeDetection_detectEdges_Async'); - late final _ximgproc_StructuredEdgeDetection_detectEdges_Async = - _ximgproc_StructuredEdgeDetection_detectEdges_AsyncPtr.asFunction< + StructuredEdgeDetection, Mat, Mat, imp1.CvCallback_0)>>( + 'cv_ximgproc_StructuredEdgeDetection_detectEdges'); + late final _cv_ximgproc_StructuredEdgeDetection_detectEdges = + _cv_ximgproc_StructuredEdgeDetection_detectEdgesPtr.asFunction< ffi.Pointer Function( - StructuredEdgeDetection, Mat, imp1.CvCallback_1)>(); + StructuredEdgeDetection, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_StructuredEdgeDetection_edgesNms( + ffi.Pointer cv_ximgproc_StructuredEdgeDetection_edgesNms( StructuredEdgeDetection self, Mat edge_image, Mat orientation_image, - ffi.Pointer dst, + Mat dst, int r, int s, double m, bool isParallel, + imp1.CvCallback_0 callback, ) { - return _ximgproc_StructuredEdgeDetection_edgesNms( + return _cv_ximgproc_StructuredEdgeDetection_edgesNms( self, edge_image, orientation_image, @@ -5378,212 +3257,119 @@ class CvNativeContrib { s, m, isParallel, - ); - } - - late final _ximgproc_StructuredEdgeDetection_edgesNmsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - StructuredEdgeDetection, - Mat, - Mat, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Float, - ffi.Bool)>>('ximgproc_StructuredEdgeDetection_edgesNms'); - late final _ximgproc_StructuredEdgeDetection_edgesNms = - _ximgproc_StructuredEdgeDetection_edgesNmsPtr.asFunction< - ffi.Pointer Function(StructuredEdgeDetection, Mat, Mat, - ffi.Pointer, int, int, double, bool)>(); - - ffi.Pointer ximgproc_StructuredEdgeDetection_edgesNms_Async( - StructuredEdgeDetection self, - Mat edge_image, - Mat orientation_image, - int r, - int s, - double m, - bool isParallel, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_StructuredEdgeDetection_edgesNms_Async( - self, - edge_image, - orientation_image, - r, - s, - m, - isParallel, callback, ); } - late final _ximgproc_StructuredEdgeDetection_edgesNms_AsyncPtr = _lookup< + late final _cv_ximgproc_StructuredEdgeDetection_edgesNmsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(StructuredEdgeDetection, Mat, Mat, - ffi.Int, ffi.Int, ffi.Float, ffi.Bool, imp1.CvCallback_1)>>( - 'ximgproc_StructuredEdgeDetection_edgesNms_Async'); - late final _ximgproc_StructuredEdgeDetection_edgesNms_Async = - _ximgproc_StructuredEdgeDetection_edgesNms_AsyncPtr.asFunction< - ffi.Pointer Function(StructuredEdgeDetection, Mat, Mat, int, - int, double, bool, imp1.CvCallback_1)>(); - - ffi.Pointer ximgproc_anisotropicDiffusion( - Mat src, - ffi.Pointer dst, - double alpha, - double K, - int niters, - ) { - return _ximgproc_anisotropicDiffusion( - src, - dst, - alpha, - K, - niters, - ); - } - - late final _ximgproc_anisotropicDiffusionPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, ffi.Float, - ffi.Float, ffi.Int)>>('ximgproc_anisotropicDiffusion'); - late final _ximgproc_anisotropicDiffusion = - _ximgproc_anisotropicDiffusionPtr.asFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, double, double, int)>(); - - ffi.Pointer ximgproc_anisotropicDiffusion_Async( + ffi.Pointer Function( + StructuredEdgeDetection, + Mat, + Mat, + Mat, + ffi.Int, + ffi.Int, + ffi.Float, + ffi.Bool, + imp1.CvCallback_0)>>( + 'cv_ximgproc_StructuredEdgeDetection_edgesNms'); + late final _cv_ximgproc_StructuredEdgeDetection_edgesNms = + _cv_ximgproc_StructuredEdgeDetection_edgesNmsPtr.asFunction< + ffi.Pointer Function(StructuredEdgeDetection, Mat, Mat, Mat, + int, int, double, bool, imp1.CvCallback_0)>(); + + ffi.Pointer cv_ximgproc_anisotropicDiffusion( Mat src, + Mat dst, double alpha, double K, int niters, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_anisotropicDiffusion_Async( - src, - alpha, - K, - niters, - callback, - ); - } - - late final _ximgproc_anisotropicDiffusion_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Float, ffi.Float, ffi.Int, - imp1.CvCallback_1)>>('ximgproc_anisotropicDiffusion_Async'); - late final _ximgproc_anisotropicDiffusion_Async = - _ximgproc_anisotropicDiffusion_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer ximgproc_edgePreservingFilter( - Mat src, - ffi.Pointer dst, - int d, - double threshold, + imp1.CvCallback_0 callback, ) { - return _ximgproc_edgePreservingFilter( + return _cv_ximgproc_anisotropicDiffusion( src, dst, - d, - threshold, + alpha, + K, + niters, + callback, ); } - late final _ximgproc_edgePreservingFilterPtr = _lookup< + late final _cv_ximgproc_anisotropicDiffusionPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, ffi.Int, - ffi.Double)>>('ximgproc_edgePreservingFilter'); - late final _ximgproc_edgePreservingFilter = - _ximgproc_edgePreservingFilterPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, int, double)>(); + ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, + ffi.Int, imp1.CvCallback_0)>>('cv_ximgproc_anisotropicDiffusion'); + late final _cv_ximgproc_anisotropicDiffusion = + _cv_ximgproc_anisotropicDiffusionPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, double, int, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_edgePreservingFilter_Async( + ffi.Pointer cv_ximgproc_edgePreservingFilter( Mat src, + Mat dst, int d, double threshold, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _ximgproc_edgePreservingFilter_Async( + return _cv_ximgproc_edgePreservingFilter( src, + dst, d, threshold, callback, ); } - late final _ximgproc_edgePreservingFilter_AsyncPtr = _lookup< + late final _cv_ximgproc_edgePreservingFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Double, - imp1.CvCallback_1)>>('ximgproc_edgePreservingFilter_Async'); - late final _ximgproc_edgePreservingFilter_Async = - _ximgproc_edgePreservingFilter_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Double, + imp1.CvCallback_0)>>('cv_ximgproc_edgePreservingFilter'); + late final _cv_ximgproc_edgePreservingFilter = + _cv_ximgproc_edgePreservingFilterPtr.asFunction< ffi.Pointer Function( - Mat, int, double, imp1.CvCallback_1)>(); + Mat, Mat, int, double, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_findEllipses( + ffi.Pointer cv_ximgproc_findEllipses( Mat image, - ffi.Pointer ellipses, + Mat ellipses, double scoreThreshold, double reliabilityThreshold, double centerDistanceThreshold, + imp1.CvCallback_0 callback, ) { - return _ximgproc_findEllipses( + return _cv_ximgproc_findEllipses( image, ellipses, scoreThreshold, reliabilityThreshold, centerDistanceThreshold, - ); - } - - late final _ximgproc_findEllipsesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, ffi.Float, - ffi.Float, ffi.Float)>>('ximgproc_findEllipses'); - late final _ximgproc_findEllipses = _ximgproc_findEllipsesPtr.asFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, double, double, double)>(); - - ffi.Pointer ximgproc_findEllipses_Async( - Mat image, - double scoreThreshold, - double reliabilityThreshold, - double centerDistanceThreshold, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_findEllipses_Async( - image, - scoreThreshold, - reliabilityThreshold, - centerDistanceThreshold, callback, ); } - late final _ximgproc_findEllipses_AsyncPtr = _lookup< + late final _cv_ximgproc_findEllipsesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Float, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('ximgproc_findEllipses_Async'); - late final _ximgproc_findEllipses_Async = - _ximgproc_findEllipses_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, + ffi.Float, imp1.CvCallback_0)>>('cv_ximgproc_findEllipses'); + late final _cv_ximgproc_findEllipses = + _cv_ximgproc_findEllipsesPtr.asFunction< ffi.Pointer Function( - Mat, double, double, double, imp1.CvCallback_1)>(); + Mat, Mat, double, double, double, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_niBlackThreshold( + ffi.Pointer cv_ximgproc_niBlackThreshold( Mat src, - ffi.Pointer dst, + Mat dst, double maxValue, int type, int blockSize, double k, int binarizationMethod, double r, + imp1.CvCallback_0 callback, ) { - return _ximgproc_niBlackThreshold( + return _cv_ximgproc_niBlackThreshold( src, dst, maxValue, @@ -5592,50 +3378,14 @@ class CvNativeContrib { k, binarizationMethod, r, - ); - } - - late final _ximgproc_niBlackThresholdPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Double, - ffi.Int, - ffi.Double)>>('ximgproc_niBlackThreshold'); - late final _ximgproc_niBlackThreshold = - _ximgproc_niBlackThresholdPtr.asFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, double, int, int, double, int, double)>(); - - ffi.Pointer ximgproc_niBlackThreshold_Async( - Mat src, - double maxValue, - int type, - int blockSize, - double k, - int binarizationMethod, - double r, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_niBlackThreshold_Async( - src, - maxValue, - type, - blockSize, - k, - binarizationMethod, - r, callback, ); } - late final _ximgproc_niBlackThreshold_AsyncPtr = _lookup< + late final _cv_ximgproc_niBlackThresholdPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( + Mat, Mat, ffi.Double, ffi.Int, @@ -5643,131 +3393,70 @@ class CvNativeContrib { ffi.Double, ffi.Int, ffi.Double, - imp1.CvCallback_1)>>('ximgproc_niBlackThreshold_Async'); - late final _ximgproc_niBlackThreshold_Async = - _ximgproc_niBlackThreshold_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, int, int, double, int, double, imp1.CvCallback_1)>(); + imp1.CvCallback_0)>>('cv_ximgproc_niBlackThreshold'); + late final _cv_ximgproc_niBlackThreshold = + _cv_ximgproc_niBlackThresholdPtr.asFunction< + ffi.Pointer Function(Mat, Mat, double, int, int, double, + int, double, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_rl_createRLEImage( + ffi.Pointer cv_ximgproc_rl_createRLEImage( VecPoint3i runs, - ffi.Pointer res, + Mat res, CvSize size, + imp1.CvCallback_0 callback, ) { - return _ximgproc_rl_createRLEImage( + return _cv_ximgproc_rl_createRLEImage( runs, res, size, - ); - } - - late final _ximgproc_rl_createRLEImagePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint3i, ffi.Pointer, - CvSize)>>('ximgproc_rl_createRLEImage'); - late final _ximgproc_rl_createRLEImage = - _ximgproc_rl_createRLEImagePtr.asFunction< - ffi.Pointer Function( - VecPoint3i, ffi.Pointer, CvSize)>(); - - ffi.Pointer ximgproc_rl_createRLEImage_Async( - VecPoint3i runs, - CvSize size, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_rl_createRLEImage_Async( - runs, - size, callback, ); } - late final _ximgproc_rl_createRLEImage_AsyncPtr = _lookup< + late final _cv_ximgproc_rl_createRLEImagePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint3i, CvSize, - imp1.CvCallback_1)>>('ximgproc_rl_createRLEImage_Async'); - late final _ximgproc_rl_createRLEImage_Async = - _ximgproc_rl_createRLEImage_AsyncPtr.asFunction< + ffi.Pointer Function(VecPoint3i, Mat, CvSize, + imp1.CvCallback_0)>>('cv_ximgproc_rl_createRLEImage'); + late final _cv_ximgproc_rl_createRLEImage = + _cv_ximgproc_rl_createRLEImagePtr.asFunction< ffi.Pointer Function( - VecPoint3i, CvSize, imp1.CvCallback_1)>(); + VecPoint3i, Mat, CvSize, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_rl_dilate( + ffi.Pointer cv_ximgproc_rl_dilate( Mat rlSrc, - ffi.Pointer rlDest, + Mat rlDest, Mat rlKernel, CvPoint anchor, + imp1.CvCallback_0 callback, ) { - return _ximgproc_rl_dilate( + return _cv_ximgproc_rl_dilate( rlSrc, rlDest, rlKernel, anchor, - ); - } - - late final _ximgproc_rl_dilatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, Mat, CvPoint)>>('ximgproc_rl_dilate'); - late final _ximgproc_rl_dilate = _ximgproc_rl_dilatePtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, Mat, CvPoint)>(); - - ffi.Pointer ximgproc_rl_dilate_Async( - Mat rlSrc, - Mat rlKernel, - CvPoint anchor, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_rl_dilate_Async( - rlSrc, - rlKernel, - anchor, callback, ); } - late final _ximgproc_rl_dilate_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvPoint, - imp1.CvCallback_1)>>('ximgproc_rl_dilate_Async'); - late final _ximgproc_rl_dilate_Async = - _ximgproc_rl_dilate_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, CvPoint, imp1.CvCallback_1)>(); - - ffi.Pointer ximgproc_rl_erode( - Mat rlSrc, - ffi.Pointer rlDest, - Mat rlKernel, - bool bBoundaryOn, - CvPoint anchor, - ) { - return _ximgproc_rl_erode( - rlSrc, - rlDest, - rlKernel, - bBoundaryOn, - anchor, - ); - } - - late final _ximgproc_rl_erodePtr = _lookup< + late final _cv_ximgproc_rl_dilatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, Mat, ffi.Bool, - CvPoint)>>('ximgproc_rl_erode'); - late final _ximgproc_rl_erode = _ximgproc_rl_erodePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, CvPoint, + imp1.CvCallback_0)>>('cv_ximgproc_rl_dilate'); + late final _cv_ximgproc_rl_dilate = _cv_ximgproc_rl_dilatePtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, Mat, bool, CvPoint)>(); + Mat, Mat, Mat, CvPoint, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_rl_erode_Async( + ffi.Pointer cv_ximgproc_rl_erode( Mat rlSrc, + Mat rlDest, Mat rlKernel, bool bBoundaryOn, CvPoint anchor, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _ximgproc_rl_erode_Async( + return _cv_ximgproc_rl_erode( rlSrc, + rlDest, rlKernel, bBoundaryOn, anchor, @@ -5775,169 +3464,88 @@ class CvNativeContrib { ); } - late final _ximgproc_rl_erode_AsyncPtr = _lookup< + late final _cv_ximgproc_rl_erodePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Bool, CvPoint, - imp1.CvCallback_1)>>('ximgproc_rl_erode_Async'); - late final _ximgproc_rl_erode_Async = _ximgproc_rl_erode_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Bool, CvPoint, + imp1.CvCallback_0)>>('cv_ximgproc_rl_erode'); + late final _cv_ximgproc_rl_erode = _cv_ximgproc_rl_erodePtr.asFunction< ffi.Pointer Function( - Mat, Mat, bool, CvPoint, imp1.CvCallback_1)>(); + Mat, Mat, Mat, bool, CvPoint, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_rl_getStructuringElement( + ffi.Pointer cv_ximgproc_rl_getStructuringElement( int shape, CvSize ksize, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _ximgproc_rl_getStructuringElement( + return _cv_ximgproc_rl_getStructuringElement( shape, ksize, rval, - ); - } - - late final _ximgproc_rl_getStructuringElementPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, CvSize, - ffi.Pointer)>>('ximgproc_rl_getStructuringElement'); - late final _ximgproc_rl_getStructuringElement = - _ximgproc_rl_getStructuringElementPtr.asFunction< - ffi.Pointer Function(int, CvSize, ffi.Pointer)>(); - - ffi.Pointer ximgproc_rl_getStructuringElement_Async( - int shape, - CvSize ksize, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_rl_getStructuringElement_Async( - shape, - ksize, callback, ); } - late final _ximgproc_rl_getStructuringElement_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, CvSize, - imp1.CvCallback_1)>>('ximgproc_rl_getStructuringElement_Async'); - late final _ximgproc_rl_getStructuringElement_Async = - _ximgproc_rl_getStructuringElement_AsyncPtr.asFunction< - ffi.Pointer Function(int, CvSize, imp1.CvCallback_1)>(); - - ffi.Pointer ximgproc_rl_isRLMorphologyPossible( - Mat rlStructuringElement, - ffi.Pointer rval, - ) { - return _ximgproc_rl_isRLMorphologyPossible( - rlStructuringElement, - rval, - ); - } - - late final _ximgproc_rl_isRLMorphologyPossiblePtr = _lookup< + late final _cv_ximgproc_rl_getStructuringElementPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, - ffi.Pointer)>>('ximgproc_rl_isRLMorphologyPossible'); - late final _ximgproc_rl_isRLMorphologyPossible = - _ximgproc_rl_isRLMorphologyPossiblePtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + ffi.Pointer Function(ffi.Int, CvSize, Mat, + imp1.CvCallback_0)>>('cv_ximgproc_rl_getStructuringElement'); + late final _cv_ximgproc_rl_getStructuringElement = + _cv_ximgproc_rl_getStructuringElementPtr.asFunction< + ffi.Pointer Function( + int, CvSize, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_rl_isRLMorphologyPossible_Async( + bool cv_ximgproc_rl_isRLMorphologyPossible( Mat rlStructuringElement, - imp1.CvCallback_1 callback, ) { - return _ximgproc_rl_isRLMorphologyPossible_Async( + return _cv_ximgproc_rl_isRLMorphologyPossible( rlStructuringElement, - callback, ); } - late final _ximgproc_rl_isRLMorphologyPossible_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, - imp1.CvCallback_1)>>('ximgproc_rl_isRLMorphologyPossible_Async'); - late final _ximgproc_rl_isRLMorphologyPossible_Async = - _ximgproc_rl_isRLMorphologyPossible_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + late final _cv_ximgproc_rl_isRLMorphologyPossiblePtr = + _lookup>( + 'cv_ximgproc_rl_isRLMorphologyPossible'); + late final _cv_ximgproc_rl_isRLMorphologyPossible = + _cv_ximgproc_rl_isRLMorphologyPossiblePtr + .asFunction(); - ffi.Pointer ximgproc_rl_morphologyEx( + ffi.Pointer cv_ximgproc_rl_morphologyEx( Mat rlSrc, - ffi.Pointer rlDest, + Mat rlDest, int op, Mat rlKernel, bool bBoundaryOnForErosion, CvPoint anchor, + imp1.CvCallback_0 callback, ) { - return _ximgproc_rl_morphologyEx( + return _cv_ximgproc_rl_morphologyEx( rlSrc, rlDest, op, rlKernel, bBoundaryOnForErosion, anchor, - ); - } - - late final _ximgproc_rl_morphologyExPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, ffi.Int, Mat, - ffi.Bool, CvPoint)>>('ximgproc_rl_morphologyEx'); - late final _ximgproc_rl_morphologyEx = - _ximgproc_rl_morphologyExPtr.asFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, int, Mat, bool, CvPoint)>(); - - ffi.Pointer ximgproc_rl_morphologyEx_Async( - Mat rlSrc, - int op, - Mat rlKernel, - bool bBoundaryOnForErosion, - CvPoint anchor, - imp1.CvCallback_1 callback, - ) { - return _ximgproc_rl_morphologyEx_Async( - rlSrc, - op, - rlKernel, - bBoundaryOnForErosion, - anchor, callback, ); } - late final _ximgproc_rl_morphologyEx_AsyncPtr = _lookup< + late final _cv_ximgproc_rl_morphologyExPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, Mat, ffi.Bool, CvPoint, - imp1.CvCallback_1)>>('ximgproc_rl_morphologyEx_Async'); - late final _ximgproc_rl_morphologyEx_Async = - _ximgproc_rl_morphologyEx_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, ffi.Bool, + CvPoint, imp1.CvCallback_0)>>('cv_ximgproc_rl_morphologyEx'); + late final _cv_ximgproc_rl_morphologyEx = + _cv_ximgproc_rl_morphologyExPtr.asFunction< ffi.Pointer Function( - Mat, int, Mat, bool, CvPoint, imp1.CvCallback_1)>(); + Mat, Mat, int, Mat, bool, CvPoint, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_rl_paint( - Mat image, - Mat rlSrc, - Scalar value, - ) { - return _ximgproc_rl_paint( - image, - rlSrc, - value, - ); - } - - late final _ximgproc_rl_paintPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Scalar)>>( - 'ximgproc_rl_paint'); - late final _ximgproc_rl_paint = _ximgproc_rl_paintPtr - .asFunction Function(Mat, Mat, Scalar)>(); - - ffi.Pointer ximgproc_rl_paint_Async( + ffi.Pointer cv_ximgproc_rl_paint( Mat image, Mat rlSrc, Scalar value, imp1.CvCallback_0 callback, ) { - return _ximgproc_rl_paint_Async( + return _cv_ximgproc_rl_paint( image, rlSrc, value, @@ -5945,94 +3553,174 @@ class CvNativeContrib { ); } - late final _ximgproc_rl_paint_AsyncPtr = _lookup< + late final _cv_ximgproc_rl_paintPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Scalar, imp1.CvCallback_0)>>('ximgproc_rl_paint_Async'); - late final _ximgproc_rl_paint_Async = _ximgproc_rl_paint_AsyncPtr.asFunction< + Mat, Mat, Scalar, imp1.CvCallback_0)>>('cv_ximgproc_rl_paint'); + late final _cv_ximgproc_rl_paint = _cv_ximgproc_rl_paintPtr.asFunction< ffi.Pointer Function(Mat, Mat, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_rl_threshold( + ffi.Pointer cv_ximgproc_rl_threshold( Mat src, - ffi.Pointer rlDest, + Mat rlDest, double thresh, int type, + imp1.CvCallback_0 callback, ) { - return _ximgproc_rl_threshold( + return _cv_ximgproc_rl_threshold( src, rlDest, thresh, type, + callback, ); } - late final _ximgproc_rl_thresholdPtr = _lookup< + late final _cv_ximgproc_rl_thresholdPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, ffi.Double, - ffi.Int)>>('ximgproc_rl_threshold'); - late final _ximgproc_rl_threshold = _ximgproc_rl_thresholdPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, double, int)>(); + ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Int, + imp1.CvCallback_0)>>('cv_ximgproc_rl_threshold'); + late final _cv_ximgproc_rl_threshold = + _cv_ximgproc_rl_thresholdPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, int, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_rl_threshold_Async( + ffi.Pointer cv_ximgproc_thinning( Mat src, - double thresh, - int type, - imp1.CvCallback_1 callback, + Mat dst, + int thinningType, + imp1.CvCallback_0 callback, ) { - return _ximgproc_rl_threshold_Async( + return _cv_ximgproc_thinning( src, - thresh, - type, + dst, + thinningType, callback, ); } - late final _ximgproc_rl_threshold_AsyncPtr = _lookup< + late final _cv_ximgproc_thinningPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('ximgproc_rl_threshold_Async'); - late final _ximgproc_rl_threshold_Async = - _ximgproc_rl_threshold_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, double, int, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_ximgproc_thinning'); + late final _cv_ximgproc_thinning = _cv_ximgproc_thinningPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer ximgproc_thinning( - Mat src, - ffi.Pointer dst, - int thinningType, + void cv_xobjdetect_WBDetector_close( + PtrWBDetectorPtr self, ) { - return _ximgproc_thinning( - src, - dst, - thinningType, + return _cv_xobjdetect_WBDetector_close( + self, + ); + } + + late final _cv_xobjdetect_WBDetector_closePtr = + _lookup>( + 'cv_xobjdetect_WBDetector_close'); + late final _cv_xobjdetect_WBDetector_close = + _cv_xobjdetect_WBDetector_closePtr + .asFunction(); + + ffi.Pointer cv_xobjdetect_WBDetector_create( + ffi.Pointer rval, + ) { + return _cv_xobjdetect_WBDetector_create( + rval, ); } - late final _ximgproc_thinningPtr = _lookup< + late final _cv_xobjdetect_WBDetector_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Pointer, ffi.Int)>>('ximgproc_thinning'); - late final _ximgproc_thinning = _ximgproc_thinningPtr - .asFunction Function(Mat, ffi.Pointer, int)>(); + ffi.Pointer)>>('cv_xobjdetect_WBDetector_create'); + late final _cv_xobjdetect_WBDetector_create = + _cv_xobjdetect_WBDetector_createPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer ximgproc_thinning_Async( - Mat src, - int thinningType, - imp1.CvCallback_1 callback, + ffi.Pointer cv_xobjdetect_WBDetector_detect( + PtrWBDetector self, + Mat img, + ffi.Pointer bbox, + ffi.Pointer confidences, ) { - return _ximgproc_thinning_Async( - src, - thinningType, - callback, + return _cv_xobjdetect_WBDetector_detect( + self, + img, + bbox, + confidences, + ); + } + + late final _cv_xobjdetect_WBDetector_detectPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + PtrWBDetector, + Mat, + ffi.Pointer, + ffi.Pointer)>>('cv_xobjdetect_WBDetector_detect'); + late final _cv_xobjdetect_WBDetector_detect = + _cv_xobjdetect_WBDetector_detectPtr.asFunction< + ffi.Pointer Function( + PtrWBDetector, Mat, ffi.Pointer, ffi.Pointer)>(); + + ffi.Pointer cv_xobjdetect_WBDetector_read( + PtrWBDetector self, + ffi.Pointer filename, + ) { + return _cv_xobjdetect_WBDetector_read( + self, + filename, + ); + } + + late final _cv_xobjdetect_WBDetector_readPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(PtrWBDetector, + ffi.Pointer)>>('cv_xobjdetect_WBDetector_read'); + late final _cv_xobjdetect_WBDetector_read = + _cv_xobjdetect_WBDetector_readPtr.asFunction< + ffi.Pointer Function( + PtrWBDetector, ffi.Pointer)>(); + + ffi.Pointer cv_xobjdetect_WBDetector_train( + PtrWBDetector self, + ffi.Pointer pos_samples, + ffi.Pointer neg_imgs, + ) { + return _cv_xobjdetect_WBDetector_train( + self, + pos_samples, + neg_imgs, + ); + } + + late final _cv_xobjdetect_WBDetector_trainPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(PtrWBDetector, ffi.Pointer, + ffi.Pointer)>>('cv_xobjdetect_WBDetector_train'); + late final _cv_xobjdetect_WBDetector_train = + _cv_xobjdetect_WBDetector_trainPtr.asFunction< + ffi.Pointer Function( + PtrWBDetector, ffi.Pointer, ffi.Pointer)>(); + + ffi.Pointer cv_xobjdetect_WBDetector_write( + PtrWBDetector self, + ffi.Pointer filename, + ) { + return _cv_xobjdetect_WBDetector_write( + self, + filename, ); } - late final _ximgproc_thinning_AsyncPtr = _lookup< + late final _cv_xobjdetect_WBDetector_writePtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(PtrWBDetector, + ffi.Pointer)>>('cv_xobjdetect_WBDetector_write'); + late final _cv_xobjdetect_WBDetector_write = + _cv_xobjdetect_WBDetector_writePtr.asFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('ximgproc_thinning_Async'); - late final _ximgproc_thinning_Async = _ximgproc_thinning_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + PtrWBDetector, ffi.Pointer)>(); late final addresses = _SymbolAddresses(this); } @@ -6040,51 +3728,62 @@ class CvNativeContrib { class _SymbolAddresses { final CvNativeContrib _library; _SymbolAddresses(this._library); - ffi.Pointer> - get ArucoDetectorParameters_Close => - _library._ArucoDetectorParameters_ClosePtr; ffi.Pointer> - get ArucoDetector_Close => _library._ArucoDetector_ClosePtr; + get cv_aruco_arucoDetector_close => + _library._cv_aruco_arucoDetector_closePtr; ffi.Pointer> - get ArucoDictionary_Close => _library._ArucoDictionary_ClosePtr; + get cv_aruco_arucoDictionary_close => + _library._cv_aruco_arucoDictionary_closePtr; + ffi.Pointer> + get cv_aruco_detectorParameters_close => + _library._cv_aruco_detectorParameters_closePtr; ffi.Pointer> - get BlockMeanHash_Close => _library._BlockMeanHash_ClosePtr; + get cv_img_hash_BlockMeanHash_close => + _library._cv_img_hash_BlockMeanHash_closePtr; ffi.Pointer> - get QualityBRISQUE_close => _library._QualityBRISQUE_closePtr; + get cv_quality_QualityBRISQUE_close => + _library._cv_quality_QualityBRISQUE_closePtr; ffi.Pointer> - get QualityGMSD_close => _library._QualityGMSD_closePtr; + get cv_quality_QualityGMSD_close => + _library._cv_quality_QualityGMSD_closePtr; ffi.Pointer> - get QualityMSE_close => _library._QualityMSE_closePtr; + get cv_quality_QualityMSE_close => + _library._cv_quality_QualityMSE_closePtr; ffi.Pointer> - get QualityPSNR_close => _library._QualityPSNR_closePtr; + get cv_quality_QualityPSNR_close => + _library._cv_quality_QualityPSNR_closePtr; ffi.Pointer> - get QualitySSIM_close => _library._QualitySSIM_closePtr; - ffi.Pointer> - get WBDetector_Close => _library._WBDetector_ClosePtr; + get cv_quality_QualitySSIM_close => + _library._cv_quality_QualitySSIM_closePtr; ffi.Pointer> - get WeChatQRCode_Close => _library._WeChatQRCode_ClosePtr; + get cv_wechat_qrcode_WeChatQRCode_close => + _library._cv_wechat_qrcode_WeChatQRCode_closePtr; ffi.Pointer> - get ximgproc_EdgeDrawing_Close => _library._ximgproc_EdgeDrawing_ClosePtr; + get cv_ximgproc_EdgeDrawing_close => + _library._cv_ximgproc_EdgeDrawing_closePtr; ffi.Pointer> - get ximgproc_GraphSegmentation_Close => - _library._ximgproc_GraphSegmentation_ClosePtr; + get cv_ximgproc_GraphSegmentation_close => + _library._cv_ximgproc_GraphSegmentation_closePtr; ffi.Pointer> - get ximgproc_RFFeatureGetter_Close => - _library._ximgproc_RFFeatureGetter_ClosePtr; + get cv_ximgproc_RFFeatureGetter_close => + _library._cv_ximgproc_RFFeatureGetter_closePtr; ffi.Pointer> - get ximgproc_StructuredEdgeDetection_Close => - _library._ximgproc_StructuredEdgeDetection_ClosePtr; + get cv_ximgproc_StructuredEdgeDetection_close => + _library._cv_ximgproc_StructuredEdgeDetection_closePtr; + ffi.Pointer> + get cv_xobjdetect_WBDetector_close => + _library._cv_xobjdetect_WBDetector_closePtr; } final class ArucoDetector extends ffi.Struct { external ffi.Pointer ptr; } -final class ArucoDetectorParameters extends ffi.Struct { +final class ArucoDetectorParams extends ffi.Struct { external ffi.Pointer ptr; } -typedef ArucoDetectorParametersPtr = ffi.Pointer; +typedef ArucoDetectorParamsPtr = ffi.Pointer; typedef ArucoDetectorPtr = ffi.Pointer; final class ArucoDictionary extends ffi.Struct { @@ -6125,43 +3824,11 @@ typedef CvSize = imp1.CvSize; typedef CvStatus = imp1.CvStatus; final class EdgeBoxes extends ffi.Struct { - @ffi.Float() - external double alpha; - - @ffi.Float() - external double beta; - - @ffi.Float() - external double eta; - - @ffi.Float() - external double minScore; - - @ffi.Int() - external int maxBoxes; - - @ffi.Float() - external double edgeMinMag; - - @ffi.Float() - external double edgeMergeThr; - - @ffi.Float() - external double clusterMinMag; - - @ffi.Float() - external double maxAspectRatio; - - @ffi.Float() - external double minBoxArea; - - @ffi.Float() - external double gamma; - - @ffi.Float() - external double kappa; + external ffi.Pointer> ptr; } +typedef EdgeBoxesPtr = ffi.Pointer; + final class EdgeDrawing extends ffi.Struct { external ffi.Pointer> ptr; } diff --git a/packages/dartcv/lib/src/g/contrib.yaml b/packages/dartcv/lib/src/g/contrib.yaml index d81927ab..884f7837 100644 --- a/packages/dartcv/lib/src/g/contrib.yaml +++ b/packages/dartcv/lib/src/g/contrib.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:dartcv/src/g/contrib.g.dart: + package:dartcv4/src/g/contrib.g.dart: used-config: ffi-native: false symbols: @@ -8,592 +8,388 @@ files: name: BLOCK_MEAN_HASH_MODE_0 c:@Ea@BLOCK_MEAN_HASH_MODE_0@BLOCK_MEAN_HASH_MODE_1: name: BLOCK_MEAN_HASH_MODE_1 - c:@F@ArucoDetectorParameters_Close: - name: ArucoDetectorParameters_Close - c:@F@ArucoDetectorParameters_Create: - name: ArucoDetectorParameters_Create - c:@F@ArucoDetectorParameters_Create_Async: - name: ArucoDetectorParameters_Create_Async - c:@F@ArucoDetectorParameters_GetAdaptiveThreshConstant: - name: ArucoDetectorParameters_GetAdaptiveThreshConstant - c:@F@ArucoDetectorParameters_GetAdaptiveThreshConstant_Async: - name: ArucoDetectorParameters_GetAdaptiveThreshConstant_Async - c:@F@ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax: - name: ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax - c:@F@ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_Async: - name: ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax_Async - c:@F@ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin: - name: ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin - c:@F@ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_Async: - name: ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin_Async - c:@F@ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep: - name: ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep - c:@F@ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_Async: - name: ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep_Async - c:@F@ArucoDetectorParameters_GetAprilTagCriticalRad: - name: ArucoDetectorParameters_GetAprilTagCriticalRad - c:@F@ArucoDetectorParameters_GetAprilTagCriticalRad_Async: - name: ArucoDetectorParameters_GetAprilTagCriticalRad_Async - c:@F@ArucoDetectorParameters_GetAprilTagDeglitch: - name: ArucoDetectorParameters_GetAprilTagDeglitch - c:@F@ArucoDetectorParameters_GetAprilTagDeglitch_Async: - name: ArucoDetectorParameters_GetAprilTagDeglitch_Async - c:@F@ArucoDetectorParameters_GetAprilTagMaxLineFitMse: - name: ArucoDetectorParameters_GetAprilTagMaxLineFitMse - c:@F@ArucoDetectorParameters_GetAprilTagMaxLineFitMse_Async: - name: ArucoDetectorParameters_GetAprilTagMaxLineFitMse_Async - c:@F@ArucoDetectorParameters_GetAprilTagMaxNmaxima: - name: ArucoDetectorParameters_GetAprilTagMaxNmaxima - c:@F@ArucoDetectorParameters_GetAprilTagMaxNmaxima_Async: - name: ArucoDetectorParameters_GetAprilTagMaxNmaxima_Async - c:@F@ArucoDetectorParameters_GetAprilTagMinClusterPixels: - name: ArucoDetectorParameters_GetAprilTagMinClusterPixels - c:@F@ArucoDetectorParameters_GetAprilTagMinClusterPixels_Async: - name: ArucoDetectorParameters_GetAprilTagMinClusterPixels_Async - c:@F@ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff: - name: ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff - c:@F@ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_Async: - name: ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff_Async - c:@F@ArucoDetectorParameters_GetAprilTagQuadDecimate: - name: ArucoDetectorParameters_GetAprilTagQuadDecimate - c:@F@ArucoDetectorParameters_GetAprilTagQuadDecimate_Async: - name: ArucoDetectorParameters_GetAprilTagQuadDecimate_Async - c:@F@ArucoDetectorParameters_GetAprilTagQuadSigma: - name: ArucoDetectorParameters_GetAprilTagQuadSigma - c:@F@ArucoDetectorParameters_GetAprilTagQuadSigma_Async: - name: ArucoDetectorParameters_GetAprilTagQuadSigma_Async - c:@F@ArucoDetectorParameters_GetCornerRefinementMaxIterations: - name: ArucoDetectorParameters_GetCornerRefinementMaxIterations - c:@F@ArucoDetectorParameters_GetCornerRefinementMaxIterations_Async: - name: ArucoDetectorParameters_GetCornerRefinementMaxIterations_Async - c:@F@ArucoDetectorParameters_GetCornerRefinementMethod: - name: ArucoDetectorParameters_GetCornerRefinementMethod - c:@F@ArucoDetectorParameters_GetCornerRefinementMethod_Async: - name: ArucoDetectorParameters_GetCornerRefinementMethod_Async - c:@F@ArucoDetectorParameters_GetCornerRefinementMinAccuracy: - name: ArucoDetectorParameters_GetCornerRefinementMinAccuracy - c:@F@ArucoDetectorParameters_GetCornerRefinementMinAccuracy_Async: - name: ArucoDetectorParameters_GetCornerRefinementMinAccuracy_Async - c:@F@ArucoDetectorParameters_GetCornerRefinementWinSize: - name: ArucoDetectorParameters_GetCornerRefinementWinSize - c:@F@ArucoDetectorParameters_GetCornerRefinementWinSize_Async: - name: ArucoDetectorParameters_GetCornerRefinementWinSize_Async - c:@F@ArucoDetectorParameters_GetDetectInvertedMarker: - name: ArucoDetectorParameters_GetDetectInvertedMarker - c:@F@ArucoDetectorParameters_GetDetectInvertedMarker_Async: - name: ArucoDetectorParameters_GetDetectInvertedMarker_Async - c:@F@ArucoDetectorParameters_GetErrorCorrectionRate: - name: ArucoDetectorParameters_GetErrorCorrectionRate - c:@F@ArucoDetectorParameters_GetErrorCorrectionRate_Async: - name: ArucoDetectorParameters_GetErrorCorrectionRate_Async - c:@F@ArucoDetectorParameters_GetMarkerBorderBits: - name: ArucoDetectorParameters_GetMarkerBorderBits - c:@F@ArucoDetectorParameters_GetMarkerBorderBits_Async: - name: ArucoDetectorParameters_GetMarkerBorderBits_Async - c:@F@ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate: - name: ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate - c:@F@ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_Async: - name: ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate_Async - c:@F@ArucoDetectorParameters_GetMaxMarkerPerimeterRate: - name: ArucoDetectorParameters_GetMaxMarkerPerimeterRate - c:@F@ArucoDetectorParameters_GetMaxMarkerPerimeterRate_Async: - name: ArucoDetectorParameters_GetMaxMarkerPerimeterRate_Async - c:@F@ArucoDetectorParameters_GetMinCornerDistanceRate: - name: ArucoDetectorParameters_GetMinCornerDistanceRate - c:@F@ArucoDetectorParameters_GetMinCornerDistanceRate_Async: - name: ArucoDetectorParameters_GetMinCornerDistanceRate_Async - c:@F@ArucoDetectorParameters_GetMinDistanceToBorder: - name: ArucoDetectorParameters_GetMinDistanceToBorder - c:@F@ArucoDetectorParameters_GetMinDistanceToBorder_Async: - name: ArucoDetectorParameters_GetMinDistanceToBorder_Async - c:@F@ArucoDetectorParameters_GetMinMarkerDistanceRate: - name: ArucoDetectorParameters_GetMinMarkerDistanceRate - c:@F@ArucoDetectorParameters_GetMinMarkerDistanceRate_Async: - name: ArucoDetectorParameters_GetMinMarkerDistanceRate_Async - c:@F@ArucoDetectorParameters_GetMinMarkerPerimeterRate: - name: ArucoDetectorParameters_GetMinMarkerPerimeterRate - c:@F@ArucoDetectorParameters_GetMinMarkerPerimeterRate_Async: - name: ArucoDetectorParameters_GetMinMarkerPerimeterRate_Async - c:@F@ArucoDetectorParameters_GetMinOtsuStdDev: - name: ArucoDetectorParameters_GetMinOtsuStdDev - c:@F@ArucoDetectorParameters_GetMinOtsuStdDev_Async: - name: ArucoDetectorParameters_GetMinOtsuStdDev_Async - c:@F@ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell: - name: ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell - c:@F@ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_Async: - name: ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell_Async - c:@F@ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell: - name: ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell - c:@F@ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_Async: - name: ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell_Async - c:@F@ArucoDetectorParameters_GetPolygonalApproxAccuracyRate: - name: ArucoDetectorParameters_GetPolygonalApproxAccuracyRate - c:@F@ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_Async: - name: ArucoDetectorParameters_GetPolygonalApproxAccuracyRate_Async - c:@F@ArucoDetectorParameters_SetAdaptiveThreshConstant: - name: ArucoDetectorParameters_SetAdaptiveThreshConstant - c:@F@ArucoDetectorParameters_SetAdaptiveThreshConstant_Async: - name: ArucoDetectorParameters_SetAdaptiveThreshConstant_Async - c:@F@ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax: - name: ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax - c:@F@ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_Async: - name: ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax_Async - c:@F@ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin: - name: ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin - c:@F@ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_Async: - name: ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin_Async - c:@F@ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep: - name: ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep - c:@F@ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_Async: - name: ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep_Async - c:@F@ArucoDetectorParameters_SetAprilTagCriticalRad: - name: ArucoDetectorParameters_SetAprilTagCriticalRad - c:@F@ArucoDetectorParameters_SetAprilTagCriticalRad_Async: - name: ArucoDetectorParameters_SetAprilTagCriticalRad_Async - c:@F@ArucoDetectorParameters_SetAprilTagDeglitch: - name: ArucoDetectorParameters_SetAprilTagDeglitch - c:@F@ArucoDetectorParameters_SetAprilTagDeglitch_Async: - name: ArucoDetectorParameters_SetAprilTagDeglitch_Async - c:@F@ArucoDetectorParameters_SetAprilTagMaxLineFitMse: - name: ArucoDetectorParameters_SetAprilTagMaxLineFitMse - c:@F@ArucoDetectorParameters_SetAprilTagMaxLineFitMse_Async: - name: ArucoDetectorParameters_SetAprilTagMaxLineFitMse_Async - c:@F@ArucoDetectorParameters_SetAprilTagMaxNmaxima: - name: ArucoDetectorParameters_SetAprilTagMaxNmaxima - c:@F@ArucoDetectorParameters_SetAprilTagMaxNmaxima_Async: - name: ArucoDetectorParameters_SetAprilTagMaxNmaxima_Async - c:@F@ArucoDetectorParameters_SetAprilTagMinClusterPixels: - name: ArucoDetectorParameters_SetAprilTagMinClusterPixels - c:@F@ArucoDetectorParameters_SetAprilTagMinClusterPixels_Async: - name: ArucoDetectorParameters_SetAprilTagMinClusterPixels_Async - c:@F@ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff: - name: ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff - c:@F@ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_Async: - name: ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff_Async - c:@F@ArucoDetectorParameters_SetAprilTagQuadDecimate: - name: ArucoDetectorParameters_SetAprilTagQuadDecimate - c:@F@ArucoDetectorParameters_SetAprilTagQuadDecimate_Async: - name: ArucoDetectorParameters_SetAprilTagQuadDecimate_Async - c:@F@ArucoDetectorParameters_SetAprilTagQuadSigma: - name: ArucoDetectorParameters_SetAprilTagQuadSigma - c:@F@ArucoDetectorParameters_SetAprilTagQuadSigma_Async: - name: ArucoDetectorParameters_SetAprilTagQuadSigma_Async - c:@F@ArucoDetectorParameters_SetCornerRefinementMaxIterations: - name: ArucoDetectorParameters_SetCornerRefinementMaxIterations - c:@F@ArucoDetectorParameters_SetCornerRefinementMaxIterations_Async: - name: ArucoDetectorParameters_SetCornerRefinementMaxIterations_Async - c:@F@ArucoDetectorParameters_SetCornerRefinementMethod: - name: ArucoDetectorParameters_SetCornerRefinementMethod - c:@F@ArucoDetectorParameters_SetCornerRefinementMethod_Async: - name: ArucoDetectorParameters_SetCornerRefinementMethod_Async - c:@F@ArucoDetectorParameters_SetCornerRefinementMinAccuracy: - name: ArucoDetectorParameters_SetCornerRefinementMinAccuracy - c:@F@ArucoDetectorParameters_SetCornerRefinementMinAccuracy_Async: - name: ArucoDetectorParameters_SetCornerRefinementMinAccuracy_Async - c:@F@ArucoDetectorParameters_SetCornerRefinementWinSize: - name: ArucoDetectorParameters_SetCornerRefinementWinSize - c:@F@ArucoDetectorParameters_SetCornerRefinementWinSize_Async: - name: ArucoDetectorParameters_SetCornerRefinementWinSize_Async - c:@F@ArucoDetectorParameters_SetDetectInvertedMarker: - name: ArucoDetectorParameters_SetDetectInvertedMarker - c:@F@ArucoDetectorParameters_SetDetectInvertedMarker_Async: - name: ArucoDetectorParameters_SetDetectInvertedMarker_Async - c:@F@ArucoDetectorParameters_SetErrorCorrectionRate: - name: ArucoDetectorParameters_SetErrorCorrectionRate - c:@F@ArucoDetectorParameters_SetErrorCorrectionRate_Async: - name: ArucoDetectorParameters_SetErrorCorrectionRate_Async - c:@F@ArucoDetectorParameters_SetMarkerBorderBits: - name: ArucoDetectorParameters_SetMarkerBorderBits - c:@F@ArucoDetectorParameters_SetMarkerBorderBits_Async: - name: ArucoDetectorParameters_SetMarkerBorderBits_Async - c:@F@ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate: - name: ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate - c:@F@ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_Async: - name: ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate_Async - c:@F@ArucoDetectorParameters_SetMaxMarkerPerimeterRate: - name: ArucoDetectorParameters_SetMaxMarkerPerimeterRate - c:@F@ArucoDetectorParameters_SetMaxMarkerPerimeterRate_Async: - name: ArucoDetectorParameters_SetMaxMarkerPerimeterRate_Async - c:@F@ArucoDetectorParameters_SetMinCornerDistanceRate: - name: ArucoDetectorParameters_SetMinCornerDistanceRate - c:@F@ArucoDetectorParameters_SetMinCornerDistanceRate_Async: - name: ArucoDetectorParameters_SetMinCornerDistanceRate_Async - c:@F@ArucoDetectorParameters_SetMinDistanceToBorder: - name: ArucoDetectorParameters_SetMinDistanceToBorder - c:@F@ArucoDetectorParameters_SetMinDistanceToBorder_Async: - name: ArucoDetectorParameters_SetMinDistanceToBorder_Async - c:@F@ArucoDetectorParameters_SetMinMarkerDistanceRate: - name: ArucoDetectorParameters_SetMinMarkerDistanceRate - c:@F@ArucoDetectorParameters_SetMinMarkerDistanceRate_Async: - name: ArucoDetectorParameters_SetMinMarkerDistanceRate_Async - c:@F@ArucoDetectorParameters_SetMinMarkerPerimeterRate: - name: ArucoDetectorParameters_SetMinMarkerPerimeterRate - c:@F@ArucoDetectorParameters_SetMinMarkerPerimeterRate_Async: - name: ArucoDetectorParameters_SetMinMarkerPerimeterRate_Async - c:@F@ArucoDetectorParameters_SetMinOtsuStdDev: - name: ArucoDetectorParameters_SetMinOtsuStdDev - c:@F@ArucoDetectorParameters_SetMinOtsuStdDev_Async: - name: ArucoDetectorParameters_SetMinOtsuStdDev_Async - c:@F@ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell: - name: ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell - c:@F@ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_Async: - name: ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell_Async - c:@F@ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell: - name: ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell - c:@F@ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_Async: - name: ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell_Async - c:@F@ArucoDetectorParameters_SetPolygonalApproxAccuracyRate: - name: ArucoDetectorParameters_SetPolygonalApproxAccuracyRate - c:@F@ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_Async: - name: ArucoDetectorParameters_SetPolygonalApproxAccuracyRate_Async - c:@F@ArucoDetector_Close: - name: ArucoDetector_Close - c:@F@ArucoDetector_DetectMarkers: - name: ArucoDetector_DetectMarkers - c:@F@ArucoDetector_DetectMarkers_Async: - name: ArucoDetector_DetectMarkers_Async - c:@F@ArucoDetector_New: - name: ArucoDetector_New - c:@F@ArucoDetector_NewWithParams: - name: ArucoDetector_NewWithParams - c:@F@ArucoDetector_NewWithParams_Async: - name: ArucoDetector_NewWithParams_Async - c:@F@ArucoDetector_New_Async: - name: ArucoDetector_New_Async - c:@F@ArucoDictionary_Close: - name: ArucoDictionary_Close - c:@F@ArucoDrawDetectedMarkers: - name: ArucoDrawDetectedMarkers - c:@F@ArucoDrawDetectedMarkers_Async: - name: ArucoDrawDetectedMarkers_Async - c:@F@ArucoGenerateImageMarker: - name: ArucoGenerateImageMarker - c:@F@ArucoGenerateImageMarker_Async: - name: ArucoGenerateImageMarker_Async - c:@F@BlockMeanHash_Close: - name: BlockMeanHash_Close - c:@F@BlockMeanHash_Compare: - name: BlockMeanHash_Compare - c:@F@BlockMeanHash_Compare_Async: - name: BlockMeanHash_Compare_Async - c:@F@BlockMeanHash_Compute: - name: BlockMeanHash_Compute - c:@F@BlockMeanHash_Compute_Async: - name: BlockMeanHash_Compute_Async - c:@F@BlockMeanHash_Create: - name: BlockMeanHash_Create - c:@F@BlockMeanHash_Create_Async: - name: BlockMeanHash_Create_Async - c:@F@BlockMeanHash_GetMean: - name: BlockMeanHash_GetMean - c:@F@BlockMeanHash_GetMean_Async: - name: BlockMeanHash_GetMean_Async - c:@F@BlockMeanHash_SetMode: - name: BlockMeanHash_SetMode - c:@F@BlockMeanHash_SetMode_Async: - name: BlockMeanHash_SetMode_Async - c:@F@QualityBRISQUE_close: - name: QualityBRISQUE_close - c:@F@QualityBRISQUE_compute: - name: QualityBRISQUE_compute - c:@F@QualityBRISQUE_computeFeatures_static: - name: QualityBRISQUE_computeFeatures_static - c:@F@QualityBRISQUE_computeFeatures_static_async: - name: QualityBRISQUE_computeFeatures_static_async - c:@F@QualityBRISQUE_compute_async: - name: QualityBRISQUE_compute_async - c:@F@QualityBRISQUE_compute_static: - name: QualityBRISQUE_compute_static - c:@F@QualityBRISQUE_compute_static_async: - name: QualityBRISQUE_compute_static_async - c:@F@QualityBRISQUE_create: - name: QualityBRISQUE_create - c:@F@QualityGMSD_close: - name: QualityGMSD_close - c:@F@QualityGMSD_compute: - name: QualityGMSD_compute - c:@F@QualityGMSD_compute_async: - name: QualityGMSD_compute_async - c:@F@QualityGMSD_compute_static: - name: QualityGMSD_compute_static - c:@F@QualityGMSD_compute_static_async: - name: QualityGMSD_compute_static_async - c:@F@QualityGMSD_create: - name: QualityGMSD_create - c:@F@QualityMSE_close: - name: QualityMSE_close - c:@F@QualityMSE_compute: - name: QualityMSE_compute - c:@F@QualityMSE_compute_async: - name: QualityMSE_compute_async - c:@F@QualityMSE_compute_static: - name: QualityMSE_compute_static - c:@F@QualityMSE_compute_static_async: - name: QualityMSE_compute_static_async - c:@F@QualityMSE_create: - name: QualityMSE_create - c:@F@QualityPSNR_close: - name: QualityPSNR_close - c:@F@QualityPSNR_compute: - name: QualityPSNR_compute - c:@F@QualityPSNR_compute_async: - name: QualityPSNR_compute_async - c:@F@QualityPSNR_compute_static: - name: QualityPSNR_compute_static - c:@F@QualityPSNR_compute_static_async: - name: QualityPSNR_compute_static_async - c:@F@QualityPSNR_create: - name: QualityPSNR_create - c:@F@QualityPSNR_getMaxPixelValue: - name: QualityPSNR_getMaxPixelValue - c:@F@QualityPSNR_setMaxPixelValue: - name: QualityPSNR_setMaxPixelValue - c:@F@QualitySSIM_close: - name: QualitySSIM_close - c:@F@QualitySSIM_compute: - name: QualitySSIM_compute - c:@F@QualitySSIM_compute_async: - name: QualitySSIM_compute_async - c:@F@QualitySSIM_compute_static: - name: QualitySSIM_compute_static - c:@F@QualitySSIM_compute_static_async: - name: QualitySSIM_compute_static_async - c:@F@QualitySSIM_create: - name: QualitySSIM_create - c:@F@WBDetector_Close: - name: WBDetector_Close - c:@F@WBDetector_Create: - name: WBDetector_Create - c:@F@WBDetector_Detect: - name: WBDetector_Detect - c:@F@WBDetector_Read: - name: WBDetector_Read - c:@F@WBDetector_Train: - name: WBDetector_Train - c:@F@WBDetector_Write: - name: WBDetector_Write - c:@F@WeChatQRCode_Close: - name: WeChatQRCode_Close - c:@F@WeChatQRCode_DetectAndDecode: - name: WeChatQRCode_DetectAndDecode - c:@F@WeChatQRCode_DetectAndDecode_Async: - name: WeChatQRCode_DetectAndDecode_Async - c:@F@WeChatQRCode_GetScaleFactor: - name: WeChatQRCode_GetScaleFactor - c:@F@WeChatQRCode_GetScaleFactor_Async: - name: WeChatQRCode_GetScaleFactor_Async - c:@F@WeChatQRCode_New: - name: WeChatQRCode_New - c:@F@WeChatQRCode_NewWithParams: - name: WeChatQRCode_NewWithParams - c:@F@WeChatQRCode_NewWithParams_Async: - name: WeChatQRCode_NewWithParams_Async - c:@F@WeChatQRCode_New_Async: - name: WeChatQRCode_New_Async - c:@F@WeChatQRCode_SetScaleFactor: - name: WeChatQRCode_SetScaleFactor - c:@F@WeChatQRCode_SetScaleFactor_Async: - name: WeChatQRCode_SetScaleFactor_Async - c:@F@averageHashCompare: - name: averageHashCompare - c:@F@averageHashCompare_Async: - name: averageHashCompare_Async - c:@F@averageHashCompute: - name: averageHashCompute - c:@F@averageHashCompute_Async: - name: averageHashCompute_Async - c:@F@colorMomentHashCompare: - name: colorMomentHashCompare - c:@F@colorMomentHashCompare_Async: - name: colorMomentHashCompare_Async - c:@F@colorMomentHashCompute: - name: colorMomentHashCompute - c:@F@colorMomentHashCompute_Async: - name: colorMomentHashCompute_Async - c:@F@getPredefinedDictionary: - name: getPredefinedDictionary - c:@F@getPredefinedDictionary_Async: - name: getPredefinedDictionary_Async - c:@F@marrHildrethHashCompare: - name: marrHildrethHashCompare - c:@F@marrHildrethHashCompare_Async: - name: marrHildrethHashCompare_Async - c:@F@marrHildrethHashCompute: - name: marrHildrethHashCompute - c:@F@marrHildrethHashCompute_Async: - name: marrHildrethHashCompute_Async - c:@F@pHashCompare: - name: pHashCompare - c:@F@pHashCompare_Async: - name: pHashCompare_Async - c:@F@pHashCompute: - name: pHashCompute - c:@F@pHashCompute_Async: - name: pHashCompute_Async - c:@F@radialVarianceHashCompare: - name: radialVarianceHashCompare - c:@F@radialVarianceHashCompare_Async: - name: radialVarianceHashCompare_Async - c:@F@radialVarianceHashCompute: - name: radialVarianceHashCompute - c:@F@radialVarianceHashCompute_Async: - name: radialVarianceHashCompute_Async - c:@F@ximgproc_EdgeBoxes_getBoundingBoxes: - name: ximgproc_EdgeBoxes_getBoundingBoxes - c:@F@ximgproc_EdgeDrawing_Close: - name: ximgproc_EdgeDrawing_Close - c:@F@ximgproc_EdgeDrawing_Create: - name: ximgproc_EdgeDrawing_Create - c:@F@ximgproc_EdgeDrawing_Create_Async: - name: ximgproc_EdgeDrawing_Create_Async - c:@F@ximgproc_EdgeDrawing_detectEdges: - name: ximgproc_EdgeDrawing_detectEdges - c:@F@ximgproc_EdgeDrawing_detectEdges_Async: - name: ximgproc_EdgeDrawing_detectEdges_Async - c:@F@ximgproc_EdgeDrawing_detectEllipses: - name: ximgproc_EdgeDrawing_detectEllipses - c:@F@ximgproc_EdgeDrawing_detectEllipses_Async: - name: ximgproc_EdgeDrawing_detectEllipses_Async - c:@F@ximgproc_EdgeDrawing_detectLines: - name: ximgproc_EdgeDrawing_detectLines - c:@F@ximgproc_EdgeDrawing_detectLines_Async: - name: ximgproc_EdgeDrawing_detectLines_Async - c:@F@ximgproc_EdgeDrawing_getEdgeImage: - name: ximgproc_EdgeDrawing_getEdgeImage - c:@F@ximgproc_EdgeDrawing_getEdgeImage_Async: - name: ximgproc_EdgeDrawing_getEdgeImage_Async - c:@F@ximgproc_EdgeDrawing_getGradientImage: - name: ximgproc_EdgeDrawing_getGradientImage - c:@F@ximgproc_EdgeDrawing_getGradientImage_Async: - name: ximgproc_EdgeDrawing_getGradientImage_Async - c:@F@ximgproc_EdgeDrawing_getParams: - name: ximgproc_EdgeDrawing_getParams - c:@F@ximgproc_EdgeDrawing_getSegmentIndicesOfLines: - name: ximgproc_EdgeDrawing_getSegmentIndicesOfLines - c:@F@ximgproc_EdgeDrawing_getSegmentIndicesOfLines_Async: - name: ximgproc_EdgeDrawing_getSegmentIndicesOfLines_Async - c:@F@ximgproc_EdgeDrawing_getSegments: - name: ximgproc_EdgeDrawing_getSegments - c:@F@ximgproc_EdgeDrawing_getSegments_Async: - name: ximgproc_EdgeDrawing_getSegments_Async - c:@F@ximgproc_EdgeDrawing_setParams: - name: ximgproc_EdgeDrawing_setParams - c:@F@ximgproc_GraphSegmentation_Close: - name: ximgproc_GraphSegmentation_Close - c:@F@ximgproc_GraphSegmentation_Create: - name: ximgproc_GraphSegmentation_Create - c:@F@ximgproc_GraphSegmentation_Create_Async: - name: ximgproc_GraphSegmentation_Create_Async - c:@F@ximgproc_GraphSegmentation_getK: - name: ximgproc_GraphSegmentation_getK - c:@F@ximgproc_GraphSegmentation_getMinSize: - name: ximgproc_GraphSegmentation_getMinSize - c:@F@ximgproc_GraphSegmentation_getSigma: - name: ximgproc_GraphSegmentation_getSigma - c:@F@ximgproc_GraphSegmentation_processImage: - name: ximgproc_GraphSegmentation_processImage - c:@F@ximgproc_GraphSegmentation_processImage_Async: - name: ximgproc_GraphSegmentation_processImage_Async - c:@F@ximgproc_GraphSegmentation_setK: - name: ximgproc_GraphSegmentation_setK - c:@F@ximgproc_GraphSegmentation_setMinSize: - name: ximgproc_GraphSegmentation_setMinSize - c:@F@ximgproc_GraphSegmentation_setSigma: - name: ximgproc_GraphSegmentation_setSigma - c:@F@ximgproc_PeiLinNormalization: - name: ximgproc_PeiLinNormalization - c:@F@ximgproc_PeiLinNormalization_Async: - name: ximgproc_PeiLinNormalization_Async - c:@F@ximgproc_RFFeatureGetter_Clear: - name: ximgproc_RFFeatureGetter_Clear - c:@F@ximgproc_RFFeatureGetter_Close: - name: ximgproc_RFFeatureGetter_Close - c:@F@ximgproc_RFFeatureGetter_Create: - name: ximgproc_RFFeatureGetter_Create - c:@F@ximgproc_RFFeatureGetter_Create_Async: - name: ximgproc_RFFeatureGetter_Create_Async - c:@F@ximgproc_RFFeatureGetter_Empty: - name: ximgproc_RFFeatureGetter_Empty - c:@F@ximgproc_RFFeatureGetter_getFeatures: - name: ximgproc_RFFeatureGetter_getFeatures - c:@F@ximgproc_RFFeatureGetter_getFeatures_Async: - name: ximgproc_RFFeatureGetter_getFeatures_Async - c:@F@ximgproc_StructuredEdgeDetection_Close: - name: ximgproc_StructuredEdgeDetection_Close - c:@F@ximgproc_StructuredEdgeDetection_Create: - name: ximgproc_StructuredEdgeDetection_Create - c:@F@ximgproc_StructuredEdgeDetection_Create_1: - name: ximgproc_StructuredEdgeDetection_Create_1 - c:@F@ximgproc_StructuredEdgeDetection_Create_Async: - name: ximgproc_StructuredEdgeDetection_Create_Async - c:@F@ximgproc_StructuredEdgeDetection_computeOrientation: - name: ximgproc_StructuredEdgeDetection_computeOrientation - c:@F@ximgproc_StructuredEdgeDetection_computeOrientation_Async: - name: ximgproc_StructuredEdgeDetection_computeOrientation_Async - c:@F@ximgproc_StructuredEdgeDetection_detectEdges: - name: ximgproc_StructuredEdgeDetection_detectEdges - c:@F@ximgproc_StructuredEdgeDetection_detectEdges_Async: - name: ximgproc_StructuredEdgeDetection_detectEdges_Async - c:@F@ximgproc_StructuredEdgeDetection_edgesNms: - name: ximgproc_StructuredEdgeDetection_edgesNms - c:@F@ximgproc_StructuredEdgeDetection_edgesNms_Async: - name: ximgproc_StructuredEdgeDetection_edgesNms_Async - c:@F@ximgproc_anisotropicDiffusion: - name: ximgproc_anisotropicDiffusion - c:@F@ximgproc_anisotropicDiffusion_Async: - name: ximgproc_anisotropicDiffusion_Async - c:@F@ximgproc_edgePreservingFilter: - name: ximgproc_edgePreservingFilter - c:@F@ximgproc_edgePreservingFilter_Async: - name: ximgproc_edgePreservingFilter_Async - c:@F@ximgproc_findEllipses: - name: ximgproc_findEllipses - c:@F@ximgproc_findEllipses_Async: - name: ximgproc_findEllipses_Async - c:@F@ximgproc_niBlackThreshold: - name: ximgproc_niBlackThreshold - c:@F@ximgproc_niBlackThreshold_Async: - name: ximgproc_niBlackThreshold_Async - c:@F@ximgproc_rl_createRLEImage: - name: ximgproc_rl_createRLEImage - c:@F@ximgproc_rl_createRLEImage_Async: - name: ximgproc_rl_createRLEImage_Async - c:@F@ximgproc_rl_dilate: - name: ximgproc_rl_dilate - c:@F@ximgproc_rl_dilate_Async: - name: ximgproc_rl_dilate_Async - c:@F@ximgproc_rl_erode: - name: ximgproc_rl_erode - c:@F@ximgproc_rl_erode_Async: - name: ximgproc_rl_erode_Async - c:@F@ximgproc_rl_getStructuringElement: - name: ximgproc_rl_getStructuringElement - c:@F@ximgproc_rl_getStructuringElement_Async: - name: ximgproc_rl_getStructuringElement_Async - c:@F@ximgproc_rl_isRLMorphologyPossible: - name: ximgproc_rl_isRLMorphologyPossible - c:@F@ximgproc_rl_isRLMorphologyPossible_Async: - name: ximgproc_rl_isRLMorphologyPossible_Async - c:@F@ximgproc_rl_morphologyEx: - name: ximgproc_rl_morphologyEx - c:@F@ximgproc_rl_morphologyEx_Async: - name: ximgproc_rl_morphologyEx_Async - c:@F@ximgproc_rl_paint: - name: ximgproc_rl_paint - c:@F@ximgproc_rl_paint_Async: - name: ximgproc_rl_paint_Async - c:@F@ximgproc_rl_threshold: - name: ximgproc_rl_threshold - c:@F@ximgproc_rl_threshold_Async: - name: ximgproc_rl_threshold_Async - c:@F@ximgproc_thinning: - name: ximgproc_thinning - c:@F@ximgproc_thinning_Async: - name: ximgproc_thinning_Async + c:@F@cv_aruco_arucoDetector_close: + name: cv_aruco_arucoDetector_close + c:@F@cv_aruco_arucoDetector_create: + name: cv_aruco_arucoDetector_create + c:@F@cv_aruco_arucoDetector_create_1: + name: cv_aruco_arucoDetector_create_1 + c:@F@cv_aruco_arucoDetector_detectMarkers: + name: cv_aruco_arucoDetector_detectMarkers + c:@F@cv_aruco_arucoDictionary_close: + name: cv_aruco_arucoDictionary_close + c:@F@cv_aruco_detectorParameters_close: + name: cv_aruco_detectorParameters_close + c:@F@cv_aruco_detectorParameters_create: + name: cv_aruco_detectorParameters_create + c:@F@cv_aruco_detectorParameters_get_adaptiveThreshConstant: + name: cv_aruco_detectorParameters_get_adaptiveThreshConstant + c:@F@cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMax: + name: cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMax + c:@F@cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMin: + name: cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMin + c:@F@cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStep: + name: cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStep + c:@F@cv_aruco_detectorParameters_get_aprilTagCriticalRad: + name: cv_aruco_detectorParameters_get_aprilTagCriticalRad + c:@F@cv_aruco_detectorParameters_get_aprilTagDeglitch: + name: cv_aruco_detectorParameters_get_aprilTagDeglitch + c:@F@cv_aruco_detectorParameters_get_aprilTagMaxLineFitMse: + name: cv_aruco_detectorParameters_get_aprilTagMaxLineFitMse + c:@F@cv_aruco_detectorParameters_get_aprilTagMaxNmaxima: + name: cv_aruco_detectorParameters_get_aprilTagMaxNmaxima + c:@F@cv_aruco_detectorParameters_get_aprilTagMinClusterPixels: + name: cv_aruco_detectorParameters_get_aprilTagMinClusterPixels + c:@F@cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiff: + name: cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiff + c:@F@cv_aruco_detectorParameters_get_aprilTagQuadDecimate: + name: cv_aruco_detectorParameters_get_aprilTagQuadDecimate + c:@F@cv_aruco_detectorParameters_get_aprilTagQuadSigma: + name: cv_aruco_detectorParameters_get_aprilTagQuadSigma + c:@F@cv_aruco_detectorParameters_get_cornerRefinementMaxIterations: + name: cv_aruco_detectorParameters_get_cornerRefinementMaxIterations + c:@F@cv_aruco_detectorParameters_get_cornerRefinementMethod: + name: cv_aruco_detectorParameters_get_cornerRefinementMethod + c:@F@cv_aruco_detectorParameters_get_cornerRefinementMinAccuracy: + name: cv_aruco_detectorParameters_get_cornerRefinementMinAccuracy + c:@F@cv_aruco_detectorParameters_get_cornerRefinementWinSize: + name: cv_aruco_detectorParameters_get_cornerRefinementWinSize + c:@F@cv_aruco_detectorParameters_get_detectInvertedMarker: + name: cv_aruco_detectorParameters_get_detectInvertedMarker + c:@F@cv_aruco_detectorParameters_get_errorCorrectionRate: + name: cv_aruco_detectorParameters_get_errorCorrectionRate + c:@F@cv_aruco_detectorParameters_get_markerBorderBits: + name: cv_aruco_detectorParameters_get_markerBorderBits + c:@F@cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRate: + name: cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRate + c:@F@cv_aruco_detectorParameters_get_maxMarkerPerimeterRate: + name: cv_aruco_detectorParameters_get_maxMarkerPerimeterRate + c:@F@cv_aruco_detectorParameters_get_minCornerDistanceRate: + name: cv_aruco_detectorParameters_get_minCornerDistanceRate + c:@F@cv_aruco_detectorParameters_get_minDistanceToBorder: + name: cv_aruco_detectorParameters_get_minDistanceToBorder + c:@F@cv_aruco_detectorParameters_get_minMarkerDistanceRate: + name: cv_aruco_detectorParameters_get_minMarkerDistanceRate + c:@F@cv_aruco_detectorParameters_get_minMarkerPerimeterRate: + name: cv_aruco_detectorParameters_get_minMarkerPerimeterRate + c:@F@cv_aruco_detectorParameters_get_minOtsuStdDev: + name: cv_aruco_detectorParameters_get_minOtsuStdDev + c:@F@cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCell: + name: cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCell + c:@F@cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCell: + name: cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCell + c:@F@cv_aruco_detectorParameters_get_polygonalApproxAccuracyRate: + name: cv_aruco_detectorParameters_get_polygonalApproxAccuracyRate + c:@F@cv_aruco_detectorParameters_set_adaptiveThreshConstant: + name: cv_aruco_detectorParameters_set_adaptiveThreshConstant + c:@F@cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMax: + name: cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMax + c:@F@cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMin: + name: cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMin + c:@F@cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStep: + name: cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStep + c:@F@cv_aruco_detectorParameters_set_aprilTagCriticalRad: + name: cv_aruco_detectorParameters_set_aprilTagCriticalRad + c:@F@cv_aruco_detectorParameters_set_aprilTagDeglitch: + name: cv_aruco_detectorParameters_set_aprilTagDeglitch + c:@F@cv_aruco_detectorParameters_set_aprilTagMaxLineFitMse: + name: cv_aruco_detectorParameters_set_aprilTagMaxLineFitMse + c:@F@cv_aruco_detectorParameters_set_aprilTagMaxNmaxima: + name: cv_aruco_detectorParameters_set_aprilTagMaxNmaxima + c:@F@cv_aruco_detectorParameters_set_aprilTagMinClusterPixels: + name: cv_aruco_detectorParameters_set_aprilTagMinClusterPixels + c:@F@cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiff: + name: cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiff + c:@F@cv_aruco_detectorParameters_set_aprilTagQuadDecimate: + name: cv_aruco_detectorParameters_set_aprilTagQuadDecimate + c:@F@cv_aruco_detectorParameters_set_aprilTagQuadSigma: + name: cv_aruco_detectorParameters_set_aprilTagQuadSigma + c:@F@cv_aruco_detectorParameters_set_cornerRefinementMaxIterations: + name: cv_aruco_detectorParameters_set_cornerRefinementMaxIterations + c:@F@cv_aruco_detectorParameters_set_cornerRefinementMethod: + name: cv_aruco_detectorParameters_set_cornerRefinementMethod + c:@F@cv_aruco_detectorParameters_set_cornerRefinementMinAccuracy: + name: cv_aruco_detectorParameters_set_cornerRefinementMinAccuracy + c:@F@cv_aruco_detectorParameters_set_cornerRefinementWinSize: + name: cv_aruco_detectorParameters_set_cornerRefinementWinSize + c:@F@cv_aruco_detectorParameters_set_detectInvertedMarker: + name: cv_aruco_detectorParameters_set_detectInvertedMarker + c:@F@cv_aruco_detectorParameters_set_errorCorrectionRate: + name: cv_aruco_detectorParameters_set_errorCorrectionRate + c:@F@cv_aruco_detectorParameters_set_markerBorderBits: + name: cv_aruco_detectorParameters_set_markerBorderBits + c:@F@cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRate: + name: cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRate + c:@F@cv_aruco_detectorParameters_set_maxMarkerPerimeterRate: + name: cv_aruco_detectorParameters_set_maxMarkerPerimeterRate + c:@F@cv_aruco_detectorParameters_set_minCornerDistanceRate: + name: cv_aruco_detectorParameters_set_minCornerDistanceRate + c:@F@cv_aruco_detectorParameters_set_minDistanceToBorder: + name: cv_aruco_detectorParameters_set_minDistanceToBorder + c:@F@cv_aruco_detectorParameters_set_minMarkerDistanceRate: + name: cv_aruco_detectorParameters_set_minMarkerDistanceRate + c:@F@cv_aruco_detectorParameters_set_minMarkerPerimeterRate: + name: cv_aruco_detectorParameters_set_minMarkerPerimeterRate + c:@F@cv_aruco_detectorParameters_set_minOtsuStdDev: + name: cv_aruco_detectorParameters_set_minOtsuStdDev + c:@F@cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCell: + name: cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCell + c:@F@cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCell: + name: cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCell + c:@F@cv_aruco_detectorParameters_set_polygonalApproxAccuracyRate: + name: cv_aruco_detectorParameters_set_polygonalApproxAccuracyRate + c:@F@cv_aruco_drawDetectedMarkers: + name: cv_aruco_drawDetectedMarkers + c:@F@cv_aruco_generateImageMarker: + name: cv_aruco_generateImageMarker + c:@F@cv_aruco_getPredefinedDictionary: + name: cv_aruco_getPredefinedDictionary + c:@F@cv_img_hash_BlockMeanHash_close: + name: cv_img_hash_BlockMeanHash_close + c:@F@cv_img_hash_BlockMeanHash_compare: + name: cv_img_hash_BlockMeanHash_compare + c:@F@cv_img_hash_BlockMeanHash_compute: + name: cv_img_hash_BlockMeanHash_compute + c:@F@cv_img_hash_BlockMeanHash_create: + name: cv_img_hash_BlockMeanHash_create + c:@F@cv_img_hash_BlockMeanHash_getMean: + name: cv_img_hash_BlockMeanHash_getMean + c:@F@cv_img_hash_BlockMeanHash_setMode: + name: cv_img_hash_BlockMeanHash_setMode + c:@F@cv_img_hash_averageHash_compare: + name: cv_img_hash_averageHash_compare + c:@F@cv_img_hash_averageHash_compute: + name: cv_img_hash_averageHash_compute + c:@F@cv_img_hash_colorMomentHash_compare: + name: cv_img_hash_colorMomentHash_compare + c:@F@cv_img_hash_colorMomentHash_compute: + name: cv_img_hash_colorMomentHash_compute + c:@F@cv_img_hash_marrHildrethHash_compare: + name: cv_img_hash_marrHildrethHash_compare + c:@F@cv_img_hash_marrHildrethHash_compute: + name: cv_img_hash_marrHildrethHash_compute + c:@F@cv_img_hash_pHash_compare: + name: cv_img_hash_pHash_compare + c:@F@cv_img_hash_pHash_compute: + name: cv_img_hash_pHash_compute + c:@F@cv_img_hash_radialVarianceHash_compare: + name: cv_img_hash_radialVarianceHash_compare + c:@F@cv_img_hash_radialVarianceHash_compute: + name: cv_img_hash_radialVarianceHash_compute + c:@F@cv_quality_QualityBRISQUE_close: + name: cv_quality_QualityBRISQUE_close + c:@F@cv_quality_QualityBRISQUE_compute: + name: cv_quality_QualityBRISQUE_compute + c:@F@cv_quality_QualityBRISQUE_computeFeatures_static: + name: cv_quality_QualityBRISQUE_computeFeatures_static + c:@F@cv_quality_QualityBRISQUE_compute_static: + name: cv_quality_QualityBRISQUE_compute_static + c:@F@cv_quality_QualityBRISQUE_create: + name: cv_quality_QualityBRISQUE_create + c:@F@cv_quality_QualityGMSD_close: + name: cv_quality_QualityGMSD_close + c:@F@cv_quality_QualityGMSD_compute: + name: cv_quality_QualityGMSD_compute + c:@F@cv_quality_QualityGMSD_compute_static: + name: cv_quality_QualityGMSD_compute_static + c:@F@cv_quality_QualityGMSD_create: + name: cv_quality_QualityGMSD_create + c:@F@cv_quality_QualityMSE_close: + name: cv_quality_QualityMSE_close + c:@F@cv_quality_QualityMSE_compute: + name: cv_quality_QualityMSE_compute + c:@F@cv_quality_QualityMSE_compute_static: + name: cv_quality_QualityMSE_compute_static + c:@F@cv_quality_QualityMSE_create: + name: cv_quality_QualityMSE_create + c:@F@cv_quality_QualityPSNR_close: + name: cv_quality_QualityPSNR_close + c:@F@cv_quality_QualityPSNR_compute: + name: cv_quality_QualityPSNR_compute + c:@F@cv_quality_QualityPSNR_compute_static: + name: cv_quality_QualityPSNR_compute_static + c:@F@cv_quality_QualityPSNR_create: + name: cv_quality_QualityPSNR_create + c:@F@cv_quality_QualityPSNR_getMaxPixelValue: + name: cv_quality_QualityPSNR_getMaxPixelValue + c:@F@cv_quality_QualityPSNR_setMaxPixelValue: + name: cv_quality_QualityPSNR_setMaxPixelValue + c:@F@cv_quality_QualitySSIM_close: + name: cv_quality_QualitySSIM_close + c:@F@cv_quality_QualitySSIM_compute: + name: cv_quality_QualitySSIM_compute + c:@F@cv_quality_QualitySSIM_compute_static: + name: cv_quality_QualitySSIM_compute_static + c:@F@cv_quality_QualitySSIM_create: + name: cv_quality_QualitySSIM_create + c:@F@cv_wechat_qrcode_WeChatQRCode_close: + name: cv_wechat_qrcode_WeChatQRCode_close + c:@F@cv_wechat_qrcode_WeChatQRCode_create: + name: cv_wechat_qrcode_WeChatQRCode_create + c:@F@cv_wechat_qrcode_WeChatQRCode_create_1: + name: cv_wechat_qrcode_WeChatQRCode_create_1 + c:@F@cv_wechat_qrcode_WeChatQRCode_detectAndDecode: + name: cv_wechat_qrcode_WeChatQRCode_detectAndDecode + c:@F@cv_wechat_qrcode_WeChatQRCode_getScaleFactor: + name: cv_wechat_qrcode_WeChatQRCode_getScaleFactor + c:@F@cv_wechat_qrcode_WeChatQRCode_setScaleFactor: + name: cv_wechat_qrcode_WeChatQRCode_setScaleFactor + c:@F@cv_ximgproc_EdgeBoxes_getAlpha: + name: cv_ximgproc_EdgeBoxes_getAlpha + c:@F@cv_ximgproc_EdgeBoxes_getBeta: + name: cv_ximgproc_EdgeBoxes_getBeta + c:@F@cv_ximgproc_EdgeBoxes_getBoundingBoxes: + name: cv_ximgproc_EdgeBoxes_getBoundingBoxes + c:@F@cv_ximgproc_EdgeBoxes_getClusterMinMag: + name: cv_ximgproc_EdgeBoxes_getClusterMinMag + c:@F@cv_ximgproc_EdgeBoxes_getEdgeMergeThr: + name: cv_ximgproc_EdgeBoxes_getEdgeMergeThr + c:@F@cv_ximgproc_EdgeBoxes_getEdgeMinMag: + name: cv_ximgproc_EdgeBoxes_getEdgeMinMag + c:@F@cv_ximgproc_EdgeBoxes_getEta: + name: cv_ximgproc_EdgeBoxes_getEta + c:@F@cv_ximgproc_EdgeBoxes_getGamma: + name: cv_ximgproc_EdgeBoxes_getGamma + c:@F@cv_ximgproc_EdgeBoxes_getKappa: + name: cv_ximgproc_EdgeBoxes_getKappa + c:@F@cv_ximgproc_EdgeBoxes_getMaxAspectRatio: + name: cv_ximgproc_EdgeBoxes_getMaxAspectRatio + c:@F@cv_ximgproc_EdgeBoxes_getMaxBoxes: + name: cv_ximgproc_EdgeBoxes_getMaxBoxes + c:@F@cv_ximgproc_EdgeBoxes_getMinBoxArea: + name: cv_ximgproc_EdgeBoxes_getMinBoxArea + c:@F@cv_ximgproc_EdgeBoxes_getMinScore: + name: cv_ximgproc_EdgeBoxes_getMinScore + c:@F@cv_ximgproc_EdgeBoxes_setAlpha: + name: cv_ximgproc_EdgeBoxes_setAlpha + c:@F@cv_ximgproc_EdgeBoxes_setBeta: + name: cv_ximgproc_EdgeBoxes_setBeta + c:@F@cv_ximgproc_EdgeBoxes_setClusterMinMag: + name: cv_ximgproc_EdgeBoxes_setClusterMinMag + c:@F@cv_ximgproc_EdgeBoxes_setEdgeMergeThr: + name: cv_ximgproc_EdgeBoxes_setEdgeMergeThr + c:@F@cv_ximgproc_EdgeBoxes_setEdgeMinMag: + name: cv_ximgproc_EdgeBoxes_setEdgeMinMag + c:@F@cv_ximgproc_EdgeBoxes_setEta: + name: cv_ximgproc_EdgeBoxes_setEta + c:@F@cv_ximgproc_EdgeBoxes_setGamma: + name: cv_ximgproc_EdgeBoxes_setGamma + c:@F@cv_ximgproc_EdgeBoxes_setKappa: + name: cv_ximgproc_EdgeBoxes_setKappa + c:@F@cv_ximgproc_EdgeBoxes_setMaxAspectRatio: + name: cv_ximgproc_EdgeBoxes_setMaxAspectRatio + c:@F@cv_ximgproc_EdgeBoxes_setMaxBoxes: + name: cv_ximgproc_EdgeBoxes_setMaxBoxes + c:@F@cv_ximgproc_EdgeBoxes_setMinBoxArea: + name: cv_ximgproc_EdgeBoxes_setMinBoxArea + c:@F@cv_ximgproc_EdgeBoxes_setMinScore: + name: cv_ximgproc_EdgeBoxes_setMinScore + c:@F@cv_ximgproc_EdgeDrawing_close: + name: cv_ximgproc_EdgeDrawing_close + c:@F@cv_ximgproc_EdgeDrawing_create: + name: cv_ximgproc_EdgeDrawing_create + c:@F@cv_ximgproc_EdgeDrawing_detectEdges: + name: cv_ximgproc_EdgeDrawing_detectEdges + c:@F@cv_ximgproc_EdgeDrawing_detectEllipses: + name: cv_ximgproc_EdgeDrawing_detectEllipses + c:@F@cv_ximgproc_EdgeDrawing_detectLines: + name: cv_ximgproc_EdgeDrawing_detectLines + c:@F@cv_ximgproc_EdgeDrawing_getEdgeImage: + name: cv_ximgproc_EdgeDrawing_getEdgeImage + c:@F@cv_ximgproc_EdgeDrawing_getGradientImage: + name: cv_ximgproc_EdgeDrawing_getGradientImage + c:@F@cv_ximgproc_EdgeDrawing_getParams: + name: cv_ximgproc_EdgeDrawing_getParams + c:@F@cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLines: + name: cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLines + c:@F@cv_ximgproc_EdgeDrawing_getSegments: + name: cv_ximgproc_EdgeDrawing_getSegments + c:@F@cv_ximgproc_EdgeDrawing_setParams: + name: cv_ximgproc_EdgeDrawing_setParams + c:@F@cv_ximgproc_GraphSegmentation_close: + name: cv_ximgproc_GraphSegmentation_close + c:@F@cv_ximgproc_GraphSegmentation_create: + name: cv_ximgproc_GraphSegmentation_create + c:@F@cv_ximgproc_GraphSegmentation_getK: + name: cv_ximgproc_GraphSegmentation_getK + c:@F@cv_ximgproc_GraphSegmentation_getMinSize: + name: cv_ximgproc_GraphSegmentation_getMinSize + c:@F@cv_ximgproc_GraphSegmentation_getSigma: + name: cv_ximgproc_GraphSegmentation_getSigma + c:@F@cv_ximgproc_GraphSegmentation_processImage: + name: cv_ximgproc_GraphSegmentation_processImage + c:@F@cv_ximgproc_GraphSegmentation_setK: + name: cv_ximgproc_GraphSegmentation_setK + c:@F@cv_ximgproc_GraphSegmentation_setMinSize: + name: cv_ximgproc_GraphSegmentation_setMinSize + c:@F@cv_ximgproc_GraphSegmentation_setSigma: + name: cv_ximgproc_GraphSegmentation_setSigma + c:@F@cv_ximgproc_PeiLinNormalization: + name: cv_ximgproc_PeiLinNormalization + c:@F@cv_ximgproc_RFFeatureGetter_clear: + name: cv_ximgproc_RFFeatureGetter_clear + c:@F@cv_ximgproc_RFFeatureGetter_close: + name: cv_ximgproc_RFFeatureGetter_close + c:@F@cv_ximgproc_RFFeatureGetter_create: + name: cv_ximgproc_RFFeatureGetter_create + c:@F@cv_ximgproc_RFFeatureGetter_empty: + name: cv_ximgproc_RFFeatureGetter_empty + c:@F@cv_ximgproc_RFFeatureGetter_getFeatures: + name: cv_ximgproc_RFFeatureGetter_getFeatures + c:@F@cv_ximgproc_StructuredEdgeDetection_close: + name: cv_ximgproc_StructuredEdgeDetection_close + c:@F@cv_ximgproc_StructuredEdgeDetection_computeOrientation: + name: cv_ximgproc_StructuredEdgeDetection_computeOrientation + c:@F@cv_ximgproc_StructuredEdgeDetection_create: + name: cv_ximgproc_StructuredEdgeDetection_create + c:@F@cv_ximgproc_StructuredEdgeDetection_create_1: + name: cv_ximgproc_StructuredEdgeDetection_create_1 + c:@F@cv_ximgproc_StructuredEdgeDetection_detectEdges: + name: cv_ximgproc_StructuredEdgeDetection_detectEdges + c:@F@cv_ximgproc_StructuredEdgeDetection_edgesNms: + name: cv_ximgproc_StructuredEdgeDetection_edgesNms + c:@F@cv_ximgproc_anisotropicDiffusion: + name: cv_ximgproc_anisotropicDiffusion + c:@F@cv_ximgproc_edgePreservingFilter: + name: cv_ximgproc_edgePreservingFilter + c:@F@cv_ximgproc_findEllipses: + name: cv_ximgproc_findEllipses + c:@F@cv_ximgproc_niBlackThreshold: + name: cv_ximgproc_niBlackThreshold + c:@F@cv_ximgproc_rl_createRLEImage: + name: cv_ximgproc_rl_createRLEImage + c:@F@cv_ximgproc_rl_dilate: + name: cv_ximgproc_rl_dilate + c:@F@cv_ximgproc_rl_erode: + name: cv_ximgproc_rl_erode + c:@F@cv_ximgproc_rl_getStructuringElement: + name: cv_ximgproc_rl_getStructuringElement + c:@F@cv_ximgproc_rl_isRLMorphologyPossible: + name: cv_ximgproc_rl_isRLMorphologyPossible + c:@F@cv_ximgproc_rl_morphologyEx: + name: cv_ximgproc_rl_morphologyEx + c:@F@cv_ximgproc_rl_paint: + name: cv_ximgproc_rl_paint + c:@F@cv_ximgproc_rl_threshold: + name: cv_ximgproc_rl_threshold + c:@F@cv_ximgproc_thinning: + name: cv_ximgproc_thinning + c:@F@cv_xobjdetect_WBDetector_close: + name: cv_xobjdetect_WBDetector_close + c:@F@cv_xobjdetect_WBDetector_create: + name: cv_xobjdetect_WBDetector_create + c:@F@cv_xobjdetect_WBDetector_detect: + name: cv_xobjdetect_WBDetector_detect + c:@F@cv_xobjdetect_WBDetector_read: + name: cv_xobjdetect_WBDetector_read + c:@F@cv_xobjdetect_WBDetector_train: + name: cv_xobjdetect_WBDetector_train + c:@F@cv_xobjdetect_WBDetector_write: + name: cv_xobjdetect_WBDetector_write c:@S@ArucoDetector: name: ArucoDetector - c:@S@ArucoDetectorParameters: - name: ArucoDetectorParameters + c:@S@ArucoDetectorParams: + name: ArucoDetectorParams c:@S@ArucoDictionary: name: ArucoDictionary c:@S@BlockMeanHash: @@ -626,8 +422,8 @@ files: name: StructuredEdgeDetection c:@S@WeChatQRCode: name: WeChatQRCode - c:aruco.h@T@ArucoDetectorParametersPtr: - name: ArucoDetectorParametersPtr + c:aruco.h@T@ArucoDetectorParamsPtr: + name: ArucoDetectorParamsPtr c:aruco.h@T@ArucoDetectorPtr: name: ArucoDetectorPtr c:aruco.h@T@ArucoDictionaryPtr: @@ -674,6 +470,8 @@ files: name: VecVecPoint2f c:wechat_qrcode.h@T@WeChatQRCodePtr: name: WeChatQRCodePtr + c:ximgproc.h@T@EdgeBoxesPtr: + name: EdgeBoxesPtr c:ximgproc.h@T@EdgeDrawingPtr: name: EdgeDrawingPtr c:ximgproc.h@T@GraphSegmentationPtr: diff --git a/packages/dartcv/lib/src/g/core.g.dart b/packages/dartcv/lib/src/g/core.g.dart index 7443d1a0..74935673 100644 --- a/packages/dartcv/lib/src/g/core.g.dart +++ b/packages/dartcv/lib/src/g/core.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Core /// @@ -30,6174 +30,3932 @@ class CvNativeCore { lookup) : _lookup = lookup; - void CvStatus_Close( + void CvStatus_close( ffi.Pointer self, ) { - return _CvStatus_Close( + return _CvStatus_close( self, ); } - late final _CvStatus_ClosePtr = + late final _CvStatus_closePtr = _lookup)>>( - 'CvStatus_Close'); - late final _CvStatus_Close = - _CvStatus_ClosePtr.asFunction)>(); + 'CvStatus_close'); + late final _CvStatus_close = + _CvStatus_closePtr.asFunction)>(); - ffi.Pointer Eye( - int rows, - int cols, - int type, - ffi.Pointer rval, + ffi.Pointer cv_LUT( + Mat src, + Mat lut, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _Eye( - rows, - cols, - type, - rval, + return _cv_LUT( + src, + lut, + dst, + callback, ); } - late final _EyePtr = _lookup< + late final _cv_LUTPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Int, ffi.Int, ffi.Int, ffi.Pointer)>>('Eye'); - late final _Eye = _EyePtr.asFunction< - ffi.Pointer Function(int, int, int, ffi.Pointer)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_LUT'); + late final _cv_LUT = _cv_LUTPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer GetCVTickCount( - ffi.Pointer rval, + ffi.Pointer cv_Mat_adjustROI( + Mat self, + int dtop, + int dbottom, + int dleft, + int dright, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _GetCVTickCount( + return _cv_Mat_adjustROI( + self, + dtop, + dbottom, + dleft, + dright, rval, + callback, ); } - late final _GetCVTickCountPtr = _lookup< + late final _cv_Mat_adjustROIPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('GetCVTickCount'); - late final _GetCVTickCount = _GetCVTickCountPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, + ffi.Int, Mat, imp1.CvCallback_0)>>('cv_Mat_adjustROI'); + late final _cv_Mat_adjustROI = _cv_Mat_adjustROIPtr.asFunction< + ffi.Pointer Function( + Mat, int, int, int, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer GetNumThreads( - ffi.Pointer rval, + int cv_Mat_channels( + Mat self, ) { - return _GetNumThreads( - rval, + return _cv_Mat_channels( + self, ); } - late final _GetNumThreadsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('GetNumThreads'); - late final _GetNumThreads = _GetNumThreadsPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + late final _cv_Mat_channelsPtr = + _lookup>('cv_Mat_channels'); + late final _cv_Mat_channels = + _cv_Mat_channelsPtr.asFunction(isLeaf: true); - ffi.Pointer GetTickFrequency( - ffi.Pointer rval, + ffi.Pointer cv_Mat_clone( + Mat self, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _GetTickFrequency( + return _cv_Mat_clone( + self, rval, + callback, ); } - late final _GetTickFrequencyPtr = _lookup< + late final _cv_Mat_clonePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('GetTickFrequency'); - late final _GetTickFrequency = _GetTickFrequencyPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_Mat_clone'); + late final _cv_Mat_clone = _cv_Mat_clonePtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer KMeans( - Mat data, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - Mat centers, - ffi.Pointer rval, + void cv_Mat_close( + imp1.MatPtr self, ) { - return _KMeans( - data, - k, - bestLabels, - criteria, - attempts, - flags, - centers, - rval, + return _cv_Mat_close( + self, ); } - late final _KMeansPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, Mat, TermCriteria, - ffi.Int, ffi.Int, Mat, ffi.Pointer)>>('KMeans'); - late final _KMeans = _KMeansPtr.asFunction< - ffi.Pointer Function(Mat, int, Mat, TermCriteria, int, int, Mat, - ffi.Pointer)>(); + late final _cv_Mat_closePtr = + _lookup>( + 'cv_Mat_close'); + late final _cv_Mat_close = + _cv_Mat_closePtr.asFunction(); - ffi.Pointer KMeansPoints( - VecPoint2f pts, - int k, - Mat bestLabels, - TermCriteria criteria, - int attempts, - int flags, - Mat centers, - ffi.Pointer rval, + void cv_Mat_closeVoid( + ffi.Pointer self, ) { - return _KMeansPoints( - pts, - k, - bestLabels, - criteria, - attempts, - flags, - centers, - rval, + return _cv_Mat_closeVoid( + self, ); } - late final _KMeansPointsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, ffi.Int, Mat, TermCriteria, - ffi.Int, ffi.Int, Mat, ffi.Pointer)>>('KMeansPoints'); - late final _KMeansPoints = _KMeansPointsPtr.asFunction< - ffi.Pointer Function(VecPoint2f, int, Mat, TermCriteria, int, - int, Mat, ffi.Pointer)>(); + late final _cv_Mat_closeVoidPtr = + _lookup)>>( + 'cv_Mat_closeVoid'); + late final _cv_Mat_closeVoid = + _cv_Mat_closeVoidPtr.asFunction)>(); - ffi.Pointer LUT( - Mat src, - Mat lut, - Mat dst, + ffi.Pointer cv_Mat_col( + Mat self, + int x, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _LUT( - src, - lut, - dst, + return _cv_Mat_col( + self, + x, + rval, + callback, ); } - late final _LUTPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>('LUT'); - late final _LUT = - _LUTPtr.asFunction Function(Mat, Mat, Mat)>(); + late final _cv_Mat_colPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_Mat_col'); + late final _cv_Mat_col = _cv_Mat_colPtr.asFunction< + ffi.Pointer Function(Mat, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AbsDiff( - Mat src1, - Mat src2, - Mat dst, + int cv_Mat_cols( + Mat self, ) { - return _Mat_AbsDiff( - src1, - src2, - dst, + return _cv_Mat_cols( + self, ); } - late final _Mat_AbsDiffPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_AbsDiff'); - late final _Mat_AbsDiff = _Mat_AbsDiffPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); + late final _cv_Mat_colsPtr = + _lookup>('cv_Mat_cols'); + late final _cv_Mat_cols = + _cv_Mat_colsPtr.asFunction(isLeaf: true); - ffi.Pointer Mat_Add( - Mat src1, - Mat src2, - Mat dst, - Mat mask, - int dtype, + ffi.Pointer cv_Mat_convertFp16( + Mat self, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Add( - src1, - src2, - dst, - mask, - dtype, + return _cv_Mat_convertFp16( + self, + rval, + callback, ); } - late final _Mat_AddPtr = _lookup< + late final _cv_Mat_convertFp16Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, Mat, ffi.Int)>>('Mat_Add'); - late final _Mat_Add = _Mat_AddPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, int)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_Mat_convertFp16'); + late final _cv_Mat_convertFp16 = _cv_Mat_convertFp16Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AddF64( - Mat m, - double val, + ffi.Pointer cv_Mat_convertTo( + Mat self, + Mat dst, + int type, + imp1.CvCallback_0 callback, ) { - return _Mat_AddF64( - m, - val, + return _cv_Mat_convertTo( + self, + dst, + type, + callback, ); } - late final _Mat_AddF64Ptr = _lookup< - ffi.NativeFunction Function(Mat, double_t)>>( - 'Mat_AddF64'); - late final _Mat_AddF64 = - _Mat_AddF64Ptr.asFunction Function(Mat, double)>(); + late final _cv_Mat_convertToPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_Mat_convertTo'); + late final _cv_Mat_convertTo = _cv_Mat_convertToPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AddFloat( - Mat m, - double val, + ffi.Pointer cv_Mat_convertTo_1( + Mat self, + Mat dst, + int type, + double alpha, + double beta, + imp1.CvCallback_0 callback, ) { - return _Mat_AddFloat( - m, - val, + return _cv_Mat_convertTo_1( + self, + dst, + type, + alpha, + beta, + callback, ); } - late final _Mat_AddFloatPtr = - _lookup Function(Mat, float_t)>>( - 'Mat_AddFloat'); - late final _Mat_AddFloat = _Mat_AddFloatPtr.asFunction< - ffi.Pointer Function(Mat, double)>(); + late final _cv_Mat_convertTo_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Float, + ffi.Float, imp1.CvCallback_0)>>('cv_Mat_convertTo_1'); + late final _cv_Mat_convertTo_1 = _cv_Mat_convertTo_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, double, double, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AddI16( - Mat m, - int val, + ffi.Pointer cv_Mat_copyTo( + Mat self, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _Mat_AddI16( - m, - val, + return _cv_Mat_copyTo( + self, + dst, + callback, ); } - late final _Mat_AddI16Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int16)>>( - 'Mat_AddI16'); - late final _Mat_AddI16 = - _Mat_AddI16Ptr.asFunction Function(Mat, int)>(); + late final _cv_Mat_copyToPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, imp1.CvCallback_0)>>('cv_Mat_copyTo'); + late final _cv_Mat_copyTo = _cv_Mat_copyToPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AddI32( - Mat m, - int val, + ffi.Pointer cv_Mat_copyTo_1( + Mat self, + Mat dst, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _Mat_AddI32( - m, - val, + return _cv_Mat_copyTo_1( + self, + dst, + mask, + callback, ); } - late final _Mat_AddI32Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int32)>>( - 'Mat_AddI32'); - late final _Mat_AddI32 = - _Mat_AddI32Ptr.asFunction Function(Mat, int)>(); + late final _cv_Mat_copyTo_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_Mat_copyTo_1'); + late final _cv_Mat_copyTo_1 = _cv_Mat_copyTo_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AddMat( - Mat m, - Mat val, + /// @brief Create empty Mat + /// + /// ALL return values with a type of `Pointer of Struct`, + /// e.g., + /// Mat, the internal pointer (Mat.ptr) MUST be NULL + /// otherwise the memory of mat.ptr pointed to will NOT be freed correctly. + /// Mat* mat = (Mat*)malloc(sizeof(Mat)); + /// CvStatus *status = cv_Mat_create(mat); + /// Mat_close(mat); + /// + /// @param rval Mat* + /// @return CvStatus + ffi.Pointer cv_Mat_create( + ffi.Pointer rval, ) { - return _Mat_AddMat( - m, - val, + return _cv_Mat_create( + rval, ); } - late final _Mat_AddMatPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_AddMat'); - late final _Mat_AddMat = - _Mat_AddMatPtr.asFunction Function(Mat, Mat)>(); + late final _cv_Mat_createPtr = _lookup< + ffi.NativeFunction Function(ffi.Pointer)>>( + 'cv_Mat_create'); + late final _cv_Mat_create = _cv_Mat_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer Mat_AddSChar( - Mat m, - int val, + /// @brief Create Mat with specified size and type + /// + /// @param rows number of rows + /// @param cols number of columns + /// @param type type of the created matrix + /// @param rval Mat* + /// @return CvStatus + ffi.Pointer cv_Mat_create_1( + int rows, + int cols, + int type, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_AddSChar( - m, - val, + return _cv_Mat_create_1( + rows, + cols, + type, + rval, + callback, ); } - late final _Mat_AddSCharPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int8)>>( - 'Mat_AddSChar'); - late final _Mat_AddSChar = - _Mat_AddSCharPtr.asFunction Function(Mat, int)>(); + late final _cv_Mat_create_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_create_1'); + late final _cv_Mat_create_1 = _cv_Mat_create_1Ptr.asFunction< + ffi.Pointer Function( + int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AddU16( - Mat m, - int val, + ffi.Pointer cv_Mat_create_10( + VecPoint3i vec, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_AddU16( - m, - val, + return _cv_Mat_create_10( + vec, + rval, + callback, ); } - late final _Mat_AddU16Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Uint16)>>( - 'Mat_AddU16'); - late final _Mat_AddU16 = - _Mat_AddU16Ptr.asFunction Function(Mat, int)>(); + late final _cv_Mat_create_10Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VecPoint3i, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_create_10'); + late final _cv_Mat_create_10 = _cv_Mat_create_10Ptr.asFunction< + ffi.Pointer Function( + VecPoint3i, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AddUChar( - Mat m, - int val, + /// @brief Create Mat with Mat::ptr + ffi.Pointer cv_Mat_create_11( + Mat self, + int rows, + int cols, + int type, + int prows, + int pcols, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_AddUChar( - m, - val, + return _cv_Mat_create_11( + self, + rows, + cols, + type, + prows, + pcols, + rval, + callback, ); } - late final _Mat_AddUCharPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Uint8)>>( - 'Mat_AddUChar'); - late final _Mat_AddUChar = - _Mat_AddUCharPtr.asFunction Function(Mat, int)>(); + late final _cv_Mat_create_11Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_create_11'); + late final _cv_Mat_create_11 = _cv_Mat_create_11Ptr.asFunction< + ffi.Pointer Function( + Mat, int, int, int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_AddWeighted( - Mat src1, - double alpha, - Mat src2, - double beta, - double gamma, - Mat dst, - int dtype, - ) { - return _Mat_AddWeighted( - src1, - alpha, - src2, - beta, - gamma, - dst, - dtype, - ); - } - - late final _Mat_AddWeightedPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, Mat, ffi.Double, - ffi.Double, Mat, ffi.Int)>>('Mat_AddWeighted'); - late final _Mat_AddWeighted = _Mat_AddWeightedPtr.asFunction< - ffi.Pointer Function( - Mat, double, Mat, double, double, Mat, int)>(); - - ffi.Pointer Mat_AdjustROI( - Mat m, - int dtop, - int dbottom, - int dleft, - int dright, - ffi.Pointer rval, - ) { - return _Mat_AdjustROI( - m, - dtop, - dbottom, - dleft, - dright, - rval, - ); - } - - late final _Mat_AdjustROIPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Int, ffi.Pointer)>>('Mat_AdjustROI'); - late final _Mat_AdjustROI = _Mat_AdjustROIPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, int, ffi.Pointer)>(); - - ffi.Pointer Mat_BatchDistance( - Mat src1, - Mat src2, - Mat dist, - int dtype, - Mat nidx, - int normType, - int K, - Mat mask, - int update, - bool crosscheck, - ) { - return _Mat_BatchDistance( - src1, - src2, - dist, - dtype, - nidx, - normType, - K, - mask, - update, - crosscheck, - ); - } - - late final _Mat_BatchDistancePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, Mat, ffi.Int, - ffi.Int, Mat, ffi.Int, ffi.Bool)>>('Mat_BatchDistance'); - late final _Mat_BatchDistance = _Mat_BatchDistancePtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, int, Mat, int, int, Mat, int, bool)>(); - - ffi.Pointer Mat_BitwiseAnd( - Mat src1, - Mat src2, - Mat dst, - ) { - return _Mat_BitwiseAnd( - src1, - src2, - dst, - ); - } - - late final _Mat_BitwiseAndPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_BitwiseAnd'); - late final _Mat_BitwiseAnd = _Mat_BitwiseAndPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_BitwiseAndWithMask( - Mat src1, - Mat src2, - Mat dst, - Mat mask, - ) { - return _Mat_BitwiseAndWithMask( - src1, - src2, - dst, - mask, - ); - } - - late final _Mat_BitwiseAndWithMaskPtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Mat, Mat)>>( - 'Mat_BitwiseAndWithMask'); - late final _Mat_BitwiseAndWithMask = _Mat_BitwiseAndWithMaskPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat)>(); - - ffi.Pointer Mat_BitwiseNot( - Mat src1, - Mat dst, - ) { - return _Mat_BitwiseNot( - src1, - dst, - ); - } - - late final _Mat_BitwiseNotPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_BitwiseNot'); - late final _Mat_BitwiseNot = - _Mat_BitwiseNotPtr.asFunction Function(Mat, Mat)>(); - - ffi.Pointer Mat_BitwiseNotWithMask( - Mat src1, - Mat dst, - Mat mask, - ) { - return _Mat_BitwiseNotWithMask( - src1, - dst, - mask, - ); - } - - late final _Mat_BitwiseNotWithMaskPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_BitwiseNotWithMask'); - late final _Mat_BitwiseNotWithMask = _Mat_BitwiseNotWithMaskPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_BitwiseOr( - Mat src1, - Mat src2, - Mat dst, - ) { - return _Mat_BitwiseOr( - src1, - src2, - dst, - ); - } - - late final _Mat_BitwiseOrPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_BitwiseOr'); - late final _Mat_BitwiseOr = _Mat_BitwiseOrPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_BitwiseOrWithMask( - Mat src1, - Mat src2, - Mat dst, - Mat mask, - ) { - return _Mat_BitwiseOrWithMask( - src1, - src2, - dst, - mask, - ); - } - - late final _Mat_BitwiseOrWithMaskPtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Mat, Mat)>>( - 'Mat_BitwiseOrWithMask'); - late final _Mat_BitwiseOrWithMask = _Mat_BitwiseOrWithMaskPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat)>(); - - ffi.Pointer Mat_BitwiseXor( - Mat src1, - Mat src2, - Mat dst, - ) { - return _Mat_BitwiseXor( - src1, - src2, - dst, - ); - } - - late final _Mat_BitwiseXorPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_BitwiseXor'); - late final _Mat_BitwiseXor = _Mat_BitwiseXorPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_BitwiseXorWithMask( - Mat src1, - Mat src2, - Mat dst, - Mat mask, - ) { - return _Mat_BitwiseXorWithMask( - src1, - src2, - dst, - mask, - ); - } - - late final _Mat_BitwiseXorWithMaskPtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Mat, Mat)>>( - 'Mat_BitwiseXorWithMask'); - late final _Mat_BitwiseXorWithMask = _Mat_BitwiseXorWithMaskPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat)>(); - - ffi.Pointer Mat_BorderInterpolate( - int p, - int len, - int borderType, - ffi.Pointer rval, - ) { - return _Mat_BorderInterpolate( - p, - len, - borderType, - rval, - ); - } - - late final _Mat_BorderInterpolatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_BorderInterpolate'); - late final _Mat_BorderInterpolate = _Mat_BorderInterpolatePtr.asFunction< - ffi.Pointer Function(int, int, int, ffi.Pointer)>(); - - ffi.Pointer Mat_CalcCovarMatrix( - Mat samples, - Mat covar, - Mat mean, - int flags, - int ctype, - ) { - return _Mat_CalcCovarMatrix( - samples, - covar, - mean, - flags, - ctype, - ); - } - - late final _Mat_CalcCovarMatrixPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Int, ffi.Int)>>('Mat_CalcCovarMatrix'); - late final _Mat_CalcCovarMatrix = _Mat_CalcCovarMatrixPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int, int)>(); - - ffi.Pointer Mat_CartToPolar( - Mat x, - Mat y, - Mat magnitude, - Mat angle, - bool angleInDegrees, - ) { - return _Mat_CartToPolar( - x, - y, - magnitude, - angle, - angleInDegrees, - ); - } - - late final _Mat_CartToPolarPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, ffi.Bool)>>('Mat_CartToPolar'); - late final _Mat_CartToPolar = _Mat_CartToPolarPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, bool)>(); - - int Mat_Channels( - Mat m, - ) { - return _Mat_Channels( - m, - ); - } - - late final _Mat_ChannelsPtr = - _lookup>('Mat_Channels'); - late final _Mat_Channels = - _Mat_ChannelsPtr.asFunction(isLeaf: true); - - ffi.Pointer Mat_CheckRange( - Mat m, - bool quiet, - ffi.Pointer pos, - double minVal, - double maxVal, - ffi.Pointer rval, - ) { - return _Mat_CheckRange( - m, - quiet, - pos, - minVal, - maxVal, - rval, - ); - } - - late final _Mat_CheckRangePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Bool, - ffi.Pointer, - ffi.Double, - ffi.Double, - ffi.Pointer)>>('Mat_CheckRange'); - late final _Mat_CheckRange = _Mat_CheckRangePtr.asFunction< - ffi.Pointer Function(Mat, bool, ffi.Pointer, double, - double, ffi.Pointer)>(); - - ffi.Pointer Mat_Clone( - Mat m, - ffi.Pointer rval, - ) { - return _Mat_Clone( - m, - rval, - ); - } - - late final _Mat_ClonePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>>('Mat_Clone'); - late final _Mat_Clone = _Mat_ClonePtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); - - ffi.Pointer Mat_Clone_Async( + ffi.Pointer cv_Mat_create_12( Mat self, - imp1.CvCallback_1 callback, + int rowStart, + int rowEnd, + int colStart, + int colEnd, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Clone_Async( + return _cv_Mat_create_12( self, - callback, - ); - } - - late final _Mat_Clone_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('Mat_Clone_Async'); - late final _Mat_Clone_Async = _Mat_Clone_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, imp1.CvCallback_1)>(); - - void Mat_Close( - imp1.MatPtr m, - ) { - return _Mat_Close( - m, - ); - } - - late final _Mat_ClosePtr = - _lookup>('Mat_Close'); - late final _Mat_Close = - _Mat_ClosePtr.asFunction(); - - void Mat_CloseVoid( - ffi.Pointer m, - ) { - return _Mat_CloseVoid( - m, - ); - } - - late final _Mat_CloseVoidPtr = - _lookup)>>( - 'Mat_CloseVoid'); - late final _Mat_CloseVoid = - _Mat_CloseVoidPtr.asFunction)>(); - - ffi.Pointer Mat_Col( - Mat m, - int x, - ffi.Pointer rval, - ) { - return _Mat_Col( - m, - x, - rval, - ); - } - - late final _Mat_ColPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Pointer)>>('Mat_Col'); - late final _Mat_Col = _Mat_ColPtr.asFunction< - ffi.Pointer Function(Mat, int, ffi.Pointer)>(); - - int Mat_Cols( - Mat m, - ) { - return _Mat_Cols( - m, - ); - } - - late final _Mat_ColsPtr = - _lookup>('Mat_Cols'); - late final _Mat_Cols = - _Mat_ColsPtr.asFunction(isLeaf: true); - - ffi.Pointer Mat_Compare( - Mat src1, - Mat src2, - Mat dst, - int ct, - ) { - return _Mat_Compare( - src1, - src2, - dst, - ct, - ); - } - - late final _Mat_ComparePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Int)>>('Mat_Compare'); - late final _Mat_Compare = _Mat_ComparePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int)>(); - - ffi.Pointer Mat_CompleteSymm( - Mat m, - bool lowerToUpper, - ) { - return _Mat_CompleteSymm( - m, - lowerToUpper, - ); - } - - late final _Mat_CompleteSymmPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Bool)>>( - 'Mat_CompleteSymm'); - late final _Mat_CompleteSymm = _Mat_CompleteSymmPtr.asFunction< - ffi.Pointer Function(Mat, bool)>(); - - ffi.Pointer Mat_ConvertFp16( - Mat m, - ffi.Pointer rval, - ) { - return _Mat_ConvertFp16( - m, - rval, - ); - } - - late final _Mat_ConvertFp16Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_ConvertFp16'); - late final _Mat_ConvertFp16 = _Mat_ConvertFp16Ptr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); - - ffi.Pointer Mat_ConvertScaleAbs( - Mat src, - Mat dst, - double alpha, - double beta, - ) { - return _Mat_ConvertScaleAbs( - src, - dst, - alpha, - beta, - ); - } - - late final _Mat_ConvertScaleAbsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Double, ffi.Double)>>('Mat_ConvertScaleAbs'); - late final _Mat_ConvertScaleAbs = _Mat_ConvertScaleAbsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, double)>(); - - ffi.Pointer Mat_ConvertTo( - Mat m, - Mat dst, - int type, - ) { - return _Mat_ConvertTo( - m, - dst, - type, - ); - } - - late final _Mat_ConvertToPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('Mat_ConvertTo'); - late final _Mat_ConvertTo = _Mat_ConvertToPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int)>(); - - ffi.Pointer Mat_ConvertToWithParams( - Mat m, - Mat dst, - int type, - double alpha, - double beta, - ) { - return _Mat_ConvertToWithParams( - m, - dst, - type, - alpha, - beta, - ); - } - - late final _Mat_ConvertToWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Float, - ffi.Float)>>('Mat_ConvertToWithParams'); - late final _Mat_ConvertToWithParams = _Mat_ConvertToWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, double, double)>(); - - ffi.Pointer Mat_ConvertToWithParams_Async( - Mat self, - int type, - double alpha, - double beta, - imp1.CvCallback_1 callback, - ) { - return _Mat_ConvertToWithParams_Async( - self, - type, - alpha, - beta, - callback, - ); - } - - late final _Mat_ConvertToWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('Mat_ConvertToWithParams_Async'); - late final _Mat_ConvertToWithParams_Async = - _Mat_ConvertToWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, double, double, imp1.CvCallback_1)>(); - - ffi.Pointer Mat_ConvertTo_Async( - Mat self, - int type, - imp1.CvCallback_1 callback, - ) { - return _Mat_ConvertTo_Async( - self, - type, - callback, - ); - } - - late final _Mat_ConvertTo_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('Mat_ConvertTo_Async'); - late final _Mat_ConvertTo_Async = _Mat_ConvertTo_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); - - ffi.Pointer Mat_CopyMakeBorder( - Mat src, - Mat dst, - int top, - int bottom, - int left, - int right, - int borderType, - Scalar value, - ) { - return _Mat_CopyMakeBorder( - src, - dst, - top, - bottom, - left, - right, - borderType, - value, - ); - } - - late final _Mat_CopyMakeBorderPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Int, ffi.Int, Scalar)>>('Mat_CopyMakeBorder'); - late final _Mat_CopyMakeBorder = _Mat_CopyMakeBorderPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, int, int, int, int, Scalar)>(); - - ffi.Pointer Mat_CopyTo( - Mat m, - Mat dst, - ) { - return _Mat_CopyTo( - m, - dst, - ); - } - - late final _Mat_CopyToPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_CopyTo'); - late final _Mat_CopyTo = - _Mat_CopyToPtr.asFunction Function(Mat, Mat)>(); - - ffi.Pointer Mat_CopyToWithMask( - Mat m, - Mat dst, - Mat mask, - ) { - return _Mat_CopyToWithMask( - m, - dst, - mask, - ); - } - - late final _Mat_CopyToWithMaskPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_CopyToWithMask'); - late final _Mat_CopyToWithMask = _Mat_CopyToWithMaskPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_CopyToWithMask_Async( - Mat self, - Mat dst, - Mat mask, - imp1.CvCallback_0 callback, - ) { - return _Mat_CopyToWithMask_Async( - self, - dst, - mask, - callback, - ); - } - - late final _Mat_CopyToWithMask_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, imp1.CvCallback_0)>>('Mat_CopyToWithMask_Async'); - late final _Mat_CopyToWithMask_Async = - _Mat_CopyToWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer Mat_CopyTo_Async( - Mat self, - Mat dst, - imp1.CvCallback_0 callback, - ) { - return _Mat_CopyTo_Async( - self, - dst, - callback, - ); - } - - late final _Mat_CopyTo_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_0)>>('Mat_CopyTo_Async'); - late final _Mat_CopyTo_Async = _Mat_CopyTo_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - - int Mat_CountNonZero( - Mat src, - ) { - return _Mat_CountNonZero( - src, - ); - } - - late final _Mat_CountNonZeroPtr = - _lookup>('Mat_CountNonZero'); - late final _Mat_CountNonZero = - _Mat_CountNonZeroPtr.asFunction(isLeaf: true); - - ffi.Pointer Mat_DCT( - Mat src, - Mat dst, - int flags, - ) { - return _Mat_DCT( - src, - dst, - flags, - ); - } - - late final _Mat_DCTPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('Mat_DCT'); - late final _Mat_DCT = - _Mat_DCTPtr.asFunction Function(Mat, Mat, int)>(); - - ffi.Pointer Mat_DFT( - Mat src, - Mat dst, - int flags, - int nonzeroRows, - ) { - return _Mat_DFT( - src, - dst, - flags, - nonzeroRows, - ); - } - - late final _Mat_DFTPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Int)>>('Mat_DFT'); - late final _Mat_DFT = _Mat_DFTPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, int)>(); - - ffi.Pointer Mat_Data( - Mat m, - ) { - return _Mat_Data( - m, - ); - } - - late final _Mat_DataPtr = - _lookup Function(Mat)>>( - 'Mat_Data'); - late final _Mat_Data = - _Mat_DataPtr.asFunction Function(Mat)>( - isLeaf: true); - - ffi.Pointer Mat_Determinant( - Mat m, - ffi.Pointer rval, - ) { - return _Mat_Determinant( - m, - rval, - ); - } - - late final _Mat_DeterminantPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_Determinant'); - late final _Mat_Determinant = _Mat_DeterminantPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); - - int Mat_Dims( - Mat m, - ) { - return _Mat_Dims( - m, - ); - } - - late final _Mat_DimsPtr = - _lookup>('Mat_Dims'); - late final _Mat_Dims = - _Mat_DimsPtr.asFunction(isLeaf: true); - - ffi.Pointer Mat_Divide( - Mat src1, - Mat src2, - Mat dst, - double scale, - int dtype, - ) { - return _Mat_Divide( - src1, - src2, - dst, - scale, - dtype, - ); - } - - late final _Mat_DividePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Double, ffi.Int)>>('Mat_Divide'); - late final _Mat_Divide = _Mat_DividePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, double, int)>(); - - ffi.Pointer Mat_DivideF64( - Mat m, - double val, - ) { - return _Mat_DivideF64( - m, - val, - ); - } - - late final _Mat_DivideF64Ptr = _lookup< - ffi.NativeFunction Function(Mat, double_t)>>( - 'Mat_DivideF64'); - late final _Mat_DivideF64 = _Mat_DivideF64Ptr.asFunction< - ffi.Pointer Function(Mat, double)>(); - - ffi.Pointer Mat_DivideFloat( - Mat m, - double val, - ) { - return _Mat_DivideFloat( - m, - val, - ); - } - - late final _Mat_DivideFloatPtr = - _lookup Function(Mat, float_t)>>( - 'Mat_DivideFloat'); - late final _Mat_DivideFloat = _Mat_DivideFloatPtr.asFunction< - ffi.Pointer Function(Mat, double)>(); - - ffi.Pointer Mat_DivideI16( - Mat m, - int val, - ) { - return _Mat_DivideI16( - m, - val, - ); - } - - late final _Mat_DivideI16Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int16)>>( - 'Mat_DivideI16'); - late final _Mat_DivideI16 = - _Mat_DivideI16Ptr.asFunction Function(Mat, int)>(); - - ffi.Pointer Mat_DivideI32( - Mat m, - int val, - ) { - return _Mat_DivideI32( - m, - val, - ); - } - - late final _Mat_DivideI32Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int32)>>( - 'Mat_DivideI32'); - late final _Mat_DivideI32 = - _Mat_DivideI32Ptr.asFunction Function(Mat, int)>(); - - ffi.Pointer Mat_DivideMat( - Mat m, - Mat val, - ) { - return _Mat_DivideMat( - m, - val, - ); - } - - late final _Mat_DivideMatPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_DivideMat'); - late final _Mat_DivideMat = - _Mat_DivideMatPtr.asFunction Function(Mat, Mat)>(); - - ffi.Pointer Mat_DivideSChar( - Mat m, - int val, - ) { - return _Mat_DivideSChar( - m, - val, - ); - } - - late final _Mat_DivideSCharPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int8)>>( - 'Mat_DivideSChar'); - late final _Mat_DivideSChar = _Mat_DivideSCharPtr.asFunction< - ffi.Pointer Function(Mat, int)>(); - - ffi.Pointer Mat_DivideU16( - Mat m, - int val, - ) { - return _Mat_DivideU16( - m, - val, - ); - } - - late final _Mat_DivideU16Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Uint16)>>( - 'Mat_DivideU16'); - late final _Mat_DivideU16 = - _Mat_DivideU16Ptr.asFunction Function(Mat, int)>(); - - ffi.Pointer Mat_DivideUChar( - Mat m, - int val, - ) { - return _Mat_DivideUChar( - m, - val, - ); - } - - late final _Mat_DivideUCharPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Uint8)>>( - 'Mat_DivideUChar'); - late final _Mat_DivideUChar = _Mat_DivideUCharPtr.asFunction< - ffi.Pointer Function(Mat, int)>(); - - ffi.Pointer Mat_Eigen( - Mat src, - Mat eigenvalues, - Mat eigenvectors, - ffi.Pointer rval, - ) { - return _Mat_Eigen( - src, - eigenvalues, - eigenvectors, - rval, - ); - } - - late final _Mat_EigenPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Pointer)>>('Mat_Eigen'); - late final _Mat_Eigen = _Mat_EigenPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer Mat_EigenNonSymmetric( - Mat src, - Mat eigenvalues, - Mat eigenvectors, - ) { - return _Mat_EigenNonSymmetric( - src, - eigenvalues, - eigenvectors, - ); - } - - late final _Mat_EigenNonSymmetricPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_EigenNonSymmetric'); - late final _Mat_EigenNonSymmetric = _Mat_EigenNonSymmetricPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - int Mat_ElemSize( - Mat m, - ) { - return _Mat_ElemSize( - m, - ); - } - - late final _Mat_ElemSizePtr = - _lookup>('Mat_ElemSize'); - late final _Mat_ElemSize = - _Mat_ElemSizePtr.asFunction(isLeaf: true); - - int Mat_ElemSize1( - Mat m, - ) { - return _Mat_ElemSize1( - m, - ); - } - - late final _Mat_ElemSize1Ptr = - _lookup>('Mat_ElemSize1'); - late final _Mat_ElemSize1 = - _Mat_ElemSize1Ptr.asFunction(isLeaf: true); - - bool Mat_Empty( - Mat m, - ) { - return _Mat_Empty( - m, - ); - } - - late final _Mat_EmptyPtr = - _lookup>('Mat_Empty'); - late final _Mat_Empty = _Mat_EmptyPtr.asFunction(); - - ffi.Pointer Mat_Exp( - Mat src, - Mat dst, - ) { - return _Mat_Exp( - src, - dst, - ); - } - - late final _Mat_ExpPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_Exp'); - late final _Mat_Exp = - _Mat_ExpPtr.asFunction Function(Mat, Mat)>(); - - ffi.Pointer Mat_ExtractChannel( - Mat src, - Mat dst, - int coi, - ) { - return _Mat_ExtractChannel( - src, - dst, - coi, - ); - } - - late final _Mat_ExtractChannelPtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, ffi.Int)>>( - 'Mat_ExtractChannel'); - late final _Mat_ExtractChannel = _Mat_ExtractChannelPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int)>(); - - ffi.Pointer Mat_Eye_Async( - int rows, - int cols, - int type, - imp1.CvCallback_1 callback, - ) { - return _Mat_Eye_Async( - rows, - cols, - type, - callback, - ); - } - - late final _Mat_Eye_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Int, ffi.Int, imp1.CvCallback_1)>>('Mat_Eye_Async'); - late final _Mat_Eye_Async = _Mat_Eye_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer Mat_FindNonZero( - Mat src, - Mat idx, - ) { - return _Mat_FindNonZero( - src, - idx, - ); - } - - late final _Mat_FindNonZeroPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_FindNonZero'); - late final _Mat_FindNonZero = _Mat_FindNonZeroPtr.asFunction< - ffi.Pointer Function(Mat, Mat)>(); - - int Mat_Flags( - Mat m, - ) { - return _Mat_Flags( - m, - ); - } - - late final _Mat_FlagsPtr = - _lookup>('Mat_Flags'); - late final _Mat_Flags = - _Mat_FlagsPtr.asFunction(isLeaf: true); - - ffi.Pointer Mat_Flip( - Mat src, - Mat dst, - int flipCode, - ) { - return _Mat_Flip( - src, - dst, - flipCode, - ); - } - - late final _Mat_FlipPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('Mat_Flip'); - late final _Mat_Flip = - _Mat_FlipPtr.asFunction Function(Mat, Mat, int)>(); - - ffi.Pointer Mat_FromCMat( - Mat m, - ffi.Pointer rval, - ) { - return _Mat_FromCMat( - m, - rval, - ); - } - - late final _Mat_FromCMatPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_FromCMat'); - late final _Mat_FromCMat = _Mat_FromCMatPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); - - ffi.Pointer Mat_FromPtr( - Mat m, - int rows, - int cols, - int type, - int prows, - int pcols, - ffi.Pointer rval, - ) { - return _Mat_FromPtr( - m, - rows, - cols, - type, - prows, - pcols, - rval, - ); - } - - late final _Mat_FromPtrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_FromPtr'); - late final _Mat_FromPtr = _Mat_FromPtrPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, int, int, ffi.Pointer)>(); - - ffi.Pointer Mat_FromRange( - Mat m, - int rowStart, - int rowEnd, - int colStart, - int colEnd, - ffi.Pointer rval, - ) { - return _Mat_FromRange( - m, - rowStart, - rowEnd, - colStart, - colEnd, - rval, - ); - } - - late final _Mat_FromRangePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Int, ffi.Pointer)>>('Mat_FromRange'); - late final _Mat_FromRange = _Mat_FromRangePtr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, int, ffi.Pointer)>(); - - ffi.Pointer Mat_Gemm( - Mat src1, - Mat src2, - double alpha, - Mat src3, - double beta, - Mat dst, - int flags, - ) { - return _Mat_Gemm( - src1, - src2, - alpha, - src3, - beta, - dst, - flags, - ); - } - - late final _Mat_GemmPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, Mat, ffi.Double, - Mat, ffi.Int)>>('Mat_Gemm'); - late final _Mat_Gemm = _Mat_GemmPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, Mat, double, Mat, int)>(); - - ffi.Pointer Mat_GetDouble( - Mat m, - int row, - int col, - ffi.Pointer rval, - ) { - return _Mat_GetDouble( - m, - row, - col, - rval, - ); - } - - late final _Mat_GetDoublePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetDouble'); - late final _Mat_GetDouble = _Mat_GetDoublePtr.asFunction< - ffi.Pointer Function( - Mat, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetDouble3( - Mat m, - int x, - int y, - int z, - ffi.Pointer rval, - ) { - return _Mat_GetDouble3( - m, - x, - y, - z, - rval, - ); - } - - late final _Mat_GetDouble3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetDouble3'); - late final _Mat_GetDouble3 = _Mat_GetDouble3Ptr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetFloat( - Mat m, - int row, - int col, - ffi.Pointer rval, - ) { - return _Mat_GetFloat( - m, - row, - col, - rval, - ); - } - - late final _Mat_GetFloatPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_GetFloat'); - late final _Mat_GetFloat = _Mat_GetFloatPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetFloat3( - Mat m, - int x, - int y, - int z, - ffi.Pointer rval, - ) { - return _Mat_GetFloat3( - m, - x, - y, - z, - rval, - ); - } - - late final _Mat_GetFloat3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetFloat3'); - late final _Mat_GetFloat3 = _Mat_GetFloat3Ptr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetInt( - Mat m, - int row, - int col, - ffi.Pointer rval, - ) { - return _Mat_GetInt( - m, - row, - col, - rval, - ); - } - - late final _Mat_GetIntPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_GetInt'); - late final _Mat_GetInt = _Mat_GetIntPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetInt3( - Mat m, - int x, - int y, - int z, - ffi.Pointer rval, - ) { - return _Mat_GetInt3( - m, - x, - y, - z, - rval, - ); - } - - late final _Mat_GetInt3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetInt3'); - late final _Mat_GetInt3 = _Mat_GetInt3Ptr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetOptimalDFTSize( - int vecsize, - ffi.Pointer rval, - ) { - return _Mat_GetOptimalDFTSize( - vecsize, - rval, - ); - } - - late final _Mat_GetOptimalDFTSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Pointer)>>('Mat_GetOptimalDFTSize'); - late final _Mat_GetOptimalDFTSize = _Mat_GetOptimalDFTSizePtr.asFunction< - ffi.Pointer Function(int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetSChar( - Mat m, - int row, - int col, - ffi.Pointer rval, - ) { - return _Mat_GetSChar( - m, - row, - col, - rval, - ); - } - - late final _Mat_GetSCharPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_GetSChar'); - late final _Mat_GetSChar = _Mat_GetSCharPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetSChar3( - Mat m, - int x, - int y, - int z, - ffi.Pointer rval, - ) { - return _Mat_GetSChar3( - m, - x, - y, - z, - rval, - ); - } - - late final _Mat_GetSChar3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetSChar3'); - late final _Mat_GetSChar3 = _Mat_GetSChar3Ptr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetShort( - Mat m, - int row, - int col, - ffi.Pointer rval, - ) { - return _Mat_GetShort( - m, - row, - col, - rval, - ); - } - - late final _Mat_GetShortPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_GetShort'); - late final _Mat_GetShort = _Mat_GetShortPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetShort3( - Mat m, - int x, - int y, - int z, - ffi.Pointer rval, - ) { - return _Mat_GetShort3( - m, - x, - y, - z, - rval, - ); - } - - late final _Mat_GetShort3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetShort3'); - late final _Mat_GetShort3 = _Mat_GetShort3Ptr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetUChar( - Mat m, - int row, - int col, - ffi.Pointer rval, - ) { - return _Mat_GetUChar( - m, - row, - col, - rval, - ); - } - - late final _Mat_GetUCharPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_GetUChar'); - late final _Mat_GetUChar = _Mat_GetUCharPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetUChar3( - Mat m, - int x, - int y, - int z, - ffi.Pointer rval, - ) { - return _Mat_GetUChar3( - m, - x, - y, - z, - rval, - ); - } - - late final _Mat_GetUChar3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetUChar3'); - late final _Mat_GetUChar3 = _Mat_GetUChar3Ptr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetUShort( - Mat m, - int row, - int col, - ffi.Pointer rval, - ) { - return _Mat_GetUShort( - m, - row, - col, - rval, - ); - } - - late final _Mat_GetUShortPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetUShort'); - late final _Mat_GetUShort = _Mat_GetUShortPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetUShort3( - Mat m, - int x, - int y, - int z, - ffi.Pointer rval, - ) { - return _Mat_GetUShort3( - m, - x, - y, - z, - rval, - ); - } - - late final _Mat_GetUShort3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_GetUShort3'); - late final _Mat_GetUShort3 = _Mat_GetUShort3Ptr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, ffi.Pointer)>(isLeaf: true); - - ffi.Pointer Mat_GetVec2b( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec2b( - m, - row, - col, - ); - } - - late final _Mat_GetVec2bPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec2b'); - late final _Mat_GetVec2b = - _Mat_GetVec2bPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec2d( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec2d( - m, - row, - col, - ); - } - - late final _Mat_GetVec2dPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec2d'); - late final _Mat_GetVec2d = - _Mat_GetVec2dPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec2f( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec2f( - m, - row, - col, - ); - } - - late final _Mat_GetVec2fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec2f'); - late final _Mat_GetVec2f = - _Mat_GetVec2fPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec2i( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec2i( - m, - row, - col, - ); - } - - late final _Mat_GetVec2iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec2i'); - late final _Mat_GetVec2i = - _Mat_GetVec2iPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec2s( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec2s( - m, - row, - col, - ); - } - - late final _Mat_GetVec2sPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec2s'); - late final _Mat_GetVec2s = - _Mat_GetVec2sPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec2w( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec2w( - m, - row, - col, - ); - } - - late final _Mat_GetVec2wPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec2w'); - late final _Mat_GetVec2w = - _Mat_GetVec2wPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec3b( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec3b( - m, - row, - col, - ); - } - - late final _Mat_GetVec3bPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec3b'); - late final _Mat_GetVec3b = - _Mat_GetVec3bPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec3d( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec3d( - m, - row, - col, - ); - } - - late final _Mat_GetVec3dPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec3d'); - late final _Mat_GetVec3d = - _Mat_GetVec3dPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec3f( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec3f( - m, - row, - col, - ); - } - - late final _Mat_GetVec3fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec3f'); - late final _Mat_GetVec3f = - _Mat_GetVec3fPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec3i( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec3i( - m, - row, - col, - ); - } - - late final _Mat_GetVec3iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec3i'); - late final _Mat_GetVec3i = - _Mat_GetVec3iPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec3s( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec3s( - m, - row, - col, - ); - } - - late final _Mat_GetVec3sPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec3s'); - late final _Mat_GetVec3s = - _Mat_GetVec3sPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec3w( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec3w( - m, - row, - col, - ); - } - - late final _Mat_GetVec3wPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec3w'); - late final _Mat_GetVec3w = - _Mat_GetVec3wPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec4b( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec4b( - m, - row, - col, - ); - } - - late final _Mat_GetVec4bPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec4b'); - late final _Mat_GetVec4b = - _Mat_GetVec4bPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec4d( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec4d( - m, - row, - col, - ); - } - - late final _Mat_GetVec4dPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec4d'); - late final _Mat_GetVec4d = - _Mat_GetVec4dPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec4f( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec4f( - m, - row, - col, - ); - } - - late final _Mat_GetVec4fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec4f'); - late final _Mat_GetVec4f = - _Mat_GetVec4fPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec4i( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec4i( - m, - row, - col, - ); - } - - late final _Mat_GetVec4iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec4i'); - late final _Mat_GetVec4i = - _Mat_GetVec4iPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec4s( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec4s( - m, - row, - col, - ); - } - - late final _Mat_GetVec4sPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec4s'); - late final _Mat_GetVec4s = - _Mat_GetVec4sPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec4w( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec4w( - m, - row, - col, - ); - } - - late final _Mat_GetVec4wPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec4w'); - late final _Mat_GetVec4w = - _Mat_GetVec4wPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec6d( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec6d( - m, - row, - col, - ); - } - - late final _Mat_GetVec6dPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec6d'); - late final _Mat_GetVec6d = - _Mat_GetVec6dPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec6f( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec6f( - m, - row, - col, - ); - } - - late final _Mat_GetVec6fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec6f'); - late final _Mat_GetVec6f = - _Mat_GetVec6fPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec6i( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec6i( - m, - row, - col, - ); - } - - late final _Mat_GetVec6iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec6i'); - late final _Mat_GetVec6i = - _Mat_GetVec6iPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_GetVec8i( - Mat m, - int row, - int col, - ) { - return _Mat_GetVec8i( - m, - row, - col, - ); - } - - late final _Mat_GetVec8iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int)>>('Mat_GetVec8i'); - late final _Mat_GetVec8i = - _Mat_GetVec8iPtr.asFunction Function(Mat, int, int)>( - isLeaf: true); - - ffi.Pointer Mat_Hconcat( - Mat src1, - Mat src2, - Mat dst, - ) { - return _Mat_Hconcat( - src1, - src2, - dst, - ); - } - - late final _Mat_HconcatPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_Hconcat'); - late final _Mat_Hconcat = _Mat_HconcatPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_Idct( - Mat src, - Mat dst, - int flags, - ) { - return _Mat_Idct( - src, - dst, - flags, - ); - } - - late final _Mat_IdctPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('Mat_Idct'); - late final _Mat_Idct = - _Mat_IdctPtr.asFunction Function(Mat, Mat, int)>(); - - ffi.Pointer Mat_Idft( - Mat src, - Mat dst, - int flags, - int nonzeroRows, - ) { - return _Mat_Idft( - src, - dst, - flags, - nonzeroRows, - ); - } - - late final _Mat_IdftPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Int)>>('Mat_Idft'); - late final _Mat_Idft = _Mat_IdftPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, int)>(); - - ffi.Pointer Mat_InRange( - Mat src, - Mat lowerb, - Mat upperb, - Mat dst, - ) { - return _Mat_InRange( - src, - lowerb, - upperb, - dst, - ); - } - - late final _Mat_InRangePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat)>>('Mat_InRange'); - late final _Mat_InRange = _Mat_InRangePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat)>(); - - ffi.Pointer Mat_InRangeWithScalar( - Mat src, - Scalar lowerb, - Scalar upperb, - Mat dst, - ) { - return _Mat_InRangeWithScalar( - src, - lowerb, - upperb, - dst, - ); - } - - late final _Mat_InRangeWithScalarPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Scalar, Scalar, Mat)>>('Mat_InRangeWithScalar'); - late final _Mat_InRangeWithScalar = _Mat_InRangeWithScalarPtr.asFunction< - ffi.Pointer Function(Mat, Scalar, Scalar, Mat)>(); - - ffi.Pointer Mat_InsertChannel( - Mat src, - Mat dst, - int coi, - ) { - return _Mat_InsertChannel( - src, - dst, - coi, - ); - } - - late final _Mat_InsertChannelPtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, ffi.Int)>>( - 'Mat_InsertChannel'); - late final _Mat_InsertChannel = _Mat_InsertChannelPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int)>(); - - ffi.Pointer Mat_Invert( - Mat src, - Mat dst, - int flags, - ffi.Pointer rval, - ) { - return _Mat_Invert( - src, - dst, - flags, + rowStart, + rowEnd, + colStart, + colEnd, rval, + callback, ); } - late final _Mat_InvertPtr = _lookup< + late final _cv_Mat_create_12Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Pointer)>>('Mat_Invert'); - late final _Mat_Invert = _Mat_InvertPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, ffi.Pointer)>(); - - bool Mat_IsContinuous( - Mat m, - ) { - return _Mat_IsContinuous( - m, - ); - } - - late final _Mat_IsContinuousPtr = - _lookup>('Mat_IsContinuous'); - late final _Mat_IsContinuous = - _Mat_IsContinuousPtr.asFunction(isLeaf: true); - - bool Mat_IsSubmatrix( - Mat m, - ) { - return _Mat_IsSubmatrix( - m, - ); - } - - late final _Mat_IsSubmatrixPtr = - _lookup>('Mat_IsSubmatrix'); - late final _Mat_IsSubmatrix = - _Mat_IsSubmatrixPtr.asFunction(isLeaf: true); + Mat, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_create_12'); + late final _cv_Mat_create_12 = _cv_Mat_create_12Ptr.asFunction< + ffi.Pointer Function( + Mat, int, int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_LocateROI( - Mat m, - ffi.Pointer wholeSize, - ffi.Pointer ofs, + /// @brief Create Mat with specified sizes and type + /// + /// @param sizes array of integers, each describing a dimension + /// @param type type of the created matrix + /// @param rval Mat* + /// @return CvStatus + ffi.Pointer cv_Mat_create_2( + VecI32 sizes, + int type, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_LocateROI( - m, - wholeSize, - ofs, + return _cv_Mat_create_2( + sizes, + type, + rval, + callback, ); } - late final _Mat_LocateROIPtr = _lookup< + late final _cv_Mat_create_2Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, - ffi.Pointer)>>('Mat_LocateROI'); - late final _Mat_LocateROI = _Mat_LocateROIPtr.asFunction< + ffi.Pointer Function(VecI32, ffi.Int, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_create_2'); + late final _cv_Mat_create_2 = _cv_Mat_create_2Ptr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, ffi.Pointer)>(); + VecI32, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Log( - Mat src, - Mat dst, + /// @brief Create Mat with specified sizes and type + /// + /// @param sizes array of integers, each describing a dimension + /// @param type type of the created matrix + /// @param ar array of values to initialize the matrix with + /// @param rval Mat* + /// @return CvStatus + ffi.Pointer cv_Mat_create_3( + VecI32 sizes, + int type, + Scalar ar, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Log( - src, - dst, + return _cv_Mat_create_3( + sizes, + type, + ar, + rval, + callback, ); } - late final _Mat_LogPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_Log'); - late final _Mat_Log = - _Mat_LogPtr.asFunction Function(Mat, Mat)>(); + late final _cv_Mat_create_3Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VecI32, ffi.Int, Scalar, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_create_3'); + late final _cv_Mat_create_3 = _cv_Mat_create_3Ptr.asFunction< + ffi.Pointer Function( + VecI32, int, Scalar, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Magnitude( - Mat x, - Mat y, - Mat magnitude, + /// @brief Create Mat with specified sizes, type and data buffer + /// + /// @param sizes array of integers, each describing a dimension + /// @param type type of the created matrix + /// @param buf buffer to initialize the matrix with, will be copied + /// @param rval Mat* + /// @return CvStatus + ffi.Pointer cv_Mat_create_4( + VecI32 sizes, + int type, + ffi.Pointer buf, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Magnitude( - x, - y, - magnitude, + return _cv_Mat_create_4( + sizes, + type, + buf, + rval, + callback, ); } - late final _Mat_MagnitudePtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_Magnitude'); - late final _Mat_Magnitude = _Mat_MagnitudePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); + late final _cv_Mat_create_4Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VecI32, ffi.Int, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_create_4'); + late final _cv_Mat_create_4 = _cv_Mat_create_4Ptr.asFunction< + ffi.Pointer Function(VecI32, int, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Max( - Mat src1, - Mat src2, - Mat dst, + /// @brief Create Mat with Scalar values + /// + /// @param ar array of values to initialize the matrix with + /// @param rows number of rows + /// @param cols number of columns + /// @param type type of the created matrix + /// @param rval Mat* + /// @return CvStatus + ffi.Pointer cv_Mat_create_5( + Scalar ar, + int rows, + int cols, + int type, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Max( - src1, - src2, - dst, + return _cv_Mat_create_5( + ar, + rows, + cols, + type, + rval, + callback, ); } - late final _Mat_MaxPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_Max'); - late final _Mat_Max = - _Mat_MaxPtr.asFunction Function(Mat, Mat, Mat)>(); + late final _cv_Mat_create_5Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Scalar, ffi.Int, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_create_5'); + late final _cv_Mat_create_5 = _cv_Mat_create_5Ptr.asFunction< + ffi.Pointer Function( + Scalar, int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Mean( - Mat m, - ffi.Pointer rval, + /// @brief Create Mat with rows, cols, type and data buffer + /// + /// @param sizes array of integers, each describing a dimension + /// @param type type of the created matrix + /// @param buf buffer to initialize the matrix with, will be copied + /// @param rval Mat* + /// @return CvStatus + ffi.Pointer cv_Mat_create_6( + int rows, + int cols, + int type, + ffi.Pointer buf, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Mean( - m, + return _cv_Mat_create_6( + rows, + cols, + type, + buf, rval, + callback, ); } - late final _Mat_MeanPtr = _lookup< + late final _cv_Mat_create_6Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_Mean'); - late final _Mat_Mean = _Mat_MeanPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_create_6'); + late final _cv_Mat_create_6 = _cv_Mat_create_6Ptr.asFunction< + ffi.Pointer Function(int, int, int, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_MeanStdDev( - Mat src, - ffi.Pointer dstMean, - ffi.Pointer dstStdDev, + /// @brief Create Mat with specified vector of points + /// + /// @param vec array of points + /// @param rval Mat* + /// @return CvStatus + ffi.Pointer cv_Mat_create_7( + VecPoint vec, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_MeanStdDev( - src, - dstMean, - dstStdDev, + return _cv_Mat_create_7( + vec, + rval, + callback, ); } - late final _Mat_MeanStdDevPtr = _lookup< + late final _cv_Mat_create_7Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, - ffi.Pointer)>>('Mat_MeanStdDev'); - late final _Mat_MeanStdDev = _Mat_MeanStdDevPtr.asFunction< + ffi.Pointer Function(VecPoint, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_create_7'); + late final _cv_Mat_create_7 = _cv_Mat_create_7Ptr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, ffi.Pointer)>(); + VecPoint, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_MeanStdDevWithMask( - Mat src, - ffi.Pointer dstMean, - ffi.Pointer dstStdDev, - Mat mask, + ffi.Pointer cv_Mat_create_8( + VecPoint2f vec, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_MeanStdDevWithMask( - src, - dstMean, - dstStdDev, - mask, + return _cv_Mat_create_8( + vec, + rval, + callback, ); } - late final _Mat_MeanStdDevWithMaskPtr = _lookup< + late final _cv_Mat_create_8Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, - ffi.Pointer, Mat)>>('Mat_MeanStdDevWithMask'); - late final _Mat_MeanStdDevWithMask = _Mat_MeanStdDevWithMaskPtr.asFunction< + ffi.Pointer Function(VecPoint2f, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_create_8'); + late final _cv_Mat_create_8 = _cv_Mat_create_8Ptr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer, ffi.Pointer, Mat)>(); + VecPoint2f, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_MeanWithMask( - Mat m, - Mat mask, - ffi.Pointer rval, + ffi.Pointer cv_Mat_create_9( + VecPoint3f vec, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_MeanWithMask( - m, - mask, + return _cv_Mat_create_9( + vec, rval, + callback, ); } - late final _Mat_MeanWithMaskPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Pointer)>>('Mat_MeanWithMask'); - late final _Mat_MeanWithMask = _Mat_MeanWithMaskPtr.asFunction< - ffi.Pointer Function(Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer Mat_Merge( - VecMat mats, - ffi.Pointer dst, - ) { - return _Mat_Merge( - mats, - dst, - ); - } - - late final _Mat_MergePtr = _lookup< + late final _cv_Mat_create_9Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - VecMat, ffi.Pointer)>>('Mat_Merge'); - late final _Mat_Merge = _Mat_MergePtr.asFunction< - ffi.Pointer Function(VecMat, ffi.Pointer)>(); + ffi.Pointer Function(VecPoint3f, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_create_9'); + late final _cv_Mat_create_9 = _cv_Mat_create_9Ptr.asFunction< + ffi.Pointer Function( + VecPoint3f, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Min( - Mat src1, - Mat src2, - Mat dst, + ffi.Pointer cv_Mat_data( + Mat self, ) { - return _Mat_Min( - src1, - src2, - dst, + return _cv_Mat_data( + self, ); } - late final _Mat_MinPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_Min'); - late final _Mat_Min = - _Mat_MinPtr.asFunction Function(Mat, Mat, Mat)>(); + late final _cv_Mat_dataPtr = + _lookup Function(Mat)>>( + 'cv_Mat_data'); + late final _cv_Mat_data = _cv_Mat_dataPtr + .asFunction Function(Mat)>(isLeaf: true); - ffi.Pointer Mat_MinMaxIdx( - Mat m, - ffi.Pointer minVal, - ffi.Pointer maxVal, - ffi.Pointer minIdx, - ffi.Pointer maxIdx, + int cv_Mat_dims( + Mat self, ) { - return _Mat_MinMaxIdx( - m, - minVal, - maxVal, - minIdx, - maxIdx, + return _cv_Mat_dims( + self, ); } - late final _Mat_MinMaxIdxPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('Mat_MinMaxIdx'); - late final _Mat_MinMaxIdx = _Mat_MinMaxIdxPtr.asFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>(); + late final _cv_Mat_dimsPtr = + _lookup>('cv_Mat_dims'); + late final _cv_Mat_dims = + _cv_Mat_dimsPtr.asFunction(isLeaf: true); - ffi.Pointer Mat_MinMaxLoc( - Mat m, - ffi.Pointer minVal, - ffi.Pointer maxVal, - ffi.Pointer minLoc, - ffi.Pointer maxLoc, + int cv_Mat_elemSize( + Mat self, ) { - return _Mat_MinMaxLoc( - m, - minVal, - maxVal, - minLoc, - maxLoc, + return _cv_Mat_elemSize( + self, ); } - late final _Mat_MinMaxLocPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('Mat_MinMaxLoc'); - late final _Mat_MinMaxLoc = _Mat_MinMaxLocPtr.asFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>(); + late final _cv_Mat_elemSizePtr = + _lookup>('cv_Mat_elemSize'); + late final _cv_Mat_elemSize = + _cv_Mat_elemSizePtr.asFunction(isLeaf: true); - ffi.Pointer Mat_MixChannels( - VecMat src, - VecMat dst, - VecI32 fromTo, + int cv_Mat_elemSize1( + Mat self, ) { - return _Mat_MixChannels( - src, - dst, - fromTo, + return _cv_Mat_elemSize1( + self, ); } - late final _Mat_MixChannelsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecMat, VecMat, VecI32)>>('Mat_MixChannels'); - late final _Mat_MixChannels = _Mat_MixChannelsPtr.asFunction< - ffi.Pointer Function(VecMat, VecMat, VecI32)>(); + late final _cv_Mat_elemSize1Ptr = + _lookup>('cv_Mat_elemSize1'); + late final _cv_Mat_elemSize1 = + _cv_Mat_elemSize1Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_Mul( - Mat m, - Mat val, - ffi.Pointer dst, - double scale, + bool cv_Mat_empty( + Mat self, ) { - return _Mat_Mul( - m, - val, - dst, - scale, + return _cv_Mat_empty( + self, ); } - late final _Mat_MulPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Pointer, ffi.Double)>>('Mat_Mul'); - late final _Mat_Mul = _Mat_MulPtr.asFunction< - ffi.Pointer Function(Mat, Mat, ffi.Pointer, double)>(); + late final _cv_Mat_emptyPtr = + _lookup>('cv_Mat_empty'); + late final _cv_Mat_empty = _cv_Mat_emptyPtr.asFunction(); - ffi.Pointer Mat_MulSpectrums( - Mat a, - Mat b, - Mat c, - int flags, - bool conjB, + ffi.Pointer cv_Mat_eye( + int rows, + int cols, + int type, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_MulSpectrums( - a, - b, - c, - flags, - conjB, + return _cv_Mat_eye( + rows, + cols, + type, + rval, + callback, ); } - late final _Mat_MulSpectrumsPtr = _lookup< + late final _cv_Mat_eyePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Int, ffi.Bool)>>('Mat_MulSpectrums'); - late final _Mat_MulSpectrums = _Mat_MulSpectrumsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int, bool)>(); + ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_eye'); + late final _cv_Mat_eye = _cv_Mat_eyePtr.asFunction< + ffi.Pointer Function( + int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Multiply( - Mat src1, - Mat src2, - Mat dst, - double scale, - int dtype, + int cv_Mat_flags( + Mat self, ) { - return _Mat_Multiply( - src1, - src2, - dst, - scale, - dtype, + return _cv_Mat_flags( + self, ); } - late final _Mat_MultiplyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Double, ffi.Int)>>('Mat_Multiply'); - late final _Mat_Multiply = _Mat_MultiplyPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, double, int)>(); + late final _cv_Mat_flagsPtr = + _lookup>('cv_Mat_flags'); + late final _cv_Mat_flags = + _cv_Mat_flagsPtr.asFunction(isLeaf: true); - ffi.Pointer Mat_MultiplyF64( - Mat m, - double val, + ffi.Pointer cv_Mat_get_Vec2b( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplyF64( - m, - val, + return _cv_Mat_get_Vec2b( + self, + i0, + i1, ); } - late final _Mat_MultiplyF64Ptr = _lookup< - ffi.NativeFunction Function(Mat, double_t)>>( - 'Mat_MultiplyF64'); - late final _Mat_MultiplyF64 = _Mat_MultiplyF64Ptr.asFunction< - ffi.Pointer Function(Mat, double)>(); + late final _cv_Mat_get_Vec2bPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec2b'); + late final _cv_Mat_get_Vec2b = _cv_Mat_get_Vec2bPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_MultiplyFloat( - Mat m, - double val, + ffi.Pointer cv_Mat_get_Vec2d( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplyFloat( - m, - val, + return _cv_Mat_get_Vec2d( + self, + i0, + i1, ); } - late final _Mat_MultiplyFloatPtr = - _lookup Function(Mat, float_t)>>( - 'Mat_MultiplyFloat'); - late final _Mat_MultiplyFloat = _Mat_MultiplyFloatPtr.asFunction< - ffi.Pointer Function(Mat, double)>(); + late final _cv_Mat_get_Vec2dPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec2d'); + late final _cv_Mat_get_Vec2d = _cv_Mat_get_Vec2dPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_MultiplyI16( - Mat m, - int val, + ffi.Pointer cv_Mat_get_Vec2f( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplyI16( - m, - val, + return _cv_Mat_get_Vec2f( + self, + i0, + i1, ); } - late final _Mat_MultiplyI16Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int16)>>( - 'Mat_MultiplyI16'); - late final _Mat_MultiplyI16 = _Mat_MultiplyI16Ptr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_get_Vec2fPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec2f'); + late final _cv_Mat_get_Vec2f = _cv_Mat_get_Vec2fPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_MultiplyI32( - Mat m, - int val, + ffi.Pointer cv_Mat_get_Vec2i( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplyI32( - m, - val, + return _cv_Mat_get_Vec2i( + self, + i0, + i1, ); } - late final _Mat_MultiplyI32Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int32)>>( - 'Mat_MultiplyI32'); - late final _Mat_MultiplyI32 = _Mat_MultiplyI32Ptr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_get_Vec2iPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec2i'); + late final _cv_Mat_get_Vec2i = _cv_Mat_get_Vec2iPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_MultiplyMat( - Mat m, - Mat val, + ffi.Pointer cv_Mat_get_Vec2s( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplyMat( - m, - val, + return _cv_Mat_get_Vec2s( + self, + i0, + i1, ); } - late final _Mat_MultiplyMatPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_MultiplyMat'); - late final _Mat_MultiplyMat = _Mat_MultiplyMatPtr.asFunction< - ffi.Pointer Function(Mat, Mat)>(); + late final _cv_Mat_get_Vec2sPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec2s'); + late final _cv_Mat_get_Vec2s = _cv_Mat_get_Vec2sPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_MultiplyMatrix( - Mat x, - Mat y, - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec2w( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplyMatrix( - x, - y, - rval, + return _cv_Mat_get_Vec2w( + self, + i0, + i1, ); } - late final _Mat_MultiplyMatrixPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Pointer)>>('Mat_MultiplyMatrix'); - late final _Mat_MultiplyMatrix = _Mat_MultiplyMatrixPtr.asFunction< - ffi.Pointer Function(Mat, Mat, ffi.Pointer)>(); + late final _cv_Mat_get_Vec2wPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec2w'); + late final _cv_Mat_get_Vec2w = _cv_Mat_get_Vec2wPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_MultiplySChar( - Mat m, - int val, + ffi.Pointer cv_Mat_get_Vec3b( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplySChar( - m, - val, + return _cv_Mat_get_Vec3b( + self, + i0, + i1, ); } - late final _Mat_MultiplySCharPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int8)>>( - 'Mat_MultiplySChar'); - late final _Mat_MultiplySChar = _Mat_MultiplySCharPtr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_get_Vec3bPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec3b'); + late final _cv_Mat_get_Vec3b = _cv_Mat_get_Vec3bPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_MultiplyU16( - Mat m, - int val, + ffi.Pointer cv_Mat_get_Vec3d( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplyU16( - m, - val, + return _cv_Mat_get_Vec3d( + self, + i0, + i1, ); } - late final _Mat_MultiplyU16Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Uint16)>>( - 'Mat_MultiplyU16'); - late final _Mat_MultiplyU16 = _Mat_MultiplyU16Ptr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_get_Vec3dPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec3d'); + late final _cv_Mat_get_Vec3d = _cv_Mat_get_Vec3dPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_MultiplyUChar( - Mat m, - int val, + ffi.Pointer cv_Mat_get_Vec3f( + Mat self, + int i0, + int i1, ) { - return _Mat_MultiplyUChar( - m, - val, + return _cv_Mat_get_Vec3f( + self, + i0, + i1, ); } - late final _Mat_MultiplyUCharPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Uint8)>>( - 'Mat_MultiplyUChar'); - late final _Mat_MultiplyUChar = _Mat_MultiplyUCharPtr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_get_Vec3fPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec3f'); + late final _cv_Mat_get_Vec3f = _cv_Mat_get_Vec3fPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - /// @brief Create empty Mat - /// - /// ALL return values with a type of `Pointer of Struct`, - /// e.g., Mat, the internal pointer (Mat.ptr) MUST be NULL - /// otherwise the memory of mat.ptr pointed to will NOT be freed correctly. - /// Mat* mat = (Mat*)malloc(sizeof(Mat)); - /// CvStatus *status = Mat_New(mat); - /// Mat_Close(mat); - /// - /// @param rval Mat* - /// @return CvStatus - ffi.Pointer Mat_New( - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec3i( + Mat self, + int i0, + int i1, ) { - return _Mat_New( - rval, + return _cv_Mat_get_Vec3i( + self, + i0, + i1, ); } - late final _Mat_NewPtr = _lookup< - ffi.NativeFunction Function(ffi.Pointer)>>( - 'Mat_New'); - late final _Mat_New = _Mat_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + late final _cv_Mat_get_Vec3iPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec3i'); + late final _cv_Mat_get_Vec3i = _cv_Mat_get_Vec3iPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromBytes( - int rows, - int cols, - int type, - ffi.Pointer buf, - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec3s( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromBytes( - rows, - cols, - type, - buf, - rval, + return _cv_Mat_get_Vec3s( + self, + i0, + i1, ); } - late final _Mat_NewFromBytesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer, ffi.Pointer)>>('Mat_NewFromBytes'); - late final _Mat_NewFromBytes = _Mat_NewFromBytesPtr.asFunction< - ffi.Pointer Function( - int, int, int, ffi.Pointer, ffi.Pointer)>(); + late final _cv_Mat_get_Vec3sPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec3s'); + late final _cv_Mat_get_Vec3s = _cv_Mat_get_Vec3sPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromBytes_Async( - int rows, - int cols, - int type, - ffi.Pointer buf, - int step, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_get_Vec3w( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromBytes_Async( - rows, - cols, - type, - buf, - step, - callback, + return _cv_Mat_get_Vec3w( + self, + i0, + i1, ); } - late final _Mat_NewFromBytes_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Pointer, - ffi.Int, - imp1.CvCallback_1)>>('Mat_NewFromBytes_Async'); - late final _Mat_NewFromBytes_Async = _Mat_NewFromBytes_AsyncPtr.asFunction< - ffi.Pointer Function( - int, int, int, ffi.Pointer, int, imp1.CvCallback_1)>(); + late final _cv_Mat_get_Vec3wPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec3w'); + late final _cv_Mat_get_Vec3w = _cv_Mat_get_Vec3wPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromScalar( - Scalar ar, - int rows, - int cols, - int type, - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec4b( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromScalar( - ar, - rows, - cols, - type, - rval, + return _cv_Mat_get_Vec4b( + self, + i0, + i1, ); } - late final _Mat_NewFromScalarPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Scalar, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('Mat_NewFromScalar'); - late final _Mat_NewFromScalar = _Mat_NewFromScalarPtr.asFunction< - ffi.Pointer Function( - Scalar, int, int, int, ffi.Pointer)>(); + late final _cv_Mat_get_Vec4bPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec4b'); + late final _cv_Mat_get_Vec4b = _cv_Mat_get_Vec4bPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromScalar_Async( - Scalar s, - int rows, - int cols, - int type, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_get_Vec4d( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromScalar_Async( - s, - rows, - cols, - type, - callback, + return _cv_Mat_get_Vec4d( + self, + i0, + i1, ); } - late final _Mat_NewFromScalar_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Scalar, ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('Mat_NewFromScalar_Async'); - late final _Mat_NewFromScalar_Async = _Mat_NewFromScalar_AsyncPtr.asFunction< - ffi.Pointer Function( - Scalar, int, int, int, imp1.CvCallback_1)>(); + late final _cv_Mat_get_Vec4dPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec4d'); + late final _cv_Mat_get_Vec4d = _cv_Mat_get_Vec4dPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromVecPoint( - VecPoint vec, - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec4f( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromVecPoint( - vec, - rval, + return _cv_Mat_get_Vec4f( + self, + i0, + i1, ); } - late final _Mat_NewFromVecPointPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, ffi.Pointer)>>('Mat_NewFromVecPoint'); - late final _Mat_NewFromVecPoint = _Mat_NewFromVecPointPtr.asFunction< - ffi.Pointer Function(VecPoint, ffi.Pointer)>(); + late final _cv_Mat_get_Vec4fPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec4f'); + late final _cv_Mat_get_Vec4f = _cv_Mat_get_Vec4fPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromVecPoint2f( - VecPoint2f vec, - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec4i( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromVecPoint2f( - vec, - rval, + return _cv_Mat_get_Vec4i( + self, + i0, + i1, ); } - late final _Mat_NewFromVecPoint2fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint2f, ffi.Pointer)>>('Mat_NewFromVecPoint2f'); - late final _Mat_NewFromVecPoint2f = _Mat_NewFromVecPoint2fPtr.asFunction< - ffi.Pointer Function(VecPoint2f, ffi.Pointer)>(); + late final _cv_Mat_get_Vec4iPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec4i'); + late final _cv_Mat_get_Vec4i = _cv_Mat_get_Vec4iPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromVecPoint2f_Async( - VecPoint2f vec, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_get_Vec4s( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromVecPoint2f_Async( - vec, - callback, + return _cv_Mat_get_Vec4s( + self, + i0, + i1, ); } - late final _Mat_NewFromVecPoint2f_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint2f, imp1.CvCallback_1)>>('Mat_NewFromVecPoint2f_Async'); - late final _Mat_NewFromVecPoint2f_Async = - _Mat_NewFromVecPoint2f_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint2f, imp1.CvCallback_1)>(); + late final _cv_Mat_get_Vec4sPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec4s'); + late final _cv_Mat_get_Vec4s = _cv_Mat_get_Vec4sPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromVecPoint3f( - VecPoint3f vec, - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec4w( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromVecPoint3f( - vec, - rval, + return _cv_Mat_get_Vec4w( + self, + i0, + i1, ); } - late final _Mat_NewFromVecPoint3fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint3f, ffi.Pointer)>>('Mat_NewFromVecPoint3f'); - late final _Mat_NewFromVecPoint3f = _Mat_NewFromVecPoint3fPtr.asFunction< - ffi.Pointer Function(VecPoint3f, ffi.Pointer)>(); + late final _cv_Mat_get_Vec4wPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec4w'); + late final _cv_Mat_get_Vec4w = _cv_Mat_get_Vec4wPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromVecPoint3f_Async( - VecPoint3f vec, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_get_Vec6d( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromVecPoint3f_Async( - vec, - callback, + return _cv_Mat_get_Vec6d( + self, + i0, + i1, ); } - late final _Mat_NewFromVecPoint3f_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint3f, imp1.CvCallback_1)>>('Mat_NewFromVecPoint3f_Async'); - late final _Mat_NewFromVecPoint3f_Async = - _Mat_NewFromVecPoint3f_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint3f, imp1.CvCallback_1)>(); + late final _cv_Mat_get_Vec6dPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec6d'); + late final _cv_Mat_get_Vec6d = _cv_Mat_get_Vec6dPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromVecPoint3i( - VecPoint3i vec, - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec6f( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromVecPoint3i( - vec, - rval, + return _cv_Mat_get_Vec6f( + self, + i0, + i1, ); } - late final _Mat_NewFromVecPoint3iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint3i, ffi.Pointer)>>('Mat_NewFromVecPoint3i'); - late final _Mat_NewFromVecPoint3i = _Mat_NewFromVecPoint3iPtr.asFunction< - ffi.Pointer Function(VecPoint3i, ffi.Pointer)>(); + late final _cv_Mat_get_Vec6fPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec6f'); + late final _cv_Mat_get_Vec6f = _cv_Mat_get_Vec6fPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewFromVecPoint_Async( - VecPoint vec, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_get_Vec6i( + Mat self, + int i0, + int i1, ) { - return _Mat_NewFromVecPoint_Async( - vec, - callback, + return _cv_Mat_get_Vec6i( + self, + i0, + i1, ); } - late final _Mat_NewFromVecPoint_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, imp1.CvCallback_1)>>('Mat_NewFromVecPoint_Async'); - late final _Mat_NewFromVecPoint_Async = - _Mat_NewFromVecPoint_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint, imp1.CvCallback_1)>(); + late final _cv_Mat_get_Vec6iPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec6i'); + late final _cv_Mat_get_Vec6i = _cv_Mat_get_Vec6iPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewWithSize( - int rows, - int cols, - int type, - ffi.Pointer rval, + ffi.Pointer cv_Mat_get_Vec8i( + Mat self, + int i0, + int i1, ) { - return _Mat_NewWithSize( - rows, - cols, - type, - rval, + return _cv_Mat_get_Vec8i( + self, + i0, + i1, ); } - late final _Mat_NewWithSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_NewWithSize'); - late final _Mat_NewWithSize = _Mat_NewWithSizePtr.asFunction< - ffi.Pointer Function(int, int, int, ffi.Pointer)>(); + late final _cv_Mat_get_Vec8iPtr = _lookup< + ffi + .NativeFunction Function(Mat, ffi.Int, ffi.Int)>>( + 'cv_Mat_get_Vec8i'); + late final _cv_Mat_get_Vec8i = _cv_Mat_get_Vec8iPtr + .asFunction Function(Mat, int, int)>(isLeaf: true); - ffi.Pointer Mat_NewWithSize_Async( - int rows, - int cols, - int type, - imp1.CvCallback_1 callback, + double cv_Mat_get_f32_1( + Mat self, + int i0, ) { - return _Mat_NewWithSize_Async( - rows, - cols, - type, - callback, + return _cv_Mat_get_f32_1( + self, + i0, ); } - late final _Mat_NewWithSize_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('Mat_NewWithSize_Async'); - late final _Mat_NewWithSize_Async = _Mat_NewWithSize_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, int, imp1.CvCallback_1)>(); + late final _cv_Mat_get_f32_1Ptr = + _lookup>( + 'cv_Mat_get_f32_1'); + late final _cv_Mat_get_f32_1 = + _cv_Mat_get_f32_1Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_NewWithSizes( - VecI32 sizes, - int type, - ffi.Pointer rval, + double cv_Mat_get_f32_2( + Mat self, + int i0, + int i1, ) { - return _Mat_NewWithSizes( - sizes, - type, - rval, + return _cv_Mat_get_f32_2( + self, + i0, + i1, + ); + } + + late final _cv_Mat_get_f32_2Ptr = + _lookup>( + 'cv_Mat_get_f32_2'); + late final _cv_Mat_get_f32_2 = _cv_Mat_get_f32_2Ptr + .asFunction(isLeaf: true); + + double cv_Mat_get_f32_3( + Mat self, + int i0, + int i1, + int i2, + ) { + return _cv_Mat_get_f32_3( + self, + i0, + i1, + i2, ); } - late final _Mat_NewWithSizesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecI32, ffi.Int, ffi.Pointer)>>('Mat_NewWithSizes'); - late final _Mat_NewWithSizes = _Mat_NewWithSizesPtr.asFunction< - ffi.Pointer Function(VecI32, int, ffi.Pointer)>(); + late final _cv_Mat_get_f32_3Ptr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_get_f32_3'); + late final _cv_Mat_get_f32_3 = _cv_Mat_get_f32_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_NewWithSizesFromBytes( - VecI32 sizes, - int type, - ffi.Pointer buf, - ffi.Pointer rval, + double cv_Mat_get_f64_1( + Mat self, + int i0, ) { - return _Mat_NewWithSizesFromBytes( - sizes, - type, - buf, - rval, + return _cv_Mat_get_f64_1( + self, + i0, ); } - late final _Mat_NewWithSizesFromBytesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecI32, ffi.Int, ffi.Pointer, - ffi.Pointer)>>('Mat_NewWithSizesFromBytes'); - late final _Mat_NewWithSizesFromBytes = - _Mat_NewWithSizesFromBytesPtr.asFunction< - ffi.Pointer Function( - VecI32, int, ffi.Pointer, ffi.Pointer)>(); + late final _cv_Mat_get_f64_1Ptr = + _lookup>( + 'cv_Mat_get_f64_1'); + late final _cv_Mat_get_f64_1 = + _cv_Mat_get_f64_1Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_NewWithSizesFromBytes_Async( - VecI32 sizes, - int type, - VecChar buf, - imp1.CvCallback_1 callback, + double cv_Mat_get_f64_2( + Mat self, + int i0, + int i1, ) { - return _Mat_NewWithSizesFromBytes_Async( - sizes, - type, - buf, - callback, + return _cv_Mat_get_f64_2( + self, + i0, + i1, ); } - late final _Mat_NewWithSizesFromBytes_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecI32, ffi.Int, VecChar, - imp1.CvCallback_1)>>('Mat_NewWithSizesFromBytes_Async'); - late final _Mat_NewWithSizesFromBytes_Async = - _Mat_NewWithSizesFromBytes_AsyncPtr.asFunction< - ffi.Pointer Function( - VecI32, int, VecChar, imp1.CvCallback_1)>(); + late final _cv_Mat_get_f64_2Ptr = + _lookup>( + 'cv_Mat_get_f64_2'); + late final _cv_Mat_get_f64_2 = _cv_Mat_get_f64_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_NewWithSizesFromScalar( - VecI32 sizes, - int type, - Scalar ar, - ffi.Pointer rval, + double cv_Mat_get_f64_3( + Mat self, + int i0, + int i1, + int i2, ) { - return _Mat_NewWithSizesFromScalar( - sizes, - type, - ar, - rval, + return _cv_Mat_get_f64_3( + self, + i0, + i1, + i2, ); } - late final _Mat_NewWithSizesFromScalarPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecI32, ffi.Int, Scalar, - ffi.Pointer)>>('Mat_NewWithSizesFromScalar'); - late final _Mat_NewWithSizesFromScalar = - _Mat_NewWithSizesFromScalarPtr.asFunction< - ffi.Pointer Function( - VecI32, int, Scalar, ffi.Pointer)>(); + late final _cv_Mat_get_f64_3Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_get_f64_3'); + late final _cv_Mat_get_f64_3 = _cv_Mat_get_f64_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_NewWithSizesScalar_Async( - VecI32 sizes, - int type, - Scalar s, - imp1.CvCallback_1 callback, + int cv_Mat_get_i16_1( + Mat self, + int i0, ) { - return _Mat_NewWithSizesScalar_Async( - sizes, - type, - s, - callback, + return _cv_Mat_get_i16_1( + self, + i0, ); } - late final _Mat_NewWithSizesScalar_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecI32, ffi.Int, Scalar, - imp1.CvCallback_1)>>('Mat_NewWithSizesScalar_Async'); - late final _Mat_NewWithSizesScalar_Async = - _Mat_NewWithSizesScalar_AsyncPtr.asFunction< - ffi.Pointer Function( - VecI32, int, Scalar, imp1.CvCallback_1)>(); + late final _cv_Mat_get_i16_1Ptr = + _lookup>( + 'cv_Mat_get_i16_1'); + late final _cv_Mat_get_i16_1 = + _cv_Mat_get_i16_1Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_NewWithSizes_Async( - VecI32 sizes, - int type, - imp1.CvCallback_1 callback, + int cv_Mat_get_i16_2( + Mat self, + int i0, + int i1, ) { - return _Mat_NewWithSizes_Async( - sizes, - type, - callback, + return _cv_Mat_get_i16_2( + self, + i0, + i1, ); } - late final _Mat_NewWithSizes_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecI32, ffi.Int, imp1.CvCallback_1)>>('Mat_NewWithSizes_Async'); - late final _Mat_NewWithSizes_Async = _Mat_NewWithSizes_AsyncPtr.asFunction< - ffi.Pointer Function(VecI32, int, imp1.CvCallback_1)>(); + late final _cv_Mat_get_i16_2Ptr = + _lookup>( + 'cv_Mat_get_i16_2'); + late final _cv_Mat_get_i16_2 = _cv_Mat_get_i16_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_New_Async( - imp1.CvCallback_1 callback, + int cv_Mat_get_i16_3( + Mat self, + int i0, + int i1, + int i2, ) { - return _Mat_New_Async( - callback, + return _cv_Mat_get_i16_3( + self, + i0, + i1, + i2, ); } - late final _Mat_New_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(imp1.CvCallback_1)>>('Mat_New_Async'); - late final _Mat_New_Async = _Mat_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + late final _cv_Mat_get_i16_3Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_get_i16_3'); + late final _cv_Mat_get_i16_3 = _cv_Mat_get_i16_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Normalize( - Mat src, - Mat dst, - double alpha, - double beta, - int typ, - int dtype, - Mat mask, + int cv_Mat_get_i32_1( + Mat self, + int i0, ) { - return _Mat_Normalize( - src, - dst, - alpha, - beta, - typ, - dtype, - mask, + return _cv_Mat_get_i32_1( + self, + i0, ); } - late final _Mat_NormalizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Double, - ffi.Int, ffi.Int, Mat)>>('Mat_Normalize'); - late final _Mat_Normalize = _Mat_NormalizePtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, double, int, int, Mat)>(); + late final _cv_Mat_get_i32_1Ptr = + _lookup>( + 'cv_Mat_get_i32_1'); + late final _cv_Mat_get_i32_1 = + _cv_Mat_get_i32_1Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_Ones_Async( - int rows, - int cols, - int type, - imp1.CvCallback_1 callback, + int cv_Mat_get_i32_2( + Mat self, + int i0, + int i1, ) { - return _Mat_Ones_Async( - rows, - cols, - type, - callback, + return _cv_Mat_get_i32_2( + self, + i0, + i1, ); } - late final _Mat_Ones_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Int, ffi.Int, imp1.CvCallback_1)>>('Mat_Ones_Async'); - late final _Mat_Ones_Async = _Mat_Ones_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, int, imp1.CvCallback_1)>(); + late final _cv_Mat_get_i32_2Ptr = + _lookup>( + 'cv_Mat_get_i32_2'); + late final _cv_Mat_get_i32_2 = _cv_Mat_get_i32_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_PCACompute( - Mat src, - Mat mean, - Mat eigenvectors, - Mat eigenvalues, - int maxComponents, + int cv_Mat_get_i32_3( + Mat self, + int i0, + int i1, + int i2, ) { - return _Mat_PCACompute( - src, - mean, - eigenvectors, - eigenvalues, - maxComponents, + return _cv_Mat_get_i32_3( + self, + i0, + i1, + i2, ); } - late final _Mat_PCAComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, ffi.Int)>>('Mat_PCACompute'); - late final _Mat_PCACompute = _Mat_PCAComputePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, int)>(); + late final _cv_Mat_get_i32_3Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_get_i32_3'); + late final _cv_Mat_get_i32_3 = _cv_Mat_get_i32_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_PatchNaNs( - Mat m, - double val, + int cv_Mat_get_i8_1( + Mat self, + int i0, ) { - return _Mat_PatchNaNs( - m, - val, + return _cv_Mat_get_i8_1( + self, + i0, ); } - late final _Mat_PatchNaNsPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Double)>>( - 'Mat_PatchNaNs'); - late final _Mat_PatchNaNs = _Mat_PatchNaNsPtr.asFunction< - ffi.Pointer Function(Mat, double)>(); + late final _cv_Mat_get_i8_1Ptr = + _lookup>( + 'cv_Mat_get_i8_1'); + late final _cv_Mat_get_i8_1 = + _cv_Mat_get_i8_1Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_PerspectiveTransform( - Mat src, - Mat dst, - Mat tm, + int cv_Mat_get_i8_2( + Mat self, + int i0, + int i1, ) { - return _Mat_PerspectiveTransform( - src, - dst, - tm, + return _cv_Mat_get_i8_2( + self, + i0, + i1, ); } - late final _Mat_PerspectiveTransformPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_PerspectiveTransform'); - late final _Mat_PerspectiveTransform = _Mat_PerspectiveTransformPtr - .asFunction Function(Mat, Mat, Mat)>(); + late final _cv_Mat_get_i8_2Ptr = + _lookup>( + 'cv_Mat_get_i8_2'); + late final _cv_Mat_get_i8_2 = + _cv_Mat_get_i8_2Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_Phase( - Mat x, - Mat y, - Mat angle, - bool angleInDegrees, + int cv_Mat_get_i8_3( + Mat self, + int i0, + int i1, + int i2, ) { - return _Mat_Phase( - x, - y, - angle, - angleInDegrees, + return _cv_Mat_get_i8_3( + self, + i0, + i1, + i2, ); } - late final _Mat_PhasePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Bool)>>('Mat_Phase'); - late final _Mat_Phase = _Mat_PhasePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, bool)>(); + late final _cv_Mat_get_i8_3Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_get_i8_3'); + late final _cv_Mat_get_i8_3 = _cv_Mat_get_i8_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_PolarToCart( - Mat magnitude, - Mat degree, - Mat x, - Mat y, - bool angleInDegrees, + int cv_Mat_get_u16_1( + Mat self, + int i0, ) { - return _Mat_PolarToCart( - magnitude, - degree, - x, - y, - angleInDegrees, + return _cv_Mat_get_u16_1( + self, + i0, ); } - late final _Mat_PolarToCartPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, ffi.Bool)>>('Mat_PolarToCart'); - late final _Mat_PolarToCart = _Mat_PolarToCartPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, bool)>(); + late final _cv_Mat_get_u16_1Ptr = + _lookup>( + 'cv_Mat_get_u16_1'); + late final _cv_Mat_get_u16_1 = + _cv_Mat_get_u16_1Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_Pow( - Mat src, - double power, - Mat dst, + int cv_Mat_get_u16_2( + Mat self, + int i0, + int i1, ) { - return _Mat_Pow( - src, - power, - dst, + return _cv_Mat_get_u16_2( + self, + i0, + i1, ); } - late final _Mat_PowPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, Mat)>>('Mat_Pow'); - late final _Mat_Pow = _Mat_PowPtr.asFunction< - ffi.Pointer Function(Mat, double, Mat)>(); + late final _cv_Mat_get_u16_2Ptr = + _lookup>( + 'cv_Mat_get_u16_2'); + late final _cv_Mat_get_u16_2 = _cv_Mat_get_u16_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Ptr_u8_1( - Mat m, - int i, + int cv_Mat_get_u16_3( + Mat self, + int i0, + int i1, + int i2, ) { - return _Mat_Ptr_u8_1( - m, - i, + return _cv_Mat_get_u16_3( + self, + i0, + i1, + i2, ); } - late final _Mat_Ptr_u8_1Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int)>>( - 'Mat_Ptr_u8_1'); - late final _Mat_Ptr_u8_1 = - _Mat_Ptr_u8_1Ptr.asFunction Function(Mat, int)>(); + late final _cv_Mat_get_u16_3Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_get_u16_3'); + late final _cv_Mat_get_u16_3 = _cv_Mat_get_u16_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Ptr_u8_2( - Mat m, - int i, - int j, + int cv_Mat_get_u8_1( + Mat self, + int i0, ) { - return _Mat_Ptr_u8_2( - m, - i, - j, + return _cv_Mat_get_u8_1( + self, + i0, ); } - late final _Mat_Ptr_u8_2Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int)>>('Mat_Ptr_u8_2'); - late final _Mat_Ptr_u8_2 = _Mat_Ptr_u8_2Ptr.asFunction< - ffi.Pointer Function(Mat, int, int)>(); + late final _cv_Mat_get_u8_1Ptr = + _lookup>( + 'cv_Mat_get_u8_1'); + late final _cv_Mat_get_u8_1 = + _cv_Mat_get_u8_1Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_Ptr_u8_3( - Mat m, - int i, - int j, - int k, + int cv_Mat_get_u8_2( + Mat self, + int i0, + int i1, ) { - return _Mat_Ptr_u8_3( - m, - i, - j, - k, + return _cv_Mat_get_u8_2( + self, + i0, + i1, ); } - late final _Mat_Ptr_u8_3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int)>>('Mat_Ptr_u8_3'); - late final _Mat_Ptr_u8_3 = _Mat_Ptr_u8_3Ptr.asFunction< - ffi.Pointer Function(Mat, int, int, int)>(); + late final _cv_Mat_get_u8_2Ptr = + _lookup>( + 'cv_Mat_get_u8_2'); + late final _cv_Mat_get_u8_2 = + _cv_Mat_get_u8_2Ptr.asFunction(isLeaf: true); - ffi.Pointer Mat_Reduce( - Mat src, - Mat dst, - int dim, - int rType, - int dType, + int cv_Mat_get_u8_3( + Mat self, + int i0, + int i1, + int i2, ) { - return _Mat_Reduce( - src, - dst, - dim, - rType, - dType, + return _cv_Mat_get_u8_3( + self, + i0, + i1, + i2, ); } - late final _Mat_ReducePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Int, ffi.Int)>>('Mat_Reduce'); - late final _Mat_Reduce = _Mat_ReducePtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, int, int)>(); + late final _cv_Mat_get_u8_3Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_get_u8_3'); + late final _cv_Mat_get_u8_3 = _cv_Mat_get_u8_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_ReduceArgMax( - Mat src, - Mat dst, - int axis, - bool lastIndex, + bool cv_Mat_isContinuous( + Mat self, ) { - return _Mat_ReduceArgMax( - src, - dst, - axis, - lastIndex, + return _cv_Mat_isContinuous( + self, ); } - late final _Mat_ReduceArgMaxPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Bool)>>('Mat_ReduceArgMax'); - late final _Mat_ReduceArgMax = _Mat_ReduceArgMaxPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, bool)>(); + late final _cv_Mat_isContinuousPtr = + _lookup>( + 'cv_Mat_isContinuous'); + late final _cv_Mat_isContinuous = + _cv_Mat_isContinuousPtr.asFunction(isLeaf: true); - ffi.Pointer Mat_ReduceArgMin( - Mat src, - Mat dst, - int axis, - bool lastIndex, + bool cv_Mat_isSubmatrix( + Mat self, ) { - return _Mat_ReduceArgMin( - src, - dst, - axis, - lastIndex, + return _cv_Mat_isSubmatrix( + self, ); } - late final _Mat_ReduceArgMinPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Bool)>>('Mat_ReduceArgMin'); - late final _Mat_ReduceArgMin = _Mat_ReduceArgMinPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, bool)>(); + late final _cv_Mat_isSubmatrixPtr = + _lookup>('cv_Mat_isSubmatrix'); + late final _cv_Mat_isSubmatrix = + _cv_Mat_isSubmatrixPtr.asFunction(isLeaf: true); - ffi.Pointer Mat_Region( - Mat m, - CvRect r, - ffi.Pointer rval, + ffi.Pointer cv_Mat_locateROI( + Mat self, + ffi.Pointer wholeSize, + ffi.Pointer ofs, + imp1.CvCallback_0 callback, ) { - return _Mat_Region( - m, - r, - rval, + return _cv_Mat_locateROI( + self, + wholeSize, + ofs, + callback, ); } - late final _Mat_RegionPtr = _lookup< + late final _cv_Mat_locateROIPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, CvRect, ffi.Pointer)>>('Mat_Region'); - late final _Mat_Region = _Mat_RegionPtr.asFunction< - ffi.Pointer Function(Mat, CvRect, ffi.Pointer)>(); + ffi.Pointer Function(Mat, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_locateROI'); + late final _cv_Mat_locateROI = _cv_Mat_locateROIPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Region_Async( + ffi.Pointer cv_Mat_mean( Mat self, - CvRect r, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Region_Async( + return _cv_Mat_mean( self, - r, + rval, callback, ); } - late final _Mat_Region_AsyncPtr = _lookup< + late final _cv_Mat_meanPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, CvRect, imp1.CvCallback_1)>>('Mat_Region_Async'); - late final _Mat_Region_Async = _Mat_Region_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, CvRect, imp1.CvCallback_1)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_mean'); + late final _cv_Mat_mean = _cv_Mat_meanPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Release( - ffi.Pointer m, + ffi.Pointer cv_Mat_mean_1( + Mat self, + Mat mask, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Release( - m, + return _cv_Mat_mean_1( + self, + mask, + rval, + callback, ); } - late final _Mat_ReleasePtr = _lookup< - ffi.NativeFunction Function(ffi.Pointer)>>( - 'Mat_Release'); - late final _Mat_Release = _Mat_ReleasePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + late final _cv_Mat_mean_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_mean_1'); + late final _cv_Mat_mean_1 = _cv_Mat_mean_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Repeat( - Mat src, - int nY, - int nX, + ffi.Pointer cv_Mat_mul( + Mat self, + Mat val, Mat dst, + double scale, ) { - return _Mat_Repeat( - src, - nY, - nX, + return _cv_Mat_mul( + self, + val, dst, + scale, ); } - late final _Mat_RepeatPtr = _lookup< + late final _cv_Mat_mulPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Mat)>>('Mat_Repeat'); - late final _Mat_Repeat = _Mat_RepeatPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Mat)>(); + Mat, Mat, Mat, ffi.Double)>>('cv_Mat_mul'); + late final _cv_Mat_mul = _cv_Mat_mulPtr + .asFunction Function(Mat, Mat, Mat, double)>(); - ffi.Pointer Mat_Reshape( - Mat m, - int cn, + ffi.Pointer cv_Mat_ones( int rows, + int cols, + int type, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Mat_Reshape( - m, - cn, + return _cv_Mat_ones( rows, + cols, + type, rval, + callback, ); } - late final _Mat_ReshapePtr = _lookup< + late final _cv_Mat_onesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_Reshape'); - late final _Mat_Reshape = _Mat_ReshapePtr.asFunction< - ffi.Pointer Function(Mat, int, int, ffi.Pointer)>(); + ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_ones'); + late final _cv_Mat_ones = _cv_Mat_onesPtr.asFunction< + ffi.Pointer Function( + int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Mat_ReshapeByVec( - Mat m, - int cn, - VecI32 newshape, - ffi.Pointer rval, + ffi.Pointer cv_Mat_op_add_f32( + Mat self, + double val, ) { - return _Mat_ReshapeByVec( - m, - cn, - newshape, - rval, + return _cv_Mat_op_add_f32( + self, + val, ); } - late final _Mat_ReshapeByVecPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, VecI32, ffi.Pointer)>>('Mat_ReshapeByVec'); - late final _Mat_ReshapeByVec = _Mat_ReshapeByVecPtr.asFunction< - ffi.Pointer Function(Mat, int, VecI32, ffi.Pointer)>(); + late final _cv_Mat_op_add_f32Ptr = + _lookup Function(Mat, float_t)>>( + 'cv_Mat_op_add_f32'); + late final _cv_Mat_op_add_f32 = _cv_Mat_op_add_f32Ptr + .asFunction Function(Mat, double)>(); - ffi.Pointer Mat_Reshape_Async( + ffi.Pointer cv_Mat_op_add_f64( Mat self, - int cn, - int rows, - imp1.CvCallback_1 callback, + double val, ) { - return _Mat_Reshape_Async( + return _cv_Mat_op_add_f64( self, - cn, - rows, - callback, + val, ); } - late final _Mat_Reshape_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, imp1.CvCallback_1)>>('Mat_Reshape_Async'); - late final _Mat_Reshape_Async = _Mat_Reshape_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_1)>(); + late final _cv_Mat_op_add_f64Ptr = _lookup< + ffi.NativeFunction Function(Mat, double_t)>>( + 'cv_Mat_op_add_f64'); + late final _cv_Mat_op_add_f64 = _cv_Mat_op_add_f64Ptr + .asFunction Function(Mat, double)>(); - ffi.Pointer Mat_Row( - Mat m, - int y, - ffi.Pointer rval, + ffi.Pointer cv_Mat_op_add_i16( + Mat self, + int val, ) { - return _Mat_Row( - m, - y, - rval, + return _cv_Mat_op_add_i16( + self, + val, ); } - late final _Mat_RowPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Pointer)>>('Mat_Row'); - late final _Mat_Row = _Mat_RowPtr.asFunction< - ffi.Pointer Function(Mat, int, ffi.Pointer)>(); + late final _cv_Mat_op_add_i16Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int16)>>( + 'cv_Mat_op_add_i16'); + late final _cv_Mat_op_add_i16 = _cv_Mat_op_add_i16Ptr + .asFunction Function(Mat, int)>(); - int Mat_Rows( - Mat m, + ffi.Pointer cv_Mat_op_add_i32( + Mat self, + int val, ) { - return _Mat_Rows( - m, + return _cv_Mat_op_add_i32( + self, + val, ); } - late final _Mat_RowsPtr = - _lookup>('Mat_Rows'); - late final _Mat_Rows = - _Mat_RowsPtr.asFunction(isLeaf: true); + late final _cv_Mat_op_add_i32Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int32)>>( + 'cv_Mat_op_add_i32'); + late final _cv_Mat_op_add_i32 = _cv_Mat_op_add_i32Ptr + .asFunction Function(Mat, int)>(); - ffi.Pointer Mat_ScaleAdd( - Mat src1, - double alpha, - Mat src2, - Mat dst, + ffi.Pointer cv_Mat_op_add_i8( + Mat self, + int val, ) { - return _Mat_ScaleAdd( - src1, - alpha, - src2, - dst, + return _cv_Mat_op_add_i8( + self, + val, ); } - late final _Mat_ScaleAddPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Double, Mat, Mat)>>('Mat_ScaleAdd'); - late final _Mat_ScaleAdd = _Mat_ScaleAddPtr.asFunction< - ffi.Pointer Function(Mat, double, Mat, Mat)>(); - - ffi.Pointer Mat_SetDouble( - Mat m, - int row, - int col, - double val, + late final _cv_Mat_op_add_i8Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int8)>>( + 'cv_Mat_op_add_i8'); + late final _cv_Mat_op_add_i8 = _cv_Mat_op_add_i8Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_add_mat( + Mat self, + Mat val, ) { - return _Mat_SetDouble( - m, - row, - col, + return _cv_Mat_op_add_mat( + self, val, ); } - late final _Mat_SetDoublePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Double)>>('Mat_SetDouble'); - late final _Mat_SetDouble = _Mat_SetDoublePtr.asFunction< - ffi.Pointer Function(Mat, int, int, double)>(isLeaf: true); + late final _cv_Mat_op_add_matPtr = + _lookup Function(Mat, Mat)>>( + 'cv_Mat_op_add_mat'); + late final _cv_Mat_op_add_mat = _cv_Mat_op_add_matPtr + .asFunction Function(Mat, Mat)>(); - ffi.Pointer Mat_SetDouble3( - Mat m, - int x, - int y, - int z, - double val, + ffi.Pointer cv_Mat_op_add_u16( + Mat self, + int val, ) { - return _Mat_SetDouble3( - m, - x, - y, - z, + return _cv_Mat_op_add_u16( + self, val, ); } - late final _Mat_SetDouble3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Double)>>('Mat_SetDouble3'); - late final _Mat_SetDouble3 = _Mat_SetDouble3Ptr.asFunction< - ffi.Pointer Function(Mat, int, int, int, double)>(isLeaf: true); - - ffi.Pointer Mat_SetFloat( - Mat m, - int row, - int col, - double val, + late final _cv_Mat_op_add_u16Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Uint16)>>( + 'cv_Mat_op_add_u16'); + late final _cv_Mat_op_add_u16 = _cv_Mat_op_add_u16Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_add_u8( + Mat self, + int val, ) { - return _Mat_SetFloat( - m, - row, - col, + return _cv_Mat_op_add_u8( + self, val, ); } - late final _Mat_SetFloatPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Float)>>('Mat_SetFloat'); - late final _Mat_SetFloat = _Mat_SetFloatPtr.asFunction< - ffi.Pointer Function(Mat, int, int, double)>(isLeaf: true); + late final _cv_Mat_op_add_u8Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Uint8)>>( + 'cv_Mat_op_add_u8'); + late final _cv_Mat_op_add_u8 = _cv_Mat_op_add_u8Ptr + .asFunction Function(Mat, int)>(); - ffi.Pointer Mat_SetFloat3( - Mat m, - int x, - int y, - int z, + ffi.Pointer cv_Mat_op_div_f32( + Mat self, double val, ) { - return _Mat_SetFloat3( - m, - x, - y, - z, + return _cv_Mat_op_div_f32( + self, val, ); } - late final _Mat_SetFloat3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Float)>>('Mat_SetFloat3'); - late final _Mat_SetFloat3 = _Mat_SetFloat3Ptr.asFunction< - ffi.Pointer Function(Mat, int, int, int, double)>(isLeaf: true); + late final _cv_Mat_op_div_f32Ptr = + _lookup Function(Mat, float_t)>>( + 'cv_Mat_op_div_f32'); + late final _cv_Mat_op_div_f32 = _cv_Mat_op_div_f32Ptr + .asFunction Function(Mat, double)>(); - ffi.Pointer Mat_SetIdentity( - Mat src, - double scalar, + ffi.Pointer cv_Mat_op_div_f64( + Mat self, + double val, ) { - return _Mat_SetIdentity( - src, - scalar, + return _cv_Mat_op_div_f64( + self, + val, ); } - late final _Mat_SetIdentityPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Double)>>( - 'Mat_SetIdentity'); - late final _Mat_SetIdentity = _Mat_SetIdentityPtr.asFunction< - ffi.Pointer Function(Mat, double)>(isLeaf: true); + late final _cv_Mat_op_div_f64Ptr = _lookup< + ffi.NativeFunction Function(Mat, double_t)>>( + 'cv_Mat_op_div_f64'); + late final _cv_Mat_op_div_f64 = _cv_Mat_op_div_f64Ptr + .asFunction Function(Mat, double)>(); - ffi.Pointer Mat_SetInt( - Mat m, - int row, - int col, + ffi.Pointer cv_Mat_op_div_i16( + Mat self, int val, ) { - return _Mat_SetInt( - m, - row, - col, + return _cv_Mat_op_div_i16( + self, val, ); } - late final _Mat_SetIntPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int32)>>('Mat_SetInt'); - late final _Mat_SetInt = _Mat_SetIntPtr.asFunction< - ffi.Pointer Function(Mat, int, int, int)>(isLeaf: true); + late final _cv_Mat_op_div_i16Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int16)>>( + 'cv_Mat_op_div_i16'); + late final _cv_Mat_op_div_i16 = _cv_Mat_op_div_i16Ptr + .asFunction Function(Mat, int)>(); - ffi.Pointer Mat_SetInt3( - Mat m, - int x, - int y, - int z, + ffi.Pointer cv_Mat_op_div_i32( + Mat self, int val, ) { - return _Mat_SetInt3( - m, - x, - y, - z, + return _cv_Mat_op_div_i32( + self, val, ); } - late final _Mat_SetInt3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Int32)>>('Mat_SetInt3'); - late final _Mat_SetInt3 = _Mat_SetInt3Ptr.asFunction< - ffi.Pointer Function(Mat, int, int, int, int)>(isLeaf: true); - - ffi.Pointer Mat_SetSChar( - Mat m, - int row, - int col, + late final _cv_Mat_op_div_i32Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int32)>>( + 'cv_Mat_op_div_i32'); + late final _cv_Mat_op_div_i32 = _cv_Mat_op_div_i32Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_div_i8( + Mat self, int val, ) { - return _Mat_SetSChar( - m, - row, - col, + return _cv_Mat_op_div_i8( + self, val, ); } - late final _Mat_SetSCharPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int8)>>('Mat_SetSChar'); - late final _Mat_SetSChar = _Mat_SetSCharPtr.asFunction< - ffi.Pointer Function(Mat, int, int, int)>(isLeaf: true); + late final _cv_Mat_op_div_i8Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int8)>>( + 'cv_Mat_op_div_i8'); + late final _cv_Mat_op_div_i8 = _cv_Mat_op_div_i8Ptr + .asFunction Function(Mat, int)>(); - ffi.Pointer Mat_SetSChar3( - Mat m, - int x, - int y, - int z, - int val, + ffi.Pointer cv_Mat_op_div_mat( + Mat self, + Mat val, ) { - return _Mat_SetSChar3( - m, - x, - y, - z, + return _cv_Mat_op_div_mat( + self, val, ); } - late final _Mat_SetSChar3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Int8)>>('Mat_SetSChar3'); - late final _Mat_SetSChar3 = _Mat_SetSChar3Ptr.asFunction< - ffi.Pointer Function(Mat, int, int, int, int)>(isLeaf: true); - - ffi.Pointer Mat_SetShort( - Mat m, - int row, - int col, + late final _cv_Mat_op_div_matPtr = + _lookup Function(Mat, Mat)>>( + 'cv_Mat_op_div_mat'); + late final _cv_Mat_op_div_mat = _cv_Mat_op_div_matPtr + .asFunction Function(Mat, Mat)>(); + + ffi.Pointer cv_Mat_op_div_u16( + Mat self, int val, ) { - return _Mat_SetShort( - m, - row, - col, + return _cv_Mat_op_div_u16( + self, val, ); } - late final _Mat_SetShortPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int16)>>('Mat_SetShort'); - late final _Mat_SetShort = _Mat_SetShortPtr.asFunction< - ffi.Pointer Function(Mat, int, int, int)>(isLeaf: true); + late final _cv_Mat_op_div_u16Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Uint16)>>( + 'cv_Mat_op_div_u16'); + late final _cv_Mat_op_div_u16 = _cv_Mat_op_div_u16Ptr + .asFunction Function(Mat, int)>(); - ffi.Pointer Mat_SetShort3( - Mat m, - int x, - int y, - int z, + ffi.Pointer cv_Mat_op_div_u8( + Mat self, int val, ) { - return _Mat_SetShort3( - m, - x, - y, - z, + return _cv_Mat_op_div_u8( + self, val, ); } - late final _Mat_SetShort3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Int16)>>('Mat_SetShort3'); - late final _Mat_SetShort3 = _Mat_SetShort3Ptr.asFunction< - ffi.Pointer Function(Mat, int, int, int, int)>(isLeaf: true); + late final _cv_Mat_op_div_u8Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Uint8)>>( + 'cv_Mat_op_div_u8'); + late final _cv_Mat_op_div_u8 = _cv_Mat_op_div_u8Ptr + .asFunction Function(Mat, int)>(); - ffi.Pointer Mat_SetTo( - Mat m, - Scalar value, - Mat mask, + ffi.Pointer cv_Mat_op_mul_f32( + Mat self, + double val, ) { - return _Mat_SetTo( - m, - value, - mask, + return _cv_Mat_op_mul_f32( + self, + val, ); } - late final _Mat_SetToPtr = _lookup< - ffi.NativeFunction Function(Mat, Scalar, Mat)>>( - 'Mat_SetTo'); - late final _Mat_SetTo = _Mat_SetToPtr.asFunction< - ffi.Pointer Function(Mat, Scalar, Mat)>(isLeaf: true); + late final _cv_Mat_op_mul_f32Ptr = + _lookup Function(Mat, float_t)>>( + 'cv_Mat_op_mul_f32'); + late final _cv_Mat_op_mul_f32 = _cv_Mat_op_mul_f32Ptr + .asFunction Function(Mat, double)>(); - ffi.Pointer Mat_SetUChar( - Mat m, - int row, - int col, - int val, + ffi.Pointer cv_Mat_op_mul_f64( + Mat self, + double val, ) { - return _Mat_SetUChar( - m, - row, - col, + return _cv_Mat_op_mul_f64( + self, val, ); } - late final _Mat_SetUCharPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Uint8)>>('Mat_SetUChar'); - late final _Mat_SetUChar = _Mat_SetUCharPtr.asFunction< - ffi.Pointer Function(Mat, int, int, int)>(isLeaf: true); + late final _cv_Mat_op_mul_f64Ptr = _lookup< + ffi.NativeFunction Function(Mat, double_t)>>( + 'cv_Mat_op_mul_f64'); + late final _cv_Mat_op_mul_f64 = _cv_Mat_op_mul_f64Ptr + .asFunction Function(Mat, double)>(); - ffi.Pointer Mat_SetUChar3( - Mat m, - int x, - int y, - int z, + ffi.Pointer cv_Mat_op_mul_i16( + Mat self, int val, ) { - return _Mat_SetUChar3( - m, - x, - y, - z, + return _cv_Mat_op_mul_i16( + self, val, ); } - late final _Mat_SetUChar3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Uint8)>>('Mat_SetUChar3'); - late final _Mat_SetUChar3 = _Mat_SetUChar3Ptr.asFunction< - ffi.Pointer Function(Mat, int, int, int, int)>(isLeaf: true); - - ffi.Pointer Mat_SetUShort( - Mat m, - int row, - int col, + late final _cv_Mat_op_mul_i16Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int16)>>( + 'cv_Mat_op_mul_i16'); + late final _cv_Mat_op_mul_i16 = _cv_Mat_op_mul_i16Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_mul_i32( + Mat self, int val, ) { - return _Mat_SetUShort( - m, - row, - col, + return _cv_Mat_op_mul_i32( + self, val, ); } - late final _Mat_SetUShortPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Uint16)>>('Mat_SetUShort'); - late final _Mat_SetUShort = _Mat_SetUShortPtr.asFunction< - ffi.Pointer Function(Mat, int, int, int)>(isLeaf: true); + late final _cv_Mat_op_mul_i32Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int32)>>( + 'cv_Mat_op_mul_i32'); + late final _cv_Mat_op_mul_i32 = _cv_Mat_op_mul_i32Ptr + .asFunction Function(Mat, int)>(); - ffi.Pointer Mat_SetUShort3( - Mat m, - int x, - int y, - int z, + ffi.Pointer cv_Mat_op_mul_i8( + Mat self, int val, ) { - return _Mat_SetUShort3( - m, - x, - y, - z, + return _cv_Mat_op_mul_i8( + self, val, ); } - late final _Mat_SetUShort3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Uint16)>>('Mat_SetUShort3'); - late final _Mat_SetUShort3 = _Mat_SetUShort3Ptr.asFunction< - ffi.Pointer Function(Mat, int, int, int, int)>(isLeaf: true); - - ffi.Pointer Mat_SetVec2b( - Mat m, - int row, - int col, - Vec2b val, - ) { - return _Mat_SetVec2b( - m, - row, - col, - val, - ); - } + late final _cv_Mat_op_mul_i8Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int8)>>( + 'cv_Mat_op_mul_i8'); + late final _cv_Mat_op_mul_i8 = _cv_Mat_op_mul_i8Ptr + .asFunction Function(Mat, int)>(); - late final _Mat_SetVec2bPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec2b)>>('Mat_SetVec2b'); - late final _Mat_SetVec2b = _Mat_SetVec2bPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec2b)>(isLeaf: true); - - ffi.Pointer Mat_SetVec2d( - Mat m, - int row, - int col, - Vec2d val, + ffi.Pointer cv_Mat_op_mul_mat( + Mat self, + Mat val, ) { - return _Mat_SetVec2d( - m, - row, - col, + return _cv_Mat_op_mul_mat( + self, val, ); } - late final _Mat_SetVec2dPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec2d)>>('Mat_SetVec2d'); - late final _Mat_SetVec2d = _Mat_SetVec2dPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec2d)>(isLeaf: true); - - ffi.Pointer Mat_SetVec2f( - Mat m, - int row, - int col, - Vec2f val, - ) { - return _Mat_SetVec2f( - m, - row, - col, - val, - ); - } + late final _cv_Mat_op_mul_matPtr = + _lookup Function(Mat, Mat)>>( + 'cv_Mat_op_mul_mat'); + late final _cv_Mat_op_mul_mat = _cv_Mat_op_mul_matPtr + .asFunction Function(Mat, Mat)>(); - late final _Mat_SetVec2fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec2f)>>('Mat_SetVec2f'); - late final _Mat_SetVec2f = _Mat_SetVec2fPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec2f)>(isLeaf: true); - - ffi.Pointer Mat_SetVec2i( - Mat m, - int row, - int col, - Vec2i val, + ffi.Pointer cv_Mat_op_mul_u16( + Mat self, + int val, ) { - return _Mat_SetVec2i( - m, - row, - col, + return _cv_Mat_op_mul_u16( + self, val, ); } - late final _Mat_SetVec2iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec2i)>>('Mat_SetVec2i'); - late final _Mat_SetVec2i = _Mat_SetVec2iPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec2i)>(isLeaf: true); - - ffi.Pointer Mat_SetVec2s( - Mat m, - int row, - int col, - Vec2s val, + late final _cv_Mat_op_mul_u16Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Uint16)>>( + 'cv_Mat_op_mul_u16'); + late final _cv_Mat_op_mul_u16 = _cv_Mat_op_mul_u16Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_mul_u8( + Mat self, + int val, ) { - return _Mat_SetVec2s( - m, - row, - col, + return _cv_Mat_op_mul_u8( + self, val, ); } - late final _Mat_SetVec2sPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec2s)>>('Mat_SetVec2s'); - late final _Mat_SetVec2s = _Mat_SetVec2sPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec2s)>(isLeaf: true); - - ffi.Pointer Mat_SetVec2w( - Mat m, - int row, - int col, - Vec2w val, + late final _cv_Mat_op_mul_u8Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Uint8)>>( + 'cv_Mat_op_mul_u8'); + late final _cv_Mat_op_mul_u8 = _cv_Mat_op_mul_u8Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_sub_f32( + Mat self, + double val, ) { - return _Mat_SetVec2w( - m, - row, - col, + return _cv_Mat_op_sub_f32( + self, val, ); } - late final _Mat_SetVec2wPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec2w)>>('Mat_SetVec2w'); - late final _Mat_SetVec2w = _Mat_SetVec2wPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec2w)>(isLeaf: true); - - ffi.Pointer Mat_SetVec3b( - Mat m, - int row, - int col, - Vec3b val, + late final _cv_Mat_op_sub_f32Ptr = + _lookup Function(Mat, float_t)>>( + 'cv_Mat_op_sub_f32'); + late final _cv_Mat_op_sub_f32 = _cv_Mat_op_sub_f32Ptr + .asFunction Function(Mat, double)>(); + + ffi.Pointer cv_Mat_op_sub_f64( + Mat self, + double val, ) { - return _Mat_SetVec3b( - m, - row, - col, + return _cv_Mat_op_sub_f64( + self, val, ); } - late final _Mat_SetVec3bPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec3b)>>('Mat_SetVec3b'); - late final _Mat_SetVec3b = _Mat_SetVec3bPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec3b)>(isLeaf: true); - - ffi.Pointer Mat_SetVec3d( - Mat m, - int row, - int col, - Vec3d val, + late final _cv_Mat_op_sub_f64Ptr = _lookup< + ffi.NativeFunction Function(Mat, double_t)>>( + 'cv_Mat_op_sub_f64'); + late final _cv_Mat_op_sub_f64 = _cv_Mat_op_sub_f64Ptr + .asFunction Function(Mat, double)>(); + + ffi.Pointer cv_Mat_op_sub_i16( + Mat self, + int val, ) { - return _Mat_SetVec3d( - m, - row, - col, + return _cv_Mat_op_sub_i16( + self, val, ); } - late final _Mat_SetVec3dPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec3d)>>('Mat_SetVec3d'); - late final _Mat_SetVec3d = _Mat_SetVec3dPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec3d)>(isLeaf: true); - - ffi.Pointer Mat_SetVec3f( - Mat m, - int row, - int col, - Vec3f val, + late final _cv_Mat_op_sub_i16Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int16)>>( + 'cv_Mat_op_sub_i16'); + late final _cv_Mat_op_sub_i16 = _cv_Mat_op_sub_i16Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_sub_i32( + Mat self, + int val, ) { - return _Mat_SetVec3f( - m, - row, - col, + return _cv_Mat_op_sub_i32( + self, val, ); } - late final _Mat_SetVec3fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec3f)>>('Mat_SetVec3f'); - late final _Mat_SetVec3f = _Mat_SetVec3fPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec3f)>(isLeaf: true); - - ffi.Pointer Mat_SetVec3i( - Mat m, - int row, - int col, - Vec3i val, + late final _cv_Mat_op_sub_i32Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int32)>>( + 'cv_Mat_op_sub_i32'); + late final _cv_Mat_op_sub_i32 = _cv_Mat_op_sub_i32Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_sub_i8( + Mat self, + int val, ) { - return _Mat_SetVec3i( - m, - row, - col, + return _cv_Mat_op_sub_i8( + self, val, ); } - late final _Mat_SetVec3iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec3i)>>('Mat_SetVec3i'); - late final _Mat_SetVec3i = _Mat_SetVec3iPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec3i)>(isLeaf: true); - - ffi.Pointer Mat_SetVec3s( - Mat m, - int row, - int col, - Vec3s val, + late final _cv_Mat_op_sub_i8Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int8)>>( + 'cv_Mat_op_sub_i8'); + late final _cv_Mat_op_sub_i8 = _cv_Mat_op_sub_i8Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_sub_mat( + Mat self, + Mat val, ) { - return _Mat_SetVec3s( - m, - row, - col, + return _cv_Mat_op_sub_mat( + self, val, ); } - late final _Mat_SetVec3sPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec3s)>>('Mat_SetVec3s'); - late final _Mat_SetVec3s = _Mat_SetVec3sPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec3s)>(isLeaf: true); - - ffi.Pointer Mat_SetVec3w( - Mat m, - int row, - int col, - Vec3w val, + late final _cv_Mat_op_sub_matPtr = + _lookup Function(Mat, Mat)>>( + 'cv_Mat_op_sub_mat'); + late final _cv_Mat_op_sub_mat = _cv_Mat_op_sub_matPtr + .asFunction Function(Mat, Mat)>(); + + ffi.Pointer cv_Mat_op_sub_u16( + Mat self, + int val, ) { - return _Mat_SetVec3w( - m, - row, - col, + return _cv_Mat_op_sub_u16( + self, val, ); } - late final _Mat_SetVec3wPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec3w)>>('Mat_SetVec3w'); - late final _Mat_SetVec3w = _Mat_SetVec3wPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec3w)>(isLeaf: true); - - ffi.Pointer Mat_SetVec4b( - Mat m, - int row, - int col, - Vec4b val, + late final _cv_Mat_op_sub_u16Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Uint16)>>( + 'cv_Mat_op_sub_u16'); + late final _cv_Mat_op_sub_u16 = _cv_Mat_op_sub_u16Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_op_sub_u8( + Mat self, + int val, ) { - return _Mat_SetVec4b( - m, - row, - col, + return _cv_Mat_op_sub_u8( + self, val, ); } - late final _Mat_SetVec4bPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec4b)>>('Mat_SetVec4b'); - late final _Mat_SetVec4b = _Mat_SetVec4bPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec4b)>(isLeaf: true); - - ffi.Pointer Mat_SetVec4d( - Mat m, - int row, - int col, - Vec4d val, + late final _cv_Mat_op_sub_u8Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Uint8)>>( + 'cv_Mat_op_sub_u8'); + late final _cv_Mat_op_sub_u8 = _cv_Mat_op_sub_u8Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_patchNaNs( + Mat self, + double val, + imp1.CvCallback_0 callback, ) { - return _Mat_SetVec4d( - m, - row, - col, + return _cv_Mat_patchNaNs( + self, val, + callback, ); } - late final _Mat_SetVec4dPtr = _lookup< + late final _cv_Mat_patchNaNsPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec4d)>>('Mat_SetVec4d'); - late final _Mat_SetVec4d = _Mat_SetVec4dPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec4d)>(isLeaf: true); - - ffi.Pointer Mat_SetVec4f( - Mat m, - int row, - int col, - Vec4f val, + Mat, ffi.Double, imp1.CvCallback_0)>>('cv_Mat_patchNaNs'); + late final _cv_Mat_patchNaNs = _cv_Mat_patchNaNsPtr.asFunction< + ffi.Pointer Function(Mat, double, imp1.CvCallback_0)>(); + + ffi.Pointer cv_Mat_ptr_uchar_1( + Mat self, + int i, ) { - return _Mat_SetVec4f( - m, - row, - col, - val, + return _cv_Mat_ptr_uchar_1( + self, + i, ); } - late final _Mat_SetVec4fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec4f)>>('Mat_SetVec4f'); - late final _Mat_SetVec4f = _Mat_SetVec4fPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec4f)>(isLeaf: true); - - ffi.Pointer Mat_SetVec4i( - Mat m, - int row, - int col, - Vec4i val, + late final _cv_Mat_ptr_uchar_1Ptr = _lookup< + ffi.NativeFunction Function(Mat, ffi.Int)>>( + 'cv_Mat_ptr_uchar_1'); + late final _cv_Mat_ptr_uchar_1 = _cv_Mat_ptr_uchar_1Ptr + .asFunction Function(Mat, int)>(); + + ffi.Pointer cv_Mat_ptr_uchar_2( + Mat self, + int i, + int j, ) { - return _Mat_SetVec4i( - m, - row, - col, - val, + return _cv_Mat_ptr_uchar_2( + self, + i, + j, ); } - late final _Mat_SetVec4iPtr = _lookup< + late final _cv_Mat_ptr_uchar_2Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec4i)>>('Mat_SetVec4i'); - late final _Mat_SetVec4i = _Mat_SetVec4iPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec4i)>(isLeaf: true); - - ffi.Pointer Mat_SetVec4s( - Mat m, - int row, - int col, - Vec4s val, + ffi.Pointer Function( + Mat, ffi.Int, ffi.Int)>>('cv_Mat_ptr_uchar_2'); + late final _cv_Mat_ptr_uchar_2 = _cv_Mat_ptr_uchar_2Ptr + .asFunction Function(Mat, int, int)>(); + + ffi.Pointer cv_Mat_ptr_uchar_3( + Mat self, + int i, + int j, + int k, ) { - return _Mat_SetVec4s( - m, - row, - col, - val, + return _cv_Mat_ptr_uchar_3( + self, + i, + j, + k, ); } - late final _Mat_SetVec4sPtr = _lookup< + late final _cv_Mat_ptr_uchar_3Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec4s)>>('Mat_SetVec4s'); - late final _Mat_SetVec4s = _Mat_SetVec4sPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec4s)>(isLeaf: true); - - ffi.Pointer Mat_SetVec4w( - Mat m, - int row, - int col, - Vec4w val, + ffi.Pointer Function( + Mat, ffi.Int, ffi.Int, ffi.Int)>>('cv_Mat_ptr_uchar_3'); + late final _cv_Mat_ptr_uchar_3 = _cv_Mat_ptr_uchar_3Ptr + .asFunction Function(Mat, int, int, int)>(); + + ffi.Pointer cv_Mat_region( + Mat self, + CvRect r, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Mat_SetVec4w( - m, - row, - col, - val, + return _cv_Mat_region( + self, + r, + rval, + callback, ); } - late final _Mat_SetVec4wPtr = _lookup< + late final _cv_Mat_regionPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec4w)>>('Mat_SetVec4w'); - late final _Mat_SetVec4w = _Mat_SetVec4wPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec4w)>(isLeaf: true); - - ffi.Pointer Mat_SetVec6d( - Mat m, - int row, - int col, - Vec6d val, + Mat, CvRect, Mat, imp1.CvCallback_0)>>('cv_Mat_region'); + late final _cv_Mat_region = _cv_Mat_regionPtr.asFunction< + ffi.Pointer Function(Mat, CvRect, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_Mat_release( + Mat self, ) { - return _Mat_SetVec6d( - m, - row, - col, - val, + return _cv_Mat_release( + self, ); } - late final _Mat_SetVec6dPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec6d)>>('Mat_SetVec6d'); - late final _Mat_SetVec6d = _Mat_SetVec6dPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec6d)>(isLeaf: true); - - ffi.Pointer Mat_SetVec6f( - Mat m, - int row, - int col, - Vec6f val, + late final _cv_Mat_releasePtr = + _lookup Function(Mat)>>( + 'cv_Mat_release'); + late final _cv_Mat_release = + _cv_Mat_releasePtr.asFunction Function(Mat)>(); + + ffi.Pointer cv_Mat_reshape( + Mat self, + int cn, + int rows, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Mat_SetVec6f( - m, - row, - col, - val, + return _cv_Mat_reshape( + self, + cn, + rows, + rval, + callback, ); } - late final _Mat_SetVec6fPtr = _lookup< + late final _cv_Mat_reshapePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec6f)>>('Mat_SetVec6f'); - late final _Mat_SetVec6f = _Mat_SetVec6fPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec6f)>(isLeaf: true); - - ffi.Pointer Mat_SetVec6i( - Mat m, - int row, - int col, - Vec6i val, + ffi.Pointer Function(Mat, ffi.Int, ffi.Int, Mat, + imp1.CvCallback_0)>>('cv_Mat_reshape'); + late final _cv_Mat_reshape = _cv_Mat_reshapePtr.asFunction< + ffi.Pointer Function(Mat, int, int, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_Mat_reshape_1( + Mat self, + int cn, + VecI32 newshape, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Mat_SetVec6i( - m, - row, - col, - val, + return _cv_Mat_reshape_1( + self, + cn, + newshape, + rval, + callback, ); } - late final _Mat_SetVec6iPtr = _lookup< + late final _cv_Mat_reshape_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec6i)>>('Mat_SetVec6i'); - late final _Mat_SetVec6i = _Mat_SetVec6iPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec6i)>(isLeaf: true); - - ffi.Pointer Mat_SetVec8i( - Mat m, - int row, - int col, - Vec8i val, + ffi.Pointer Function(Mat, ffi.Int, VecI32, Mat, + imp1.CvCallback_0)>>('cv_Mat_reshape_1'); + late final _cv_Mat_reshape_1 = _cv_Mat_reshape_1Ptr.asFunction< + ffi.Pointer Function( + Mat, int, VecI32, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_Mat_row( + Mat self, + int y, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Mat_SetVec8i( - m, - row, - col, - val, + return _cv_Mat_row( + self, + y, + rval, + callback, ); } - late final _Mat_SetVec8iPtr = _lookup< + late final _cv_Mat_rowPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Vec8i)>>('Mat_SetVec8i'); - late final _Mat_SetVec8i = _Mat_SetVec8iPtr.asFunction< - ffi.Pointer Function(Mat, int, int, Vec8i)>(isLeaf: true); + Mat, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_Mat_row'); + late final _cv_Mat_row = _cv_Mat_rowPtr.asFunction< + ffi.Pointer Function(Mat, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Mat_Size( - Mat m, + int cv_Mat_rows( + Mat self, ) { - return _Mat_Size( - m, + return _cv_Mat_rows( + self, ); } - late final _Mat_SizePtr = - _lookup Function(Mat)>>( - 'Mat_Size'); - late final _Mat_Size = - _Mat_SizePtr.asFunction Function(Mat)>(isLeaf: true); + late final _cv_Mat_rowsPtr = + _lookup>('cv_Mat_rows'); + late final _cv_Mat_rows = + _cv_Mat_rowsPtr.asFunction(isLeaf: true); - ffi.Pointer Mat_Solve( - Mat src1, - Mat src2, - Mat dst, - int flags, - ffi.Pointer rval, + ffi.Pointer cv_Mat_setTo( + Mat self, + Scalar value, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _Mat_Solve( - src1, - src2, - dst, - flags, - rval, + return _cv_Mat_setTo( + self, + value, + mask, + callback, ); } - late final _Mat_SolvePtr = _lookup< + late final _cv_Mat_setToPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, ffi.Int, ffi.Pointer)>>('Mat_Solve'); - late final _Mat_Solve = _Mat_SolvePtr.asFunction< + Mat, Scalar, Mat, imp1.CvCallback_0)>>('cv_Mat_setTo'); + late final _cv_Mat_setTo = _cv_Mat_setToPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, int, ffi.Pointer)>(); + Mat, Scalar, Mat, imp1.CvCallback_0)>(isLeaf: true); - ffi.Pointer Mat_SolveCubic( - Mat coeffs, - Mat roots, - ffi.Pointer rval, + void cv_Mat_set_Vec2b( + Mat self, + int i0, + int i1, + Vec2b val, ) { - return _Mat_SolveCubic( - coeffs, - roots, - rval, + return _cv_Mat_set_Vec2b( + self, + i0, + i1, + val, ); } - late final _Mat_SolveCubicPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Pointer)>>('Mat_SolveCubic'); - late final _Mat_SolveCubic = _Mat_SolveCubicPtr.asFunction< - ffi.Pointer Function(Mat, Mat, ffi.Pointer)>(); + late final _cv_Mat_set_Vec2bPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec2b'); + late final _cv_Mat_set_Vec2b = _cv_Mat_set_Vec2bPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SolvePoly( - Mat coeffs, - Mat roots, - int maxIters, - ffi.Pointer rval, + void cv_Mat_set_Vec2d( + Mat self, + int i0, + int i1, + Vec2d val, ) { - return _Mat_SolvePoly( - coeffs, - roots, - maxIters, - rval, + return _cv_Mat_set_Vec2d( + self, + i0, + i1, + val, ); } - late final _Mat_SolvePolyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Pointer)>>('Mat_SolvePoly'); - late final _Mat_SolvePoly = _Mat_SolvePolyPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, ffi.Pointer)>(); + late final _cv_Mat_set_Vec2dPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec2d'); + late final _cv_Mat_set_Vec2d = _cv_Mat_set_Vec2dPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Sort( - Mat src, - Mat dst, - int flags, + void cv_Mat_set_Vec2f( + Mat self, + int i0, + int i1, + Vec2f val, ) { - return _Mat_Sort( - src, - dst, - flags, + return _cv_Mat_set_Vec2f( + self, + i0, + i1, + val, ); } - late final _Mat_SortPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('Mat_Sort'); - late final _Mat_Sort = - _Mat_SortPtr.asFunction Function(Mat, Mat, int)>(); + late final _cv_Mat_set_Vec2fPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec2f'); + late final _cv_Mat_set_Vec2f = _cv_Mat_set_Vec2fPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SortIdx( - Mat src, - Mat dst, - int flags, + void cv_Mat_set_Vec2i( + Mat self, + int i0, + int i1, + Vec2i val, ) { - return _Mat_SortIdx( - src, - dst, - flags, + return _cv_Mat_set_Vec2i( + self, + i0, + i1, + val, ); } - late final _Mat_SortIdxPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('Mat_SortIdx'); - late final _Mat_SortIdx = _Mat_SortIdxPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int)>(); + late final _cv_Mat_set_Vec2iPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec2i'); + late final _cv_Mat_set_Vec2i = _cv_Mat_set_Vec2iPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Split( - Mat src, - ffi.Pointer rval, + void cv_Mat_set_Vec2s( + Mat self, + int i0, + int i1, + Vec2s val, ) { - return _Mat_Split( - src, - rval, + return _cv_Mat_set_Vec2s( + self, + i0, + i1, + val, ); } - late final _Mat_SplitPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_Split'); - late final _Mat_Split = _Mat_SplitPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_Vec2sPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec2s'); + late final _cv_Mat_set_Vec2s = _cv_Mat_set_Vec2sPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Sqrt( - Mat m, - ffi.Pointer rval, + void cv_Mat_set_Vec2w( + Mat self, + int i0, + int i1, + Vec2w val, ) { - return _Mat_Sqrt( - m, - rval, + return _cv_Mat_set_Vec2w( + self, + i0, + i1, + val, ); } - late final _Mat_SqrtPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>>('Mat_Sqrt'); - late final _Mat_Sqrt = _Mat_SqrtPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_Vec2wPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec2w'); + late final _cv_Mat_set_Vec2w = _cv_Mat_set_Vec2wPtr + .asFunction(isLeaf: true); - MatStep Mat_Step( - Mat m, + void cv_Mat_set_Vec3b( + Mat self, + int i0, + int i1, + Vec3b val, ) { - return _Mat_Step( - m, + return _cv_Mat_set_Vec3b( + self, + i0, + i1, + val, ); } - late final _Mat_StepPtr = - _lookup>('Mat_Step'); - late final _Mat_Step = - _Mat_StepPtr.asFunction(isLeaf: true); + late final _cv_Mat_set_Vec3bPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec3b'); + late final _cv_Mat_set_Vec3b = _cv_Mat_set_Vec3bPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Subtract( - Mat src1, - Mat src2, - Mat dst, - Mat mask, - int dtype, + void cv_Mat_set_Vec3d( + Mat self, + int i0, + int i1, + Vec3d val, ) { - return _Mat_Subtract( - src1, - src2, - dst, - mask, - dtype, + return _cv_Mat_set_Vec3d( + self, + i0, + i1, + val, + ); + } + + late final _cv_Mat_set_Vec3dPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec3d'); + late final _cv_Mat_set_Vec3d = _cv_Mat_set_Vec3dPtr + .asFunction(isLeaf: true); + + void cv_Mat_set_Vec3f( + Mat self, + int i0, + int i1, + Vec3f val, + ) { + return _cv_Mat_set_Vec3f( + self, + i0, + i1, + val, ); } - late final _Mat_SubtractPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, ffi.Int)>>('Mat_Subtract'); - late final _Mat_Subtract = _Mat_SubtractPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, int)>(); + late final _cv_Mat_set_Vec3fPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec3f'); + late final _cv_Mat_set_Vec3f = _cv_Mat_set_Vec3fPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SubtractF64( - Mat m, - double val, + void cv_Mat_set_Vec3i( + Mat self, + int i0, + int i1, + Vec3i val, ) { - return _Mat_SubtractF64( - m, + return _cv_Mat_set_Vec3i( + self, + i0, + i1, val, ); } - late final _Mat_SubtractF64Ptr = _lookup< - ffi.NativeFunction Function(Mat, double_t)>>( - 'Mat_SubtractF64'); - late final _Mat_SubtractF64 = _Mat_SubtractF64Ptr.asFunction< - ffi.Pointer Function(Mat, double)>(); + late final _cv_Mat_set_Vec3iPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec3i'); + late final _cv_Mat_set_Vec3i = _cv_Mat_set_Vec3iPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SubtractFloat( - Mat m, - double val, + void cv_Mat_set_Vec3s( + Mat self, + int i0, + int i1, + Vec3s val, ) { - return _Mat_SubtractFloat( - m, + return _cv_Mat_set_Vec3s( + self, + i0, + i1, val, ); } - late final _Mat_SubtractFloatPtr = - _lookup Function(Mat, float_t)>>( - 'Mat_SubtractFloat'); - late final _Mat_SubtractFloat = _Mat_SubtractFloatPtr.asFunction< - ffi.Pointer Function(Mat, double)>(); + late final _cv_Mat_set_Vec3sPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec3s'); + late final _cv_Mat_set_Vec3s = _cv_Mat_set_Vec3sPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SubtractI16( - Mat m, - int val, + void cv_Mat_set_Vec3w( + Mat self, + int i0, + int i1, + Vec3w val, ) { - return _Mat_SubtractI16( - m, + return _cv_Mat_set_Vec3w( + self, + i0, + i1, val, ); } - late final _Mat_SubtractI16Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int16)>>( - 'Mat_SubtractI16'); - late final _Mat_SubtractI16 = _Mat_SubtractI16Ptr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_set_Vec3wPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec3w'); + late final _cv_Mat_set_Vec3w = _cv_Mat_set_Vec3wPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SubtractI32( - Mat m, - int val, + void cv_Mat_set_Vec4b( + Mat self, + int i0, + int i1, + Vec4b val, ) { - return _Mat_SubtractI32( - m, + return _cv_Mat_set_Vec4b( + self, + i0, + i1, val, ); } - late final _Mat_SubtractI32Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int32)>>( - 'Mat_SubtractI32'); - late final _Mat_SubtractI32 = _Mat_SubtractI32Ptr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_set_Vec4bPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec4b'); + late final _cv_Mat_set_Vec4b = _cv_Mat_set_Vec4bPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SubtractMat( - Mat m, - Mat val, + void cv_Mat_set_Vec4d( + Mat self, + int i0, + int i1, + Vec4d val, ) { - return _Mat_SubtractMat( - m, + return _cv_Mat_set_Vec4d( + self, + i0, + i1, val, ); } - late final _Mat_SubtractMatPtr = - _lookup Function(Mat, Mat)>>( - 'Mat_SubtractMat'); - late final _Mat_SubtractMat = _Mat_SubtractMatPtr.asFunction< - ffi.Pointer Function(Mat, Mat)>(); + late final _cv_Mat_set_Vec4dPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec4d'); + late final _cv_Mat_set_Vec4d = _cv_Mat_set_Vec4dPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SubtractSChar( - Mat m, - int val, + void cv_Mat_set_Vec4f( + Mat self, + int i0, + int i1, + Vec4f val, ) { - return _Mat_SubtractSChar( - m, + return _cv_Mat_set_Vec4f( + self, + i0, + i1, val, ); } - late final _Mat_SubtractSCharPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Int8)>>( - 'Mat_SubtractSChar'); - late final _Mat_SubtractSChar = _Mat_SubtractSCharPtr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_set_Vec4fPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec4f'); + late final _cv_Mat_set_Vec4f = _cv_Mat_set_Vec4fPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SubtractU16( - Mat m, - int val, + void cv_Mat_set_Vec4i( + Mat self, + int i0, + int i1, + Vec4i val, ) { - return _Mat_SubtractU16( - m, + return _cv_Mat_set_Vec4i( + self, + i0, + i1, val, ); } - late final _Mat_SubtractU16Ptr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Uint16)>>( - 'Mat_SubtractU16'); - late final _Mat_SubtractU16 = _Mat_SubtractU16Ptr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_set_Vec4iPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec4i'); + late final _cv_Mat_set_Vec4i = _cv_Mat_set_Vec4iPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_SubtractUChar( - Mat m, - int val, + void cv_Mat_set_Vec4s( + Mat self, + int i0, + int i1, + Vec4s val, ) { - return _Mat_SubtractUChar( - m, + return _cv_Mat_set_Vec4s( + self, + i0, + i1, val, ); } - late final _Mat_SubtractUCharPtr = _lookup< - ffi.NativeFunction Function(Mat, ffi.Uint8)>>( - 'Mat_SubtractUChar'); - late final _Mat_SubtractUChar = _Mat_SubtractUCharPtr.asFunction< - ffi.Pointer Function(Mat, int)>(); + late final _cv_Mat_set_Vec4sPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec4s'); + late final _cv_Mat_set_Vec4s = _cv_Mat_set_Vec4sPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Sum( - Mat src, - ffi.Pointer rval, + void cv_Mat_set_Vec4w( + Mat self, + int i0, + int i1, + Vec4w val, ) { - return _Mat_Sum( - src, - rval, + return _cv_Mat_set_Vec4w( + self, + i0, + i1, + val, ); } - late final _Mat_SumPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>>('Mat_Sum'); - late final _Mat_Sum = _Mat_SumPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_Vec4wPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec4w'); + late final _cv_Mat_set_Vec4w = _cv_Mat_set_Vec4wPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_T( - Mat x, - ffi.Pointer rval, + void cv_Mat_set_Vec6d( + Mat self, + int i0, + int i1, + Vec6d val, ) { - return _Mat_T( - x, - rval, + return _cv_Mat_set_Vec6d( + self, + i0, + i1, + val, ); } - late final _Mat_TPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>>('Mat_T'); - late final _Mat_T = _Mat_TPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_Vec6dPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec6d'); + late final _cv_Mat_set_Vec6d = _cv_Mat_set_Vec6dPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_ToVecChar( - Mat m, - ffi.Pointer rval, + void cv_Mat_set_Vec6f( + Mat self, + int i0, + int i1, + Vec6f val, ) { - return _Mat_ToVecChar( - m, - rval, + return _cv_Mat_set_Vec6f( + self, + i0, + i1, + val, ); } - late final _Mat_ToVecCharPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_ToVecChar'); - late final _Mat_ToVecChar = _Mat_ToVecCharPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_Vec6fPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec6f'); + late final _cv_Mat_set_Vec6f = _cv_Mat_set_Vec6fPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_ToVecChar_Async( + void cv_Mat_set_Vec6i( Mat self, - imp1.CvCallback_1 callback, + int i0, + int i1, + Vec6i val, ) { - return _Mat_ToVecChar_Async( + return _cv_Mat_set_Vec6i( self, - callback, + i0, + i1, + val, ); } - late final _Mat_ToVecChar_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('Mat_ToVecChar_Async'); - late final _Mat_ToVecChar_Async = _Mat_ToVecChar_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, imp1.CvCallback_1)>(); + late final _cv_Mat_set_Vec6iPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec6i'); + late final _cv_Mat_set_Vec6i = _cv_Mat_set_Vec6iPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_ToVecUChar( - Mat m, - ffi.Pointer rval, + void cv_Mat_set_Vec8i( + Mat self, + int i0, + int i1, + Vec8i val, ) { - return _Mat_ToVecUChar( - m, - rval, + return _cv_Mat_set_Vec8i( + self, + i0, + i1, + val, ); } - late final _Mat_ToVecUCharPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_ToVecUChar'); - late final _Mat_ToVecUChar = _Mat_ToVecUCharPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_Vec8iPtr = _lookup< + ffi.NativeFunction>( + 'cv_Mat_set_Vec8i'); + late final _cv_Mat_set_Vec8i = _cv_Mat_set_Vec8iPtr + .asFunction(isLeaf: true); - ffi.Pointer Mat_ToVecUChar_Async( + void cv_Mat_set_f32_1( Mat self, - imp1.CvCallback_1 callback, + int i0, + double val, ) { - return _Mat_ToVecUChar_Async( + return _cv_Mat_set_f32_1( self, - callback, + i0, + val, ); } - late final _Mat_ToVecUChar_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('Mat_ToVecUChar_Async'); - late final _Mat_ToVecUChar_Async = _Mat_ToVecUChar_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, imp1.CvCallback_1)>(); + late final _cv_Mat_set_f32_1Ptr = + _lookup>( + 'cv_Mat_set_f32_1'); + late final _cv_Mat_set_f32_1 = _cv_Mat_set_f32_1Ptr + .asFunction(isLeaf: true); - int Mat_Total( - Mat m, + void cv_Mat_set_f32_2( + Mat self, + int i0, + int i1, + double val, ) { - return _Mat_Total( - m, + return _cv_Mat_set_f32_2( + self, + i0, + i1, + val, ); } - late final _Mat_TotalPtr = - _lookup>('Mat_Total'); - late final _Mat_Total = - _Mat_TotalPtr.asFunction(isLeaf: true); + late final _cv_Mat_set_f32_2Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_set_f32_2'); + late final _cv_Mat_set_f32_2 = _cv_Mat_set_f32_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Trace( - Mat src, - ffi.Pointer rval, + void cv_Mat_set_f32_3( + Mat self, + int i0, + int i1, + int i2, + double val, ) { - return _Mat_Trace( - src, - rval, + return _cv_Mat_set_f32_3( + self, + i0, + i1, + i2, + val, ); } - late final _Mat_TracePtr = _lookup< + late final _cv_Mat_set_f32_3Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_Trace'); - late final _Mat_Trace = _Mat_TracePtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + ffi.Void Function( + Mat, ffi.Int, ffi.Int, ffi.Int, float_t)>>('cv_Mat_set_f32_3'); + late final _cv_Mat_set_f32_3 = _cv_Mat_set_f32_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Transform( - Mat src, - Mat dst, - Mat tm, + void cv_Mat_set_f64_1( + Mat self, + int i0, + double val, ) { - return _Mat_Transform( - src, - dst, - tm, + return _cv_Mat_set_f64_1( + self, + i0, + val, ); } - late final _Mat_TransformPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_Transform'); - late final _Mat_Transform = _Mat_TransformPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); + late final _cv_Mat_set_f64_1Ptr = + _lookup>( + 'cv_Mat_set_f64_1'); + late final _cv_Mat_set_f64_1 = _cv_Mat_set_f64_1Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Transpose( - Mat src, - Mat dst, + void cv_Mat_set_f64_2( + Mat self, + int i0, + int i1, + double val, ) { - return _Mat_Transpose( - src, - dst, + return _cv_Mat_set_f64_2( + self, + i0, + i1, + val, ); } - late final _Mat_TransposePtr = - _lookup Function(Mat, Mat)>>( - 'Mat_Transpose'); - late final _Mat_Transpose = - _Mat_TransposePtr.asFunction Function(Mat, Mat)>(); + late final _cv_Mat_set_f64_2Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_set_f64_2'); + late final _cv_Mat_set_f64_2 = _cv_Mat_set_f64_2Ptr + .asFunction(isLeaf: true); + + void cv_Mat_set_f64_3( + Mat self, + int i0, + int i1, + int i2, + double val, + ) { + return _cv_Mat_set_f64_3( + self, + i0, + i1, + i2, + val, + ); + } + + late final _cv_Mat_set_f64_3Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + Mat, ffi.Int, ffi.Int, ffi.Int, double_t)>>('cv_Mat_set_f64_3'); + late final _cv_Mat_set_f64_3 = _cv_Mat_set_f64_3Ptr + .asFunction(isLeaf: true); - int Mat_Type( - Mat m, + void cv_Mat_set_i16_1( + Mat self, + int i0, + int val, ) { - return _Mat_Type( - m, + return _cv_Mat_set_i16_1( + self, + i0, + val, ); } - late final _Mat_TypePtr = - _lookup>('Mat_Type'); - late final _Mat_Type = - _Mat_TypePtr.asFunction(isLeaf: true); + late final _cv_Mat_set_i16_1Ptr = + _lookup>( + 'cv_Mat_set_i16_1'); + late final _cv_Mat_set_i16_1 = _cv_Mat_set_i16_1Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Vconcat( - Mat src1, - Mat src2, - Mat dst, + void cv_Mat_set_i16_2( + Mat self, + int i0, + int i1, + int val, ) { - return _Mat_Vconcat( - src1, - src2, - dst, + return _cv_Mat_set_i16_2( + self, + i0, + i1, + val, ); } - late final _Mat_VconcatPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_Vconcat'); - late final _Mat_Vconcat = _Mat_VconcatPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); + late final _cv_Mat_set_i16_2Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_set_i16_2'); + late final _cv_Mat_set_i16_2 = _cv_Mat_set_i16_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_Zeros_Async( - int rows, - int cols, - int type, - imp1.CvCallback_1 callback, + void cv_Mat_set_i16_3( + Mat self, + int i0, + int i1, + int i2, + int val, ) { - return _Mat_Zeros_Async( - rows, - cols, - type, - callback, + return _cv_Mat_set_i16_3( + self, + i0, + i1, + i2, + val, ); } - late final _Mat_Zeros_AsyncPtr = _lookup< + late final _cv_Mat_set_i16_3Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('Mat_Zeros_Async'); - late final _Mat_Zeros_Async = _Mat_Zeros_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, int, imp1.CvCallback_1)>(); + ffi.Void Function( + Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Int16)>>('cv_Mat_set_i16_3'); + late final _cv_Mat_set_i16_3 = _cv_Mat_set_i16_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_colRange( - Mat m, - int start, - int end, - ffi.Pointer rval, + void cv_Mat_set_i32_1( + Mat self, + int i0, + int val, ) { - return _Mat_colRange( - m, - start, - end, - rval, + return _cv_Mat_set_i32_1( + self, + i0, + val, ); } - late final _Mat_colRangePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_colRange'); - late final _Mat_colRange = _Mat_colRangePtr.asFunction< - ffi.Pointer Function(Mat, int, int, ffi.Pointer)>(); + late final _cv_Mat_set_i32_1Ptr = + _lookup>( + 'cv_Mat_set_i32_1'); + late final _cv_Mat_set_i32_1 = _cv_Mat_set_i32_1Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_rowRange( - Mat m, - int start, - int end, - ffi.Pointer rval, + void cv_Mat_set_i32_2( + Mat self, + int i0, + int i1, + int val, ) { - return _Mat_rowRange( - m, - start, - end, - rval, + return _cv_Mat_set_i32_2( + self, + i0, + i1, + val, ); } - late final _Mat_rowRangePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Mat_rowRange'); - late final _Mat_rowRange = _Mat_rowRangePtr.asFunction< - ffi.Pointer Function(Mat, int, int, ffi.Pointer)>(); + late final _cv_Mat_set_i32_2Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_set_i32_2'); + late final _cv_Mat_set_i32_2 = _cv_Mat_set_i32_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_toString( + void cv_Mat_set_i32_3( Mat self, - int fmtType, - int f16Precision, - int f32Precision, - int f64Precision, - bool multiLine, - ffi.Pointer> rval, + int i0, + int i1, + int i2, + int val, ) { - return _Mat_toString( + return _cv_Mat_set_i32_3( self, - fmtType, - f16Precision, - f32Precision, - f64Precision, - multiLine, - rval, + i0, + i1, + i2, + val, ); } - late final _Mat_toStringPtr = _lookup< + late final _cv_Mat_set_i32_3Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Bool, - ffi.Pointer>)>>('Mat_toString'); - late final _Mat_toString = _Mat_toStringPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, int, bool, ffi.Pointer>)>(); + ffi.Void Function( + Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Int32)>>('cv_Mat_set_i32_3'); + late final _cv_Mat_set_i32_3 = _cv_Mat_set_i32_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_toVecPoint( + void cv_Mat_set_i8_1( Mat self, - ffi.Pointer vec, + int i0, + int val, ) { - return _Mat_toVecPoint( + return _cv_Mat_set_i8_1( self, - vec, + i0, + val, ); } - late final _Mat_toVecPointPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_toVecPoint'); - late final _Mat_toVecPoint = _Mat_toVecPointPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_i8_1Ptr = + _lookup>( + 'cv_Mat_set_i8_1'); + late final _cv_Mat_set_i8_1 = _cv_Mat_set_i8_1Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_toVecPoint2f( + void cv_Mat_set_i8_2( Mat self, - ffi.Pointer vec, + int i0, + int i1, + int val, ) { - return _Mat_toVecPoint2f( + return _cv_Mat_set_i8_2( self, - vec, + i0, + i1, + val, ); } - late final _Mat_toVecPoint2fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_toVecPoint2f'); - late final _Mat_toVecPoint2f = _Mat_toVecPoint2fPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_i8_2Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_set_i8_2'); + late final _cv_Mat_set_i8_2 = _cv_Mat_set_i8_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_toVecPoint3f( + void cv_Mat_set_i8_3( Mat self, - ffi.Pointer vec, + int i0, + int i1, + int i2, + int val, ) { - return _Mat_toVecPoint3f( + return _cv_Mat_set_i8_3( self, - vec, + i0, + i1, + i2, + val, ); } - late final _Mat_toVecPoint3fPtr = _lookup< + late final _cv_Mat_set_i8_3Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_toVecPoint3f'); - late final _Mat_toVecPoint3f = _Mat_toVecPoint3fPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + ffi.Void Function( + Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Int8)>>('cv_Mat_set_i8_3'); + late final _cv_Mat_set_i8_3 = _cv_Mat_set_i8_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Mat_toVecPoint3i( + void cv_Mat_set_u16_1( Mat self, - ffi.Pointer vec, + int i0, + int val, ) { - return _Mat_toVecPoint3i( + return _cv_Mat_set_u16_1( self, - vec, + i0, + val, ); } - late final _Mat_toVecPoint3iPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Mat_toVecPoint3i'); - late final _Mat_toVecPoint3i = _Mat_toVecPoint3iPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + late final _cv_Mat_set_u16_1Ptr = + _lookup>( + 'cv_Mat_set_u16_1'); + late final _cv_Mat_set_u16_1 = _cv_Mat_set_u16_1Ptr + .asFunction(isLeaf: true); - ffi.Pointer Norm( - Mat src1, - int normType, - Mat mask, - ffi.Pointer rval, + void cv_Mat_set_u16_2( + Mat self, + int i0, + int i1, + int val, ) { - return _Norm( - src1, - normType, - mask, - rval, + return _cv_Mat_set_u16_2( + self, + i0, + i1, + val, ); } - late final _NormPtr = _lookup< + late final _cv_Mat_set_u16_2Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, Mat, ffi.Pointer)>>('Norm'); - late final _Norm = _NormPtr.asFunction< - ffi.Pointer Function(Mat, int, Mat, ffi.Pointer)>(); + ffi.Void Function( + Mat, ffi.Int, ffi.Int, ffi.Uint16)>>('cv_Mat_set_u16_2'); + late final _cv_Mat_set_u16_2 = _cv_Mat_set_u16_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer NormWithMats( - Mat src1, - Mat src2, - int normType, - Mat mask, - ffi.Pointer rval, - ) { - return _NormWithMats( - src1, - src2, - normType, - mask, - rval, + void cv_Mat_set_u16_3( + Mat self, + int i0, + int i1, + int i2, + int val, + ) { + return _cv_Mat_set_u16_3( + self, + i0, + i1, + i2, + val, ); } - late final _NormWithMatsPtr = _lookup< + late final _cv_Mat_set_u16_3Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, - ffi.Pointer)>>('NormWithMats'); - late final _NormWithMats = _NormWithMatsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, Mat, ffi.Pointer)>(); + ffi.Void Function( + Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Uint16)>>('cv_Mat_set_u16_3'); + late final _cv_Mat_set_u16_3 = _cv_Mat_set_u16_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer Ones( - int rows, - int cols, - int type, - ffi.Pointer rval, + void cv_Mat_set_u8_1( + Mat self, + int i0, + int val, ) { - return _Ones( - rows, - cols, - type, - rval, + return _cv_Mat_set_u8_1( + self, + i0, + val, ); } - late final _OnesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Int, ffi.Int, ffi.Pointer)>>('Ones'); - late final _Ones = _OnesPtr.asFunction< - ffi.Pointer Function(int, int, int, ffi.Pointer)>(); + late final _cv_Mat_set_u8_1Ptr = + _lookup>( + 'cv_Mat_set_u8_1'); + late final _cv_Mat_set_u8_1 = _cv_Mat_set_u8_1Ptr + .asFunction(isLeaf: true); - ffi.Pointer RNG_Fill( - RNG rng, - Mat mat, - int distType, - double a, - double b, - bool saturateRange, + void cv_Mat_set_u8_2( + Mat self, + int i0, + int i1, + int val, ) { - return _RNG_Fill( - rng, - mat, - distType, - a, - b, - saturateRange, + return _cv_Mat_set_u8_2( + self, + i0, + i1, + val, ); } - late final _RNG_FillPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(RNG, Mat, ffi.Int, ffi.Double, - ffi.Double, ffi.Bool)>>('RNG_Fill'); - late final _RNG_Fill = _RNG_FillPtr.asFunction< - ffi.Pointer Function(RNG, Mat, int, double, double, bool)>(); + late final _cv_Mat_set_u8_2Ptr = _lookup< + ffi + .NativeFunction>( + 'cv_Mat_set_u8_2'); + late final _cv_Mat_set_u8_2 = _cv_Mat_set_u8_2Ptr + .asFunction(isLeaf: true); - ffi.Pointer RNG_Fill_Async( - RNG rng, - Mat mat, - int distType, - double a, - double b, - bool saturateRange, - imp1.CvCallback_0 callback, + void cv_Mat_set_u8_3( + Mat self, + int i0, + int i1, + int i2, + int val, ) { - return _RNG_Fill_Async( - rng, - mat, - distType, - a, - b, - saturateRange, - callback, + return _cv_Mat_set_u8_3( + self, + i0, + i1, + i2, + val, ); } - late final _RNG_Fill_AsyncPtr = _lookup< + late final _cv_Mat_set_u8_3Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(RNG, Mat, ffi.Int, ffi.Double, - ffi.Double, ffi.Bool, imp1.CvCallback_0)>>('RNG_Fill_Async'); - late final _RNG_Fill_Async = _RNG_Fill_AsyncPtr.asFunction< - ffi.Pointer Function( - RNG, Mat, int, double, double, bool, imp1.CvCallback_0)>(); + ffi.Void Function( + Mat, ffi.Int, ffi.Int, ffi.Int, ffi.Uint8)>>('cv_Mat_set_u8_3'); + late final _cv_Mat_set_u8_3 = _cv_Mat_set_u8_3Ptr + .asFunction(isLeaf: true); - ffi.Pointer RNG_Gaussian( - RNG rng, - double sigma, - ffi.Pointer rval, + ffi.Pointer cv_Mat_size( + Mat self, ) { - return _RNG_Gaussian( - rng, - sigma, - rval, + return _cv_Mat_size( + self, ); } - late final _RNG_GaussianPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - RNG, ffi.Double, ffi.Pointer)>>('RNG_Gaussian'); - late final _RNG_Gaussian = _RNG_GaussianPtr.asFunction< - ffi.Pointer Function(RNG, double, ffi.Pointer)>(); + late final _cv_Mat_sizePtr = + _lookup Function(Mat)>>( + 'cv_Mat_size'); + late final _cv_Mat_size = _cv_Mat_sizePtr + .asFunction Function(Mat)>(isLeaf: true); - ffi.Pointer RNG_Gaussian_Async( - RNG rng, - double sigma, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_sqrt( + Mat self, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _RNG_Gaussian_Async( - rng, - sigma, + return _cv_Mat_sqrt( + self, + rval, callback, ); } - late final _RNG_Gaussian_AsyncPtr = _lookup< + late final _cv_Mat_sqrtPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - RNG, ffi.Double, imp1.CvCallback_1)>>('RNG_Gaussian_Async'); - late final _RNG_Gaussian_Async = _RNG_Gaussian_AsyncPtr.asFunction< - ffi.Pointer Function(RNG, double, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_Mat_sqrt'); + late final _cv_Mat_sqrt = _cv_Mat_sqrtPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer RNG_Next( - RNG rng, - ffi.Pointer rval, + MatStep cv_Mat_step( + Mat self, ) { - return _RNG_Next( - rng, - rval, + return _cv_Mat_step( + self, ); } - late final _RNG_NextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - RNG, ffi.Pointer)>>('RNG_Next'); - late final _RNG_Next = _RNG_NextPtr.asFunction< - ffi.Pointer Function(RNG, ffi.Pointer)>(); + late final _cv_Mat_stepPtr = + _lookup>('cv_Mat_step'); + late final _cv_Mat_step = + _cv_Mat_stepPtr.asFunction(isLeaf: true); - ffi.Pointer RNG_Next_Async( - RNG rng, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_t( + Mat self, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _RNG_Next_Async( - rng, + return _cv_Mat_t( + self, + rval, callback, ); } - late final _RNG_Next_AsyncPtr = _lookup< + late final _cv_Mat_tPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - RNG, imp1.CvCallback_1)>>('RNG_Next_Async'); - late final _RNG_Next_Async = _RNG_Next_AsyncPtr.asFunction< - ffi.Pointer Function(RNG, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_Mat_t'); + late final _cv_Mat_t = _cv_Mat_tPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer RNG_Uniform( - RNG rng, - int a, - int b, - ffi.Pointer rval, + ffi.Pointer cv_Mat_toFmtString( + Mat self, + int fmtType, + int f16Precision, + int f32Precision, + int f64Precision, + bool multiLine, + ffi.Pointer> rval, ) { - return _RNG_Uniform( - rng, - a, - b, + return _cv_Mat_toFmtString( + self, + fmtType, + f16Precision, + f32Precision, + f64Precision, + multiLine, rval, ); } - late final _RNG_UniformPtr = _lookup< + late final _cv_Mat_toFmtStringPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - RNG, ffi.Int, ffi.Int, ffi.Pointer)>>('RNG_Uniform'); - late final _RNG_Uniform = _RNG_UniformPtr.asFunction< - ffi.Pointer Function(RNG, int, int, ffi.Pointer)>(); + Mat, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Bool, + ffi.Pointer>)>>('cv_Mat_toFmtString'); + late final _cv_Mat_toFmtString = _cv_Mat_toFmtStringPtr.asFunction< + ffi.Pointer Function( + Mat, int, int, int, int, bool, ffi.Pointer>)>(); - ffi.Pointer RNG_UniformDouble( - RNG rng, - double a, - double b, - ffi.Pointer rval, + ffi.Pointer cv_Mat_toVecChar( + Mat self, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _RNG_UniformDouble( - rng, - a, - b, + return _cv_Mat_toVecChar( + self, rval, + callback, ); } - late final _RNG_UniformDoublePtr = _lookup< + late final _cv_Mat_toVecCharPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(RNG, ffi.Double, ffi.Double, - ffi.Pointer)>>('RNG_UniformDouble'); - late final _RNG_UniformDouble = _RNG_UniformDoublePtr.asFunction< + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_toVecChar'); + late final _cv_Mat_toVecChar = _cv_Mat_toVecCharPtr.asFunction< ffi.Pointer Function( - RNG, double, double, ffi.Pointer)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer RNG_UniformDouble_Async( - RNG rng, - double a, - double b, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_toVecPoint( + Mat self, + ffi.Pointer vec, + imp1.CvCallback_0 callback, ) { - return _RNG_UniformDouble_Async( - rng, - a, - b, + return _cv_Mat_toVecPoint( + self, + vec, callback, ); } - late final _RNG_UniformDouble_AsyncPtr = _lookup< + late final _cv_Mat_toVecPointPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(RNG, ffi.Double, ffi.Double, - imp1.CvCallback_1)>>('RNG_UniformDouble_Async'); - late final _RNG_UniformDouble_Async = _RNG_UniformDouble_AsyncPtr.asFunction< - ffi.Pointer Function(RNG, double, double, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_toVecPoint'); + late final _cv_Mat_toVecPoint = _cv_Mat_toVecPointPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer RNG_Uniform_Async( - RNG rng, - int a, - int b, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Mat_toVecPoint2f( + Mat self, + ffi.Pointer vec, + imp1.CvCallback_0 callback, ) { - return _RNG_Uniform_Async( - rng, - a, - b, + return _cv_Mat_toVecPoint2f( + self, + vec, callback, ); } - late final _RNG_Uniform_AsyncPtr = _lookup< + late final _cv_Mat_toVecPoint2fPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - RNG, ffi.Int, ffi.Int, imp1.CvCallback_1)>>('RNG_Uniform_Async'); - late final _RNG_Uniform_Async = _RNG_Uniform_AsyncPtr.asFunction< - ffi.Pointer Function(RNG, int, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_toVecPoint2f'); + late final _cv_Mat_toVecPoint2f = _cv_Mat_toVecPoint2fPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer RandN( - Mat mat, - Scalar mean, - Scalar stddev, + ffi.Pointer cv_Mat_toVecPoint3f( + Mat self, + ffi.Pointer vec, + imp1.CvCallback_0 callback, ) { - return _RandN( - mat, - mean, - stddev, + return _cv_Mat_toVecPoint3f( + self, + vec, + callback, ); } - late final _RandNPtr = _lookup< + late final _cv_Mat_toVecPoint3fPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Scalar, Scalar)>>('RandN'); - late final _RandN = _RandNPtr.asFunction< - ffi.Pointer Function(Mat, Scalar, Scalar)>(); + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_toVecPoint3f'); + late final _cv_Mat_toVecPoint3f = _cv_Mat_toVecPoint3fPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer RandN_Async( - Mat mat, - Scalar mean, - Scalar stddev, + ffi.Pointer cv_Mat_toVecPoint3i( + Mat self, + ffi.Pointer vec, imp1.CvCallback_0 callback, ) { - return _RandN_Async( - mat, - mean, - stddev, + return _cv_Mat_toVecPoint3i( + self, + vec, callback, ); } - late final _RandN_AsyncPtr = _lookup< + late final _cv_Mat_toVecPoint3iPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Scalar, Scalar, imp1.CvCallback_0)>>('RandN_Async'); - late final _RandN_Async = _RandN_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Scalar, Scalar, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_toVecPoint3i'); + late final _cv_Mat_toVecPoint3i = _cv_Mat_toVecPoint3iPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer RandShuffle( - Mat mat, + ffi.Pointer cv_Mat_toVecUChar( + Mat self, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _RandShuffle( - mat, + return _cv_Mat_toVecUChar( + self, + rval, + callback, ); } - late final _RandShufflePtr = - _lookup Function(Mat)>>( - 'RandShuffle'); - late final _RandShuffle = - _RandShufflePtr.asFunction Function(Mat)>(); + late final _cv_Mat_toVecUCharPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_toVecUChar'); + late final _cv_Mat_toVecUChar = _cv_Mat_toVecUCharPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer RandShuffleWithParams( - Mat mat, - double iterFactor, - RNG rng, + int cv_Mat_total( + Mat self, ) { - return _RandShuffleWithParams( - mat, - iterFactor, - rng, + return _cv_Mat_total( + self, ); } - late final _RandShuffleWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Double, RNG)>>('RandShuffleWithParams'); - late final _RandShuffleWithParams = _RandShuffleWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, double, RNG)>(); + late final _cv_Mat_totalPtr = + _lookup>('cv_Mat_total'); + late final _cv_Mat_total = + _cv_Mat_totalPtr.asFunction(isLeaf: true); - ffi.Pointer RandShuffleWithParams_Async( - Mat mat, - double iterFactor, - RNG rng, - imp1.CvCallback_0 callback, + int cv_Mat_type( + Mat self, ) { - return _RandShuffleWithParams_Async( - mat, - iterFactor, - rng, - callback, + return _cv_Mat_type( + self, ); } - late final _RandShuffleWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, RNG, - imp1.CvCallback_0)>>('RandShuffleWithParams_Async'); - late final _RandShuffleWithParams_Async = - _RandShuffleWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, RNG, imp1.CvCallback_0)>(); + late final _cv_Mat_typePtr = + _lookup>('cv_Mat_type'); + late final _cv_Mat_type = + _cv_Mat_typePtr.asFunction(isLeaf: true); - ffi.Pointer RandShuffle_Async( - Mat mat, + ffi.Pointer cv_Mat_zeros( + int rows, + int cols, + int type, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _RandShuffle_Async( - mat, + return _cv_Mat_zeros( + rows, + cols, + type, + rval, callback, ); } - late final _RandShuffle_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_0)>>('RandShuffle_Async'); - late final _RandShuffle_Async = _RandShuffle_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, imp1.CvCallback_0)>(); - - ffi.Pointer RandU( - Mat mat, - Scalar low, - Scalar high, - ) { - return _RandU( - mat, - low, - high, - ); - } - - late final _RandUPtr = _lookup< + late final _cv_Mat_zerosPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Scalar, Scalar)>>('RandU'); - late final _RandU = _RandUPtr.asFunction< - ffi.Pointer Function(Mat, Scalar, Scalar)>(); + ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_zeros'); + late final _cv_Mat_zeros = _cv_Mat_zerosPtr.asFunction< + ffi.Pointer Function( + int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer RandU_Async( - Mat mat, - Scalar low, - Scalar high, + ffi.Pointer cv_PCACompute( + Mat src, + Mat mean, + Mat eigenvectors, + Mat eigenvalues, + int maxComponents, imp1.CvCallback_0 callback, ) { - return _RandU_Async( - mat, - low, - high, + return _cv_PCACompute( + src, + mean, + eigenvectors, + eigenvalues, + maxComponents, callback, ); } - late final _RandU_AsyncPtr = _lookup< + late final _cv_PCAComputePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Scalar, Scalar, imp1.CvCallback_0)>>('RandU_Async'); - late final _RandU_Async = _RandU_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Scalar, Scalar, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Int, + imp1.CvCallback_0)>>('cv_PCACompute'); + late final _cv_PCACompute = _cv_PCAComputePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, int, imp1.CvCallback_0)>(); - void Rng_Close( + void cv_RNG_close( imp1.RNGPtr rng, ) { - return _Rng_Close( + return _cv_RNG_close( rng, ); } - late final _Rng_ClosePtr = - _lookup>('Rng_Close'); - late final _Rng_Close = - _Rng_ClosePtr.asFunction(); + late final _cv_RNG_closePtr = + _lookup>( + 'cv_RNG_close'); + late final _cv_RNG_close = + _cv_RNG_closePtr.asFunction(); - ffi.Pointer Rng_New( + ffi.Pointer cv_RNG_create( ffi.Pointer rval, ) { - return _Rng_New( + return _cv_RNG_create( rval, ); } - late final _Rng_NewPtr = _lookup< + late final _cv_RNG_createPtr = _lookup< ffi.NativeFunction Function(ffi.Pointer)>>( - 'Rng_New'); - late final _Rng_New = _Rng_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + 'cv_RNG_create'); + late final _cv_RNG_create = _cv_RNG_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer Rng_NewWithState( + ffi.Pointer cv_RNG_create_1( int state, ffi.Pointer rval, ) { - return _Rng_NewWithState( + return _cv_RNG_create_1( state, rval, ); } - late final _Rng_NewWithStatePtr = _lookup< + late final _cv_RNG_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Uint64, ffi.Pointer)>>('Rng_NewWithState'); - late final _Rng_NewWithState = _Rng_NewWithStatePtr.asFunction< - ffi.Pointer Function(int, ffi.Pointer)>(); + ffi.Uint64, ffi.Pointer)>>('cv_RNG_create_1'); + late final _cv_RNG_create_1 = _cv_RNG_create_1Ptr + .asFunction Function(int, ffi.Pointer)>(); - ffi.Pointer Rng_NewWithState_Async( - int state, - imp1.CvCallback_1 callback, + ffi.Pointer cv_RNG_fill( + RNG rng, + Mat mat, + int distType, + double a, + double b, + bool saturateRange, + imp1.CvCallback_0 callback, ) { - return _Rng_NewWithState_Async( - state, + return _cv_RNG_fill( + rng, + mat, + distType, + a, + b, + saturateRange, callback, ); } - late final _Rng_NewWithState_AsyncPtr = _lookup< + late final _cv_RNG_fillPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(RNG, Mat, ffi.Int, ffi.Double, + ffi.Double, ffi.Bool, imp1.CvCallback_0)>>('cv_RNG_fill'); + late final _cv_RNG_fill = _cv_RNG_fillPtr.asFunction< + ffi.Pointer Function( + RNG, Mat, int, double, double, bool, imp1.CvCallback_0)>(); + + ffi.Pointer cv_RNG_gaussian( + RNG rng, + double sigma, + ffi.Pointer rval, + ) { + return _cv_RNG_gaussian( + rng, + sigma, + rval, + ); + } + + late final _cv_RNG_gaussianPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Uint64, imp1.CvCallback_1)>>('Rng_NewWithState_Async'); - late final _Rng_NewWithState_Async = _Rng_NewWithState_AsyncPtr.asFunction< - ffi.Pointer Function(int, imp1.CvCallback_1)>(); + RNG, ffi.Double, ffi.Pointer)>>('cv_RNG_gaussian'); + late final _cv_RNG_gaussian = _cv_RNG_gaussianPtr.asFunction< + ffi.Pointer Function(RNG, double, ffi.Pointer)>(); - ffi.Pointer Rng_New_Async( - imp1.CvCallback_1 callback, + ffi.Pointer cv_RNG_next( + RNG rng, + ffi.Pointer rval, ) { - return _Rng_New_Async( - callback, + return _cv_RNG_next( + rng, + rval, ); } - late final _Rng_New_AsyncPtr = _lookup< + late final _cv_RNG_nextPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(imp1.CvCallback_1)>>('Rng_New_Async'); - late final _Rng_New_Async = _Rng_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + ffi.Pointer Function( + RNG, ffi.Pointer)>>('cv_RNG_next'); + late final _cv_RNG_next = _cv_RNG_nextPtr.asFunction< + ffi.Pointer Function(RNG, ffi.Pointer)>(); - ffi.Pointer Rotate( - Mat src, - Mat dst, - int rotateCode, + ffi.Pointer cv_RNG_uniform( + RNG rng, + int a, + int b, + ffi.Pointer rval, ) { - return _Rotate( - src, - dst, - rotateCode, + return _cv_RNG_uniform( + rng, + a, + b, + rval, + ); + } + + late final _cv_RNG_uniformPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + RNG, ffi.Int, ffi.Int, ffi.Pointer)>>('cv_RNG_uniform'); + late final _cv_RNG_uniform = _cv_RNG_uniformPtr.asFunction< + ffi.Pointer Function(RNG, int, int, ffi.Pointer)>(); + + ffi.Pointer cv_RNG_uniformDouble( + RNG rng, + double a, + double b, + ffi.Pointer rval, + ) { + return _cv_RNG_uniformDouble( + rng, + a, + b, + rval, ); } - late final _RotatePtr = _lookup< + late final _cv_RNG_uniformDoublePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('Rotate'); - late final _Rotate = - _RotatePtr.asFunction Function(Mat, Mat, int)>(); + ffi.Pointer Function(RNG, ffi.Double, ffi.Double, + ffi.Pointer)>>('cv_RNG_uniformDouble'); + late final _cv_RNG_uniformDouble = _cv_RNG_uniformDoublePtr.asFunction< + ffi.Pointer Function( + RNG, double, double, ffi.Pointer)>(); - ffi.Pointer RotatedRect_BoundingRect( + ffi.Pointer cv_RotatedRect_boundingRect( RotatedRect rect, ffi.Pointer rval, ) { - return _RotatedRect_BoundingRect( + return _cv_RotatedRect_boundingRect( rect, rval, ); } - late final _RotatedRect_BoundingRectPtr = _lookup< + late final _cv_RotatedRect_boundingRectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - RotatedRect, ffi.Pointer)>>('RotatedRect_BoundingRect'); - late final _RotatedRect_BoundingRect = - _RotatedRect_BoundingRectPtr.asFunction< + ffi.Pointer Function(RotatedRect, + ffi.Pointer)>>('cv_RotatedRect_boundingRect'); + late final _cv_RotatedRect_boundingRect = + _cv_RotatedRect_boundingRectPtr.asFunction< ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); - ffi.Pointer RotatedRect_BoundingRect2f( + ffi.Pointer cv_RotatedRect_boundingRect2f( RotatedRect rect, ffi.Pointer rval, ) { - return _RotatedRect_BoundingRect2f( + return _cv_RotatedRect_boundingRect2f( rect, rval, ); } - late final _RotatedRect_BoundingRect2fPtr = _lookup< + late final _cv_RotatedRect_boundingRect2fPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(RotatedRect, - ffi.Pointer)>>('RotatedRect_BoundingRect2f'); - late final _RotatedRect_BoundingRect2f = - _RotatedRect_BoundingRect2fPtr.asFunction< + ffi.Pointer)>>('cv_RotatedRect_boundingRect2f'); + late final _cv_RotatedRect_boundingRect2f = + _cv_RotatedRect_boundingRect2fPtr.asFunction< ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); - ffi.Pointer RotatedRect_Points( + ffi.Pointer cv_RotatedRect_points( RotatedRect rect, ffi.Pointer pts, ) { - return _RotatedRect_Points( + return _cv_RotatedRect_points( rect, pts, ); } - late final _RotatedRect_PointsPtr = _lookup< + late final _cv_RotatedRect_pointsPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - RotatedRect, ffi.Pointer)>>('RotatedRect_Points'); - late final _RotatedRect_Points = _RotatedRect_PointsPtr.asFunction< + RotatedRect, ffi.Pointer)>>('cv_RotatedRect_points'); + late final _cv_RotatedRect_points = _cv_RotatedRect_pointsPtr.asFunction< ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); - ffi.Pointer SVD_Compute( - Mat src, - ffi.Pointer w, - ffi.Pointer u, - ffi.Pointer vt, - int flags, - ) { - return _SVD_Compute( - src, - w, - u, - vt, - flags, - ); - } - - late final _SVD_ComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, - ffi.Pointer, ffi.Pointer, ffi.Int)>>('SVD_Compute'); - late final _SVD_Compute = _SVD_ComputePtr.asFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, ffi.Pointer, ffi.Pointer, int)>(); - - ffi.Pointer SVD_Compute_Async( + ffi.Pointer cv_SVD_Compute( Mat src, + Mat w_r, + Mat u_r, + Mat vt_r, int flags, - imp1.CvCallback_3 callback, + imp1.CvCallback_0 callback, ) { - return _SVD_Compute_Async( + return _cv_SVD_Compute( src, + w_r, + u_r, + vt_r, flags, callback, ); } - late final _SVD_Compute_AsyncPtr = _lookup< + late final _cv_SVD_ComputePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_3)>>('SVD_Compute_Async'); - late final _SVD_Compute_Async = _SVD_Compute_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_3)>(); + ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Int, + imp1.CvCallback_0)>>('cv_SVD_Compute'); + late final _cv_SVD_Compute = _cv_SVD_ComputePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer SVD_backSubst( + ffi.Pointer cv_SVD_backSubst( Mat w, Mat u, Mat vt, Mat rhs, - ffi.Pointer dst, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _SVD_backSubst( + return _cv_SVD_backSubst( w, u, vt, rhs, dst, - ); - } - - late final _SVD_backSubstPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, ffi.Pointer)>>('SVD_backSubst'); - late final _SVD_backSubst = _SVD_backSubstPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer SVD_backSubst_Async( - Mat w, - Mat u, - Mat vt, - Mat rhs, - imp1.CvCallback_1 callback, - ) { - return _SVD_backSubst_Async( - w, - u, - vt, - rhs, callback, ); } - late final _SVD_backSubst_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, imp1.CvCallback_1)>>('SVD_backSubst_Async'); - late final _SVD_backSubst_Async = _SVD_backSubst_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer SetNumThreads( - int n, - ) { - return _SetNumThreads( - n, - ); - } - - late final _SetNumThreadsPtr = - _lookup Function(ffi.Int)>>( - 'SetNumThreads'); - late final _SetNumThreads = - _SetNumThreadsPtr.asFunction Function(int)>(); - - ffi.Pointer SetRNGSeed( - int seed, - ) { - return _SetRNGSeed( - seed, - ); - } - - late final _SetRNGSeedPtr = - _lookup Function(ffi.Int)>>( - 'SetRNGSeed'); - late final _SetRNGSeed = - _SetRNGSeedPtr.asFunction Function(int)>(); - - ffi.Pointer TheRNG( - ffi.Pointer rval, - ) { - return _TheRNG( - rval, - ); - } - - late final _TheRNGPtr = _lookup< - ffi.NativeFunction Function(ffi.Pointer)>>( - 'TheRNG'); - late final _TheRNG = - _TheRNGPtr.asFunction Function(ffi.Pointer)>(); - - ffi.Pointer Zeros( - int rows, - int cols, - int type, - ffi.Pointer rval, - ) { - return _Zeros( - rows, - cols, - type, - rval, - ); - } - - late final _ZerosPtr = _lookup< + late final _cv_SVD_backSubstPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Int, ffi.Int, ffi.Int, ffi.Pointer)>>('Zeros'); - late final _Zeros = _ZerosPtr.asFunction< - ffi.Pointer Function(int, int, int, ffi.Pointer)>(); + Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_SVD_backSubst'); + late final _cv_SVD_backSubst = _cv_SVD_backSubstPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_AbsDiff_Async( + ffi.Pointer cv_absdiff( Mat src1, Mat src2, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_AbsDiff_Async( + return _cv_absdiff( src1, src2, + dst, callback, ); } - late final _core_AbsDiff_AsyncPtr = _lookup< + late final _cv_absdiffPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_AbsDiff_Async'); - late final _core_AbsDiff_Async = _core_AbsDiff_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_absdiff'); + late final _cv_absdiff = _cv_absdiffPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_AddWeighted_Async( + ffi.Pointer cv_add( Mat src1, - double alpha, Mat src2, - double beta, - double gamma, + Mat dst, + Mat mask, int dtype, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_AddWeighted_Async( + return _cv_add( src1, - alpha, src2, - beta, - gamma, + dst, + mask, dtype, callback, ); } - late final _core_AddWeighted_AsyncPtr = _lookup< + late final _cv_addPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, - ffi.Double, - Mat, - ffi.Double, - ffi.Double, - ffi.Int, - imp1.CvCallback_1)>>('core_AddWeighted_Async'); - late final _core_AddWeighted_Async = _core_AddWeighted_AsyncPtr.asFunction< + Mat, Mat, Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_add'); + late final _cv_add = _cv_addPtr.asFunction< ffi.Pointer Function( - Mat, double, Mat, double, double, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Add_Async( + ffi.Pointer cv_addWeighted( Mat src1, + double alpha, Mat src2, - Mat mask, + double beta, + double gamma, + Mat dst, int dtype, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Add_Async( + return _cv_addWeighted( src1, + alpha, src2, - mask, + beta, + gamma, + dst, dtype, callback, ); } - late final _core_Add_AsyncPtr = _lookup< + late final _cv_addWeightedPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Int, imp1.CvCallback_1)>>('core_Add_Async'); - late final _core_Add_Async = _core_Add_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, ffi.Double, Mat, ffi.Double, + ffi.Double, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_addWeighted'); + late final _cv_addWeighted = _cv_addWeightedPtr.asFunction< + ffi.Pointer Function( + Mat, double, Mat, double, double, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_BatchDistance_Async( + ffi.Pointer cv_batchDistance( Mat src1, Mat src2, + Mat dist, int dtype, + Mat nidx, int normType, int K, Mat mask, int update, bool crosscheck, - imp1.CvCallback_2 callback, + imp1.CvCallback_0 callback, ) { - return _core_BatchDistance_Async( + return _cv_batchDistance( src1, src2, + dist, dtype, + nidx, normType, K, mask, @@ -6207,214 +3965,235 @@ class CvNativeCore { ); } - late final _core_BatchDistance_AsyncPtr = _lookup< + late final _cv_batchDistancePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( + Mat, Mat, Mat, ffi.Int, + Mat, ffi.Int, ffi.Int, Mat, ffi.Int, ffi.Bool, - imp1.CvCallback_2)>>('core_BatchDistance_Async'); - late final _core_BatchDistance_Async = - _core_BatchDistance_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, int, int, Mat, int, bool, imp1.CvCallback_2)>(); + imp1.CvCallback_0)>>('cv_batchDistance'); + late final _cv_batchDistance = _cv_batchDistancePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, int, Mat, int, int, Mat, + int, bool, imp1.CvCallback_0)>(); - ffi.Pointer core_BitwiseAndWithMask_Async( + ffi.Pointer cv_bitwise_and( Mat src1, Mat src2, - Mat mask, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_BitwiseAndWithMask_Async( + return _cv_bitwise_and( src1, src2, - mask, + dst, callback, ); } - late final _core_BitwiseAndWithMask_AsyncPtr = _lookup< + late final _cv_bitwise_andPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_1)>>('core_BitwiseAndWithMask_Async'); - late final _core_BitwiseAndWithMask_Async = - _core_BitwiseAndWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_bitwise_and'); + late final _cv_bitwise_and = _cv_bitwise_andPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_BitwiseAnd_Async( + ffi.Pointer cv_bitwise_and_1( Mat src1, Mat src2, - imp1.CvCallback_1 callback, + Mat dst, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _core_BitwiseAnd_Async( + return _cv_bitwise_and_1( src1, src2, + dst, + mask, callback, ); } - late final _core_BitwiseAnd_AsyncPtr = _lookup< + late final _cv_bitwise_and_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_BitwiseAnd_Async'); - late final _core_BitwiseAnd_Async = _core_BitwiseAnd_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_bitwise_and_1'); + late final _cv_bitwise_and_1 = _cv_bitwise_and_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_BitwiseNotWithMask_Async( + ffi.Pointer cv_bitwise_not( Mat src1, - Mat mask, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_BitwiseNotWithMask_Async( + return _cv_bitwise_not( src1, - mask, + dst, callback, ); } - late final _core_BitwiseNotWithMask_AsyncPtr = _lookup< + late final _cv_bitwise_notPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_BitwiseNotWithMask_Async'); - late final _core_BitwiseNotWithMask_Async = - _core_BitwiseNotWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_bitwise_not'); + late final _cv_bitwise_not = _cv_bitwise_notPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_BitwiseNot_Async( + ffi.Pointer cv_bitwise_not_1( Mat src1, - imp1.CvCallback_1 callback, + Mat dst, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _core_BitwiseNot_Async( + return _cv_bitwise_not_1( src1, + dst, + mask, callback, ); } - late final _core_BitwiseNot_AsyncPtr = _lookup< + late final _cv_bitwise_not_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_BitwiseNot_Async'); - late final _core_BitwiseNot_Async = _core_BitwiseNot_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_bitwise_not_1'); + late final _cv_bitwise_not_1 = _cv_bitwise_not_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_BitwiseOrWithMask_Async( + ffi.Pointer cv_bitwise_or( Mat src1, Mat src2, - Mat mask, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_BitwiseOrWithMask_Async( + return _cv_bitwise_or( src1, src2, - mask, + dst, callback, ); } - late final _core_BitwiseOrWithMask_AsyncPtr = _lookup< + late final _cv_bitwise_orPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_1)>>('core_BitwiseOrWithMask_Async'); - late final _core_BitwiseOrWithMask_Async = - _core_BitwiseOrWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_bitwise_or'); + late final _cv_bitwise_or = _cv_bitwise_orPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_BitwiseOr_Async( + ffi.Pointer cv_bitwise_or_1( Mat src1, Mat src2, - imp1.CvCallback_1 callback, + Mat dst, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _core_BitwiseOr_Async( + return _cv_bitwise_or_1( src1, src2, + dst, + mask, callback, ); } - late final _core_BitwiseOr_AsyncPtr = _lookup< + late final _cv_bitwise_or_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_BitwiseOr_Async'); - late final _core_BitwiseOr_Async = _core_BitwiseOr_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_bitwise_or_1'); + late final _cv_bitwise_or_1 = _cv_bitwise_or_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_BitwiseXorWithMask_Async( + ffi.Pointer cv_bitwise_xor( Mat src1, Mat src2, - Mat mask, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_BitwiseXorWithMask_Async( + return _cv_bitwise_xor( src1, src2, - mask, + dst, callback, ); } - late final _core_BitwiseXorWithMask_AsyncPtr = _lookup< + late final _cv_bitwise_xorPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_1)>>('core_BitwiseXorWithMask_Async'); - late final _core_BitwiseXorWithMask_Async = - _core_BitwiseXorWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_bitwise_xor'); + late final _cv_bitwise_xor = _cv_bitwise_xorPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_BitwiseXor_Async( + ffi.Pointer cv_bitwise_xor_1( Mat src1, Mat src2, - imp1.CvCallback_1 callback, + Mat dst, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _core_BitwiseXor_Async( + return _cv_bitwise_xor_1( src1, src2, + dst, + mask, callback, ); } - late final _core_BitwiseXor_AsyncPtr = _lookup< + late final _cv_bitwise_xor_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_BitwiseXor_Async'); - late final _core_BitwiseXor_Async = _core_BitwiseXor_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_bitwise_xor_1'); + late final _cv_bitwise_xor_1 = _cv_bitwise_xor_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_BorderInterpolate_Async( + ffi.Pointer cv_borderInterpolate( int p, int len, int borderType, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_BorderInterpolate_Async( + return _cv_borderInterpolate( p, len, borderType, + rval, callback, ); } - late final _core_BorderInterpolate_AsyncPtr = _lookup< + late final _cv_borderInterpolatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('core_BorderInterpolate_Async'); - late final _core_BorderInterpolate_Async = - _core_BorderInterpolate_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, int, imp1.CvCallback_1)>(); + ffi.Pointer Function( + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_borderInterpolate'); + late final _cv_borderInterpolate = _cv_borderInterpolatePtr.asFunction< + ffi.Pointer Function( + int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_CalcCovarMatrix_Async( + ffi.Pointer cv_calcCovarMatrix( Mat samples, + Mat covar, Mat mean, int flags, int ctype, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_CalcCovarMatrix_Async( + return _cv_calcCovarMatrix( samples, + covar, mean, flags, ctype, @@ -6422,135 +4201,177 @@ class CvNativeCore { ); } - late final _core_CalcCovarMatrix_AsyncPtr = _lookup< + late final _cv_calcCovarMatrixPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('core_CalcCovarMatrix_Async'); - late final _core_CalcCovarMatrix_Async = - _core_CalcCovarMatrix_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, ffi.Int, + imp1.CvCallback_0)>>('cv_calcCovarMatrix'); + late final _cv_calcCovarMatrix = _cv_calcCovarMatrixPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, int, int, imp1.CvCallback_0)>(); - ffi.Pointer core_CartToPolar_Async( + ffi.Pointer cv_cartToPolar( Mat x, Mat y, + Mat magnitude, + Mat angle, bool angleInDegrees, - imp1.CvCallback_2 callback, + imp1.CvCallback_0 callback, ) { - return _core_CartToPolar_Async( + return _cv_cartToPolar( x, y, + magnitude, + angle, angleInDegrees, callback, ); } - late final _core_CartToPolar_AsyncPtr = _lookup< + late final _cv_cartToPolarPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Bool, - imp1.CvCallback_2)>>('core_CartToPolar_Async'); - late final _core_CartToPolar_Async = _core_CartToPolar_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, bool, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Bool, + imp1.CvCallback_0)>>('cv_cartToPolar'); + late final _cv_cartToPolar = _cv_cartToPolarPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, bool, imp1.CvCallback_0)>(); - ffi.Pointer core_CheckRange_Async( + ffi.Pointer cv_checkRange( Mat self, bool quiet, + ffi.Pointer pos, double minVal, double maxVal, - imp1.CvCallback_2 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_CheckRange_Async( + return _cv_checkRange( self, quiet, + pos, minVal, maxVal, + rval, callback, ); } - late final _core_CheckRange_AsyncPtr = _lookup< + late final _cv_checkRangePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Bool, ffi.Double, ffi.Double, - imp1.CvCallback_2)>>('core_CheckRange_Async'); - late final _core_CheckRange_Async = _core_CheckRange_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, bool, double, double, imp1.CvCallback_2)>(); + ffi.Pointer Function( + Mat, + ffi.Bool, + ffi.Pointer, + ffi.Double, + ffi.Double, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_checkRange'); + late final _cv_checkRange = _cv_checkRangePtr.asFunction< + ffi.Pointer Function(Mat, bool, ffi.Pointer, double, + double, ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_colRange( + Mat self, + int start, + int end, + Mat rval, + imp1.CvCallback_0 callback, + ) { + return _cv_colRange( + self, + start, + end, + rval, + callback, + ); + } + + late final _cv_colRangePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, ffi.Int, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_colRange'); + late final _cv_colRange = _cv_colRangePtr.asFunction< + ffi.Pointer Function(Mat, int, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Compare_Async( + ffi.Pointer cv_compare( Mat src1, Mat src2, + Mat dst, int ct, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Compare_Async( + return _cv_compare( src1, src2, + dst, ct, callback, ); } - late final _core_Compare_AsyncPtr = _lookup< + late final _cv_comparePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, ffi.Int, imp1.CvCallback_1)>>('core_Compare_Async'); - late final _core_Compare_Async = _core_Compare_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_compare'); + late final _cv_compare = _cv_comparePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_CompleteSymm_Async( + ffi.Pointer cv_completeSymm( Mat self, bool lowerToUpper, imp1.CvCallback_0 callback, ) { - return _core_CompleteSymm_Async( + return _cv_completeSymm( self, lowerToUpper, callback, ); } - late final _core_CompleteSymm_AsyncPtr = _lookup< + late final _cv_completeSymmPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Bool, imp1.CvCallback_0)>>('core_CompleteSymm_Async'); - late final _core_CompleteSymm_Async = _core_CompleteSymm_AsyncPtr.asFunction< + Mat, ffi.Bool, imp1.CvCallback_0)>>('cv_completeSymm'); + late final _cv_completeSymm = _cv_completeSymmPtr.asFunction< ffi.Pointer Function(Mat, bool, imp1.CvCallback_0)>(); - ffi.Pointer core_ConvertScaleAbs_Async( + ffi.Pointer cv_convertScaleAbs( Mat src, + Mat dst, double alpha, double beta, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_ConvertScaleAbs_Async( + return _cv_convertScaleAbs( src, + dst, alpha, beta, callback, ); } - late final _core_ConvertScaleAbs_AsyncPtr = _lookup< + late final _cv_convertScaleAbsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, ffi.Double, - imp1.CvCallback_1)>>('core_ConvertScaleAbs_Async'); - late final _core_ConvertScaleAbs_Async = - _core_ConvertScaleAbs_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, double, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Double, + imp1.CvCallback_0)>>('cv_convertScaleAbs'); + late final _cv_convertScaleAbs = _cv_convertScaleAbsPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, double, imp1.CvCallback_0)>(); - ffi.Pointer core_CopyMakeBorder_Async( + ffi.Pointer cv_copyMakeBorder( Mat src, + Mat dst, int top, int bottom, int left, int right, int borderType, Scalar value, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_CopyMakeBorder_Async( + return _cv_copyMakeBorder( src, + dst, top, bottom, left, @@ -6561,9 +4382,10 @@ class CvNativeCore { ); } - late final _core_CopyMakeBorder_AsyncPtr = _lookup< + late final _cv_copyMakeBorderPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( + Mat, Mat, ffi.Int, ffi.Int, @@ -6571,372 +4393,435 @@ class CvNativeCore { ffi.Int, ffi.Int, Scalar, - imp1.CvCallback_1)>>('core_CopyMakeBorder_Async'); - late final _core_CopyMakeBorder_Async = - _core_CopyMakeBorder_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, int, int, Scalar, imp1.CvCallback_1)>(); + imp1.CvCallback_0)>>('cv_copyMakeBorder'); + late final _cv_copyMakeBorder = _cv_copyMakeBorderPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, int, int, int, int, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer core_CountNonZero_Async( + int cv_countNonZero( Mat src, - imp1.CvCallback_1 callback, ) { - return _core_CountNonZero_Async( + return _cv_countNonZero( src, - callback, ); } - late final _core_CountNonZero_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_CountNonZero_Async'); - late final _core_CountNonZero_Async = _core_CountNonZero_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + late final _cv_countNonZeroPtr = + _lookup>('cv_countNonZero'); + late final _cv_countNonZero = + _cv_countNonZeroPtr.asFunction(); - ffi.Pointer core_DCT_Async( + ffi.Pointer cv_dct( Mat src, + Mat dst, int flags, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_DCT_Async( + return _cv_dct( src, + dst, flags, callback, ); } - late final _core_DCT_AsyncPtr = _lookup< + late final _cv_dctPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('core_DCT_Async'); - late final _core_DCT_Async = _core_DCT_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_dct'); + late final _cv_dct = _cv_dctPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_DFT_Async( + ffi.Pointer cv_determinant( Mat self, - int flags, - int nonzeroRows, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_DFT_Async( + return _cv_determinant( self, - flags, - nonzeroRows, + rval, callback, ); } - late final _core_DFT_AsyncPtr = _lookup< + late final _cv_determinantPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, imp1.CvCallback_1)>>('core_DFT_Async'); - late final _core_DFT_Async = _core_DFT_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_determinant'); + late final _cv_determinant = _cv_determinantPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_Determinant_Async( - Mat self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_dft( + Mat src, + Mat dst, + int flags, + int nonzeroRows, + imp1.CvCallback_0 callback, ) { - return _core_Determinant_Async( - self, + return _cv_dft( + src, + dst, + flags, + nonzeroRows, callback, ); } - late final _core_Determinant_AsyncPtr = _lookup< + late final _cv_dftPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Determinant_Async'); - late final _core_Determinant_Async = _core_Determinant_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, ffi.Int, imp1.CvCallback_0)>>('cv_dft'); + late final _cv_dft = _cv_dftPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Divide_Async( + ffi.Pointer cv_divide( Mat src1, Mat src2, + Mat dst, double scale, int dtype, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Divide_Async( + return _cv_divide( src1, src2, + dst, scale, dtype, callback, ); } - late final _core_Divide_AsyncPtr = _lookup< + late final _cv_dividePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('core_Divide_Async'); - late final _core_Divide_Async = _core_Divide_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Double, ffi.Int, + imp1.CvCallback_0)>>('cv_divide'); + late final _cv_divide = _cv_dividePtr.asFunction< ffi.Pointer Function( - Mat, Mat, double, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, double, int, imp1.CvCallback_0)>(); - ffi.Pointer core_EigenNonSymmetric_Async( + ffi.Pointer cv_eigen( Mat src, - imp1.CvCallback_2 callback, + Mat eigenvalues, + Mat eigenvectors, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_EigenNonSymmetric_Async( + return _cv_eigen( src, + eigenvalues, + eigenvectors, + rval, callback, ); } - late final _core_EigenNonSymmetric_AsyncPtr = _lookup< + late final _cv_eigenPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_2)>>('core_EigenNonSymmetric_Async'); - late final _core_EigenNonSymmetric_Async = _core_EigenNonSymmetric_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_eigen'); + late final _cv_eigen = _cv_eigenPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_Eigen_Async( + ffi.Pointer cv_eigenNonSymmetric( Mat src, - imp1.CvCallback_3 callback, + Mat eigenvalues, + Mat eigenvectors, + imp1.CvCallback_0 callback, ) { - return _core_Eigen_Async( + return _cv_eigenNonSymmetric( src, + eigenvalues, + eigenvectors, callback, ); } - late final _core_Eigen_AsyncPtr = _lookup< + late final _cv_eigenNonSymmetricPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_3)>>('core_Eigen_Async'); - late final _core_Eigen_Async = _core_Eigen_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_3)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_eigenNonSymmetric'); + late final _cv_eigenNonSymmetric = _cv_eigenNonSymmetricPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Exp_Async( + ffi.Pointer cv_exp( Mat src, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_Exp_Async( + return _cv_exp( src, + dst, callback, ); } - late final _core_Exp_AsyncPtr = _lookup< + late final _cv_expPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Exp_Async'); - late final _core_Exp_Async = _core_Exp_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_exp'); + late final _cv_exp = _cv_expPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_ExtractChannel_Async( + ffi.Pointer cv_extractChannel( Mat src, + Mat dst, int coi, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_ExtractChannel_Async( + return _cv_extractChannel( src, + dst, coi, callback, ); } - late final _core_ExtractChannel_AsyncPtr = _lookup< + late final _cv_extractChannelPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('core_ExtractChannel_Async'); - late final _core_ExtractChannel_Async = - _core_ExtractChannel_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_extractChannel'); + late final _cv_extractChannel = _cv_extractChannelPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_FindNonZero_Async( + ffi.Pointer cv_findNonZero( Mat src, - imp1.CvCallback_1 callback, + Mat idx, + imp1.CvCallback_0 callback, ) { - return _core_FindNonZero_Async( + return _cv_findNonZero( src, + idx, callback, ); } - late final _core_FindNonZero_AsyncPtr = _lookup< + late final _cv_findNonZeroPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_FindNonZero_Async'); - late final _core_FindNonZero_Async = _core_FindNonZero_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_findNonZero'); + late final _cv_findNonZero = _cv_findNonZeroPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Flip_Async( + ffi.Pointer cv_flip( Mat src, + Mat dst, int flipCode, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Flip_Async( + return _cv_flip( src, + dst, flipCode, callback, ); } - late final _core_Flip_AsyncPtr = _lookup< + late final _cv_flipPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('core_Flip_Async'); - late final _core_Flip_Async = _core_Flip_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_flip'); + late final _cv_flip = _cv_flipPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Gemm_Async( + ffi.Pointer cv_gemm( Mat src1, Mat src2, double alpha, Mat src3, double beta, + Mat dst, int flags, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Gemm_Async( + return _cv_gemm( src1, src2, alpha, src3, beta, + dst, flags, callback, ); } - late final _core_Gemm_AsyncPtr = _lookup< + late final _cv_gemmPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, Mat, ffi.Double, Mat, ffi.Double, - ffi.Int, imp1.CvCallback_1)>>('core_Gemm_Async'); - late final _core_Gemm_Async = _core_Gemm_AsyncPtr.asFunction< + Mat, ffi.Int, imp1.CvCallback_0)>>('cv_gemm'); + late final _cv_gemm = _cv_gemmPtr.asFunction< ffi.Pointer Function( - Mat, Mat, double, Mat, double, int, imp1.CvCallback_1)>(); + Mat, Mat, double, Mat, double, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_GetOptimalDFTSize_Async( + int cv_getNumThreads() { + return _cv_getNumThreads(); + } + + late final _cv_getNumThreadsPtr = + _lookup>('cv_getNumThreads'); + late final _cv_getNumThreads = + _cv_getNumThreadsPtr.asFunction(); + + ffi.Pointer cv_getOptimalDFTSize( int vecsize, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_GetOptimalDFTSize_Async( + return _cv_getOptimalDFTSize( vecsize, + rval, callback, ); } - late final _core_GetOptimalDFTSize_AsyncPtr = _lookup< + late final _cv_getOptimalDFTSizePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, imp1.CvCallback_1)>>('core_GetOptimalDFTSize_Async'); - late final _core_GetOptimalDFTSize_Async = _core_GetOptimalDFTSize_AsyncPtr - .asFunction Function(int, imp1.CvCallback_1)>(); + ffi.Pointer Function(ffi.Int, ffi.Pointer, + imp1.CvCallback_0)>>('cv_getOptimalDFTSize'); + late final _cv_getOptimalDFTSize = _cv_getOptimalDFTSizePtr.asFunction< + ffi.Pointer Function( + int, ffi.Pointer, imp1.CvCallback_0)>(); + + int cv_getTickCount() { + return _cv_getTickCount(); + } + + late final _cv_getTickCountPtr = + _lookup>('cv_getTickCount'); + late final _cv_getTickCount = + _cv_getTickCountPtr.asFunction(); + + double cv_getTickFrequency() { + return _cv_getTickFrequency(); + } + + late final _cv_getTickFrequencyPtr = + _lookup>('cv_getTickFrequency'); + late final _cv_getTickFrequency = + _cv_getTickFrequencyPtr.asFunction(); - ffi.Pointer core_Hconcat_Async( + ffi.Pointer cv_hconcat( Mat src1, Mat src2, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_Hconcat_Async( + return _cv_hconcat( src1, src2, + dst, callback, ); } - late final _core_Hconcat_AsyncPtr = _lookup< + late final _cv_hconcatPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_Hconcat_Async'); - late final _core_Hconcat_Async = _core_Hconcat_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_hconcat'); + late final _cv_hconcat = _cv_hconcatPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Idct_Async( + ffi.Pointer cv_idct( Mat src, + Mat dst, int flags, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Idct_Async( + return _cv_idct( src, + dst, flags, callback, ); } - late final _core_Idct_AsyncPtr = _lookup< + late final _cv_idctPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('core_Idct_Async'); - late final _core_Idct_Async = _core_Idct_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_idct'); + late final _cv_idct = _cv_idctPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Idft_Async( + ffi.Pointer cv_idft( Mat src, + Mat dst, int flags, int nonzeroRows, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Idft_Async( + return _cv_idft( src, + dst, flags, nonzeroRows, callback, ); } - late final _core_Idft_AsyncPtr = _lookup< + late final _cv_idftPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, imp1.CvCallback_1)>>('core_Idft_Async'); - late final _core_Idft_Async = _core_Idft_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, ffi.Int, imp1.CvCallback_0)>>('cv_idft'); + late final _cv_idft = _cv_idftPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, int, imp1.CvCallback_0)>(); - ffi.Pointer core_InRangeWithScalar_Async( + ffi.Pointer cv_inRange( Mat src, - Scalar lowerb, - Scalar upperb, - imp1.CvCallback_1 callback, + Mat lowerb, + Mat upperb, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_InRangeWithScalar_Async( + return _cv_inRange( src, lowerb, upperb, + dst, callback, ); } - late final _core_InRangeWithScalar_AsyncPtr = _lookup< + late final _cv_inRangePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Scalar, Scalar, - imp1.CvCallback_1)>>('core_InRangeWithScalar_Async'); - late final _core_InRangeWithScalar_Async = - _core_InRangeWithScalar_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Scalar, Scalar, imp1.CvCallback_1)>(); + Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_inRange'); + late final _cv_inRange = _cv_inRangePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_InRange_Async( + ffi.Pointer cv_inRange_1( Mat src, - Mat lowerb, - Mat upperb, - imp1.CvCallback_1 callback, + Scalar lowerb, + Scalar upperb, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_InRange_Async( + return _cv_inRange_1( src, lowerb, upperb, + dst, callback, ); } - late final _core_InRange_AsyncPtr = _lookup< + late final _cv_inRange_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, imp1.CvCallback_1)>>('core_InRange_Async'); - late final _core_InRange_Async = _core_InRange_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); + Mat, Scalar, Scalar, Mat, imp1.CvCallback_0)>>('cv_inRange_1'); + late final _cv_inRange_1 = _cv_inRange_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Scalar, Scalar, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_InsertChannel_Async( + ffi.Pointer cv_insertChannel( Mat src, Mat dst, int coi, imp1.CvCallback_0 callback, ) { - return _core_InsertChannel_Async( + return _cv_insertChannel( src, dst, coi, @@ -6944,82 +4829,102 @@ class CvNativeCore { ); } - late final _core_InsertChannel_AsyncPtr = _lookup< + late final _cv_insertChannelPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, - imp1.CvCallback_0)>>('core_InsertChannel_Async'); - late final _core_InsertChannel_Async = - _core_InsertChannel_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_insertChannel'); + late final _cv_insertChannel = _cv_insertChannelPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Invert_Async( + ffi.Pointer cv_invert( Mat src, + Mat dst, int flags, - imp1.CvCallback_2 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_Invert_Async( + return _cv_invert( src, + dst, flags, + rval, callback, ); } - late final _core_Invert_AsyncPtr = _lookup< + late final _cv_invertPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_2)>>('core_Invert_Async'); - late final _core_Invert_Async = _core_Invert_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_invert'); + late final _cv_invert = _cv_invertPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_KMeans_Async( + ffi.Pointer cv_kmeans( Mat data, int k, Mat bestLabels, TermCriteria criteria, int attempts, int flags, - imp1.CvCallback_2 callback, + Mat centers, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_KMeans_Async( + return _cv_kmeans( data, k, bestLabels, criteria, attempts, flags, + centers, + rval, callback, ); } - late final _core_KMeans_AsyncPtr = _lookup< + late final _cv_kmeansPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, Mat, TermCriteria, - ffi.Int, ffi.Int, imp1.CvCallback_2)>>('core_KMeans_Async'); - late final _core_KMeans_Async = _core_KMeans_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, Mat, TermCriteria, int, int, imp1.CvCallback_2)>(); + ffi.Pointer Function( + Mat, + ffi.Int, + Mat, + TermCriteria, + ffi.Int, + ffi.Int, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_kmeans'); + late final _cv_kmeans = _cv_kmeansPtr.asFunction< + ffi.Pointer Function(Mat, int, Mat, TermCriteria, int, int, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_KMeans_Points_Async( + ffi.Pointer cv_kmeans_points( VecPoint2f pts, int k, Mat bestLabels, TermCriteria criteria, int attempts, int flags, - imp1.CvCallback_2 callback, + Mat centers, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_KMeans_Points_Async( + return _cv_kmeans_points( pts, k, bestLabels, criteria, attempts, flags, + centers, + rval, callback, ); } - late final _core_KMeans_Points_AsyncPtr = _lookup< + late final _cv_kmeans_pointsPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VecPoint2f, @@ -7028,276 +4933,239 @@ class CvNativeCore { TermCriteria, ffi.Int, ffi.Int, - imp1.CvCallback_2)>>('core_KMeans_Points_Async'); - late final _core_KMeans_Points_Async = - _core_KMeans_Points_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint2f, int, Mat, TermCriteria, - int, int, imp1.CvCallback_2)>(); - - ffi.Pointer core_LUT_Async( - Mat src, - Mat lut, - imp1.CvCallback_1 callback, - ) { - return _core_LUT_Async( - src, - lut, - callback, - ); - } - - late final _core_LUT_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_LUT_Async'); - late final _core_LUT_Async = _core_LUT_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_kmeans_points'); + late final _cv_kmeans_points = _cv_kmeans_pointsPtr.asFunction< + ffi.Pointer Function(VecPoint2f, int, Mat, TermCriteria, int, + int, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_Log_Async( + ffi.Pointer cv_log( Mat src, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_Log_Async( + return _cv_log( src, + dst, callback, ); } - late final _core_Log_AsyncPtr = _lookup< + late final _cv_logPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Log_Async'); - late final _core_Log_Async = _core_Log_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_log'); + late final _cv_log = _cv_logPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Magnitude_Async( + ffi.Pointer cv_magnitude( Mat x, Mat y, - imp1.CvCallback_1 callback, + Mat magnitude, + imp1.CvCallback_0 callback, ) { - return _core_Magnitude_Async( + return _cv_magnitude( x, y, + magnitude, callback, ); } - late final _core_Magnitude_AsyncPtr = _lookup< + late final _cv_magnitudePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_Magnitude_Async'); - late final _core_Magnitude_Async = _core_Magnitude_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_magnitude'); + late final _cv_magnitude = _cv_magnitudePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Max_Async( + ffi.Pointer cv_max( Mat src1, Mat src2, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_Max_Async( + return _cv_max( src1, src2, + dst, callback, ); } - late final _core_Max_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_Max_Async'); - late final _core_Max_Async = _core_Max_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer core_MeanStdDevWithMask_Async( - Mat src, - Mat mask, - imp1.CvCallback_2 callback, - ) { - return _core_MeanStdDevWithMask_Async( - src, - mask, - callback, - ); - } - - late final _core_MeanStdDevWithMask_AsyncPtr = _lookup< + late final _cv_maxPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_2)>>('core_MeanStdDevWithMask_Async'); - late final _core_MeanStdDevWithMask_Async = - _core_MeanStdDevWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_2)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_max'); + late final _cv_max = _cv_maxPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_MeanStdDev_Async( + ffi.Pointer cv_meanStdDev( Mat src, - imp1.CvCallback_2 callback, - ) { - return _core_MeanStdDev_Async( - src, - callback, - ); - } - - late final _core_MeanStdDev_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_2)>>('core_MeanStdDev_Async'); - late final _core_MeanStdDev_Async = _core_MeanStdDev_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_2)>(); - - ffi.Pointer core_MeanWithMask_Async( - Mat self, - Mat mask, - imp1.CvCallback_1 callback, - ) { - return _core_MeanWithMask_Async( - self, - mask, - callback, - ); - } - - late final _core_MeanWithMask_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_MeanWithMask_Async'); - late final _core_MeanWithMask_Async = _core_MeanWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer core_Mean_Async( - Mat self, - imp1.CvCallback_1 callback, - ) { - return _core_Mean_Async( - self, - callback, - ); - } - - late final _core_Mean_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Mean_Async'); - late final _core_Mean_Async = _core_Mean_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); - - ffi.Pointer core_Merge_Async( - VecMat mats, - imp1.CvCallback_1 callback, + ffi.Pointer dstMean, + ffi.Pointer dstStdDev, + imp1.CvCallback_0 callback, ) { - return _core_Merge_Async( - mats, + return _cv_meanStdDev( + src, + dstMean, + dstStdDev, callback, ); } - late final _core_Merge_AsyncPtr = _lookup< + late final _cv_meanStdDevPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - VecMat, imp1.CvCallback_1)>>('core_Merge_Async'); - late final _core_Merge_Async = _core_Merge_AsyncPtr - .asFunction Function(VecMat, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>>('cv_meanStdDev'); + late final _cv_meanStdDev = _cv_meanStdDevPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_MinMaxIdx_Async( - Mat self, - imp1.CvCallback_4 callback, + ffi.Pointer cv_meanStdDev_1( + Mat src, + ffi.Pointer dstMean, + ffi.Pointer dstStdDev, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _core_MinMaxIdx_Async( - self, + return _cv_meanStdDev_1( + src, + dstMean, + dstStdDev, + mask, callback, ); } - late final _core_MinMaxIdx_AsyncPtr = _lookup< + late final _cv_meanStdDev_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_4)>>('core_MinMaxIdx_Async'); - late final _core_MinMaxIdx_Async = _core_MinMaxIdx_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_4)>(); + ffi.Pointer Function(Mat, ffi.Pointer, + ffi.Pointer, Mat, imp1.CvCallback_0)>>('cv_meanStdDev_1'); + late final _cv_meanStdDev_1 = _cv_meanStdDev_1Ptr.asFunction< + ffi.Pointer Function(Mat, ffi.Pointer, + ffi.Pointer, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_MinMaxIdx_Mask_Async( - Mat self, - Mat mask, - imp1.CvCallback_4 callback, + ffi.Pointer cv_merge( + VecMat mats, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_MinMaxIdx_Mask_Async( - self, - mask, + return _cv_merge( + mats, + dst, callback, ); } - late final _core_MinMaxIdx_Mask_AsyncPtr = _lookup< + late final _cv_mergePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_4)>>('core_MinMaxIdx_Mask_Async'); - late final _core_MinMaxIdx_Mask_Async = - _core_MinMaxIdx_Mask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_4)>(); + VecMat, Mat, imp1.CvCallback_0)>>('cv_merge'); + late final _cv_merge = _cv_mergePtr.asFunction< + ffi.Pointer Function(VecMat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_MinMaxLoc_Async( - Mat self, - imp1.CvCallback_4 callback, + ffi.Pointer cv_min( + Mat src1, + Mat src2, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_MinMaxLoc_Async( - self, + return _cv_min( + src1, + src2, + dst, callback, ); } - late final _core_MinMaxLoc_AsyncPtr = _lookup< + late final _cv_minPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_4)>>('core_MinMaxLoc_Async'); - late final _core_MinMaxLoc_Async = _core_MinMaxLoc_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_4)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_min'); + late final _cv_min = _cv_minPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_MinMaxLoc_Mask_Async( + ffi.Pointer cv_minMaxIdx( Mat self, - Mat mask, - imp1.CvCallback_4 callback, + ffi.Pointer minVal, + ffi.Pointer maxVal, + ffi.Pointer minIdx, + ffi.Pointer maxIdx, + imp1.CvCallback_0 callback, ) { - return _core_MinMaxLoc_Mask_Async( + return _cv_minMaxIdx( self, - mask, + minVal, + maxVal, + minIdx, + maxIdx, callback, ); } - late final _core_MinMaxLoc_Mask_AsyncPtr = _lookup< + late final _cv_minMaxIdxPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_4)>>('core_MinMaxLoc_Mask_Async'); - late final _core_MinMaxLoc_Mask_Async = - _core_MinMaxLoc_Mask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_4)>(); + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_minMaxIdx'); + late final _cv_minMaxIdx = _cv_minMaxIdxPtr.asFunction< + ffi.Pointer Function( + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer core_Min_Async( - Mat src1, - Mat src2, - imp1.CvCallback_1 callback, + ffi.Pointer cv_minMaxLoc( + Mat self, + ffi.Pointer minVal, + ffi.Pointer maxVal, + ffi.Pointer minLoc, + ffi.Pointer maxLoc, + imp1.CvCallback_0 callback, ) { - return _core_Min_Async( - src1, - src2, + return _cv_minMaxLoc( + self, + minVal, + maxVal, + minLoc, + maxLoc, callback, ); } - late final _core_Min_AsyncPtr = _lookup< + late final _cv_minMaxLocPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_Min_Async'); - late final _core_Min_Async = _core_Min_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_minMaxLoc'); + late final _cv_minMaxLoc = _cv_minMaxLocPtr.asFunction< + ffi.Pointer Function( + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer core_MixChannels_Async( + ffi.Pointer cv_mixChannels( VecMat src, VecMat dst, VecI32 fromTo, imp1.CvCallback_0 callback, ) { - return _core_MixChannels_Async( + return _cv_mixChannels( src, dst, fromTo, @@ -7305,909 +5173,842 @@ class CvNativeCore { ); } - late final _core_MixChannels_AsyncPtr = _lookup< + late final _cv_mixChannelsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecMat, VecMat, VecI32, - imp1.CvCallback_0)>>('core_MixChannels_Async'); - late final _core_MixChannels_Async = _core_MixChannels_AsyncPtr.asFunction< + ffi.Pointer Function( + VecMat, VecMat, VecI32, imp1.CvCallback_0)>>('cv_mixChannels'); + late final _cv_mixChannels = _cv_mixChannelsPtr.asFunction< ffi.Pointer Function( VecMat, VecMat, VecI32, imp1.CvCallback_0)>(); - ffi.Pointer core_MulSpectrums_Async( + ffi.Pointer cv_mulSpectrums( Mat a, Mat b, + Mat c, int flags, bool conjB, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_MulSpectrums_Async( + return _cv_mulSpectrums( a, b, + c, flags, conjB, callback, ); } - late final _core_MulSpectrums_AsyncPtr = _lookup< + late final _cv_mulSpectrumsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Bool, - imp1.CvCallback_1)>>('core_MulSpectrums_Async'); - late final _core_MulSpectrums_Async = _core_MulSpectrums_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, bool, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, ffi.Bool, + imp1.CvCallback_0)>>('cv_mulSpectrums'); + late final _cv_mulSpectrums = _cv_mulSpectrumsPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, int, bool, imp1.CvCallback_0)>(); - ffi.Pointer core_MultiplyWithParams_Async( + ffi.Pointer cv_multiply( Mat src1, Mat src2, + Mat dst, double scale, int dtype, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_MultiplyWithParams_Async( + return _cv_multiply( src1, src2, + dst, scale, dtype, callback, ); } - late final _core_MultiplyWithParams_AsyncPtr = _lookup< + late final _cv_multiplyPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('core_MultiplyWithParams_Async'); - late final _core_MultiplyWithParams_Async = - _core_MultiplyWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer core_Multiply_Async( - Mat src1, - Mat src2, - imp1.CvCallback_1 callback, - ) { - return _core_Multiply_Async( - src1, - src2, - callback, - ); - } - - late final _core_Multiply_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_Multiply_Async'); - late final _core_Multiply_Async = _core_Multiply_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer core_NormWithMats_Async( - Mat src1, - Mat src2, - int normType, - imp1.CvCallback_1 callback, - ) { - return _core_NormWithMats_Async( - src1, - src2, - normType, - callback, - ); - } - - late final _core_NormWithMats_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, - imp1.CvCallback_1)>>('core_NormWithMats_Async'); - late final _core_NormWithMats_Async = _core_NormWithMats_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Double, ffi.Int, + imp1.CvCallback_0)>>('cv_multiply'); + late final _cv_multiply = _cv_multiplyPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, double, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Norm_Async( + ffi.Pointer cv_norm( Mat src1, int normType, - imp1.CvCallback_1 callback, + Mat mask, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_Norm_Async( + return _cv_norm( src1, normType, + mask, + rval, callback, ); } - late final _core_Norm_AsyncPtr = _lookup< + late final _cv_normPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('core_Norm_Async'); - late final _core_Norm_Async = _core_Norm_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, ffi.Int, Mat, + ffi.Pointer, imp1.CvCallback_0)>>('cv_norm'); + late final _cv_norm = _cv_normPtr.asFunction< + ffi.Pointer Function( + Mat, int, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_Norm_Mask_Async( + ffi.Pointer cv_norm_1( Mat src1, + Mat src2, int normType, Mat mask, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_Norm_Mask_Async( + return _cv_norm_1( src1, + src2, normType, mask, + rval, callback, ); } - late final _core_Norm_Mask_AsyncPtr = _lookup< + late final _cv_norm_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, Mat, imp1.CvCallback_1)>>('core_Norm_Mask_Async'); - late final _core_Norm_Mask_Async = _core_Norm_Mask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, Mat, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, + ffi.Pointer, imp1.CvCallback_0)>>('cv_norm_1'); + late final _cv_norm_1 = _cv_norm_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_Normalize_Async( + ffi.Pointer cv_normalize( Mat src, Mat dst, double alpha, double beta, int typ, int dtype, + Mat mask, imp1.CvCallback_0 callback, ) { - return _core_Normalize_Async( + return _cv_normalize( src, dst, alpha, beta, typ, dtype, + mask, callback, ); } - late final _core_Normalize_AsyncPtr = _lookup< + late final _cv_normalizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Double, - ffi.Int, ffi.Int, imp1.CvCallback_0)>>('core_Normalize_Async'); - late final _core_Normalize_Async = _core_Normalize_AsyncPtr.asFunction< + ffi.Int, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_normalize'); + late final _cv_normalize = _cv_normalizePtr.asFunction< ffi.Pointer Function( - Mat, Mat, double, double, int, int, imp1.CvCallback_0)>(); + Mat, Mat, double, double, int, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Normalize_Mask_Async( + ffi.Pointer cv_perspectiveTransform( Mat src, Mat dst, - double alpha, - double beta, - int typ, - int dtype, - Mat mask, + Mat tm, imp1.CvCallback_0 callback, ) { - return _core_Normalize_Mask_Async( + return _cv_perspectiveTransform( src, dst, - alpha, - beta, - typ, - dtype, - mask, + tm, callback, ); } - late final _core_Normalize_Mask_AsyncPtr = _lookup< + late final _cv_perspectiveTransformPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, - Mat, - ffi.Double, - ffi.Double, - ffi.Int, - ffi.Int, - Mat, - imp1.CvCallback_0)>>('core_Normalize_Mask_Async'); - late final _core_Normalize_Mask_Async = - _core_Normalize_Mask_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, double, int, int, Mat, imp1.CvCallback_0)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_perspectiveTransform'); + late final _cv_perspectiveTransform = _cv_perspectiveTransformPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_PCABackProject_Async( - Mat src, - Mat mean, - Mat eigenvectors, - imp1.CvCallback_1 callback, + ffi.Pointer cv_phase( + Mat x, + Mat y, + Mat angle, + bool angleInDegrees, + imp1.CvCallback_0 callback, ) { - return _core_PCABackProject_Async( - src, - mean, - eigenvectors, + return _cv_phase( + x, + y, + angle, + angleInDegrees, callback, ); } - late final _core_PCABackProject_AsyncPtr = _lookup< + late final _cv_phasePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, imp1.CvCallback_1)>>('core_PCABackProject_Async'); - late final _core_PCABackProject_Async = - _core_PCABackProject_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer core_PCACompute_1_Async( - Mat src, - Mat mean, - int maxComponents, - imp1.CvCallback_1 callback, - ) { - return _core_PCACompute_1_Async( - src, - mean, - maxComponents, - callback, - ); - } - - late final _core_PCACompute_1_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, - imp1.CvCallback_1)>>('core_PCACompute_1_Async'); - late final _core_PCACompute_1_Async = _core_PCACompute_1_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_1)>(); - - ffi.Pointer core_PCACompute_2_Async( - Mat src, - Mat mean, - double retainedVariance, - imp1.CvCallback_2 callback, - ) { - return _core_PCACompute_2_Async( - src, - mean, - retainedVariance, - callback, - ); - } - - late final _core_PCACompute_2_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, - imp1.CvCallback_2)>>('core_PCACompute_2_Async'); - late final _core_PCACompute_2_Async = _core_PCACompute_2_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, imp1.CvCallback_2)>(); - - ffi.Pointer core_PCACompute_3_Async( - Mat src, - Mat mean, - double retainedVariance, - imp1.CvCallback_1 callback, - ) { - return _core_PCACompute_3_Async( - src, - mean, - retainedVariance, - callback, - ); - } - - late final _core_PCACompute_3_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, - imp1.CvCallback_1)>>('core_PCACompute_3_Async'); - late final _core_PCACompute_3_Async = _core_PCACompute_3_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, imp1.CvCallback_1)>(); + Mat, Mat, Mat, ffi.Bool, imp1.CvCallback_0)>>('cv_phase'); + late final _cv_phase = _cv_phasePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, bool, imp1.CvCallback_0)>(); - ffi.Pointer core_PCACompute_Async( - Mat src, - Mat mean, - int maxComponents, - imp1.CvCallback_2 callback, + ffi.Pointer cv_polarToCart( + Mat magnitude, + Mat degree, + Mat x, + Mat y, + bool angleInDegrees, + imp1.CvCallback_0 callback, ) { - return _core_PCACompute_Async( - src, - mean, - maxComponents, + return _cv_polarToCart( + magnitude, + degree, + x, + y, + angleInDegrees, callback, ); } - late final _core_PCACompute_AsyncPtr = _lookup< + late final _cv_polarToCartPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, imp1.CvCallback_2)>>('core_PCACompute_Async'); - late final _core_PCACompute_Async = _core_PCACompute_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Bool, + imp1.CvCallback_0)>>('cv_polarToCart'); + late final _cv_polarToCart = _cv_polarToCartPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, bool, imp1.CvCallback_0)>(); - ffi.Pointer core_PCAProject_Async( + ffi.Pointer cv_pow( Mat src, - Mat mean, - Mat eigenvectors, - imp1.CvCallback_1 callback, + double power, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_PCAProject_Async( + return _cv_pow( src, - mean, - eigenvectors, + power, + dst, callback, ); } - late final _core_PCAProject_AsyncPtr = _lookup< + late final _cv_powPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, imp1.CvCallback_1)>>('core_PCAProject_Async'); - late final _core_PCAProject_Async = _core_PCAProject_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_1)>(); + Mat, ffi.Double, Mat, imp1.CvCallback_0)>>('cv_pow'); + late final _cv_pow = _cv_powPtr.asFunction< + ffi.Pointer Function(Mat, double, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_PatchNaNs_Async( - Mat self, - double val, + ffi.Pointer cv_randShuffle( + Mat mat, imp1.CvCallback_0 callback, ) { - return _core_PatchNaNs_Async( - self, - val, + return _cv_randShuffle( + mat, callback, ); } - late final _core_PatchNaNs_AsyncPtr = _lookup< + late final _cv_randShufflePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Double, imp1.CvCallback_0)>>('core_PatchNaNs_Async'); - late final _core_PatchNaNs_Async = _core_PatchNaNs_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, double, imp1.CvCallback_0)>(); + Mat, imp1.CvCallback_0)>>('cv_randShuffle'); + late final _cv_randShuffle = _cv_randShufflePtr + .asFunction Function(Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_PerspectiveTransform_Async( - Mat src, - Mat tm, - imp1.CvCallback_1 callback, + ffi.Pointer cv_randShuffle_1( + Mat mat, + double iterFactor, + RNG rng, + imp1.CvCallback_0 callback, ) { - return _core_PerspectiveTransform_Async( - src, - tm, + return _cv_randShuffle_1( + mat, + iterFactor, + rng, callback, ); } - late final _core_PerspectiveTransform_AsyncPtr = _lookup< + late final _cv_randShuffle_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_PerspectiveTransform_Async'); - late final _core_PerspectiveTransform_Async = - _core_PerspectiveTransform_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, ffi.Double, RNG, imp1.CvCallback_0)>>('cv_randShuffle_1'); + late final _cv_randShuffle_1 = _cv_randShuffle_1Ptr.asFunction< + ffi.Pointer Function(Mat, double, RNG, imp1.CvCallback_0)>(); - ffi.Pointer core_Phase_Async( - Mat x, - Mat y, - bool angleInDegrees, - imp1.CvCallback_1 callback, + ffi.Pointer cv_randn( + Mat mat, + Scalar mean, + Scalar stddev, + imp1.CvCallback_0 callback, ) { - return _core_Phase_Async( - x, - y, - angleInDegrees, + return _cv_randn( + mat, + mean, + stddev, callback, ); } - late final _core_Phase_AsyncPtr = _lookup< + late final _cv_randnPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, ffi.Bool, imp1.CvCallback_1)>>('core_Phase_Async'); - late final _core_Phase_Async = _core_Phase_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, bool, imp1.CvCallback_1)>(); + Mat, Scalar, Scalar, imp1.CvCallback_0)>>('cv_randn'); + late final _cv_randn = _cv_randnPtr.asFunction< + ffi.Pointer Function(Mat, Scalar, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer core_PolarToCart_Async( - Mat magnitude, - Mat degree, - bool angleInDegrees, - imp1.CvCallback_2 callback, + ffi.Pointer cv_randu( + Mat mat, + Scalar low, + Scalar high, + imp1.CvCallback_0 callback, ) { - return _core_PolarToCart_Async( - magnitude, - degree, - angleInDegrees, + return _cv_randu( + mat, + low, + high, callback, ); } - late final _core_PolarToCart_AsyncPtr = _lookup< + late final _cv_randuPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Bool, - imp1.CvCallback_2)>>('core_PolarToCart_Async'); - late final _core_PolarToCart_Async = _core_PolarToCart_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, bool, imp1.CvCallback_2)>(); + ffi.Pointer Function( + Mat, Scalar, Scalar, imp1.CvCallback_0)>>('cv_randu'); + late final _cv_randu = _cv_randuPtr.asFunction< + ffi.Pointer Function(Mat, Scalar, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer core_Pow_Async( + ffi.Pointer cv_reduce( Mat src, - double power, - imp1.CvCallback_1 callback, + Mat dst, + int dim, + int rType, + int dType, + imp1.CvCallback_0 callback, ) { - return _core_Pow_Async( + return _cv_reduce( src, - power, + dst, + dim, + rType, + dType, callback, ); } - late final _core_Pow_AsyncPtr = _lookup< + late final _cv_reducePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Double, imp1.CvCallback_1)>>('core_Pow_Async'); - late final _core_Pow_Async = _core_Pow_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, double, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, ffi.Int, + imp1.CvCallback_0)>>('cv_reduce'); + late final _cv_reduce = _cv_reducePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, int, int, imp1.CvCallback_0)>(); - ffi.Pointer core_ReduceArgMax_Async( + ffi.Pointer cv_reduceArgMax( Mat src, + Mat dst, int axis, bool lastIndex, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_ReduceArgMax_Async( + return _cv_reduceArgMax( src, + dst, axis, lastIndex, callback, ); } - late final _core_ReduceArgMax_AsyncPtr = _lookup< + late final _cv_reduceArgMaxPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Bool, - imp1.CvCallback_1)>>('core_ReduceArgMax_Async'); - late final _core_ReduceArgMax_Async = _core_ReduceArgMax_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, bool, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Bool, + imp1.CvCallback_0)>>('cv_reduceArgMax'); + late final _cv_reduceArgMax = _cv_reduceArgMaxPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, bool, imp1.CvCallback_0)>(); - ffi.Pointer core_ReduceArgMin_Async( + ffi.Pointer cv_reduceArgMin( Mat src, + Mat dst, int axis, bool lastIndex, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_ReduceArgMin_Async( + return _cv_reduceArgMin( src, + dst, axis, lastIndex, callback, ); } - late final _core_ReduceArgMin_AsyncPtr = _lookup< + late final _cv_reduceArgMinPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Bool, - imp1.CvCallback_1)>>('core_ReduceArgMin_Async'); - late final _core_ReduceArgMin_Async = _core_ReduceArgMin_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, bool, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Bool, + imp1.CvCallback_0)>>('cv_reduceArgMin'); + late final _cv_reduceArgMin = _cv_reduceArgMinPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, bool, imp1.CvCallback_0)>(); - ffi.Pointer core_Reduce_Async( + ffi.Pointer cv_repeat( Mat src, - int dim, - int rType, - int dType, - imp1.CvCallback_1 callback, + int nY, + int nX, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_Reduce_Async( + return _cv_repeat( src, - dim, - rType, - dType, + nY, + nX, + dst, callback, ); } - late final _core_Reduce_AsyncPtr = _lookup< + late final _cv_repeatPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('core_Reduce_Async'); - late final _core_Reduce_Async = _core_Reduce_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, int, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, ffi.Int, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_repeat'); + late final _cv_repeat = _cv_repeatPtr.asFunction< + ffi.Pointer Function(Mat, int, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Repeat_Async( + ffi.Pointer cv_rotate( Mat src, - int nY, - int nX, - imp1.CvCallback_1 callback, + Mat dst, + int rotateCode, + imp1.CvCallback_0 callback, ) { - return _core_Repeat_Async( + return _cv_rotate( src, - nY, - nX, + dst, + rotateCode, callback, ); } - late final _core_Repeat_AsyncPtr = _lookup< + late final _cv_rotatePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, imp1.CvCallback_1)>>('core_Repeat_Async'); - late final _core_Repeat_Async = _core_Repeat_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_rotate'); + late final _cv_rotate = _cv_rotatePtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Rotate_Async( - Mat src, - int rotateCode, - imp1.CvCallback_1 callback, + ffi.Pointer cv_rowRange( + Mat self, + int start, + int end, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _core_Rotate_Async( - src, - rotateCode, + return _cv_rowRange( + self, + start, + end, + rval, callback, ); } - late final _core_Rotate_AsyncPtr = _lookup< + late final _cv_rowRangePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('core_Rotate_Async'); - late final _core_Rotate_Async = _core_Rotate_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + Mat, ffi.Int, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_rowRange'); + late final _cv_rowRange = _cv_rowRangePtr.asFunction< + ffi.Pointer Function(Mat, int, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_ScaleAdd_Async( + ffi.Pointer cv_scaleAdd( Mat src1, double alpha, Mat src2, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_ScaleAdd_Async( + return _cv_scaleAdd( src1, alpha, src2, + dst, callback, ); } - late final _core_ScaleAdd_AsyncPtr = _lookup< + late final _cv_scaleAddPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Double, Mat, imp1.CvCallback_1)>>('core_ScaleAdd_Async'); - late final _core_ScaleAdd_Async = _core_ScaleAdd_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, double, Mat, imp1.CvCallback_1)>(); + Mat, ffi.Double, Mat, Mat, imp1.CvCallback_0)>>('cv_scaleAdd'); + late final _cv_scaleAdd = _cv_scaleAddPtr.asFunction< + ffi.Pointer Function( + Mat, double, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_SetIdentity_Async( + ffi.Pointer cv_setIdentity( Mat src, - Scalar scalar, + double scalar, imp1.CvCallback_0 callback, ) { - return _core_SetIdentity_Async( + return _cv_setIdentity( src, scalar, callback, ); } - late final _core_SetIdentity_AsyncPtr = _lookup< + late final _cv_setIdentityPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Scalar, imp1.CvCallback_0)>>('core_SetIdentity_Async'); - late final _core_SetIdentity_Async = _core_SetIdentity_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Scalar, imp1.CvCallback_0)>(); + Mat, ffi.Double, imp1.CvCallback_0)>>('cv_setIdentity'); + late final _cv_setIdentity = _cv_setIdentityPtr.asFunction< + ffi.Pointer Function(Mat, double, imp1.CvCallback_0)>(); - ffi.Pointer core_SolveCubic_Async( - Mat coeffs, - imp1.CvCallback_2 callback, + void cv_setNumThreads( + int n, ) { - return _core_SolveCubic_Async( - coeffs, - callback, + return _cv_setNumThreads( + n, ); } - late final _core_SolveCubic_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_2)>>('core_SolveCubic_Async'); - late final _core_SolveCubic_Async = _core_SolveCubic_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_2)>(); + late final _cv_setNumThreadsPtr = + _lookup>( + 'cv_setNumThreads'); + late final _cv_setNumThreads = + _cv_setNumThreadsPtr.asFunction(); - ffi.Pointer core_SolvePoly_Async( - Mat coeffs, - int maxIters, - imp1.CvCallback_2 callback, + ffi.Pointer cv_setRNGSeed( + int seed, ) { - return _core_SolvePoly_Async( - coeffs, - maxIters, - callback, + return _cv_setRNGSeed( + seed, ); } - late final _core_SolvePoly_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_2)>>('core_SolvePoly_Async'); - late final _core_SolvePoly_Async = _core_SolvePoly_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_2)>(); + late final _cv_setRNGSeedPtr = + _lookup Function(ffi.Int)>>( + 'cv_setRNGSeed'); + late final _cv_setRNGSeed = + _cv_setRNGSeedPtr.asFunction Function(int)>(); - ffi.Pointer core_Solve_Async( + ffi.Pointer cv_solve( Mat src1, Mat src2, + Mat dst, int flags, - imp1.CvCallback_2 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_Solve_Async( + return _cv_solve( src1, src2, + dst, flags, + rval, callback, ); } - late final _core_Solve_AsyncPtr = _lookup< + late final _cv_solvePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, imp1.CvCallback_2)>>('core_Solve_Async'); - late final _core_Solve_Async = _core_Solve_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_solve'); + late final _cv_solve = _cv_solvePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_SortIdx_Async( - Mat src, - int flags, - imp1.CvCallback_1 callback, + ffi.Pointer cv_solveCubic( + Mat coeffs, + Mat roots, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_SortIdx_Async( - src, - flags, + return _cv_solveCubic( + coeffs, + roots, + rval, callback, ); } - late final _core_SortIdx_AsyncPtr = _lookup< + late final _cv_solveCubicPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('core_SortIdx_Async'); - late final _core_SortIdx_Async = _core_SortIdx_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_solveCubic'); + late final _cv_solveCubic = _cv_solveCubicPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_solvePoly( + Mat coeffs, + Mat roots, + int maxIters, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_solvePoly( + coeffs, + roots, + maxIters, + rval, + callback, + ); + } + + late final _cv_solvePolyPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_solvePoly'); + late final _cv_solvePoly = _cv_solvePolyPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_Sort_Async( + ffi.Pointer cv_sort( Mat src, + Mat dst, int flags, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Sort_Async( + return _cv_sort( src, + dst, flags, callback, ); } - late final _core_Sort_AsyncPtr = _lookup< + late final _cv_sortPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('core_Sort_Async'); - late final _core_Sort_Async = _core_Sort_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_sort'); + late final _cv_sort = _cv_sortPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Split_Async( + ffi.Pointer cv_sortIdx( Mat src, - imp1.CvCallback_1 callback, + Mat dst, + int flags, + imp1.CvCallback_0 callback, ) { - return _core_Split_Async( + return _cv_sortIdx( src, + dst, + flags, callback, ); } - late final _core_Split_AsyncPtr = _lookup< + late final _cv_sortIdxPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Split_Async'); - late final _core_Split_Async = _core_Split_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_sortIdx'); + late final _cv_sortIdx = _cv_sortIdxPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Sqrt_Async( - Mat self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_split( + Mat src, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_Sqrt_Async( - self, + return _cv_split( + src, + rval, callback, ); } - late final _core_Sqrt_AsyncPtr = _lookup< + late final _cv_splitPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Sqrt_Async'); - late final _core_Sqrt_Async = _core_Sqrt_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_split'); + late final _cv_split = _cv_splitPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_Subtract_Async( + ffi.Pointer cv_subtract( Mat src1, Mat src2, + Mat dst, Mat mask, int dtype, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Subtract_Async( + return _cv_subtract( src1, src2, + dst, mask, dtype, callback, ); } - late final _core_Subtract_AsyncPtr = _lookup< + late final _cv_subtractPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, - imp1.CvCallback_1)>>('core_Subtract_Async'); - late final _core_Subtract_Async = _core_Subtract_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, Mat, Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_subtract'); + late final _cv_subtract = _cv_subtractPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer core_Sum_Async( + ffi.Pointer cv_sum( Mat src, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_Sum_Async( + return _cv_sum( src, + rval, callback, ); } - late final _core_Sum_AsyncPtr = _lookup< + late final _cv_sumPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Sum_Async'); - late final _core_Sum_Async = _core_Sum_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_sum'); + late final _cv_sum = _cv_sumPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_T_Async( - Mat x, - imp1.CvCallback_1 callback, + ffi.Pointer cv_theRNG( + imp1.RNGPtr rval, ) { - return _core_T_Async( - x, - callback, + return _cv_theRNG( + rval, ); } - late final _core_T_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_T_Async'); - late final _core_T_Async = _core_T_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + late final _cv_theRNGPtr = + _lookup Function(imp1.RNGPtr)>>( + 'cv_theRNG'); + late final _cv_theRNG = + _cv_theRNGPtr.asFunction Function(imp1.RNGPtr)>(); - ffi.Pointer core_Trace_Async( + ffi.Pointer cv_trace( Mat src, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _core_Trace_Async( + return _cv_trace( src, + rval, callback, ); } - late final _core_Trace_AsyncPtr = _lookup< + late final _cv_tracePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Trace_Async'); - late final _core_Trace_Async = _core_Trace_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_trace'); + late final _cv_trace = _cv_tracePtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer core_Transform_Async( + ffi.Pointer cv_transform( Mat src, + Mat dst, Mat tm, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _core_Transform_Async( + return _cv_transform( src, + dst, tm, callback, ); } - late final _core_Transform_AsyncPtr = _lookup< + late final _cv_transformPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_Transform_Async'); - late final _core_Transform_Async = _core_Transform_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_transform'); + late final _cv_transform = _cv_transformPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Transpose_Async( + ffi.Pointer cv_transpose( Mat src, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_Transpose_Async( + return _cv_transpose( src, + dst, callback, ); } - late final _core_Transpose_AsyncPtr = _lookup< + late final _cv_transposePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('core_Transpose_Async'); - late final _core_Transpose_Async = _core_Transpose_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_transpose'); + late final _cv_transpose = _cv_transposePtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer core_Vconcat_Async( - Mat src1, - Mat src2, - imp1.CvCallback_1 callback, + ffi.Pointer cv_transposeND( + Mat src, + Mat dst, + VecI32 order, + imp1.CvCallback_0 callback, ) { - return _core_Vconcat_Async( - src1, - src2, + return _cv_transposeND( + src, + dst, + order, callback, ); } - late final _core_Vconcat_AsyncPtr = _lookup< + late final _cv_transposeNDPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('core_Vconcat_Async'); - late final _core_Vconcat_Async = _core_Vconcat_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer core_colRange_Async( - Mat self, - int start, - int end, - imp1.CvCallback_1 callback, - ) { - return _core_colRange_Async( - self, - start, - end, - callback, - ); - } - - late final _core_colRange_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('core_colRange_Async'); - late final _core_colRange_Async = _core_colRange_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_1)>(); + Mat, Mat, VecI32, imp1.CvCallback_0)>>('cv_transposeND'); + late final _cv_transposeND = _cv_transposeNDPtr.asFunction< + ffi.Pointer Function(Mat, Mat, VecI32, imp1.CvCallback_0)>(); - ffi.Pointer core_rowRange_Async( - Mat self, - int start, - int end, - imp1.CvCallback_1 callback, + ffi.Pointer cv_vconcat( + Mat src1, + Mat src2, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _core_rowRange_Async( - self, - start, - end, + return _cv_vconcat( + src1, + src2, + dst, callback, ); } - late final _core_rowRange_AsyncPtr = _lookup< + late final _cv_vconcatPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('core_rowRange_Async'); - late final _core_rowRange_Async = _core_rowRange_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_vconcat'); + late final _cv_vconcat = _cv_vconcatPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer getBuildInfo( - ffi.Pointer> rval, - ) { - return _getBuildInfo( - rval, - ); + ffi.Pointer getBuildInfo() { + return _getBuildInfo(); } - late final _getBuildInfoPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer>)>>('getBuildInfo'); - late final _getBuildInfo = _getBuildInfoPtr.asFunction< - ffi.Pointer Function(ffi.Pointer>)>(); + late final _getBuildInfoPtr = + _lookup Function()>>( + 'getBuildInfo'); + late final _getBuildInfo = + _getBuildInfoPtr.asFunction Function()>(); - ffi.Pointer getBuildInfo_Async( - imp1.CvCallback_1 callback, - ) { - return _getBuildInfo_Async( - callback, - ); + ffi.Pointer getCvVersion() { + return _getCvVersion(); } - late final _getBuildInfo_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'getBuildInfo_Async'); - late final _getBuildInfo_Async = _getBuildInfo_AsyncPtr - .asFunction Function(imp1.CvCallback_1)>(); + late final _getCvVersionPtr = + _lookup Function()>>( + 'getCvVersion'); + late final _getCvVersion = + _getCvVersionPtr.asFunction Function()>(); ffi.Pointer getLogLevel( ffi.Pointer logLevel, @@ -8223,36 +6024,6 @@ class CvNativeCore { late final _getLogLevel = _getLogLevelPtr .asFunction Function(ffi.Pointer)>(); - ffi.Pointer openCVVersion( - ffi.Pointer> rval, - ) { - return _openCVVersion( - rval, - ); - } - - late final _openCVVersionPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer>)>>('openCVVersion'); - late final _openCVVersion = _openCVVersionPtr.asFunction< - ffi.Pointer Function(ffi.Pointer>)>(); - - ffi.Pointer openCVVersion_Async( - imp1.CvCallback_1 callback, - ) { - return _openCVVersion_Async( - callback, - ); - } - - late final _openCVVersion_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'openCVVersion_Async'); - late final _openCVVersion_Async = _openCVVersion_AsyncPtr - .asFunction Function(imp1.CvCallback_1)>(); - void registerErrorCallback( ErrorCallback callback, ) { @@ -8288,13 +6059,13 @@ class _SymbolAddresses { final CvNativeCore _library; _SymbolAddresses(this._library); ffi.Pointer)>> - get CvStatus_Close => _library._CvStatus_ClosePtr; + get CvStatus_close => _library._CvStatus_closePtr; ffi.Pointer> - get Mat_Close => _library._Mat_ClosePtr; + get cv_Mat_close => _library._cv_Mat_closePtr; ffi.Pointer)>> - get Mat_CloseVoid => _library._Mat_CloseVoidPtr; + get cv_Mat_closeVoid => _library._cv_Mat_closeVoidPtr; ffi.Pointer> - get Rng_Close => _library._Rng_ClosePtr; + get cv_RNG_close => _library._cv_RNG_closePtr; } typedef CvPoint = imp1.CvPoint; diff --git a/packages/dartcv/lib/src/g/core.yaml b/packages/dartcv/lib/src/g/core.yaml index cd4ea791..a55e68e1 100644 --- a/packages/dartcv/lib/src/g/core.yaml +++ b/packages/dartcv/lib/src/g/core.yaml @@ -1,845 +1,599 @@ format_version: 1.0.0 files: - package:dartcv/src/g/core.g.dart: + package:dartcv4/src/g/core.g.dart: used-config: ffi-native: false symbols: ErrorCallbackFunction: name: ErrorCallbackFunction - c:@F@CvStatus_Close: - name: CvStatus_Close - c:@F@Eye: - name: Eye - c:@F@GetCVTickCount: - name: GetCVTickCount - c:@F@GetNumThreads: - name: GetNumThreads - c:@F@GetTickFrequency: - name: GetTickFrequency - c:@F@KMeans: - name: KMeans - c:@F@KMeansPoints: - name: KMeansPoints - c:@F@LUT: - name: LUT - c:@F@Mat_AbsDiff: - name: Mat_AbsDiff - c:@F@Mat_Add: - name: Mat_Add - c:@F@Mat_AddF64: - name: Mat_AddF64 - c:@F@Mat_AddFloat: - name: Mat_AddFloat - c:@F@Mat_AddI16: - name: Mat_AddI16 - c:@F@Mat_AddI32: - name: Mat_AddI32 - c:@F@Mat_AddMat: - name: Mat_AddMat - c:@F@Mat_AddSChar: - name: Mat_AddSChar - c:@F@Mat_AddU16: - name: Mat_AddU16 - c:@F@Mat_AddUChar: - name: Mat_AddUChar - c:@F@Mat_AddWeighted: - name: Mat_AddWeighted - c:@F@Mat_AdjustROI: - name: Mat_AdjustROI - c:@F@Mat_BatchDistance: - name: Mat_BatchDistance - c:@F@Mat_BitwiseAnd: - name: Mat_BitwiseAnd - c:@F@Mat_BitwiseAndWithMask: - name: Mat_BitwiseAndWithMask - c:@F@Mat_BitwiseNot: - name: Mat_BitwiseNot - c:@F@Mat_BitwiseNotWithMask: - name: Mat_BitwiseNotWithMask - c:@F@Mat_BitwiseOr: - name: Mat_BitwiseOr - c:@F@Mat_BitwiseOrWithMask: - name: Mat_BitwiseOrWithMask - c:@F@Mat_BitwiseXor: - name: Mat_BitwiseXor - c:@F@Mat_BitwiseXorWithMask: - name: Mat_BitwiseXorWithMask - c:@F@Mat_BorderInterpolate: - name: Mat_BorderInterpolate - c:@F@Mat_CalcCovarMatrix: - name: Mat_CalcCovarMatrix - c:@F@Mat_CartToPolar: - name: Mat_CartToPolar - c:@F@Mat_Channels: - name: Mat_Channels - c:@F@Mat_CheckRange: - name: Mat_CheckRange - c:@F@Mat_Clone: - name: Mat_Clone - c:@F@Mat_Clone_Async: - name: Mat_Clone_Async - c:@F@Mat_Close: - name: Mat_Close - c:@F@Mat_CloseVoid: - name: Mat_CloseVoid - c:@F@Mat_Col: - name: Mat_Col - c:@F@Mat_Cols: - name: Mat_Cols - c:@F@Mat_Compare: - name: Mat_Compare - c:@F@Mat_CompleteSymm: - name: Mat_CompleteSymm - c:@F@Mat_ConvertFp16: - name: Mat_ConvertFp16 - c:@F@Mat_ConvertScaleAbs: - name: Mat_ConvertScaleAbs - c:@F@Mat_ConvertTo: - name: Mat_ConvertTo - c:@F@Mat_ConvertToWithParams: - name: Mat_ConvertToWithParams - c:@F@Mat_ConvertToWithParams_Async: - name: Mat_ConvertToWithParams_Async - c:@F@Mat_ConvertTo_Async: - name: Mat_ConvertTo_Async - c:@F@Mat_CopyMakeBorder: - name: Mat_CopyMakeBorder - c:@F@Mat_CopyTo: - name: Mat_CopyTo - c:@F@Mat_CopyToWithMask: - name: Mat_CopyToWithMask - c:@F@Mat_CopyToWithMask_Async: - name: Mat_CopyToWithMask_Async - c:@F@Mat_CopyTo_Async: - name: Mat_CopyTo_Async - c:@F@Mat_CountNonZero: - name: Mat_CountNonZero - c:@F@Mat_DCT: - name: Mat_DCT - c:@F@Mat_DFT: - name: Mat_DFT - c:@F@Mat_Data: - name: Mat_Data - c:@F@Mat_Determinant: - name: Mat_Determinant - c:@F@Mat_Dims: - name: Mat_Dims - c:@F@Mat_Divide: - name: Mat_Divide - c:@F@Mat_DivideF64: - name: Mat_DivideF64 - c:@F@Mat_DivideFloat: - name: Mat_DivideFloat - c:@F@Mat_DivideI16: - name: Mat_DivideI16 - c:@F@Mat_DivideI32: - name: Mat_DivideI32 - c:@F@Mat_DivideMat: - name: Mat_DivideMat - c:@F@Mat_DivideSChar: - name: Mat_DivideSChar - c:@F@Mat_DivideU16: - name: Mat_DivideU16 - c:@F@Mat_DivideUChar: - name: Mat_DivideUChar - c:@F@Mat_Eigen: - name: Mat_Eigen - c:@F@Mat_EigenNonSymmetric: - name: Mat_EigenNonSymmetric - c:@F@Mat_ElemSize: - name: Mat_ElemSize - c:@F@Mat_ElemSize1: - name: Mat_ElemSize1 - c:@F@Mat_Empty: - name: Mat_Empty - c:@F@Mat_Exp: - name: Mat_Exp - c:@F@Mat_ExtractChannel: - name: Mat_ExtractChannel - c:@F@Mat_Eye_Async: - name: Mat_Eye_Async - c:@F@Mat_FindNonZero: - name: Mat_FindNonZero - c:@F@Mat_Flags: - name: Mat_Flags - c:@F@Mat_Flip: - name: Mat_Flip - c:@F@Mat_FromCMat: - name: Mat_FromCMat - c:@F@Mat_FromPtr: - name: Mat_FromPtr - c:@F@Mat_FromRange: - name: Mat_FromRange - c:@F@Mat_Gemm: - name: Mat_Gemm - c:@F@Mat_GetDouble: - name: Mat_GetDouble - c:@F@Mat_GetDouble3: - name: Mat_GetDouble3 - c:@F@Mat_GetFloat: - name: Mat_GetFloat - c:@F@Mat_GetFloat3: - name: Mat_GetFloat3 - c:@F@Mat_GetInt: - name: Mat_GetInt - c:@F@Mat_GetInt3: - name: Mat_GetInt3 - c:@F@Mat_GetOptimalDFTSize: - name: Mat_GetOptimalDFTSize - c:@F@Mat_GetSChar: - name: Mat_GetSChar - c:@F@Mat_GetSChar3: - name: Mat_GetSChar3 - c:@F@Mat_GetShort: - name: Mat_GetShort - c:@F@Mat_GetShort3: - name: Mat_GetShort3 - c:@F@Mat_GetUChar: - name: Mat_GetUChar - c:@F@Mat_GetUChar3: - name: Mat_GetUChar3 - c:@F@Mat_GetUShort: - name: Mat_GetUShort - c:@F@Mat_GetUShort3: - name: Mat_GetUShort3 - c:@F@Mat_GetVec2b: - name: Mat_GetVec2b - c:@F@Mat_GetVec2d: - name: Mat_GetVec2d - c:@F@Mat_GetVec2f: - name: Mat_GetVec2f - c:@F@Mat_GetVec2i: - name: Mat_GetVec2i - c:@F@Mat_GetVec2s: - name: Mat_GetVec2s - c:@F@Mat_GetVec2w: - name: Mat_GetVec2w - c:@F@Mat_GetVec3b: - name: Mat_GetVec3b - c:@F@Mat_GetVec3d: - name: Mat_GetVec3d - c:@F@Mat_GetVec3f: - name: Mat_GetVec3f - c:@F@Mat_GetVec3i: - name: Mat_GetVec3i - c:@F@Mat_GetVec3s: - name: Mat_GetVec3s - c:@F@Mat_GetVec3w: - name: Mat_GetVec3w - c:@F@Mat_GetVec4b: - name: Mat_GetVec4b - c:@F@Mat_GetVec4d: - name: Mat_GetVec4d - c:@F@Mat_GetVec4f: - name: Mat_GetVec4f - c:@F@Mat_GetVec4i: - name: Mat_GetVec4i - c:@F@Mat_GetVec4s: - name: Mat_GetVec4s - c:@F@Mat_GetVec4w: - name: Mat_GetVec4w - c:@F@Mat_GetVec6d: - name: Mat_GetVec6d - c:@F@Mat_GetVec6f: - name: Mat_GetVec6f - c:@F@Mat_GetVec6i: - name: Mat_GetVec6i - c:@F@Mat_GetVec8i: - name: Mat_GetVec8i - c:@F@Mat_Hconcat: - name: Mat_Hconcat - c:@F@Mat_Idct: - name: Mat_Idct - c:@F@Mat_Idft: - name: Mat_Idft - c:@F@Mat_InRange: - name: Mat_InRange - c:@F@Mat_InRangeWithScalar: - name: Mat_InRangeWithScalar - c:@F@Mat_InsertChannel: - name: Mat_InsertChannel - c:@F@Mat_Invert: - name: Mat_Invert - c:@F@Mat_IsContinuous: - name: Mat_IsContinuous - c:@F@Mat_IsSubmatrix: - name: Mat_IsSubmatrix - c:@F@Mat_LocateROI: - name: Mat_LocateROI - c:@F@Mat_Log: - name: Mat_Log - c:@F@Mat_Magnitude: - name: Mat_Magnitude - c:@F@Mat_Max: - name: Mat_Max - c:@F@Mat_Mean: - name: Mat_Mean - c:@F@Mat_MeanStdDev: - name: Mat_MeanStdDev - c:@F@Mat_MeanStdDevWithMask: - name: Mat_MeanStdDevWithMask - c:@F@Mat_MeanWithMask: - name: Mat_MeanWithMask - c:@F@Mat_Merge: - name: Mat_Merge - c:@F@Mat_Min: - name: Mat_Min - c:@F@Mat_MinMaxIdx: - name: Mat_MinMaxIdx - c:@F@Mat_MinMaxLoc: - name: Mat_MinMaxLoc - c:@F@Mat_MixChannels: - name: Mat_MixChannels - c:@F@Mat_Mul: - name: Mat_Mul - c:@F@Mat_MulSpectrums: - name: Mat_MulSpectrums - c:@F@Mat_Multiply: - name: Mat_Multiply - c:@F@Mat_MultiplyF64: - name: Mat_MultiplyF64 - c:@F@Mat_MultiplyFloat: - name: Mat_MultiplyFloat - c:@F@Mat_MultiplyI16: - name: Mat_MultiplyI16 - c:@F@Mat_MultiplyI32: - name: Mat_MultiplyI32 - c:@F@Mat_MultiplyMat: - name: Mat_MultiplyMat - c:@F@Mat_MultiplyMatrix: - name: Mat_MultiplyMatrix - c:@F@Mat_MultiplySChar: - name: Mat_MultiplySChar - c:@F@Mat_MultiplyU16: - name: Mat_MultiplyU16 - c:@F@Mat_MultiplyUChar: - name: Mat_MultiplyUChar - c:@F@Mat_New: - name: Mat_New - c:@F@Mat_NewFromBytes: - name: Mat_NewFromBytes - c:@F@Mat_NewFromBytes_Async: - name: Mat_NewFromBytes_Async - c:@F@Mat_NewFromScalar: - name: Mat_NewFromScalar - c:@F@Mat_NewFromScalar_Async: - name: Mat_NewFromScalar_Async - c:@F@Mat_NewFromVecPoint: - name: Mat_NewFromVecPoint - c:@F@Mat_NewFromVecPoint2f: - name: Mat_NewFromVecPoint2f - c:@F@Mat_NewFromVecPoint2f_Async: - name: Mat_NewFromVecPoint2f_Async - c:@F@Mat_NewFromVecPoint3f: - name: Mat_NewFromVecPoint3f - c:@F@Mat_NewFromVecPoint3f_Async: - name: Mat_NewFromVecPoint3f_Async - c:@F@Mat_NewFromVecPoint3i: - name: Mat_NewFromVecPoint3i - c:@F@Mat_NewFromVecPoint_Async: - name: Mat_NewFromVecPoint_Async - c:@F@Mat_NewWithSize: - name: Mat_NewWithSize - c:@F@Mat_NewWithSize_Async: - name: Mat_NewWithSize_Async - c:@F@Mat_NewWithSizes: - name: Mat_NewWithSizes - c:@F@Mat_NewWithSizesFromBytes: - name: Mat_NewWithSizesFromBytes - c:@F@Mat_NewWithSizesFromBytes_Async: - name: Mat_NewWithSizesFromBytes_Async - c:@F@Mat_NewWithSizesFromScalar: - name: Mat_NewWithSizesFromScalar - c:@F@Mat_NewWithSizesScalar_Async: - name: Mat_NewWithSizesScalar_Async - c:@F@Mat_NewWithSizes_Async: - name: Mat_NewWithSizes_Async - c:@F@Mat_New_Async: - name: Mat_New_Async - c:@F@Mat_Normalize: - name: Mat_Normalize - c:@F@Mat_Ones_Async: - name: Mat_Ones_Async - c:@F@Mat_PCACompute: - name: Mat_PCACompute - c:@F@Mat_PatchNaNs: - name: Mat_PatchNaNs - c:@F@Mat_PerspectiveTransform: - name: Mat_PerspectiveTransform - c:@F@Mat_Phase: - name: Mat_Phase - c:@F@Mat_PolarToCart: - name: Mat_PolarToCart - c:@F@Mat_Pow: - name: Mat_Pow - c:@F@Mat_Ptr_u8_1: - name: Mat_Ptr_u8_1 - c:@F@Mat_Ptr_u8_2: - name: Mat_Ptr_u8_2 - c:@F@Mat_Ptr_u8_3: - name: Mat_Ptr_u8_3 - c:@F@Mat_Reduce: - name: Mat_Reduce - c:@F@Mat_ReduceArgMax: - name: Mat_ReduceArgMax - c:@F@Mat_ReduceArgMin: - name: Mat_ReduceArgMin - c:@F@Mat_Region: - name: Mat_Region - c:@F@Mat_Region_Async: - name: Mat_Region_Async - c:@F@Mat_Release: - name: Mat_Release - c:@F@Mat_Repeat: - name: Mat_Repeat - c:@F@Mat_Reshape: - name: Mat_Reshape - c:@F@Mat_ReshapeByVec: - name: Mat_ReshapeByVec - c:@F@Mat_Reshape_Async: - name: Mat_Reshape_Async - c:@F@Mat_Row: - name: Mat_Row - c:@F@Mat_Rows: - name: Mat_Rows - c:@F@Mat_ScaleAdd: - name: Mat_ScaleAdd - c:@F@Mat_SetDouble: - name: Mat_SetDouble - c:@F@Mat_SetDouble3: - name: Mat_SetDouble3 - c:@F@Mat_SetFloat: - name: Mat_SetFloat - c:@F@Mat_SetFloat3: - name: Mat_SetFloat3 - c:@F@Mat_SetIdentity: - name: Mat_SetIdentity - c:@F@Mat_SetInt: - name: Mat_SetInt - c:@F@Mat_SetInt3: - name: Mat_SetInt3 - c:@F@Mat_SetSChar: - name: Mat_SetSChar - c:@F@Mat_SetSChar3: - name: Mat_SetSChar3 - c:@F@Mat_SetShort: - name: Mat_SetShort - c:@F@Mat_SetShort3: - name: Mat_SetShort3 - c:@F@Mat_SetTo: - name: Mat_SetTo - c:@F@Mat_SetUChar: - name: Mat_SetUChar - c:@F@Mat_SetUChar3: - name: Mat_SetUChar3 - c:@F@Mat_SetUShort: - name: Mat_SetUShort - c:@F@Mat_SetUShort3: - name: Mat_SetUShort3 - c:@F@Mat_SetVec2b: - name: Mat_SetVec2b - c:@F@Mat_SetVec2d: - name: Mat_SetVec2d - c:@F@Mat_SetVec2f: - name: Mat_SetVec2f - c:@F@Mat_SetVec2i: - name: Mat_SetVec2i - c:@F@Mat_SetVec2s: - name: Mat_SetVec2s - c:@F@Mat_SetVec2w: - name: Mat_SetVec2w - c:@F@Mat_SetVec3b: - name: Mat_SetVec3b - c:@F@Mat_SetVec3d: - name: Mat_SetVec3d - c:@F@Mat_SetVec3f: - name: Mat_SetVec3f - c:@F@Mat_SetVec3i: - name: Mat_SetVec3i - c:@F@Mat_SetVec3s: - name: Mat_SetVec3s - c:@F@Mat_SetVec3w: - name: Mat_SetVec3w - c:@F@Mat_SetVec4b: - name: Mat_SetVec4b - c:@F@Mat_SetVec4d: - name: Mat_SetVec4d - c:@F@Mat_SetVec4f: - name: Mat_SetVec4f - c:@F@Mat_SetVec4i: - name: Mat_SetVec4i - c:@F@Mat_SetVec4s: - name: Mat_SetVec4s - c:@F@Mat_SetVec4w: - name: Mat_SetVec4w - c:@F@Mat_SetVec6d: - name: Mat_SetVec6d - c:@F@Mat_SetVec6f: - name: Mat_SetVec6f - c:@F@Mat_SetVec6i: - name: Mat_SetVec6i - c:@F@Mat_SetVec8i: - name: Mat_SetVec8i - c:@F@Mat_Size: - name: Mat_Size - c:@F@Mat_Solve: - name: Mat_Solve - c:@F@Mat_SolveCubic: - name: Mat_SolveCubic - c:@F@Mat_SolvePoly: - name: Mat_SolvePoly - c:@F@Mat_Sort: - name: Mat_Sort - c:@F@Mat_SortIdx: - name: Mat_SortIdx - c:@F@Mat_Split: - name: Mat_Split - c:@F@Mat_Sqrt: - name: Mat_Sqrt - c:@F@Mat_Step: - name: Mat_Step - c:@F@Mat_Subtract: - name: Mat_Subtract - c:@F@Mat_SubtractF64: - name: Mat_SubtractF64 - c:@F@Mat_SubtractFloat: - name: Mat_SubtractFloat - c:@F@Mat_SubtractI16: - name: Mat_SubtractI16 - c:@F@Mat_SubtractI32: - name: Mat_SubtractI32 - c:@F@Mat_SubtractMat: - name: Mat_SubtractMat - c:@F@Mat_SubtractSChar: - name: Mat_SubtractSChar - c:@F@Mat_SubtractU16: - name: Mat_SubtractU16 - c:@F@Mat_SubtractUChar: - name: Mat_SubtractUChar - c:@F@Mat_Sum: - name: Mat_Sum - c:@F@Mat_T: - name: Mat_T - c:@F@Mat_ToVecChar: - name: Mat_ToVecChar - c:@F@Mat_ToVecChar_Async: - name: Mat_ToVecChar_Async - c:@F@Mat_ToVecUChar: - name: Mat_ToVecUChar - c:@F@Mat_ToVecUChar_Async: - name: Mat_ToVecUChar_Async - c:@F@Mat_Total: - name: Mat_Total - c:@F@Mat_Trace: - name: Mat_Trace - c:@F@Mat_Transform: - name: Mat_Transform - c:@F@Mat_Transpose: - name: Mat_Transpose - c:@F@Mat_Type: - name: Mat_Type - c:@F@Mat_Vconcat: - name: Mat_Vconcat - c:@F@Mat_Zeros_Async: - name: Mat_Zeros_Async - c:@F@Mat_colRange: - name: Mat_colRange - c:@F@Mat_rowRange: - name: Mat_rowRange - c:@F@Mat_toString: - name: Mat_toString - c:@F@Mat_toVecPoint: - name: Mat_toVecPoint - c:@F@Mat_toVecPoint2f: - name: Mat_toVecPoint2f - c:@F@Mat_toVecPoint3f: - name: Mat_toVecPoint3f - c:@F@Mat_toVecPoint3i: - name: Mat_toVecPoint3i - c:@F@Norm: - name: Norm - c:@F@NormWithMats: - name: NormWithMats - c:@F@Ones: - name: Ones - c:@F@RNG_Fill: - name: RNG_Fill - c:@F@RNG_Fill_Async: - name: RNG_Fill_Async - c:@F@RNG_Gaussian: - name: RNG_Gaussian - c:@F@RNG_Gaussian_Async: - name: RNG_Gaussian_Async - c:@F@RNG_Next: - name: RNG_Next - c:@F@RNG_Next_Async: - name: RNG_Next_Async - c:@F@RNG_Uniform: - name: RNG_Uniform - c:@F@RNG_UniformDouble: - name: RNG_UniformDouble - c:@F@RNG_UniformDouble_Async: - name: RNG_UniformDouble_Async - c:@F@RNG_Uniform_Async: - name: RNG_Uniform_Async - c:@F@RandN: - name: RandN - c:@F@RandN_Async: - name: RandN_Async - c:@F@RandShuffle: - name: RandShuffle - c:@F@RandShuffleWithParams: - name: RandShuffleWithParams - c:@F@RandShuffleWithParams_Async: - name: RandShuffleWithParams_Async - c:@F@RandShuffle_Async: - name: RandShuffle_Async - c:@F@RandU: - name: RandU - c:@F@RandU_Async: - name: RandU_Async - c:@F@Rng_Close: - name: Rng_Close - c:@F@Rng_New: - name: Rng_New - c:@F@Rng_NewWithState: - name: Rng_NewWithState - c:@F@Rng_NewWithState_Async: - name: Rng_NewWithState_Async - c:@F@Rng_New_Async: - name: Rng_New_Async - c:@F@Rotate: - name: Rotate - c:@F@RotatedRect_BoundingRect: - name: RotatedRect_BoundingRect - c:@F@RotatedRect_BoundingRect2f: - name: RotatedRect_BoundingRect2f - c:@F@RotatedRect_Points: - name: RotatedRect_Points - c:@F@SVD_Compute: - name: SVD_Compute - c:@F@SVD_Compute_Async: - name: SVD_Compute_Async - c:@F@SVD_backSubst: - name: SVD_backSubst - c:@F@SVD_backSubst_Async: - name: SVD_backSubst_Async - c:@F@SetNumThreads: - name: SetNumThreads - c:@F@SetRNGSeed: - name: SetRNGSeed - c:@F@TheRNG: - name: TheRNG - c:@F@Zeros: - name: Zeros - c:@F@core_AbsDiff_Async: - name: core_AbsDiff_Async - c:@F@core_AddWeighted_Async: - name: core_AddWeighted_Async - c:@F@core_Add_Async: - name: core_Add_Async - c:@F@core_BatchDistance_Async: - name: core_BatchDistance_Async - c:@F@core_BitwiseAndWithMask_Async: - name: core_BitwiseAndWithMask_Async - c:@F@core_BitwiseAnd_Async: - name: core_BitwiseAnd_Async - c:@F@core_BitwiseNotWithMask_Async: - name: core_BitwiseNotWithMask_Async - c:@F@core_BitwiseNot_Async: - name: core_BitwiseNot_Async - c:@F@core_BitwiseOrWithMask_Async: - name: core_BitwiseOrWithMask_Async - c:@F@core_BitwiseOr_Async: - name: core_BitwiseOr_Async - c:@F@core_BitwiseXorWithMask_Async: - name: core_BitwiseXorWithMask_Async - c:@F@core_BitwiseXor_Async: - name: core_BitwiseXor_Async - c:@F@core_BorderInterpolate_Async: - name: core_BorderInterpolate_Async - c:@F@core_CalcCovarMatrix_Async: - name: core_CalcCovarMatrix_Async - c:@F@core_CartToPolar_Async: - name: core_CartToPolar_Async - c:@F@core_CheckRange_Async: - name: core_CheckRange_Async - c:@F@core_Compare_Async: - name: core_Compare_Async - c:@F@core_CompleteSymm_Async: - name: core_CompleteSymm_Async - c:@F@core_ConvertScaleAbs_Async: - name: core_ConvertScaleAbs_Async - c:@F@core_CopyMakeBorder_Async: - name: core_CopyMakeBorder_Async - c:@F@core_CountNonZero_Async: - name: core_CountNonZero_Async - c:@F@core_DCT_Async: - name: core_DCT_Async - c:@F@core_DFT_Async: - name: core_DFT_Async - c:@F@core_Determinant_Async: - name: core_Determinant_Async - c:@F@core_Divide_Async: - name: core_Divide_Async - c:@F@core_EigenNonSymmetric_Async: - name: core_EigenNonSymmetric_Async - c:@F@core_Eigen_Async: - name: core_Eigen_Async - c:@F@core_Exp_Async: - name: core_Exp_Async - c:@F@core_ExtractChannel_Async: - name: core_ExtractChannel_Async - c:@F@core_FindNonZero_Async: - name: core_FindNonZero_Async - c:@F@core_Flip_Async: - name: core_Flip_Async - c:@F@core_Gemm_Async: - name: core_Gemm_Async - c:@F@core_GetOptimalDFTSize_Async: - name: core_GetOptimalDFTSize_Async - c:@F@core_Hconcat_Async: - name: core_Hconcat_Async - c:@F@core_Idct_Async: - name: core_Idct_Async - c:@F@core_Idft_Async: - name: core_Idft_Async - c:@F@core_InRangeWithScalar_Async: - name: core_InRangeWithScalar_Async - c:@F@core_InRange_Async: - name: core_InRange_Async - c:@F@core_InsertChannel_Async: - name: core_InsertChannel_Async - c:@F@core_Invert_Async: - name: core_Invert_Async - c:@F@core_KMeans_Async: - name: core_KMeans_Async - c:@F@core_KMeans_Points_Async: - name: core_KMeans_Points_Async - c:@F@core_LUT_Async: - name: core_LUT_Async - c:@F@core_Log_Async: - name: core_Log_Async - c:@F@core_Magnitude_Async: - name: core_Magnitude_Async - c:@F@core_Max_Async: - name: core_Max_Async - c:@F@core_MeanStdDevWithMask_Async: - name: core_MeanStdDevWithMask_Async - c:@F@core_MeanStdDev_Async: - name: core_MeanStdDev_Async - c:@F@core_MeanWithMask_Async: - name: core_MeanWithMask_Async - c:@F@core_Mean_Async: - name: core_Mean_Async - c:@F@core_Merge_Async: - name: core_Merge_Async - c:@F@core_MinMaxIdx_Async: - name: core_MinMaxIdx_Async - c:@F@core_MinMaxIdx_Mask_Async: - name: core_MinMaxIdx_Mask_Async - c:@F@core_MinMaxLoc_Async: - name: core_MinMaxLoc_Async - c:@F@core_MinMaxLoc_Mask_Async: - name: core_MinMaxLoc_Mask_Async - c:@F@core_Min_Async: - name: core_Min_Async - c:@F@core_MixChannels_Async: - name: core_MixChannels_Async - c:@F@core_MulSpectrums_Async: - name: core_MulSpectrums_Async - c:@F@core_MultiplyWithParams_Async: - name: core_MultiplyWithParams_Async - c:@F@core_Multiply_Async: - name: core_Multiply_Async - c:@F@core_NormWithMats_Async: - name: core_NormWithMats_Async - c:@F@core_Norm_Async: - name: core_Norm_Async - c:@F@core_Norm_Mask_Async: - name: core_Norm_Mask_Async - c:@F@core_Normalize_Async: - name: core_Normalize_Async - c:@F@core_Normalize_Mask_Async: - name: core_Normalize_Mask_Async - c:@F@core_PCABackProject_Async: - name: core_PCABackProject_Async - c:@F@core_PCACompute_1_Async: - name: core_PCACompute_1_Async - c:@F@core_PCACompute_2_Async: - name: core_PCACompute_2_Async - c:@F@core_PCACompute_3_Async: - name: core_PCACompute_3_Async - c:@F@core_PCACompute_Async: - name: core_PCACompute_Async - c:@F@core_PCAProject_Async: - name: core_PCAProject_Async - c:@F@core_PatchNaNs_Async: - name: core_PatchNaNs_Async - c:@F@core_PerspectiveTransform_Async: - name: core_PerspectiveTransform_Async - c:@F@core_Phase_Async: - name: core_Phase_Async - c:@F@core_PolarToCart_Async: - name: core_PolarToCart_Async - c:@F@core_Pow_Async: - name: core_Pow_Async - c:@F@core_ReduceArgMax_Async: - name: core_ReduceArgMax_Async - c:@F@core_ReduceArgMin_Async: - name: core_ReduceArgMin_Async - c:@F@core_Reduce_Async: - name: core_Reduce_Async - c:@F@core_Repeat_Async: - name: core_Repeat_Async - c:@F@core_Rotate_Async: - name: core_Rotate_Async - c:@F@core_ScaleAdd_Async: - name: core_ScaleAdd_Async - c:@F@core_SetIdentity_Async: - name: core_SetIdentity_Async - c:@F@core_SolveCubic_Async: - name: core_SolveCubic_Async - c:@F@core_SolvePoly_Async: - name: core_SolvePoly_Async - c:@F@core_Solve_Async: - name: core_Solve_Async - c:@F@core_SortIdx_Async: - name: core_SortIdx_Async - c:@F@core_Sort_Async: - name: core_Sort_Async - c:@F@core_Split_Async: - name: core_Split_Async - c:@F@core_Sqrt_Async: - name: core_Sqrt_Async - c:@F@core_Subtract_Async: - name: core_Subtract_Async - c:@F@core_Sum_Async: - name: core_Sum_Async - c:@F@core_T_Async: - name: core_T_Async - c:@F@core_Trace_Async: - name: core_Trace_Async - c:@F@core_Transform_Async: - name: core_Transform_Async - c:@F@core_Transpose_Async: - name: core_Transpose_Async - c:@F@core_Vconcat_Async: - name: core_Vconcat_Async - c:@F@core_colRange_Async: - name: core_colRange_Async - c:@F@core_rowRange_Async: - name: core_rowRange_Async + c:@F@CvStatus_close: + name: CvStatus_close + c:@F@cv_LUT: + name: cv_LUT + c:@F@cv_Mat_adjustROI: + name: cv_Mat_adjustROI + c:@F@cv_Mat_channels: + name: cv_Mat_channels + c:@F@cv_Mat_clone: + name: cv_Mat_clone + c:@F@cv_Mat_close: + name: cv_Mat_close + c:@F@cv_Mat_closeVoid: + name: cv_Mat_closeVoid + c:@F@cv_Mat_col: + name: cv_Mat_col + c:@F@cv_Mat_cols: + name: cv_Mat_cols + c:@F@cv_Mat_convertFp16: + name: cv_Mat_convertFp16 + c:@F@cv_Mat_convertTo: + name: cv_Mat_convertTo + c:@F@cv_Mat_convertTo_1: + name: cv_Mat_convertTo_1 + c:@F@cv_Mat_copyTo: + name: cv_Mat_copyTo + c:@F@cv_Mat_copyTo_1: + name: cv_Mat_copyTo_1 + c:@F@cv_Mat_create: + name: cv_Mat_create + c:@F@cv_Mat_create_1: + name: cv_Mat_create_1 + c:@F@cv_Mat_create_10: + name: cv_Mat_create_10 + c:@F@cv_Mat_create_11: + name: cv_Mat_create_11 + c:@F@cv_Mat_create_12: + name: cv_Mat_create_12 + c:@F@cv_Mat_create_2: + name: cv_Mat_create_2 + c:@F@cv_Mat_create_3: + name: cv_Mat_create_3 + c:@F@cv_Mat_create_4: + name: cv_Mat_create_4 + c:@F@cv_Mat_create_5: + name: cv_Mat_create_5 + c:@F@cv_Mat_create_6: + name: cv_Mat_create_6 + c:@F@cv_Mat_create_7: + name: cv_Mat_create_7 + c:@F@cv_Mat_create_8: + name: cv_Mat_create_8 + c:@F@cv_Mat_create_9: + name: cv_Mat_create_9 + c:@F@cv_Mat_data: + name: cv_Mat_data + c:@F@cv_Mat_dims: + name: cv_Mat_dims + c:@F@cv_Mat_elemSize: + name: cv_Mat_elemSize + c:@F@cv_Mat_elemSize1: + name: cv_Mat_elemSize1 + c:@F@cv_Mat_empty: + name: cv_Mat_empty + c:@F@cv_Mat_eye: + name: cv_Mat_eye + c:@F@cv_Mat_flags: + name: cv_Mat_flags + c:@F@cv_Mat_get_Vec2b: + name: cv_Mat_get_Vec2b + c:@F@cv_Mat_get_Vec2d: + name: cv_Mat_get_Vec2d + c:@F@cv_Mat_get_Vec2f: + name: cv_Mat_get_Vec2f + c:@F@cv_Mat_get_Vec2i: + name: cv_Mat_get_Vec2i + c:@F@cv_Mat_get_Vec2s: + name: cv_Mat_get_Vec2s + c:@F@cv_Mat_get_Vec2w: + name: cv_Mat_get_Vec2w + c:@F@cv_Mat_get_Vec3b: + name: cv_Mat_get_Vec3b + c:@F@cv_Mat_get_Vec3d: + name: cv_Mat_get_Vec3d + c:@F@cv_Mat_get_Vec3f: + name: cv_Mat_get_Vec3f + c:@F@cv_Mat_get_Vec3i: + name: cv_Mat_get_Vec3i + c:@F@cv_Mat_get_Vec3s: + name: cv_Mat_get_Vec3s + c:@F@cv_Mat_get_Vec3w: + name: cv_Mat_get_Vec3w + c:@F@cv_Mat_get_Vec4b: + name: cv_Mat_get_Vec4b + c:@F@cv_Mat_get_Vec4d: + name: cv_Mat_get_Vec4d + c:@F@cv_Mat_get_Vec4f: + name: cv_Mat_get_Vec4f + c:@F@cv_Mat_get_Vec4i: + name: cv_Mat_get_Vec4i + c:@F@cv_Mat_get_Vec4s: + name: cv_Mat_get_Vec4s + c:@F@cv_Mat_get_Vec4w: + name: cv_Mat_get_Vec4w + c:@F@cv_Mat_get_Vec6d: + name: cv_Mat_get_Vec6d + c:@F@cv_Mat_get_Vec6f: + name: cv_Mat_get_Vec6f + c:@F@cv_Mat_get_Vec6i: + name: cv_Mat_get_Vec6i + c:@F@cv_Mat_get_Vec8i: + name: cv_Mat_get_Vec8i + c:@F@cv_Mat_get_f32_1: + name: cv_Mat_get_f32_1 + c:@F@cv_Mat_get_f32_2: + name: cv_Mat_get_f32_2 + c:@F@cv_Mat_get_f32_3: + name: cv_Mat_get_f32_3 + c:@F@cv_Mat_get_f64_1: + name: cv_Mat_get_f64_1 + c:@F@cv_Mat_get_f64_2: + name: cv_Mat_get_f64_2 + c:@F@cv_Mat_get_f64_3: + name: cv_Mat_get_f64_3 + c:@F@cv_Mat_get_i16_1: + name: cv_Mat_get_i16_1 + c:@F@cv_Mat_get_i16_2: + name: cv_Mat_get_i16_2 + c:@F@cv_Mat_get_i16_3: + name: cv_Mat_get_i16_3 + c:@F@cv_Mat_get_i32_1: + name: cv_Mat_get_i32_1 + c:@F@cv_Mat_get_i32_2: + name: cv_Mat_get_i32_2 + c:@F@cv_Mat_get_i32_3: + name: cv_Mat_get_i32_3 + c:@F@cv_Mat_get_i8_1: + name: cv_Mat_get_i8_1 + c:@F@cv_Mat_get_i8_2: + name: cv_Mat_get_i8_2 + c:@F@cv_Mat_get_i8_3: + name: cv_Mat_get_i8_3 + c:@F@cv_Mat_get_u16_1: + name: cv_Mat_get_u16_1 + c:@F@cv_Mat_get_u16_2: + name: cv_Mat_get_u16_2 + c:@F@cv_Mat_get_u16_3: + name: cv_Mat_get_u16_3 + c:@F@cv_Mat_get_u8_1: + name: cv_Mat_get_u8_1 + c:@F@cv_Mat_get_u8_2: + name: cv_Mat_get_u8_2 + c:@F@cv_Mat_get_u8_3: + name: cv_Mat_get_u8_3 + c:@F@cv_Mat_isContinuous: + name: cv_Mat_isContinuous + c:@F@cv_Mat_isSubmatrix: + name: cv_Mat_isSubmatrix + c:@F@cv_Mat_locateROI: + name: cv_Mat_locateROI + c:@F@cv_Mat_mean: + name: cv_Mat_mean + c:@F@cv_Mat_mean_1: + name: cv_Mat_mean_1 + c:@F@cv_Mat_mul: + name: cv_Mat_mul + c:@F@cv_Mat_ones: + name: cv_Mat_ones + c:@F@cv_Mat_op_add_f32: + name: cv_Mat_op_add_f32 + c:@F@cv_Mat_op_add_f64: + name: cv_Mat_op_add_f64 + c:@F@cv_Mat_op_add_i16: + name: cv_Mat_op_add_i16 + c:@F@cv_Mat_op_add_i32: + name: cv_Mat_op_add_i32 + c:@F@cv_Mat_op_add_i8: + name: cv_Mat_op_add_i8 + c:@F@cv_Mat_op_add_mat: + name: cv_Mat_op_add_mat + c:@F@cv_Mat_op_add_u16: + name: cv_Mat_op_add_u16 + c:@F@cv_Mat_op_add_u8: + name: cv_Mat_op_add_u8 + c:@F@cv_Mat_op_div_f32: + name: cv_Mat_op_div_f32 + c:@F@cv_Mat_op_div_f64: + name: cv_Mat_op_div_f64 + c:@F@cv_Mat_op_div_i16: + name: cv_Mat_op_div_i16 + c:@F@cv_Mat_op_div_i32: + name: cv_Mat_op_div_i32 + c:@F@cv_Mat_op_div_i8: + name: cv_Mat_op_div_i8 + c:@F@cv_Mat_op_div_mat: + name: cv_Mat_op_div_mat + c:@F@cv_Mat_op_div_u16: + name: cv_Mat_op_div_u16 + c:@F@cv_Mat_op_div_u8: + name: cv_Mat_op_div_u8 + c:@F@cv_Mat_op_mul_f32: + name: cv_Mat_op_mul_f32 + c:@F@cv_Mat_op_mul_f64: + name: cv_Mat_op_mul_f64 + c:@F@cv_Mat_op_mul_i16: + name: cv_Mat_op_mul_i16 + c:@F@cv_Mat_op_mul_i32: + name: cv_Mat_op_mul_i32 + c:@F@cv_Mat_op_mul_i8: + name: cv_Mat_op_mul_i8 + c:@F@cv_Mat_op_mul_mat: + name: cv_Mat_op_mul_mat + c:@F@cv_Mat_op_mul_u16: + name: cv_Mat_op_mul_u16 + c:@F@cv_Mat_op_mul_u8: + name: cv_Mat_op_mul_u8 + c:@F@cv_Mat_op_sub_f32: + name: cv_Mat_op_sub_f32 + c:@F@cv_Mat_op_sub_f64: + name: cv_Mat_op_sub_f64 + c:@F@cv_Mat_op_sub_i16: + name: cv_Mat_op_sub_i16 + c:@F@cv_Mat_op_sub_i32: + name: cv_Mat_op_sub_i32 + c:@F@cv_Mat_op_sub_i8: + name: cv_Mat_op_sub_i8 + c:@F@cv_Mat_op_sub_mat: + name: cv_Mat_op_sub_mat + c:@F@cv_Mat_op_sub_u16: + name: cv_Mat_op_sub_u16 + c:@F@cv_Mat_op_sub_u8: + name: cv_Mat_op_sub_u8 + c:@F@cv_Mat_patchNaNs: + name: cv_Mat_patchNaNs + c:@F@cv_Mat_ptr_uchar_1: + name: cv_Mat_ptr_uchar_1 + c:@F@cv_Mat_ptr_uchar_2: + name: cv_Mat_ptr_uchar_2 + c:@F@cv_Mat_ptr_uchar_3: + name: cv_Mat_ptr_uchar_3 + c:@F@cv_Mat_region: + name: cv_Mat_region + c:@F@cv_Mat_release: + name: cv_Mat_release + c:@F@cv_Mat_reshape: + name: cv_Mat_reshape + c:@F@cv_Mat_reshape_1: + name: cv_Mat_reshape_1 + c:@F@cv_Mat_row: + name: cv_Mat_row + c:@F@cv_Mat_rows: + name: cv_Mat_rows + c:@F@cv_Mat_setTo: + name: cv_Mat_setTo + c:@F@cv_Mat_set_Vec2b: + name: cv_Mat_set_Vec2b + c:@F@cv_Mat_set_Vec2d: + name: cv_Mat_set_Vec2d + c:@F@cv_Mat_set_Vec2f: + name: cv_Mat_set_Vec2f + c:@F@cv_Mat_set_Vec2i: + name: cv_Mat_set_Vec2i + c:@F@cv_Mat_set_Vec2s: + name: cv_Mat_set_Vec2s + c:@F@cv_Mat_set_Vec2w: + name: cv_Mat_set_Vec2w + c:@F@cv_Mat_set_Vec3b: + name: cv_Mat_set_Vec3b + c:@F@cv_Mat_set_Vec3d: + name: cv_Mat_set_Vec3d + c:@F@cv_Mat_set_Vec3f: + name: cv_Mat_set_Vec3f + c:@F@cv_Mat_set_Vec3i: + name: cv_Mat_set_Vec3i + c:@F@cv_Mat_set_Vec3s: + name: cv_Mat_set_Vec3s + c:@F@cv_Mat_set_Vec3w: + name: cv_Mat_set_Vec3w + c:@F@cv_Mat_set_Vec4b: + name: cv_Mat_set_Vec4b + c:@F@cv_Mat_set_Vec4d: + name: cv_Mat_set_Vec4d + c:@F@cv_Mat_set_Vec4f: + name: cv_Mat_set_Vec4f + c:@F@cv_Mat_set_Vec4i: + name: cv_Mat_set_Vec4i + c:@F@cv_Mat_set_Vec4s: + name: cv_Mat_set_Vec4s + c:@F@cv_Mat_set_Vec4w: + name: cv_Mat_set_Vec4w + c:@F@cv_Mat_set_Vec6d: + name: cv_Mat_set_Vec6d + c:@F@cv_Mat_set_Vec6f: + name: cv_Mat_set_Vec6f + c:@F@cv_Mat_set_Vec6i: + name: cv_Mat_set_Vec6i + c:@F@cv_Mat_set_Vec8i: + name: cv_Mat_set_Vec8i + c:@F@cv_Mat_set_f32_1: + name: cv_Mat_set_f32_1 + c:@F@cv_Mat_set_f32_2: + name: cv_Mat_set_f32_2 + c:@F@cv_Mat_set_f32_3: + name: cv_Mat_set_f32_3 + c:@F@cv_Mat_set_f64_1: + name: cv_Mat_set_f64_1 + c:@F@cv_Mat_set_f64_2: + name: cv_Mat_set_f64_2 + c:@F@cv_Mat_set_f64_3: + name: cv_Mat_set_f64_3 + c:@F@cv_Mat_set_i16_1: + name: cv_Mat_set_i16_1 + c:@F@cv_Mat_set_i16_2: + name: cv_Mat_set_i16_2 + c:@F@cv_Mat_set_i16_3: + name: cv_Mat_set_i16_3 + c:@F@cv_Mat_set_i32_1: + name: cv_Mat_set_i32_1 + c:@F@cv_Mat_set_i32_2: + name: cv_Mat_set_i32_2 + c:@F@cv_Mat_set_i32_3: + name: cv_Mat_set_i32_3 + c:@F@cv_Mat_set_i8_1: + name: cv_Mat_set_i8_1 + c:@F@cv_Mat_set_i8_2: + name: cv_Mat_set_i8_2 + c:@F@cv_Mat_set_i8_3: + name: cv_Mat_set_i8_3 + c:@F@cv_Mat_set_u16_1: + name: cv_Mat_set_u16_1 + c:@F@cv_Mat_set_u16_2: + name: cv_Mat_set_u16_2 + c:@F@cv_Mat_set_u16_3: + name: cv_Mat_set_u16_3 + c:@F@cv_Mat_set_u8_1: + name: cv_Mat_set_u8_1 + c:@F@cv_Mat_set_u8_2: + name: cv_Mat_set_u8_2 + c:@F@cv_Mat_set_u8_3: + name: cv_Mat_set_u8_3 + c:@F@cv_Mat_size: + name: cv_Mat_size + c:@F@cv_Mat_sqrt: + name: cv_Mat_sqrt + c:@F@cv_Mat_step: + name: cv_Mat_step + c:@F@cv_Mat_t: + name: cv_Mat_t + c:@F@cv_Mat_toFmtString: + name: cv_Mat_toFmtString + c:@F@cv_Mat_toVecChar: + name: cv_Mat_toVecChar + c:@F@cv_Mat_toVecPoint: + name: cv_Mat_toVecPoint + c:@F@cv_Mat_toVecPoint2f: + name: cv_Mat_toVecPoint2f + c:@F@cv_Mat_toVecPoint3f: + name: cv_Mat_toVecPoint3f + c:@F@cv_Mat_toVecPoint3i: + name: cv_Mat_toVecPoint3i + c:@F@cv_Mat_toVecUChar: + name: cv_Mat_toVecUChar + c:@F@cv_Mat_total: + name: cv_Mat_total + c:@F@cv_Mat_type: + name: cv_Mat_type + c:@F@cv_Mat_zeros: + name: cv_Mat_zeros + c:@F@cv_PCACompute: + name: cv_PCACompute + c:@F@cv_RNG_close: + name: cv_RNG_close + c:@F@cv_RNG_create: + name: cv_RNG_create + c:@F@cv_RNG_create_1: + name: cv_RNG_create_1 + c:@F@cv_RNG_fill: + name: cv_RNG_fill + c:@F@cv_RNG_gaussian: + name: cv_RNG_gaussian + c:@F@cv_RNG_next: + name: cv_RNG_next + c:@F@cv_RNG_uniform: + name: cv_RNG_uniform + c:@F@cv_RNG_uniformDouble: + name: cv_RNG_uniformDouble + c:@F@cv_RotatedRect_boundingRect: + name: cv_RotatedRect_boundingRect + c:@F@cv_RotatedRect_boundingRect2f: + name: cv_RotatedRect_boundingRect2f + c:@F@cv_RotatedRect_points: + name: cv_RotatedRect_points + c:@F@cv_SVD_Compute: + name: cv_SVD_Compute + c:@F@cv_SVD_backSubst: + name: cv_SVD_backSubst + c:@F@cv_absdiff: + name: cv_absdiff + c:@F@cv_add: + name: cv_add + c:@F@cv_addWeighted: + name: cv_addWeighted + c:@F@cv_batchDistance: + name: cv_batchDistance + c:@F@cv_bitwise_and: + name: cv_bitwise_and + c:@F@cv_bitwise_and_1: + name: cv_bitwise_and_1 + c:@F@cv_bitwise_not: + name: cv_bitwise_not + c:@F@cv_bitwise_not_1: + name: cv_bitwise_not_1 + c:@F@cv_bitwise_or: + name: cv_bitwise_or + c:@F@cv_bitwise_or_1: + name: cv_bitwise_or_1 + c:@F@cv_bitwise_xor: + name: cv_bitwise_xor + c:@F@cv_bitwise_xor_1: + name: cv_bitwise_xor_1 + c:@F@cv_borderInterpolate: + name: cv_borderInterpolate + c:@F@cv_calcCovarMatrix: + name: cv_calcCovarMatrix + c:@F@cv_cartToPolar: + name: cv_cartToPolar + c:@F@cv_checkRange: + name: cv_checkRange + c:@F@cv_colRange: + name: cv_colRange + c:@F@cv_compare: + name: cv_compare + c:@F@cv_completeSymm: + name: cv_completeSymm + c:@F@cv_convertScaleAbs: + name: cv_convertScaleAbs + c:@F@cv_copyMakeBorder: + name: cv_copyMakeBorder + c:@F@cv_countNonZero: + name: cv_countNonZero + c:@F@cv_dct: + name: cv_dct + c:@F@cv_determinant: + name: cv_determinant + c:@F@cv_dft: + name: cv_dft + c:@F@cv_divide: + name: cv_divide + c:@F@cv_eigen: + name: cv_eigen + c:@F@cv_eigenNonSymmetric: + name: cv_eigenNonSymmetric + c:@F@cv_exp: + name: cv_exp + c:@F@cv_extractChannel: + name: cv_extractChannel + c:@F@cv_findNonZero: + name: cv_findNonZero + c:@F@cv_flip: + name: cv_flip + c:@F@cv_gemm: + name: cv_gemm + c:@F@cv_getNumThreads: + name: cv_getNumThreads + c:@F@cv_getOptimalDFTSize: + name: cv_getOptimalDFTSize + c:@F@cv_getTickCount: + name: cv_getTickCount + c:@F@cv_getTickFrequency: + name: cv_getTickFrequency + c:@F@cv_hconcat: + name: cv_hconcat + c:@F@cv_idct: + name: cv_idct + c:@F@cv_idft: + name: cv_idft + c:@F@cv_inRange: + name: cv_inRange + c:@F@cv_inRange_1: + name: cv_inRange_1 + c:@F@cv_insertChannel: + name: cv_insertChannel + c:@F@cv_invert: + name: cv_invert + c:@F@cv_kmeans: + name: cv_kmeans + c:@F@cv_kmeans_points: + name: cv_kmeans_points + c:@F@cv_log: + name: cv_log + c:@F@cv_magnitude: + name: cv_magnitude + c:@F@cv_max: + name: cv_max + c:@F@cv_meanStdDev: + name: cv_meanStdDev + c:@F@cv_meanStdDev_1: + name: cv_meanStdDev_1 + c:@F@cv_merge: + name: cv_merge + c:@F@cv_min: + name: cv_min + c:@F@cv_minMaxIdx: + name: cv_minMaxIdx + c:@F@cv_minMaxLoc: + name: cv_minMaxLoc + c:@F@cv_mixChannels: + name: cv_mixChannels + c:@F@cv_mulSpectrums: + name: cv_mulSpectrums + c:@F@cv_multiply: + name: cv_multiply + c:@F@cv_norm: + name: cv_norm + c:@F@cv_norm_1: + name: cv_norm_1 + c:@F@cv_normalize: + name: cv_normalize + c:@F@cv_perspectiveTransform: + name: cv_perspectiveTransform + c:@F@cv_phase: + name: cv_phase + c:@F@cv_polarToCart: + name: cv_polarToCart + c:@F@cv_pow: + name: cv_pow + c:@F@cv_randShuffle: + name: cv_randShuffle + c:@F@cv_randShuffle_1: + name: cv_randShuffle_1 + c:@F@cv_randn: + name: cv_randn + c:@F@cv_randu: + name: cv_randu + c:@F@cv_reduce: + name: cv_reduce + c:@F@cv_reduceArgMax: + name: cv_reduceArgMax + c:@F@cv_reduceArgMin: + name: cv_reduceArgMin + c:@F@cv_repeat: + name: cv_repeat + c:@F@cv_rotate: + name: cv_rotate + c:@F@cv_rowRange: + name: cv_rowRange + c:@F@cv_scaleAdd: + name: cv_scaleAdd + c:@F@cv_setIdentity: + name: cv_setIdentity + c:@F@cv_setNumThreads: + name: cv_setNumThreads + c:@F@cv_setRNGSeed: + name: cv_setRNGSeed + c:@F@cv_solve: + name: cv_solve + c:@F@cv_solveCubic: + name: cv_solveCubic + c:@F@cv_solvePoly: + name: cv_solvePoly + c:@F@cv_sort: + name: cv_sort + c:@F@cv_sortIdx: + name: cv_sortIdx + c:@F@cv_split: + name: cv_split + c:@F@cv_subtract: + name: cv_subtract + c:@F@cv_sum: + name: cv_sum + c:@F@cv_theRNG: + name: cv_theRNG + c:@F@cv_trace: + name: cv_trace + c:@F@cv_transform: + name: cv_transform + c:@F@cv_transpose: + name: cv_transpose + c:@F@cv_transposeND: + name: cv_transposeND + c:@F@cv_vconcat: + name: cv_vconcat c:@F@getBuildInfo: name: getBuildInfo - c:@F@getBuildInfo_Async: - name: getBuildInfo_Async + c:@F@getCvVersion: + name: getCvVersion c:@F@getLogLevel: name: getLogLevel - c:@F@openCVVersion: - name: openCVVersion - c:@F@openCVVersion_Async: - name: openCVVersion_Async c:@F@registerErrorCallback: name: registerErrorCallback c:@F@setLogLevel: diff --git a/packages/dartcv/lib/src/g/dnn.g.dart b/packages/dartcv/lib/src/g/dnn.g.dart index 0b17a040..b7cdaf88 100644 --- a/packages/dartcv/lib/src/g/dnn.g.dart +++ b/packages/dartcv/lib/src/g/dnn.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Dnn /// @@ -30,257 +30,170 @@ class CvNativeDnn { lookup) : _lookup = lookup; - void AsyncArray_Close( + void cv_dnn_AsyncArray_close( AsyncArrayPtr a, ) { - return _AsyncArray_Close( + return _cv_dnn_AsyncArray_close( a, ); } - late final _AsyncArray_ClosePtr = + late final _cv_dnn_AsyncArray_closePtr = _lookup>( - 'AsyncArray_Close'); - late final _AsyncArray_Close = - _AsyncArray_ClosePtr.asFunction(); + 'cv_dnn_AsyncArray_close'); + late final _cv_dnn_AsyncArray_close = + _cv_dnn_AsyncArray_closePtr.asFunction(); - ffi.Pointer AsyncArray_Get( + ffi.Pointer cv_dnn_AsyncArray_get( AsyncArray async_out, Mat out, ) { - return _AsyncArray_Get( + return _cv_dnn_AsyncArray_get( async_out, out, ); } - late final _AsyncArray_GetPtr = _lookup< + late final _cv_dnn_AsyncArray_getPtr = _lookup< ffi.NativeFunction Function(AsyncArray, Mat)>>( - 'AsyncArray_Get'); - late final _AsyncArray_Get = _AsyncArray_GetPtr.asFunction< - ffi.Pointer Function(AsyncArray, Mat)>(); + 'cv_dnn_AsyncArray_get'); + late final _cv_dnn_AsyncArray_get = _cv_dnn_AsyncArray_getPtr + .asFunction Function(AsyncArray, Mat)>(); - ffi.Pointer AsyncArray_New( + ffi.Pointer cv_dnn_AsyncArray_new( ffi.Pointer rval, ) { - return _AsyncArray_New( + return _cv_dnn_AsyncArray_new( rval, ); } - late final _AsyncArray_NewPtr = _lookup< + late final _cv_dnn_AsyncArray_newPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('AsyncArray_New'); - late final _AsyncArray_New = _AsyncArray_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + ffi.Pointer)>>('cv_dnn_AsyncArray_new'); + late final _cv_dnn_AsyncArray_new = _cv_dnn_AsyncArray_newPtr + .asFunction Function(ffi.Pointer)>(); - void Layer_Close( + void cv_dnn_Layer_close( LayerPtr layer, ) { - return _Layer_Close( + return _cv_dnn_Layer_close( layer, ); } - late final _Layer_ClosePtr = - _lookup>('Layer_Close'); - late final _Layer_Close = - _Layer_ClosePtr.asFunction(); + late final _cv_dnn_Layer_closePtr = + _lookup>( + 'cv_dnn_Layer_close'); + late final _cv_dnn_Layer_close = + _cv_dnn_Layer_closePtr.asFunction(); - void Layer_Close_Async( - LayerPtr layer, - imp1.CvCallback_0 callback, - ) { - return _Layer_Close_Async( - layer, - callback, - ); - } - - late final _Layer_Close_AsyncPtr = _lookup< - ffi.NativeFunction>( - 'Layer_Close_Async'); - late final _Layer_Close_Async = _Layer_Close_AsyncPtr.asFunction< - void Function(LayerPtr, imp1.CvCallback_0)>(); - - ffi.Pointer Layer_GetName( + ffi.Pointer cv_dnn_Layer_getName( Layer layer, ffi.Pointer> rval, ) { - return _Layer_GetName( + return _cv_dnn_Layer_getName( layer, rval, ); } - late final _Layer_GetNamePtr = _lookup< + late final _cv_dnn_Layer_getNamePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Layer, ffi.Pointer>)>>('Layer_GetName'); - late final _Layer_GetName = _Layer_GetNamePtr.asFunction< + ffi.Pointer Function(Layer, + ffi.Pointer>)>>('cv_dnn_Layer_getName'); + late final _cv_dnn_Layer_getName = _cv_dnn_Layer_getNamePtr.asFunction< ffi.Pointer Function( Layer, ffi.Pointer>)>(); - ffi.Pointer Layer_GetName_Async( - Layer layer, - imp1.CvCallback_1 callback, - ) { - return _Layer_GetName_Async( - layer, - callback, - ); - } - - late final _Layer_GetName_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Layer, imp1.CvCallback_1)>>('Layer_GetName_Async'); - late final _Layer_GetName_Async = _Layer_GetName_AsyncPtr.asFunction< - ffi.Pointer Function(Layer, imp1.CvCallback_1)>(); - - ffi.Pointer Layer_GetType( + ffi.Pointer cv_dnn_Layer_getType( Layer layer, ffi.Pointer> rval, ) { - return _Layer_GetType( + return _cv_dnn_Layer_getType( layer, rval, ); } - late final _Layer_GetTypePtr = _lookup< + late final _cv_dnn_Layer_getTypePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Layer, ffi.Pointer>)>>('Layer_GetType'); - late final _Layer_GetType = _Layer_GetTypePtr.asFunction< + ffi.Pointer Function(Layer, + ffi.Pointer>)>>('cv_dnn_Layer_getType'); + late final _cv_dnn_Layer_getType = _cv_dnn_Layer_getTypePtr.asFunction< ffi.Pointer Function( Layer, ffi.Pointer>)>(); - ffi.Pointer Layer_GetType_Async( - Layer layer, - imp1.CvCallback_1 callback, - ) { - return _Layer_GetType_Async( - layer, - callback, - ); - } - - late final _Layer_GetType_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Layer, imp1.CvCallback_1)>>('Layer_GetType_Async'); - late final _Layer_GetType_Async = _Layer_GetType_AsyncPtr.asFunction< - ffi.Pointer Function(Layer, imp1.CvCallback_1)>(); - - ffi.Pointer Layer_InputNameToIndex( + ffi.Pointer cv_dnn_Layer_inputNameToIndex( Layer layer, ffi.Pointer name, ffi.Pointer rval, ) { - return _Layer_InputNameToIndex( + return _cv_dnn_Layer_inputNameToIndex( layer, name, rval, ); } - late final _Layer_InputNameToIndexPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Layer, ffi.Pointer, - ffi.Pointer)>>('Layer_InputNameToIndex'); - late final _Layer_InputNameToIndex = _Layer_InputNameToIndexPtr.asFunction< - ffi.Pointer Function( - Layer, ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer Layer_InputNameToIndex_Async( - Layer layer, - ffi.Pointer name, - imp1.CvCallback_1 callback, - ) { - return _Layer_InputNameToIndex_Async( - layer, - name, - callback, - ); - } - - late final _Layer_InputNameToIndex_AsyncPtr = _lookup< + late final _cv_dnn_Layer_inputNameToIndexPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Layer, ffi.Pointer, - imp1.CvCallback_1)>>('Layer_InputNameToIndex_Async'); - late final _Layer_InputNameToIndex_Async = - _Layer_InputNameToIndex_AsyncPtr.asFunction< + ffi.Pointer)>>('cv_dnn_Layer_inputNameToIndex'); + late final _cv_dnn_Layer_inputNameToIndex = + _cv_dnn_Layer_inputNameToIndexPtr.asFunction< ffi.Pointer Function( - Layer, ffi.Pointer, imp1.CvCallback_1)>(); + Layer, ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer Layer_OutputNameToIndex( + ffi.Pointer cv_dnn_Layer_outputNameToIndex( Layer layer, ffi.Pointer name, ffi.Pointer rval, ) { - return _Layer_OutputNameToIndex( + return _cv_dnn_Layer_outputNameToIndex( layer, name, rval, ); } - late final _Layer_OutputNameToIndexPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Layer, ffi.Pointer, - ffi.Pointer)>>('Layer_OutputNameToIndex'); - late final _Layer_OutputNameToIndex = _Layer_OutputNameToIndexPtr.asFunction< - ffi.Pointer Function( - Layer, ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer Layer_OutputNameToIndex_Async( - Layer layer, - ffi.Pointer name, - imp1.CvCallback_1 callback, - ) { - return _Layer_OutputNameToIndex_Async( - layer, - name, - callback, - ); - } - - late final _Layer_OutputNameToIndex_AsyncPtr = _lookup< + late final _cv_dnn_Layer_outputNameToIndexPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Layer, ffi.Pointer, - imp1.CvCallback_1)>>('Layer_OutputNameToIndex_Async'); - late final _Layer_OutputNameToIndex_Async = - _Layer_OutputNameToIndex_AsyncPtr.asFunction< + ffi.Pointer)>>('cv_dnn_Layer_outputNameToIndex'); + late final _cv_dnn_Layer_outputNameToIndex = + _cv_dnn_Layer_outputNameToIndexPtr.asFunction< ffi.Pointer Function( - Layer, ffi.Pointer, imp1.CvCallback_1)>(); + Layer, ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer NMSBoxes( + ffi.Pointer cv_dnn_NMSBoxes( VecRect bboxes, VecF32 scores, double score_threshold, double nms_threshold, ffi.Pointer indices, + imp1.CvCallback_0 callback, ) { - return _NMSBoxes( + return _cv_dnn_NMSBoxes( bboxes, scores, score_threshold, nms_threshold, indices, + callback, ); } - late final _NMSBoxesPtr = _lookup< + late final _cv_dnn_NMSBoxesPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(VecRect, VecF32, ffi.Float, ffi.Float, - ffi.Pointer)>>('NMSBoxes'); - late final _NMSBoxes = _NMSBoxesPtr.asFunction< - ffi.Pointer Function( - VecRect, VecF32, double, double, ffi.Pointer)>(); + ffi.Pointer, imp1.CvCallback_0)>>('cv_dnn_NMSBoxes'); + late final _cv_dnn_NMSBoxes = _cv_dnn_NMSBoxesPtr.asFunction< + ffi.Pointer Function(VecRect, VecF32, double, double, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer NMSBoxesWithParams( + ffi.Pointer cv_dnn_NMSBoxes_1( VecRect bboxes, VecF32 scores, double score_threshold, @@ -288,8 +201,9 @@ class CvNativeDnn { ffi.Pointer indices, double eta, int top_k, + imp1.CvCallback_0 callback, ) { - return _NMSBoxesWithParams( + return _cv_dnn_NMSBoxes_1( bboxes, scores, score_threshold, @@ -297,77 +211,26 @@ class CvNativeDnn { indices, eta, top_k, - ); - } - - late final _NMSBoxesWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecRect, VecF32, ffi.Float, ffi.Float, - ffi.Pointer, ffi.Float, ffi.Int)>>('NMSBoxesWithParams'); - late final _NMSBoxesWithParams = _NMSBoxesWithParamsPtr.asFunction< - ffi.Pointer Function( - VecRect, VecF32, double, double, ffi.Pointer, double, int)>(); - - ffi.Pointer NMSBoxesWithParams_Async( - VecRect bboxes, - VecF32 scores, - double score_threshold, - double nms_threshold, - double eta, - int top_k, - imp1.CvCallback_1 callback, - ) { - return _NMSBoxesWithParams_Async( - bboxes, - scores, - score_threshold, - nms_threshold, - eta, - top_k, callback, ); } - late final _NMSBoxesWithParams_AsyncPtr = _lookup< + late final _cv_dnn_NMSBoxes_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VecRect, VecF32, ffi.Float, ffi.Float, + ffi.Pointer, ffi.Float, ffi.Int, - imp1.CvCallback_1)>>('NMSBoxesWithParams_Async'); - late final _NMSBoxesWithParams_Async = - _NMSBoxesWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(VecRect, VecF32, double, double, - double, int, imp1.CvCallback_1)>(); - - ffi.Pointer NMSBoxes_Async( - VecRect bboxes, - VecF32 scores, - double score_threshold, - double nms_threshold, - imp1.CvCallback_1 callback, - ) { - return _NMSBoxes_Async( - bboxes, - scores, - score_threshold, - nms_threshold, - callback, - ); - } - - late final _NMSBoxes_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecRect, VecF32, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('NMSBoxes_Async'); - late final _NMSBoxes_Async = _NMSBoxes_AsyncPtr.asFunction< - ffi.Pointer Function( - VecRect, VecF32, double, double, imp1.CvCallback_1)>(); + imp1.CvCallback_0)>>('cv_dnn_NMSBoxes_1'); + late final _cv_dnn_NMSBoxes_1 = _cv_dnn_NMSBoxes_1Ptr.asFunction< + ffi.Pointer Function(VecRect, VecF32, double, double, + ffi.Pointer, double, int, imp1.CvCallback_0)>(); - ffi.Pointer Net_BlobFromImage( + ffi.Pointer cv_dnn_Net_blobFromImage( Mat image, Mat blob, double scalefactor, @@ -376,8 +239,9 @@ class CvNativeDnn { bool swapRB, bool crop, int ddepth, + imp1.CvCallback_0 callback, ) { - return _Net_BlobFromImage( + return _cv_dnn_Net_blobFromImage( image, blob, scalefactor, @@ -386,42 +250,14 @@ class CvNativeDnn { swapRB, crop, ddepth, - ); - } - - late final _Net_BlobFromImagePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, CvSize, Scalar, - ffi.Bool, ffi.Bool, ffi.Int)>>('Net_BlobFromImage'); - late final _Net_BlobFromImage = _Net_BlobFromImagePtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, CvSize, Scalar, bool, bool, int)>(); - - ffi.Pointer Net_BlobFromImage_Async( - Mat image, - double scalefactor, - CvSize size, - Scalar mean, - bool swapRB, - bool crop, - int ddepth, - imp1.CvCallback_1 callback, - ) { - return _Net_BlobFromImage_Async( - image, - scalefactor, - size, - mean, - swapRB, - crop, - ddepth, callback, ); } - late final _Net_BlobFromImage_AsyncPtr = _lookup< + late final _cv_dnn_Net_blobFromImagePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( + Mat, Mat, ffi.Double, CvSize, @@ -429,12 +265,13 @@ class CvNativeDnn { ffi.Bool, ffi.Bool, ffi.Int, - imp1.CvCallback_1)>>('Net_BlobFromImage_Async'); - late final _Net_BlobFromImage_Async = _Net_BlobFromImage_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, CvSize, Scalar, bool, bool, int, imp1.CvCallback_1)>(); + imp1.CvCallback_0)>>('cv_dnn_Net_blobFromImage'); + late final _cv_dnn_Net_blobFromImage = + _cv_dnn_Net_blobFromImagePtr.asFunction< + ffi.Pointer Function(Mat, Mat, double, CvSize, Scalar, bool, + bool, int, imp1.CvCallback_0)>(); - ffi.Pointer Net_BlobFromImages( + ffi.Pointer cv_dnn_Net_blobFromImages( VecMat images, Mat blob, double scalefactor, @@ -443,8 +280,9 @@ class CvNativeDnn { bool swapRB, bool crop, int ddepth, + imp1.CvCallback_0 callback, ) { - return _Net_BlobFromImages( + return _cv_dnn_Net_blobFromImages( images, blob, scalefactor, @@ -453,1066 +291,629 @@ class CvNativeDnn { swapRB, crop, ddepth, - ); - } - - late final _Net_BlobFromImagesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecMat, Mat, ffi.Double, CvSize, - Scalar, ffi.Bool, ffi.Bool, ffi.Int)>>('Net_BlobFromImages'); - late final _Net_BlobFromImages = _Net_BlobFromImagesPtr.asFunction< - ffi.Pointer Function( - VecMat, Mat, double, CvSize, Scalar, bool, bool, int)>(); - - ffi.Pointer Net_BlobFromImages_Async( - VecMat images, - double scalefactor, - CvSize size, - Scalar mean, - bool swapRB, - bool crop, - int ddepth, - imp1.CvCallback_1 callback, - ) { - return _Net_BlobFromImages_Async( - images, - scalefactor, - size, - mean, - swapRB, - crop, - ddepth, callback, ); } - late final _Net_BlobFromImages_AsyncPtr = _lookup< + late final _cv_dnn_Net_blobFromImagesPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VecMat, + Mat, ffi.Double, CvSize, Scalar, ffi.Bool, ffi.Bool, ffi.Int, - imp1.CvCallback_1)>>('Net_BlobFromImages_Async'); - late final _Net_BlobFromImages_Async = - _Net_BlobFromImages_AsyncPtr.asFunction< - ffi.Pointer Function(VecMat, double, CvSize, Scalar, bool, - bool, int, imp1.CvCallback_1)>(); - - void Net_Close( - NetPtr net, - ) { - return _Net_Close( - net, - ); - } - - late final _Net_ClosePtr = - _lookup>('Net_Close'); - late final _Net_Close = _Net_ClosePtr.asFunction(); + imp1.CvCallback_0)>>('cv_dnn_Net_blobFromImages'); + late final _cv_dnn_Net_blobFromImages = + _cv_dnn_Net_blobFromImagesPtr.asFunction< + ffi.Pointer Function(VecMat, Mat, double, CvSize, Scalar, + bool, bool, int, imp1.CvCallback_0)>(); - void Net_Close_Async( + void cv_dnn_Net_close( NetPtr net, - imp1.CvCallback_0 callback, ) { - return _Net_Close_Async( + return _cv_dnn_Net_close( net, - callback, ); } - late final _Net_Close_AsyncPtr = - _lookup>( - 'Net_Close_Async'); - late final _Net_Close_Async = _Net_Close_AsyncPtr.asFunction< - void Function(NetPtr, imp1.CvCallback_0)>(); + late final _cv_dnn_Net_closePtr = + _lookup>( + 'cv_dnn_Net_close'); + late final _cv_dnn_Net_close = + _cv_dnn_Net_closePtr.asFunction(); - ffi.Pointer Net_Create( + ffi.Pointer cv_dnn_Net_create( ffi.Pointer rval, ) { - return _Net_Create( + return _cv_dnn_Net_create( rval, ); } - late final _Net_CreatePtr = _lookup< + late final _cv_dnn_Net_createPtr = _lookup< ffi.NativeFunction Function(ffi.Pointer)>>( - 'Net_Create'); - late final _Net_Create = _Net_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer Net_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _Net_Create_Async( - callback, - ); - } - - late final _Net_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'Net_Create_Async'); - late final _Net_Create_Async = _Net_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + 'cv_dnn_Net_create'); + late final _cv_dnn_Net_create = _cv_dnn_Net_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer Net_Dump( + ffi.Pointer cv_dnn_Net_dump( Net net, ffi.Pointer> rval, ) { - return _Net_Dump( + return _cv_dnn_Net_dump( net, rval, ); } - late final _Net_DumpPtr = _lookup< + late final _cv_dnn_Net_dumpPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Net, ffi.Pointer>)>>('Net_Dump'); - late final _Net_Dump = _Net_DumpPtr.asFunction< + Net, ffi.Pointer>)>>('cv_dnn_Net_dump'); + late final _cv_dnn_Net_dump = _cv_dnn_Net_dumpPtr.asFunction< ffi.Pointer Function( Net, ffi.Pointer>)>(); - ffi.Pointer Net_Dump_Async( + bool cv_dnn_Net_empty( Net net, - imp1.CvCallback_1 callback, ) { - return _Net_Dump_Async( + return _cv_dnn_Net_empty( net, - callback, ); } - late final _Net_Dump_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, imp1.CvCallback_1)>>('Net_Dump_Async'); - late final _Net_Dump_Async = _Net_Dump_AsyncPtr.asFunction< - ffi.Pointer Function(Net, imp1.CvCallback_1)>(); + late final _cv_dnn_Net_emptyPtr = + _lookup>('cv_dnn_Net_empty'); + late final _cv_dnn_Net_empty = + _cv_dnn_Net_emptyPtr.asFunction(); - ffi.Pointer Net_Empty( + ffi.Pointer cv_dnn_Net_forward( Net net, - ffi.Pointer rval, + ffi.Pointer outputName, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Net_Empty( + return _cv_dnn_Net_forward( net, + outputName, rval, - ); - } - - late final _Net_EmptyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, ffi.Pointer)>>('Net_Empty'); - late final _Net_Empty = _Net_EmptyPtr.asFunction< - ffi.Pointer Function(Net, ffi.Pointer)>(); - - ffi.Pointer Net_Empty_Async( - Net net, - imp1.CvCallback_1 callback, - ) { - return _Net_Empty_Async( - net, callback, ); } - late final _Net_Empty_AsyncPtr = _lookup< + late final _cv_dnn_Net_forwardPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Net, imp1.CvCallback_1)>>('Net_Empty_Async'); - late final _Net_Empty_Async = _Net_Empty_AsyncPtr.asFunction< - ffi.Pointer Function(Net, imp1.CvCallback_1)>(); + ffi.Pointer Function(Net, ffi.Pointer, Mat, + imp1.CvCallback_0)>>('cv_dnn_Net_forward'); + late final _cv_dnn_Net_forward = _cv_dnn_Net_forwardPtr.asFunction< + ffi.Pointer Function( + Net, ffi.Pointer, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Net_Forward( + ffi.Pointer cv_dnn_Net_forwardAsync( Net net, ffi.Pointer outputName, - ffi.Pointer rval, + ffi.Pointer rval, ) { - return _Net_Forward( + return _cv_dnn_Net_forwardAsync( net, outputName, rval, ); } - late final _Net_ForwardPtr = _lookup< + late final _cv_dnn_Net_forwardAsyncPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Net, ffi.Pointer, ffi.Pointer)>>('Net_Forward'); - late final _Net_Forward = _Net_ForwardPtr.asFunction< + ffi.Pointer Function(Net, ffi.Pointer, + ffi.Pointer)>>('cv_dnn_Net_forwardAsync'); + late final _cv_dnn_Net_forwardAsync = _cv_dnn_Net_forwardAsyncPtr.asFunction< ffi.Pointer Function( - Net, ffi.Pointer, ffi.Pointer)>(); + Net, ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer Net_ForwardLayers( + ffi.Pointer cv_dnn_Net_forwardLayers( Net net, ffi.Pointer outputBlobs, VecVecChar outBlobNames, + imp1.CvCallback_0 callback, ) { - return _Net_ForwardLayers( + return _cv_dnn_Net_forwardLayers( net, outputBlobs, outBlobNames, - ); - } - - late final _Net_ForwardLayersPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, ffi.Pointer, VecVecChar)>>('Net_ForwardLayers'); - late final _Net_ForwardLayers = _Net_ForwardLayersPtr.asFunction< - ffi.Pointer Function(Net, ffi.Pointer, VecVecChar)>(); - - ffi.Pointer Net_ForwardLayers_Async( - Net net, - VecVecChar outBlobNames, - imp1.CvCallback_1 callback, - ) { - return _Net_ForwardLayers_Async( - net, - outBlobNames, callback, ); } - late final _Net_ForwardLayers_AsyncPtr = _lookup< + late final _cv_dnn_Net_forwardLayersPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Net, ffi.Pointer, VecVecChar, + imp1.CvCallback_0)>>('cv_dnn_Net_forwardLayers'); + late final _cv_dnn_Net_forwardLayers = + _cv_dnn_Net_forwardLayersPtr.asFunction< ffi.Pointer Function( - Net, VecVecChar, imp1.CvCallback_1)>>('Net_ForwardLayers_Async'); - late final _Net_ForwardLayers_Async = _Net_ForwardLayers_AsyncPtr.asFunction< - ffi.Pointer Function(Net, VecVecChar, imp1.CvCallback_1)>(); - - ffi.Pointer Net_Forward_Async( - Net net, - ffi.Pointer outputName, - imp1.CvCallback_1 callback, - ) { - return _Net_Forward_Async( - net, - outputName, - callback, - ); - } - - late final _Net_Forward_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Net, ffi.Pointer, - imp1.CvCallback_1)>>('Net_Forward_Async'); - late final _Net_Forward_Async = _Net_Forward_AsyncPtr.asFunction< - ffi.Pointer Function( - Net, ffi.Pointer, imp1.CvCallback_1)>(); + Net, ffi.Pointer, VecVecChar, imp1.CvCallback_0)>(); - ffi.Pointer Net_FromNet( + ffi.Pointer cv_dnn_Net_fromNet( Net net, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_FromNet( + return _cv_dnn_Net_fromNet( net, rval, - ); - } - - late final _Net_FromNetPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, ffi.Pointer)>>('Net_FromNet'); - late final _Net_FromNet = _Net_FromNetPtr.asFunction< - ffi.Pointer Function(Net, ffi.Pointer)>(); - - ffi.Pointer Net_FromNet_Async( - Net net, - imp1.CvCallback_1 callback, - ) { - return _Net_FromNet_Async( - net, callback, ); } - late final _Net_FromNet_AsyncPtr = _lookup< + late final _cv_dnn_Net_fromNetPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Net, imp1.CvCallback_1)>>('Net_FromNet_Async'); - late final _Net_FromNet_Async = _Net_FromNet_AsyncPtr.asFunction< - ffi.Pointer Function(Net, imp1.CvCallback_1)>(); + Net, ffi.Pointer, imp1.CvCallback_0)>>('cv_dnn_Net_fromNet'); + late final _cv_dnn_Net_fromNet = _cv_dnn_Net_fromNetPtr.asFunction< + ffi.Pointer Function( + Net, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_GetBlobChannel( + ffi.Pointer cv_dnn_Net_getBlobChannel( Mat blob, int imgidx, int chnidx, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Net_GetBlobChannel( + return _cv_dnn_Net_getBlobChannel( blob, imgidx, chnidx, rval, - ); - } - - late final _Net_GetBlobChannelPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, ffi.Pointer)>>('Net_GetBlobChannel'); - late final _Net_GetBlobChannel = _Net_GetBlobChannelPtr.asFunction< - ffi.Pointer Function(Mat, int, int, ffi.Pointer)>(); - - ffi.Pointer Net_GetBlobChannel_Async( - Mat blob, - int imgidx, - int chnidx, - imp1.CvCallback_1 callback, - ) { - return _Net_GetBlobChannel_Async( - blob, - imgidx, - chnidx, callback, ); } - late final _Net_GetBlobChannel_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('Net_GetBlobChannel_Async'); - late final _Net_GetBlobChannel_Async = - _Net_GetBlobChannel_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer Net_GetBlobSize( - Mat blob, - ffi.Pointer rval, - ) { - return _Net_GetBlobSize( - blob, - rval, - ); - } - - late final _Net_GetBlobSizePtr = _lookup< + late final _cv_dnn_Net_getBlobChannelPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Mat, ffi.Int, ffi.Int, Mat, + imp1.CvCallback_0)>>('cv_dnn_Net_getBlobChannel'); + late final _cv_dnn_Net_getBlobChannel = + _cv_dnn_Net_getBlobChannelPtr.asFunction< ffi.Pointer Function( - Mat, ffi.Pointer)>>('Net_GetBlobSize'); - late final _Net_GetBlobSize = _Net_GetBlobSizePtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); + Mat, int, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Net_GetBlobSize_Async( + ffi.Pointer cv_dnn_Net_getBlobSize( Mat blob, - imp1.CvCallback_1 callback, + ffi.Pointer rval, ) { - return _Net_GetBlobSize_Async( + return _cv_dnn_Net_getBlobSize( blob, - callback, + rval, ); } - late final _Net_GetBlobSize_AsyncPtr = _lookup< + late final _cv_dnn_Net_getBlobSizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('Net_GetBlobSize_Async'); - late final _Net_GetBlobSize_Async = _Net_GetBlobSize_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, imp1.CvCallback_1)>(); + Mat, ffi.Pointer)>>('cv_dnn_Net_getBlobSize'); + late final _cv_dnn_Net_getBlobSize = _cv_dnn_Net_getBlobSizePtr + .asFunction Function(Mat, ffi.Pointer)>(); - ffi.Pointer Net_GetInputDetails( + ffi.Pointer cv_dnn_Net_getInputDetails( Net net, ffi.Pointer scales, ffi.Pointer zeropoints, + imp1.CvCallback_0 callback, ) { - return _Net_GetInputDetails( + return _cv_dnn_Net_getInputDetails( net, scales, zeropoints, - ); - } - - late final _Net_GetInputDetailsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Net, ffi.Pointer, - ffi.Pointer)>>('Net_GetInputDetails'); - late final _Net_GetInputDetails = _Net_GetInputDetailsPtr.asFunction< - ffi.Pointer Function( - Net, ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer Net_GetInputDetails_Async( - Net net, - imp1.CvCallback_2 callback, - ) { - return _Net_GetInputDetails_Async( - net, callback, ); } - late final _Net_GetInputDetails_AsyncPtr = _lookup< + late final _cv_dnn_Net_getInputDetailsPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Net, imp1.CvCallback_2)>>('Net_GetInputDetails_Async'); - late final _Net_GetInputDetails_Async = _Net_GetInputDetails_AsyncPtr - .asFunction Function(Net, imp1.CvCallback_2)>(); + Net, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_getInputDetails'); + late final _cv_dnn_Net_getInputDetails = + _cv_dnn_Net_getInputDetailsPtr.asFunction< + ffi.Pointer Function(Net, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_GetLayer( + ffi.Pointer cv_dnn_Net_getLayer( Net net, int layerid, ffi.Pointer rval, ) { - return _Net_GetLayer( + return _cv_dnn_Net_getLayer( net, layerid, rval, ); } - late final _Net_GetLayerPtr = _lookup< + late final _cv_dnn_Net_getLayerPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Net, ffi.Int, ffi.Pointer)>>('Net_GetLayer'); - late final _Net_GetLayer = _Net_GetLayerPtr.asFunction< + Net, ffi.Int, ffi.Pointer)>>('cv_dnn_Net_getLayer'); + late final _cv_dnn_Net_getLayer = _cv_dnn_Net_getLayerPtr.asFunction< ffi.Pointer Function(Net, int, ffi.Pointer)>(); - ffi.Pointer Net_GetLayerNames( + ffi.Pointer cv_dnn_Net_getLayerNames( Net net, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_GetLayerNames( + return _cv_dnn_Net_getLayerNames( net, rval, - ); - } - - late final _Net_GetLayerNamesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, ffi.Pointer)>>('Net_GetLayerNames'); - late final _Net_GetLayerNames = _Net_GetLayerNamesPtr.asFunction< - ffi.Pointer Function(Net, ffi.Pointer)>(); - - ffi.Pointer Net_GetLayerNames_Async( - Net net, - imp1.CvCallback_1 callback, - ) { - return _Net_GetLayerNames_Async( - net, - callback, - ); - } - - late final _Net_GetLayerNames_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, imp1.CvCallback_1)>>('Net_GetLayerNames_Async'); - late final _Net_GetLayerNames_Async = _Net_GetLayerNames_AsyncPtr.asFunction< - ffi.Pointer Function(Net, imp1.CvCallback_1)>(); - - ffi.Pointer Net_GetLayer_Async( - Net net, - int layerid, - imp1.CvCallback_1 callback, - ) { - return _Net_GetLayer_Async( - net, - layerid, callback, ); } - late final _Net_GetLayer_AsyncPtr = _lookup< + late final _cv_dnn_Net_getLayerNamesPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Net, ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_getLayerNames'); + late final _cv_dnn_Net_getLayerNames = + _cv_dnn_Net_getLayerNamesPtr.asFunction< ffi.Pointer Function( - Net, ffi.Int, imp1.CvCallback_1)>>('Net_GetLayer_Async'); - late final _Net_GetLayer_Async = _Net_GetLayer_AsyncPtr.asFunction< - ffi.Pointer Function(Net, int, imp1.CvCallback_1)>(); + Net, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_GetPerfProfile( + ffi.Pointer cv_dnn_Net_getPerfProfile( Net net, ffi.Pointer rval, + ffi.Pointer layersTimes, + imp1.CvCallback_0 callback, ) { - return _Net_GetPerfProfile( + return _cv_dnn_Net_getPerfProfile( net, rval, - ); - } - - late final _Net_GetPerfProfilePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, ffi.Pointer)>>('Net_GetPerfProfile'); - late final _Net_GetPerfProfile = _Net_GetPerfProfilePtr.asFunction< - ffi.Pointer Function(Net, ffi.Pointer)>(); - - ffi.Pointer Net_GetPerfProfile_Async( - Net net, - imp1.CvCallback_1 callback, - ) { - return _Net_GetPerfProfile_Async( - net, + layersTimes, callback, ); } - late final _Net_GetPerfProfile_AsyncPtr = _lookup< + late final _cv_dnn_Net_getPerfProfilePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Net, imp1.CvCallback_1)>>('Net_GetPerfProfile_Async'); - late final _Net_GetPerfProfile_Async = _Net_GetPerfProfile_AsyncPtr - .asFunction Function(Net, imp1.CvCallback_1)>(); + Net, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_getPerfProfile'); + late final _cv_dnn_Net_getPerfProfile = + _cv_dnn_Net_getPerfProfilePtr.asFunction< + ffi.Pointer Function(Net, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_GetUnconnectedOutLayers( + ffi.Pointer cv_dnn_Net_getUnconnectedOutLayers( Net net, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_GetUnconnectedOutLayers( + return _cv_dnn_Net_getUnconnectedOutLayers( net, rval, - ); - } - - late final _Net_GetUnconnectedOutLayersPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, ffi.Pointer)>>('Net_GetUnconnectedOutLayers'); - late final _Net_GetUnconnectedOutLayers = _Net_GetUnconnectedOutLayersPtr - .asFunction Function(Net, ffi.Pointer)>(); - - ffi.Pointer Net_GetUnconnectedOutLayers_Async( - Net net, - imp1.CvCallback_1 callback, - ) { - return _Net_GetUnconnectedOutLayers_Async( - net, callback, ); } - late final _Net_GetUnconnectedOutLayers_AsyncPtr = _lookup< + late final _cv_dnn_Net_getUnconnectedOutLayersPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Net, ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_getUnconnectedOutLayers'); + late final _cv_dnn_Net_getUnconnectedOutLayers = + _cv_dnn_Net_getUnconnectedOutLayersPtr.asFunction< ffi.Pointer Function( - Net, imp1.CvCallback_1)>>('Net_GetUnconnectedOutLayers_Async'); - late final _Net_GetUnconnectedOutLayers_Async = - _Net_GetUnconnectedOutLayers_AsyncPtr.asFunction< - ffi.Pointer Function(Net, imp1.CvCallback_1)>(); + Net, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ImagesFromBlob( + ffi.Pointer cv_dnn_Net_imagesFromBlob( Mat blob, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ImagesFromBlob( + return _cv_dnn_Net_imagesFromBlob( blob, rval, - ); - } - - late final _Net_ImagesFromBlobPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Pointer)>>('Net_ImagesFromBlob'); - late final _Net_ImagesFromBlob = _Net_ImagesFromBlobPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer)>(); - - ffi.Pointer Net_ImagesFromBlob_Async( - Mat blob, - imp1.CvCallback_1 callback, - ) { - return _Net_ImagesFromBlob_Async( - blob, callback, ); } - late final _Net_ImagesFromBlob_AsyncPtr = _lookup< + late final _cv_dnn_Net_imagesFromBlobPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_imagesFromBlob'); + late final _cv_dnn_Net_imagesFromBlob = + _cv_dnn_Net_imagesFromBlobPtr.asFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('Net_ImagesFromBlob_Async'); - late final _Net_ImagesFromBlob_Async = _Net_ImagesFromBlob_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); + Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNet( + ffi.Pointer cv_dnn_Net_readNet( ffi.Pointer model, ffi.Pointer config, ffi.Pointer framework, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNet( + return _cv_dnn_Net_readNet( model, config, framework, rval, + callback, ); } - late final _Net_ReadNetPtr = _lookup< + late final _cv_dnn_Net_readNetPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer, ffi.Pointer, - ffi.Pointer)>>('Net_ReadNet'); - late final _Net_ReadNet = _Net_ReadNetPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNet'); + late final _cv_dnn_Net_readNet = _cv_dnn_Net_readNetPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetBytes( + ffi.Pointer cv_dnn_Net_readNetBytes( ffi.Pointer framework, VecUChar model, VecUChar config, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetBytes( + return _cv_dnn_Net_readNetBytes( framework, model, config, rval, - ); - } - - late final _Net_ReadNetBytesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, VecUChar, - VecUChar, ffi.Pointer)>>('Net_ReadNetBytes'); - late final _Net_ReadNetBytes = _Net_ReadNetBytesPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, VecUChar, VecUChar, ffi.Pointer)>(); - - ffi.Pointer Net_ReadNetBytes_Async( - ffi.Pointer framework, - VecUChar model, - VecUChar config, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetBytes_Async( - framework, - model, - config, callback, ); } - late final _Net_ReadNetBytes_AsyncPtr = _lookup< + late final _cv_dnn_Net_readNetBytesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, VecUChar, - VecUChar, imp1.CvCallback_1)>>('Net_ReadNetBytes_Async'); - late final _Net_ReadNetBytes_Async = _Net_ReadNetBytes_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, VecUChar, VecUChar, imp1.CvCallback_1)>(); - - ffi.Pointer Net_ReadNetFromCaffe( + ffi.Pointer Function( + ffi.Pointer, + VecUChar, + VecUChar, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetBytes'); + late final _cv_dnn_Net_readNetBytes = _cv_dnn_Net_readNetBytesPtr.asFunction< + ffi.Pointer Function(ffi.Pointer, VecUChar, VecUChar, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_dnn_Net_readNetFromCaffe( ffi.Pointer prototxt, ffi.Pointer caffeModel, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromCaffe( + return _cv_dnn_Net_readNetFromCaffe( prototxt, caffeModel, rval, + callback, ); } - late final _Net_ReadNetFromCaffePtr = _lookup< + late final _cv_dnn_Net_readNetFromCaffePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer, - ffi.Pointer)>>('Net_ReadNetFromCaffe'); - late final _Net_ReadNetFromCaffe = _Net_ReadNetFromCaffePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromCaffe'); + late final _cv_dnn_Net_readNetFromCaffe = + _cv_dnn_Net_readNetFromCaffePtr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetFromCaffeBytes( + ffi.Pointer cv_dnn_Net_readNetFromCaffeBytes( VecUChar prototxt, VecUChar caffeModel, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromCaffeBytes( + return _cv_dnn_Net_readNetFromCaffeBytes( prototxt, caffeModel, rval, - ); - } - - late final _Net_ReadNetFromCaffeBytesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecUChar, VecUChar, - ffi.Pointer)>>('Net_ReadNetFromCaffeBytes'); - late final _Net_ReadNetFromCaffeBytes = - _Net_ReadNetFromCaffeBytesPtr.asFunction< - ffi.Pointer Function( - VecUChar, VecUChar, ffi.Pointer)>(); - - ffi.Pointer Net_ReadNetFromCaffeBytes_Async( - VecUChar prototxt, - VecUChar caffeModel, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromCaffeBytes_Async( - prototxt, - caffeModel, callback, ); } - late final _Net_ReadNetFromCaffeBytes_AsyncPtr = _lookup< + late final _cv_dnn_Net_readNetFromCaffeBytesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecUChar, VecUChar, - imp1.CvCallback_1)>>('Net_ReadNetFromCaffeBytes_Async'); - late final _Net_ReadNetFromCaffeBytes_Async = - _Net_ReadNetFromCaffeBytes_AsyncPtr.asFunction< + ffi.Pointer Function(VecUChar, VecUChar, ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromCaffeBytes'); + late final _cv_dnn_Net_readNetFromCaffeBytes = + _cv_dnn_Net_readNetFromCaffeBytesPtr.asFunction< ffi.Pointer Function( - VecUChar, VecUChar, imp1.CvCallback_1)>(); + VecUChar, VecUChar, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetFromCaffe_Async( - ffi.Pointer prototxt, - ffi.Pointer caffeModel, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromCaffe_Async( - prototxt, - caffeModel, - callback, - ); - } - - late final _Net_ReadNetFromCaffe_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - imp1.CvCallback_1)>>('Net_ReadNetFromCaffe_Async'); - late final _Net_ReadNetFromCaffe_Async = - _Net_ReadNetFromCaffe_AsyncPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, imp1.CvCallback_1)>(); - - ffi.Pointer Net_ReadNetFromONNX( + ffi.Pointer cv_dnn_Net_readNetFromONNX( ffi.Pointer model, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromONNX( + return _cv_dnn_Net_readNetFromONNX( model, rval, + callback, ); } - late final _Net_ReadNetFromONNXPtr = _lookup< + late final _cv_dnn_Net_readNetFromONNXPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>>('Net_ReadNetFromONNX'); - late final _Net_ReadNetFromONNX = _Net_ReadNetFromONNXPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromONNX'); + late final _cv_dnn_Net_readNetFromONNX = + _cv_dnn_Net_readNetFromONNXPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetFromONNXBytes( + ffi.Pointer cv_dnn_Net_readNetFromONNXBytes( VecUChar model, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromONNXBytes( + return _cv_dnn_Net_readNetFromONNXBytes( model, rval, - ); - } - - late final _Net_ReadNetFromONNXBytesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecUChar, ffi.Pointer)>>('Net_ReadNetFromONNXBytes'); - late final _Net_ReadNetFromONNXBytes = _Net_ReadNetFromONNXBytesPtr - .asFunction Function(VecUChar, ffi.Pointer)>(); - - ffi.Pointer Net_ReadNetFromONNXBytes_Async( - VecUChar model, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromONNXBytes_Async( - model, callback, ); } - late final _Net_ReadNetFromONNXBytes_AsyncPtr = _lookup< + late final _cv_dnn_Net_readNetFromONNXBytesPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(VecUChar, ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromONNXBytes'); + late final _cv_dnn_Net_readNetFromONNXBytes = + _cv_dnn_Net_readNetFromONNXBytesPtr.asFunction< ffi.Pointer Function( - VecUChar, imp1.CvCallback_1)>>('Net_ReadNetFromONNXBytes_Async'); - late final _Net_ReadNetFromONNXBytes_Async = - _Net_ReadNetFromONNXBytes_AsyncPtr.asFunction< - ffi.Pointer Function(VecUChar, imp1.CvCallback_1)>(); + VecUChar, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetFromONNX_Async( - ffi.Pointer model, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromONNX_Async( - model, - callback, - ); - } - - late final _Net_ReadNetFromONNX_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - imp1.CvCallback_1)>>('Net_ReadNetFromONNX_Async'); - late final _Net_ReadNetFromONNX_Async = - _Net_ReadNetFromONNX_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, imp1.CvCallback_1)>(); - - ffi.Pointer Net_ReadNetFromTFLite( + ffi.Pointer cv_dnn_Net_readNetFromTFLite( ffi.Pointer model, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromTFLite( + return _cv_dnn_Net_readNetFromTFLite( model, rval, + callback, ); } - late final _Net_ReadNetFromTFLitePtr = _lookup< + late final _cv_dnn_Net_readNetFromTFLitePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('Net_ReadNetFromTFLite'); - late final _Net_ReadNetFromTFLite = _Net_ReadNetFromTFLitePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromTFLite'); + late final _cv_dnn_Net_readNetFromTFLite = + _cv_dnn_Net_readNetFromTFLitePtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetFromTFLiteBytes( + ffi.Pointer cv_dnn_Net_readNetFromTFLiteBytes( VecUChar bufferModel, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromTFLiteBytes( + return _cv_dnn_Net_readNetFromTFLiteBytes( bufferModel, rval, - ); - } - - late final _Net_ReadNetFromTFLiteBytesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecUChar, ffi.Pointer)>>('Net_ReadNetFromTFLiteBytes'); - late final _Net_ReadNetFromTFLiteBytes = _Net_ReadNetFromTFLiteBytesPtr - .asFunction Function(VecUChar, ffi.Pointer)>(); - - ffi.Pointer Net_ReadNetFromTFLiteBytes_Async( - VecUChar bufferModel, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromTFLiteBytes_Async( - bufferModel, - callback, - ); - } - - late final _Net_ReadNetFromTFLiteBytes_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecUChar, - imp1.CvCallback_1)>>('Net_ReadNetFromTFLiteBytes_Async'); - late final _Net_ReadNetFromTFLiteBytes_Async = - _Net_ReadNetFromTFLiteBytes_AsyncPtr.asFunction< - ffi.Pointer Function(VecUChar, imp1.CvCallback_1)>(); - - ffi.Pointer Net_ReadNetFromTFLite_Async( - ffi.Pointer model, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromTFLite_Async( - model, callback, ); } - late final _Net_ReadNetFromTFLite_AsyncPtr = _lookup< + late final _cv_dnn_Net_readNetFromTFLiteBytesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - imp1.CvCallback_1)>>('Net_ReadNetFromTFLite_Async'); - late final _Net_ReadNetFromTFLite_Async = - _Net_ReadNetFromTFLite_AsyncPtr.asFunction< + ffi.Pointer Function(VecUChar, ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromTFLiteBytes'); + late final _cv_dnn_Net_readNetFromTFLiteBytes = + _cv_dnn_Net_readNetFromTFLiteBytesPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, imp1.CvCallback_1)>(); + VecUChar, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetFromTensorflow( + ffi.Pointer cv_dnn_Net_readNetFromTensorflow( ffi.Pointer model, ffi.Pointer config, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromTensorflow( + return _cv_dnn_Net_readNetFromTensorflow( model, config, rval, + callback, ); } - late final _Net_ReadNetFromTensorflowPtr = _lookup< + late final _cv_dnn_Net_readNetFromTensorflowPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer, - ffi.Pointer)>>('Net_ReadNetFromTensorflow'); - late final _Net_ReadNetFromTensorflow = - _Net_ReadNetFromTensorflowPtr.asFunction< + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromTensorflow'); + late final _cv_dnn_Net_readNetFromTensorflow = + _cv_dnn_Net_readNetFromTensorflowPtr.asFunction< ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetFromTensorflowBytes( + ffi.Pointer cv_dnn_Net_readNetFromTensorflowBytes( VecUChar model, VecUChar config, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromTensorflowBytes( + return _cv_dnn_Net_readNetFromTensorflowBytes( model, config, rval, - ); - } - - late final _Net_ReadNetFromTensorflowBytesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecUChar, VecUChar, - ffi.Pointer)>>('Net_ReadNetFromTensorflowBytes'); - late final _Net_ReadNetFromTensorflowBytes = - _Net_ReadNetFromTensorflowBytesPtr.asFunction< - ffi.Pointer Function( - VecUChar, VecUChar, ffi.Pointer)>(); - - ffi.Pointer Net_ReadNetFromTensorflowBytes_Async( - VecUChar model, - VecUChar config, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromTensorflowBytes_Async( - model, - config, callback, ); } - late final _Net_ReadNetFromTensorflowBytes_AsyncPtr = _lookup< + late final _cv_dnn_Net_readNetFromTensorflowBytesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecUChar, VecUChar, - imp1.CvCallback_1)>>('Net_ReadNetFromTensorflowBytes_Async'); - late final _Net_ReadNetFromTensorflowBytes_Async = - _Net_ReadNetFromTensorflowBytes_AsyncPtr.asFunction< + ffi.Pointer Function(VecUChar, VecUChar, ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromTensorflowBytes'); + late final _cv_dnn_Net_readNetFromTensorflowBytes = + _cv_dnn_Net_readNetFromTensorflowBytesPtr.asFunction< ffi.Pointer Function( - VecUChar, VecUChar, imp1.CvCallback_1)>(); + VecUChar, VecUChar, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_ReadNetFromTensorflow_Async( - ffi.Pointer model, - ffi.Pointer config, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromTensorflow_Async( - model, - config, - callback, - ); - } - - late final _Net_ReadNetFromTensorflow_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - imp1.CvCallback_1)>>('Net_ReadNetFromTensorflow_Async'); - late final _Net_ReadNetFromTensorflow_Async = - _Net_ReadNetFromTensorflow_AsyncPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, imp1.CvCallback_1)>(); - - ffi.Pointer Net_ReadNetFromTorch( + ffi.Pointer cv_dnn_Net_readNetFromTorch( ffi.Pointer model, bool isBinary, bool evaluate, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Net_ReadNetFromTorch( + return _cv_dnn_Net_readNetFromTorch( model, isBinary, evaluate, rval, - ); - } - - late final _Net_ReadNetFromTorchPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Bool, - ffi.Bool, ffi.Pointer)>>('Net_ReadNetFromTorch'); - late final _Net_ReadNetFromTorch = _Net_ReadNetFromTorchPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, bool, bool, ffi.Pointer)>(); - - ffi.Pointer Net_ReadNetFromTorch_Async( - ffi.Pointer model, - bool isBinary, - bool evaluate, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNetFromTorch_Async( - model, - isBinary, - evaluate, callback, ); } - late final _Net_ReadNetFromTorch_AsyncPtr = _lookup< + late final _cv_dnn_Net_readNetFromTorchPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Bool, - ffi.Bool, imp1.CvCallback_1)>>('Net_ReadNetFromTorch_Async'); - late final _Net_ReadNetFromTorch_Async = - _Net_ReadNetFromTorch_AsyncPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, bool, bool, imp1.CvCallback_1)>(); - - ffi.Pointer Net_ReadNet_Async( - ffi.Pointer model, - ffi.Pointer config, - ffi.Pointer framework, - imp1.CvCallback_1 callback, - ) { - return _Net_ReadNet_Async( - model, - config, - framework, - callback, - ); - } - - late final _Net_ReadNet_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, - ffi.Pointer, - imp1.CvCallback_1)>>('Net_ReadNet_Async'); - late final _Net_ReadNet_Async = _Net_ReadNet_AsyncPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer, imp1.CvCallback_1)>(); - - ffi.Pointer Net_SetInput( - Net net, - Mat blob, - ffi.Pointer name, - ) { - return _Net_SetInput( - net, - blob, - name, - ); - } - - late final _Net_SetInputPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Net, Mat, ffi.Pointer)>>('Net_SetInput'); - late final _Net_SetInput = _Net_SetInputPtr.asFunction< - ffi.Pointer Function(Net, Mat, ffi.Pointer)>(); - - ffi.Pointer Net_SetInput_Async( + ffi.Bool, + ffi.Bool, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_dnn_Net_readNetFromTorch'); + late final _cv_dnn_Net_readNetFromTorch = + _cv_dnn_Net_readNetFromTorchPtr.asFunction< + ffi.Pointer Function(ffi.Pointer, bool, bool, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_dnn_Net_setInput( Net net, Mat blob, ffi.Pointer name, imp1.CvCallback_0 callback, ) { - return _Net_SetInput_Async( + return _cv_dnn_Net_setInput( net, blob, name, @@ -1520,105 +921,47 @@ class CvNativeDnn { ); } - late final _Net_SetInput_AsyncPtr = _lookup< + late final _cv_dnn_Net_setInputPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Net, Mat, ffi.Pointer, - imp1.CvCallback_0)>>('Net_SetInput_Async'); - late final _Net_SetInput_Async = _Net_SetInput_AsyncPtr.asFunction< + imp1.CvCallback_0)>>('cv_dnn_Net_setInput'); + late final _cv_dnn_Net_setInput = _cv_dnn_Net_setInputPtr.asFunction< ffi.Pointer Function( Net, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Net_SetPreferableBackend( + ffi.Pointer cv_dnn_Net_setPreferableBackend( Net net, int backend, ) { - return _Net_SetPreferableBackend( + return _cv_dnn_Net_setPreferableBackend( net, backend, ); } - late final _Net_SetPreferableBackendPtr = + late final _cv_dnn_Net_setPreferableBackendPtr = _lookup Function(Net, ffi.Int)>>( - 'Net_SetPreferableBackend'); - late final _Net_SetPreferableBackend = _Net_SetPreferableBackendPtr - .asFunction Function(Net, int)>(); + 'cv_dnn_Net_setPreferableBackend'); + late final _cv_dnn_Net_setPreferableBackend = + _cv_dnn_Net_setPreferableBackendPtr + .asFunction Function(Net, int)>(); - ffi.Pointer Net_SetPreferableBackend_Async( - Net net, - int backend, - imp1.CvCallback_0 callback, - ) { - return _Net_SetPreferableBackend_Async( - net, - backend, - callback, - ); - } - - late final _Net_SetPreferableBackend_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Net, ffi.Int, - imp1.CvCallback_0)>>('Net_SetPreferableBackend_Async'); - late final _Net_SetPreferableBackend_Async = - _Net_SetPreferableBackend_AsyncPtr.asFunction< - ffi.Pointer Function(Net, int, imp1.CvCallback_0)>(); - - ffi.Pointer Net_SetPreferableTarget( + ffi.Pointer cv_dnn_Net_setPreferableTarget( Net net, int target, ) { - return _Net_SetPreferableTarget( + return _cv_dnn_Net_setPreferableTarget( net, target, ); } - late final _Net_SetPreferableTargetPtr = + late final _cv_dnn_Net_setPreferableTargetPtr = _lookup Function(Net, ffi.Int)>>( - 'Net_SetPreferableTarget'); - late final _Net_SetPreferableTarget = _Net_SetPreferableTargetPtr.asFunction< - ffi.Pointer Function(Net, int)>(); - - ffi.Pointer Net_SetPreferableTarget_Async( - Net net, - int target, - imp1.CvCallback_0 callback, - ) { - return _Net_SetPreferableTarget_Async( - net, - target, - callback, - ); - } - - late final _Net_SetPreferableTarget_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Net, ffi.Int, - imp1.CvCallback_0)>>('Net_SetPreferableTarget_Async'); - late final _Net_SetPreferableTarget_Async = - _Net_SetPreferableTarget_AsyncPtr.asFunction< - ffi.Pointer Function(Net, int, imp1.CvCallback_0)>(); - - ffi.Pointer Net_forwardAsync( - Net net, - ffi.Pointer outputName, - ffi.Pointer rval, - ) { - return _Net_forwardAsync( - net, - outputName, - rval, - ); - } - - late final _Net_forwardAsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Net, ffi.Pointer, - ffi.Pointer)>>('Net_forwardAsync'); - late final _Net_forwardAsync = _Net_forwardAsyncPtr.asFunction< - ffi.Pointer Function( - Net, ffi.Pointer, ffi.Pointer)>(); + 'cv_dnn_Net_setPreferableTarget'); + late final _cv_dnn_Net_setPreferableTarget = + _cv_dnn_Net_setPreferableTargetPtr + .asFunction Function(Net, int)>(); late final addresses = _SymbolAddresses(this); } @@ -1627,16 +970,11 @@ class _SymbolAddresses { final CvNativeDnn _library; _SymbolAddresses(this._library); ffi.Pointer> - get AsyncArray_Close => _library._AsyncArray_ClosePtr; + get cv_dnn_AsyncArray_close => _library._cv_dnn_AsyncArray_closePtr; ffi.Pointer> - get Layer_Close => _library._Layer_ClosePtr; - ffi.Pointer< - ffi.NativeFunction> - get Layer_Close_Async => _library._Layer_Close_AsyncPtr; - ffi.Pointer> get Net_Close => - _library._Net_ClosePtr; - ffi.Pointer> - get Net_Close_Async => _library._Net_Close_AsyncPtr; + get cv_dnn_Layer_close => _library._cv_dnn_Layer_closePtr; + ffi.Pointer> + get cv_dnn_Net_close => _library._cv_dnn_Net_closePtr; } final class AsyncArray extends ffi.Struct { @@ -1661,6 +999,7 @@ final class Net extends ffi.Struct { typedef NetPtr = ffi.Pointer; typedef Scalar = imp1.Scalar; typedef VecF32 = imp1.VecF32; +typedef VecF64 = imp1.VecF64; typedef VecI32 = imp1.VecI32; typedef VecMat = imp1.VecMat; typedef VecRect = imp1.VecRect; diff --git a/packages/dartcv/lib/src/g/dnn.yaml b/packages/dartcv/lib/src/g/dnn.yaml index 63f25858..2351b088 100644 --- a/packages/dartcv/lib/src/g/dnn.yaml +++ b/packages/dartcv/lib/src/g/dnn.yaml @@ -1,169 +1,93 @@ format_version: 1.0.0 files: - package:dartcv/src/g/dnn.g.dart: + package:dartcv4/src/g/dnn.g.dart: used-config: ffi-native: false symbols: - c:@F@AsyncArray_Close: - name: AsyncArray_Close - c:@F@AsyncArray_Get: - name: AsyncArray_Get - c:@F@AsyncArray_New: - name: AsyncArray_New - c:@F@Layer_Close: - name: Layer_Close - c:@F@Layer_Close_Async: - name: Layer_Close_Async - c:@F@Layer_GetName: - name: Layer_GetName - c:@F@Layer_GetName_Async: - name: Layer_GetName_Async - c:@F@Layer_GetType: - name: Layer_GetType - c:@F@Layer_GetType_Async: - name: Layer_GetType_Async - c:@F@Layer_InputNameToIndex: - name: Layer_InputNameToIndex - c:@F@Layer_InputNameToIndex_Async: - name: Layer_InputNameToIndex_Async - c:@F@Layer_OutputNameToIndex: - name: Layer_OutputNameToIndex - c:@F@Layer_OutputNameToIndex_Async: - name: Layer_OutputNameToIndex_Async - c:@F@NMSBoxes: - name: NMSBoxes - c:@F@NMSBoxesWithParams: - name: NMSBoxesWithParams - c:@F@NMSBoxesWithParams_Async: - name: NMSBoxesWithParams_Async - c:@F@NMSBoxes_Async: - name: NMSBoxes_Async - c:@F@Net_BlobFromImage: - name: Net_BlobFromImage - c:@F@Net_BlobFromImage_Async: - name: Net_BlobFromImage_Async - c:@F@Net_BlobFromImages: - name: Net_BlobFromImages - c:@F@Net_BlobFromImages_Async: - name: Net_BlobFromImages_Async - c:@F@Net_Close: - name: Net_Close - c:@F@Net_Close_Async: - name: Net_Close_Async - c:@F@Net_Create: - name: Net_Create - c:@F@Net_Create_Async: - name: Net_Create_Async - c:@F@Net_Dump: - name: Net_Dump - c:@F@Net_Dump_Async: - name: Net_Dump_Async - c:@F@Net_Empty: - name: Net_Empty - c:@F@Net_Empty_Async: - name: Net_Empty_Async - c:@F@Net_Forward: - name: Net_Forward - c:@F@Net_ForwardLayers: - name: Net_ForwardLayers - c:@F@Net_ForwardLayers_Async: - name: Net_ForwardLayers_Async - c:@F@Net_Forward_Async: - name: Net_Forward_Async - c:@F@Net_FromNet: - name: Net_FromNet - c:@F@Net_FromNet_Async: - name: Net_FromNet_Async - c:@F@Net_GetBlobChannel: - name: Net_GetBlobChannel - c:@F@Net_GetBlobChannel_Async: - name: Net_GetBlobChannel_Async - c:@F@Net_GetBlobSize: - name: Net_GetBlobSize - c:@F@Net_GetBlobSize_Async: - name: Net_GetBlobSize_Async - c:@F@Net_GetInputDetails: - name: Net_GetInputDetails - c:@F@Net_GetInputDetails_Async: - name: Net_GetInputDetails_Async - c:@F@Net_GetLayer: - name: Net_GetLayer - c:@F@Net_GetLayerNames: - name: Net_GetLayerNames - c:@F@Net_GetLayerNames_Async: - name: Net_GetLayerNames_Async - c:@F@Net_GetLayer_Async: - name: Net_GetLayer_Async - c:@F@Net_GetPerfProfile: - name: Net_GetPerfProfile - c:@F@Net_GetPerfProfile_Async: - name: Net_GetPerfProfile_Async - c:@F@Net_GetUnconnectedOutLayers: - name: Net_GetUnconnectedOutLayers - c:@F@Net_GetUnconnectedOutLayers_Async: - name: Net_GetUnconnectedOutLayers_Async - c:@F@Net_ImagesFromBlob: - name: Net_ImagesFromBlob - c:@F@Net_ImagesFromBlob_Async: - name: Net_ImagesFromBlob_Async - c:@F@Net_ReadNet: - name: Net_ReadNet - c:@F@Net_ReadNetBytes: - name: Net_ReadNetBytes - c:@F@Net_ReadNetBytes_Async: - name: Net_ReadNetBytes_Async - c:@F@Net_ReadNetFromCaffe: - name: Net_ReadNetFromCaffe - c:@F@Net_ReadNetFromCaffeBytes: - name: Net_ReadNetFromCaffeBytes - c:@F@Net_ReadNetFromCaffeBytes_Async: - name: Net_ReadNetFromCaffeBytes_Async - c:@F@Net_ReadNetFromCaffe_Async: - name: Net_ReadNetFromCaffe_Async - c:@F@Net_ReadNetFromONNX: - name: Net_ReadNetFromONNX - c:@F@Net_ReadNetFromONNXBytes: - name: Net_ReadNetFromONNXBytes - c:@F@Net_ReadNetFromONNXBytes_Async: - name: Net_ReadNetFromONNXBytes_Async - c:@F@Net_ReadNetFromONNX_Async: - name: Net_ReadNetFromONNX_Async - c:@F@Net_ReadNetFromTFLite: - name: Net_ReadNetFromTFLite - c:@F@Net_ReadNetFromTFLiteBytes: - name: Net_ReadNetFromTFLiteBytes - c:@F@Net_ReadNetFromTFLiteBytes_Async: - name: Net_ReadNetFromTFLiteBytes_Async - c:@F@Net_ReadNetFromTFLite_Async: - name: Net_ReadNetFromTFLite_Async - c:@F@Net_ReadNetFromTensorflow: - name: Net_ReadNetFromTensorflow - c:@F@Net_ReadNetFromTensorflowBytes: - name: Net_ReadNetFromTensorflowBytes - c:@F@Net_ReadNetFromTensorflowBytes_Async: - name: Net_ReadNetFromTensorflowBytes_Async - c:@F@Net_ReadNetFromTensorflow_Async: - name: Net_ReadNetFromTensorflow_Async - c:@F@Net_ReadNetFromTorch: - name: Net_ReadNetFromTorch - c:@F@Net_ReadNetFromTorch_Async: - name: Net_ReadNetFromTorch_Async - c:@F@Net_ReadNet_Async: - name: Net_ReadNet_Async - c:@F@Net_SetInput: - name: Net_SetInput - c:@F@Net_SetInput_Async: - name: Net_SetInput_Async - c:@F@Net_SetPreferableBackend: - name: Net_SetPreferableBackend - c:@F@Net_SetPreferableBackend_Async: - name: Net_SetPreferableBackend_Async - c:@F@Net_SetPreferableTarget: - name: Net_SetPreferableTarget - c:@F@Net_SetPreferableTarget_Async: - name: Net_SetPreferableTarget_Async - c:@F@Net_forwardAsync: - name: Net_forwardAsync + c:@F@cv_dnn_AsyncArray_close: + name: cv_dnn_AsyncArray_close + c:@F@cv_dnn_AsyncArray_get: + name: cv_dnn_AsyncArray_get + c:@F@cv_dnn_AsyncArray_new: + name: cv_dnn_AsyncArray_new + c:@F@cv_dnn_Layer_close: + name: cv_dnn_Layer_close + c:@F@cv_dnn_Layer_getName: + name: cv_dnn_Layer_getName + c:@F@cv_dnn_Layer_getType: + name: cv_dnn_Layer_getType + c:@F@cv_dnn_Layer_inputNameToIndex: + name: cv_dnn_Layer_inputNameToIndex + c:@F@cv_dnn_Layer_outputNameToIndex: + name: cv_dnn_Layer_outputNameToIndex + c:@F@cv_dnn_NMSBoxes: + name: cv_dnn_NMSBoxes + c:@F@cv_dnn_NMSBoxes_1: + name: cv_dnn_NMSBoxes_1 + c:@F@cv_dnn_Net_blobFromImage: + name: cv_dnn_Net_blobFromImage + c:@F@cv_dnn_Net_blobFromImages: + name: cv_dnn_Net_blobFromImages + c:@F@cv_dnn_Net_close: + name: cv_dnn_Net_close + c:@F@cv_dnn_Net_create: + name: cv_dnn_Net_create + c:@F@cv_dnn_Net_dump: + name: cv_dnn_Net_dump + c:@F@cv_dnn_Net_empty: + name: cv_dnn_Net_empty + c:@F@cv_dnn_Net_forward: + name: cv_dnn_Net_forward + c:@F@cv_dnn_Net_forwardAsync: + name: cv_dnn_Net_forwardAsync + c:@F@cv_dnn_Net_forwardLayers: + name: cv_dnn_Net_forwardLayers + c:@F@cv_dnn_Net_fromNet: + name: cv_dnn_Net_fromNet + c:@F@cv_dnn_Net_getBlobChannel: + name: cv_dnn_Net_getBlobChannel + c:@F@cv_dnn_Net_getBlobSize: + name: cv_dnn_Net_getBlobSize + c:@F@cv_dnn_Net_getInputDetails: + name: cv_dnn_Net_getInputDetails + c:@F@cv_dnn_Net_getLayer: + name: cv_dnn_Net_getLayer + c:@F@cv_dnn_Net_getLayerNames: + name: cv_dnn_Net_getLayerNames + c:@F@cv_dnn_Net_getPerfProfile: + name: cv_dnn_Net_getPerfProfile + c:@F@cv_dnn_Net_getUnconnectedOutLayers: + name: cv_dnn_Net_getUnconnectedOutLayers + c:@F@cv_dnn_Net_imagesFromBlob: + name: cv_dnn_Net_imagesFromBlob + c:@F@cv_dnn_Net_readNet: + name: cv_dnn_Net_readNet + c:@F@cv_dnn_Net_readNetBytes: + name: cv_dnn_Net_readNetBytes + c:@F@cv_dnn_Net_readNetFromCaffe: + name: cv_dnn_Net_readNetFromCaffe + c:@F@cv_dnn_Net_readNetFromCaffeBytes: + name: cv_dnn_Net_readNetFromCaffeBytes + c:@F@cv_dnn_Net_readNetFromONNX: + name: cv_dnn_Net_readNetFromONNX + c:@F@cv_dnn_Net_readNetFromONNXBytes: + name: cv_dnn_Net_readNetFromONNXBytes + c:@F@cv_dnn_Net_readNetFromTFLite: + name: cv_dnn_Net_readNetFromTFLite + c:@F@cv_dnn_Net_readNetFromTFLiteBytes: + name: cv_dnn_Net_readNetFromTFLiteBytes + c:@F@cv_dnn_Net_readNetFromTensorflow: + name: cv_dnn_Net_readNetFromTensorflow + c:@F@cv_dnn_Net_readNetFromTensorflowBytes: + name: cv_dnn_Net_readNetFromTensorflowBytes + c:@F@cv_dnn_Net_readNetFromTorch: + name: cv_dnn_Net_readNetFromTorch + c:@F@cv_dnn_Net_setInput: + name: cv_dnn_Net_setInput + c:@F@cv_dnn_Net_setPreferableBackend: + name: cv_dnn_Net_setPreferableBackend + c:@F@cv_dnn_Net_setPreferableTarget: + name: cv_dnn_Net_setPreferableTarget c:@S@AsyncArray: name: AsyncArray c:@S@Layer: @@ -186,6 +110,8 @@ files: name: Scalar c:types.h@T@VecF32: name: VecF32 + c:types.h@T@VecF64: + name: VecF64 c:types.h@T@VecI32: name: VecI32 c:types.h@T@VecMat: diff --git a/packages/dartcv/lib/src/g/features2d.g.dart b/packages/dartcv/lib/src/g/features2d.g.dart index 9e5b9765..5daa1755 100644 --- a/packages/dartcv/lib/src/g/features2d.g.dart +++ b/packages/dartcv/lib/src/g/features2d.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - features2d /// @@ -30,1385 +30,691 @@ class CvNativeFeatures2d { lookup) : _lookup = lookup; - void AKAZE_Close( - AKAZEPtr a, - ) { - return _AKAZE_Close( - a, - ); - } - - late final _AKAZE_ClosePtr = - _lookup>('AKAZE_Close'); - late final _AKAZE_Close = - _AKAZE_ClosePtr.asFunction(); - - ffi.Pointer AKAZE_Close_Async( + void cv_AKAZE_close( AKAZEPtr self, - imp1.CvCallback_0 callback, ) { - return _AKAZE_Close_Async( + return _cv_AKAZE_close( self, - callback, ); } - late final _AKAZE_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - AKAZEPtr, imp1.CvCallback_0)>>('AKAZE_Close_Async'); - late final _AKAZE_Close_Async = _AKAZE_Close_AsyncPtr.asFunction< - ffi.Pointer Function(AKAZEPtr, imp1.CvCallback_0)>(); + late final _cv_AKAZE_closePtr = + _lookup>( + 'cv_AKAZE_close'); + late final _cv_AKAZE_close = + _cv_AKAZE_closePtr.asFunction(); - ffi.Pointer AKAZE_Create( + ffi.Pointer cv_AKAZE_create( ffi.Pointer rval, ) { - return _AKAZE_Create( + return _cv_AKAZE_create( rval, ); } - late final _AKAZE_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer)>>('AKAZE_Create'); - late final _AKAZE_Create = _AKAZE_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer AKAZE_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _AKAZE_Create_Async( - callback, - ); - } - - late final _AKAZE_Create_AsyncPtr = _lookup< + late final _cv_AKAZE_createPtr = _lookup< ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'AKAZE_Create_Async'); - late final _AKAZE_Create_Async = _AKAZE_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + .NativeFunction Function(ffi.Pointer)>>( + 'cv_AKAZE_create'); + late final _cv_AKAZE_create = _cv_AKAZE_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer AKAZE_Detect( - AKAZE a, + ffi.Pointer cv_AKAZE_detect( + AKAZE self, Mat src, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _AKAZE_Detect( - a, + return _cv_AKAZE_detect( + self, src, rval, + callback, ); } - late final _AKAZE_DetectPtr = _lookup< + late final _cv_AKAZE_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - AKAZE, Mat, ffi.Pointer)>>('AKAZE_Detect'); - late final _AKAZE_Detect = _AKAZE_DetectPtr.asFunction< - ffi.Pointer Function(AKAZE, Mat, ffi.Pointer)>(); + ffi.Pointer Function(AKAZE, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_AKAZE_detect'); + late final _cv_AKAZE_detect = _cv_AKAZE_detectPtr.asFunction< + ffi.Pointer Function( + AKAZE, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer AKAZE_DetectAndCompute( - AKAZE a, + ffi.Pointer cv_AKAZE_detectAndCompute( + AKAZE self, Mat src, Mat mask, Mat desc, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _AKAZE_DetectAndCompute( - a, + return _cv_AKAZE_detectAndCompute( + self, src, mask, desc, rval, - ); - } - - late final _AKAZE_DetectAndComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(AKAZE, Mat, Mat, Mat, - ffi.Pointer)>>('AKAZE_DetectAndCompute'); - late final _AKAZE_DetectAndCompute = _AKAZE_DetectAndComputePtr.asFunction< - ffi.Pointer Function( - AKAZE, Mat, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer AKAZE_DetectAndCompute_Async( - AKAZE self, - Mat src, - Mat mask, - imp1.CvCallback_2 callback, - ) { - return _AKAZE_DetectAndCompute_Async( - self, - src, - mask, - callback, - ); - } - - late final _AKAZE_DetectAndCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(AKAZE, Mat, Mat, - imp1.CvCallback_2)>>('AKAZE_DetectAndCompute_Async'); - late final _AKAZE_DetectAndCompute_Async = - _AKAZE_DetectAndCompute_AsyncPtr.asFunction< - ffi.Pointer Function(AKAZE, Mat, Mat, imp1.CvCallback_2)>(); - - ffi.Pointer AKAZE_Detect_Async( - AKAZE self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _AKAZE_Detect_Async( - self, - src, callback, ); } - late final _AKAZE_Detect_AsyncPtr = _lookup< + late final _cv_AKAZE_detectAndComputePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - AKAZE, Mat, imp1.CvCallback_1)>>('AKAZE_Detect_Async'); - late final _AKAZE_Detect_Async = _AKAZE_Detect_AsyncPtr.asFunction< - ffi.Pointer Function(AKAZE, Mat, imp1.CvCallback_1)>(); - - void AgastFeatureDetector_Close( - AgastFeatureDetectorPtr a, - ) { - return _AgastFeatureDetector_Close( - a, - ); - } - - late final _AgastFeatureDetector_ClosePtr = - _lookup>( - 'AgastFeatureDetector_Close'); - late final _AgastFeatureDetector_Close = _AgastFeatureDetector_ClosePtr - .asFunction(); + AKAZE, + Mat, + Mat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_AKAZE_detectAndCompute'); + late final _cv_AKAZE_detectAndCompute = + _cv_AKAZE_detectAndComputePtr.asFunction< + ffi.Pointer Function(AKAZE, Mat, Mat, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer AgastFeatureDetector_Close_Async( + void cv_AgastFeatureDetector_close( AgastFeatureDetectorPtr self, - imp1.CvCallback_0 callback, ) { - return _AgastFeatureDetector_Close_Async( + return _cv_AgastFeatureDetector_close( self, - callback, ); } - late final _AgastFeatureDetector_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(AgastFeatureDetectorPtr, - imp1.CvCallback_0)>>('AgastFeatureDetector_Close_Async'); - late final _AgastFeatureDetector_Close_Async = - _AgastFeatureDetector_Close_AsyncPtr.asFunction< - ffi.Pointer Function( - AgastFeatureDetectorPtr, imp1.CvCallback_0)>(); + late final _cv_AgastFeatureDetector_closePtr = + _lookup>( + 'cv_AgastFeatureDetector_close'); + late final _cv_AgastFeatureDetector_close = _cv_AgastFeatureDetector_closePtr + .asFunction(); - ffi.Pointer AgastFeatureDetector_Create( + ffi.Pointer cv_AgastFeatureDetector_create( ffi.Pointer rval, ) { - return _AgastFeatureDetector_Create( + return _cv_AgastFeatureDetector_create( rval, ); } - late final _AgastFeatureDetector_CreatePtr = _lookup< + late final _cv_AgastFeatureDetector_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer)>>( - 'AgastFeatureDetector_Create'); - late final _AgastFeatureDetector_Create = - _AgastFeatureDetector_CreatePtr.asFunction< + 'cv_AgastFeatureDetector_create'); + late final _cv_AgastFeatureDetector_create = + _cv_AgastFeatureDetector_createPtr.asFunction< ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer AgastFeatureDetector_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _AgastFeatureDetector_Create_Async( - callback, - ); - } - - late final _AgastFeatureDetector_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'AgastFeatureDetector_Create_Async'); - late final _AgastFeatureDetector_Create_Async = - _AgastFeatureDetector_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer AgastFeatureDetector_Detect( - AgastFeatureDetector a, - Mat src, - ffi.Pointer rval, - ) { - return _AgastFeatureDetector_Detect( - a, - src, - rval, - ); - } - - late final _AgastFeatureDetector_DetectPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(AgastFeatureDetector, Mat, - ffi.Pointer)>>('AgastFeatureDetector_Detect'); - late final _AgastFeatureDetector_Detect = - _AgastFeatureDetector_DetectPtr.asFunction< - ffi.Pointer Function( - AgastFeatureDetector, Mat, ffi.Pointer)>(); - - ffi.Pointer AgastFeatureDetector_Detect_Async( + ffi.Pointer cv_AgastFeatureDetector_detect( AgastFeatureDetector self, Mat src, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _AgastFeatureDetector_Detect_Async( + return _cv_AgastFeatureDetector_detect( self, src, + rval, callback, ); } - late final _AgastFeatureDetector_Detect_AsyncPtr = _lookup< + late final _cv_AgastFeatureDetector_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(AgastFeatureDetector, Mat, - imp1.CvCallback_1)>>('AgastFeatureDetector_Detect_Async'); - late final _AgastFeatureDetector_Detect_Async = - _AgastFeatureDetector_Detect_AsyncPtr.asFunction< ffi.Pointer Function( - AgastFeatureDetector, Mat, imp1.CvCallback_1)>(); - - void BFMatcher_Close( - BFMatcherPtr b, - ) { - return _BFMatcher_Close( - b, - ); - } - - late final _BFMatcher_ClosePtr = - _lookup>( - 'BFMatcher_Close'); - late final _BFMatcher_Close = - _BFMatcher_ClosePtr.asFunction(); + AgastFeatureDetector, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_AgastFeatureDetector_detect'); + late final _cv_AgastFeatureDetector_detect = + _cv_AgastFeatureDetector_detectPtr.asFunction< + ffi.Pointer Function(AgastFeatureDetector, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer BFMatcher_Close_Async( + void cv_BFMatcher_close( BFMatcherPtr self, - imp1.CvCallback_0 callback, ) { - return _BFMatcher_Close_Async( + return _cv_BFMatcher_close( self, - callback, ); } - late final _BFMatcher_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - BFMatcherPtr, imp1.CvCallback_0)>>('BFMatcher_Close_Async'); - late final _BFMatcher_Close_Async = _BFMatcher_Close_AsyncPtr.asFunction< - ffi.Pointer Function(BFMatcherPtr, imp1.CvCallback_0)>(); + late final _cv_BFMatcher_closePtr = + _lookup>( + 'cv_BFMatcher_close'); + late final _cv_BFMatcher_close = + _cv_BFMatcher_closePtr.asFunction(); - ffi.Pointer BFMatcher_Create( + ffi.Pointer cv_BFMatcher_create( ffi.Pointer rval, ) { - return _BFMatcher_Create( + return _cv_BFMatcher_create( rval, ); } - late final _BFMatcher_CreatePtr = _lookup< + late final _cv_BFMatcher_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('BFMatcher_Create'); - late final _BFMatcher_Create = _BFMatcher_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + ffi.Pointer)>>('cv_BFMatcher_create'); + late final _cv_BFMatcher_create = _cv_BFMatcher_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer BFMatcher_CreateWithParams( + ffi.Pointer cv_BFMatcher_create_1( int normType, bool crossCheck, ffi.Pointer rval, ) { - return _BFMatcher_CreateWithParams( + return _cv_BFMatcher_create_1( normType, crossCheck, rval, ); } - late final _BFMatcher_CreateWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Bool, - ffi.Pointer)>>('BFMatcher_CreateWithParams'); - late final _BFMatcher_CreateWithParams = - _BFMatcher_CreateWithParamsPtr.asFunction< - ffi.Pointer Function(int, bool, ffi.Pointer)>(); - - ffi.Pointer BFMatcher_CreateWithParams_Async( - int normType, - bool crossCheck, - imp1.CvCallback_1 callback, - ) { - return _BFMatcher_CreateWithParams_Async( - normType, - crossCheck, - callback, - ); - } - - late final _BFMatcher_CreateWithParams_AsyncPtr = _lookup< + late final _cv_BFMatcher_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Int, ffi.Bool, - imp1.CvCallback_1)>>('BFMatcher_CreateWithParams_Async'); - late final _BFMatcher_CreateWithParams_Async = - _BFMatcher_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(int, bool, imp1.CvCallback_1)>(); - - ffi.Pointer BFMatcher_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _BFMatcher_Create_Async( - callback, - ); - } - - late final _BFMatcher_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'BFMatcher_Create_Async'); - late final _BFMatcher_Create_Async = _BFMatcher_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer BFMatcher_KnnMatch( - BFMatcher b, - Mat query, - Mat train, - int k, - ffi.Pointer rval, - ) { - return _BFMatcher_KnnMatch( - b, - query, - train, - k, - rval, - ); - } - - late final _BFMatcher_KnnMatchPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BFMatcher, Mat, Mat, ffi.Int, - ffi.Pointer)>>('BFMatcher_KnnMatch'); - late final _BFMatcher_KnnMatch = _BFMatcher_KnnMatchPtr.asFunction< - ffi.Pointer Function( - BFMatcher, Mat, Mat, int, ffi.Pointer)>(); + ffi.Pointer)>>('cv_BFMatcher_create_1'); + late final _cv_BFMatcher_create_1 = _cv_BFMatcher_create_1Ptr.asFunction< + ffi.Pointer Function(int, bool, ffi.Pointer)>(); - ffi.Pointer BFMatcher_KnnMatch_Async( + ffi.Pointer cv_BFMatcher_knnMatch( BFMatcher self, Mat query, Mat train, int k, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _BFMatcher_KnnMatch_Async( + return _cv_BFMatcher_knnMatch( self, query, train, k, + rval, callback, ); } - late final _BFMatcher_KnnMatch_AsyncPtr = _lookup< + late final _cv_BFMatcher_knnMatchPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(BFMatcher, Mat, Mat, ffi.Int, - imp1.CvCallback_1)>>('BFMatcher_KnnMatch_Async'); - late final _BFMatcher_KnnMatch_Async = - _BFMatcher_KnnMatch_AsyncPtr.asFunction< ffi.Pointer Function( - BFMatcher, Mat, Mat, int, imp1.CvCallback_1)>(); + BFMatcher, + Mat, + Mat, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_BFMatcher_knnMatch'); + late final _cv_BFMatcher_knnMatch = _cv_BFMatcher_knnMatchPtr.asFunction< + ffi.Pointer Function(BFMatcher, Mat, Mat, int, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer BFMatcher_Match( - BFMatcher b, + ffi.Pointer cv_BFMatcher_match( + BFMatcher self, Mat query, Mat train, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _BFMatcher_Match( - b, + return _cv_BFMatcher_match( + self, query, train, rval, + callback, ); } - late final _BFMatcher_MatchPtr = _lookup< + late final _cv_BFMatcher_matchPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - BFMatcher, Mat, Mat, ffi.Pointer)>>('BFMatcher_Match'); - late final _BFMatcher_Match = _BFMatcher_MatchPtr.asFunction< + BFMatcher, + Mat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_BFMatcher_match'); + late final _cv_BFMatcher_match = _cv_BFMatcher_matchPtr.asFunction< ffi.Pointer Function( - BFMatcher, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer BFMatcher_Match_Async( - BFMatcher self, - Mat query, - Mat train, - imp1.CvCallback_1 callback, - ) { - return _BFMatcher_Match_Async( - self, - query, - train, - callback, - ); - } - - late final _BFMatcher_Match_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BFMatcher, Mat, Mat, - imp1.CvCallback_1)>>('BFMatcher_Match_Async'); - late final _BFMatcher_Match_Async = _BFMatcher_Match_AsyncPtr.asFunction< - ffi.Pointer Function(BFMatcher, Mat, Mat, imp1.CvCallback_1)>(); - - void BRISK_Close( - BRISKPtr b, - ) { - return _BRISK_Close( - b, - ); - } - - late final _BRISK_ClosePtr = - _lookup>('BRISK_Close'); - late final _BRISK_Close = - _BRISK_ClosePtr.asFunction(); + BFMatcher, Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer BRISK_Close_Async( + void cv_BRISK_close( BRISKPtr self, - imp1.CvCallback_0 callback, ) { - return _BRISK_Close_Async( + return _cv_BRISK_close( self, - callback, ); } - late final _BRISK_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - BRISKPtr, imp1.CvCallback_0)>>('BRISK_Close_Async'); - late final _BRISK_Close_Async = _BRISK_Close_AsyncPtr.asFunction< - ffi.Pointer Function(BRISKPtr, imp1.CvCallback_0)>(); + late final _cv_BRISK_closePtr = + _lookup>( + 'cv_BRISK_close'); + late final _cv_BRISK_close = + _cv_BRISK_closePtr.asFunction(); - ffi.Pointer BRISK_Create( + ffi.Pointer cv_BRISK_create( ffi.Pointer rval, ) { - return _BRISK_Create( + return _cv_BRISK_create( rval, ); } - late final _BRISK_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer)>>('BRISK_Create'); - late final _BRISK_Create = _BRISK_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer BRISK_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _BRISK_Create_Async( - callback, - ); - } - - late final _BRISK_Create_AsyncPtr = _lookup< + late final _cv_BRISK_createPtr = _lookup< ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'BRISK_Create_Async'); - late final _BRISK_Create_Async = _BRISK_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + .NativeFunction Function(ffi.Pointer)>>( + 'cv_BRISK_create'); + late final _cv_BRISK_create = _cv_BRISK_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer BRISK_Detect( - BRISK b, + ffi.Pointer cv_BRISK_detect( + BRISK self, Mat src, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _BRISK_Detect( - b, + return _cv_BRISK_detect( + self, src, rval, + callback, ); } - late final _BRISK_DetectPtr = _lookup< + late final _cv_BRISK_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - BRISK, Mat, ffi.Pointer)>>('BRISK_Detect'); - late final _BRISK_Detect = _BRISK_DetectPtr.asFunction< - ffi.Pointer Function(BRISK, Mat, ffi.Pointer)>(); + ffi.Pointer Function(BRISK, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_BRISK_detect'); + late final _cv_BRISK_detect = _cv_BRISK_detectPtr.asFunction< + ffi.Pointer Function( + BRISK, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer BRISK_DetectAndCompute( - BRISK b, + ffi.Pointer cv_BRISK_detectAndCompute( + BRISK self, Mat src, Mat mask, Mat desc, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _BRISK_DetectAndCompute( - b, + return _cv_BRISK_detectAndCompute( + self, src, mask, desc, rval, + callback, ); } - late final _BRISK_DetectAndComputePtr = _lookup< + late final _cv_BRISK_detectAndComputePtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function( + BRISK, + Mat, + Mat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_BRISK_detectAndCompute'); + late final _cv_BRISK_detectAndCompute = + _cv_BRISK_detectAndComputePtr.asFunction< ffi.Pointer Function(BRISK, Mat, Mat, Mat, - ffi.Pointer)>>('BRISK_DetectAndCompute'); - late final _BRISK_DetectAndCompute = _BRISK_DetectAndComputePtr.asFunction< - ffi.Pointer Function( - BRISK, Mat, Mat, Mat, ffi.Pointer)>(); + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer BRISK_DetectAndCompute_Async( - BRISK self, - Mat src, - Mat mask, - imp1.CvCallback_2 callback, + void cv_FastFeatureDetector_close( + FastFeatureDetectorPtr self, ) { - return _BRISK_DetectAndCompute_Async( + return _cv_FastFeatureDetector_close( self, - src, - mask, - callback, ); } - late final _BRISK_DetectAndCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BRISK, Mat, Mat, - imp1.CvCallback_2)>>('BRISK_DetectAndCompute_Async'); - late final _BRISK_DetectAndCompute_Async = - _BRISK_DetectAndCompute_AsyncPtr.asFunction< - ffi.Pointer Function(BRISK, Mat, Mat, imp1.CvCallback_2)>(); + late final _cv_FastFeatureDetector_closePtr = + _lookup>( + 'cv_FastFeatureDetector_close'); + late final _cv_FastFeatureDetector_close = _cv_FastFeatureDetector_closePtr + .asFunction(); - ffi.Pointer BRISK_Detect_Async( - BRISK self, - Mat src, - imp1.CvCallback_1 callback, + ffi.Pointer cv_FastFeatureDetector_create( + ffi.Pointer rval, ) { - return _BRISK_Detect_Async( - self, - src, - callback, + return _cv_FastFeatureDetector_create( + rval, ); } - late final _BRISK_Detect_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - BRISK, Mat, imp1.CvCallback_1)>>('BRISK_Detect_Async'); - late final _BRISK_Detect_Async = _BRISK_Detect_AsyncPtr.asFunction< - ffi.Pointer Function(BRISK, Mat, imp1.CvCallback_1)>(); + late final _cv_FastFeatureDetector_createPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>( + 'cv_FastFeatureDetector_create'); + late final _cv_FastFeatureDetector_create = + _cv_FastFeatureDetector_createPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer DrawKeyPoints( - Mat src, - VecKeyPoint kp, - Mat dst, - Scalar color, - int flags, + ffi.Pointer cv_FastFeatureDetector_create_1( + int threshold, + bool nonmaxSuppression, + int type, + ffi.Pointer rval, ) { - return _DrawKeyPoints( - src, - kp, - dst, - color, - flags, + return _cv_FastFeatureDetector_create_1( + threshold, + nonmaxSuppression, + type, + rval, ); } - late final _DrawKeyPointsPtr = _lookup< - ffi.NativeFunction< + late final _cv_FastFeatureDetector_create_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Int, ffi.Bool, ffi.Int, + ffi.Pointer)>>( + 'cv_FastFeatureDetector_create_1'); + late final _cv_FastFeatureDetector_create_1 = + _cv_FastFeatureDetector_create_1Ptr.asFunction< ffi.Pointer Function( - Mat, VecKeyPoint, Mat, Scalar, ffi.Int)>>('DrawKeyPoints'); - late final _DrawKeyPoints = _DrawKeyPointsPtr.asFunction< - ffi.Pointer Function(Mat, VecKeyPoint, Mat, Scalar, int)>(); + int, bool, int, ffi.Pointer)>(); - ffi.Pointer DrawKeyPoints_Async( + ffi.Pointer cv_FastFeatureDetector_detect( + FastFeatureDetector self, Mat src, - VecKeyPoint kp, - Mat dst, - Scalar color, - int flags, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _DrawKeyPoints_Async( + return _cv_FastFeatureDetector_detect( + self, src, - kp, - dst, - color, - flags, + rval, callback, ); } - late final _DrawKeyPoints_AsyncPtr = _lookup< + late final _cv_FastFeatureDetector_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, VecKeyPoint, Mat, Scalar, ffi.Int, - imp1.CvCallback_0)>>('DrawKeyPoints_Async'); - late final _DrawKeyPoints_Async = _DrawKeyPoints_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, VecKeyPoint, Mat, Scalar, int, imp1.CvCallback_0)>(); + ffi.Pointer Function( + FastFeatureDetector, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_FastFeatureDetector_detect'); + late final _cv_FastFeatureDetector_detect = + _cv_FastFeatureDetector_detectPtr.asFunction< + ffi.Pointer Function(FastFeatureDetector, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer DrawMatches( - Mat img1, - VecKeyPoint kp1, - Mat img2, - VecKeyPoint kp2, - VecDMatch matches1to2, - Mat outImg, - Scalar matchesColor, - Scalar pointColor, - VecChar matchesMask, - int flags, - ) { - return _DrawMatches( - img1, - kp1, - img2, - kp2, - matches1to2, - outImg, - matchesColor, - pointColor, - matchesMask, - flags, - ); - } - - late final _DrawMatchesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - VecKeyPoint, - Mat, - VecKeyPoint, - VecDMatch, - Mat, - Scalar, - Scalar, - VecChar, - ffi.Int)>>('DrawMatches'); - late final _DrawMatches = _DrawMatchesPtr.asFunction< - ffi.Pointer Function(Mat, VecKeyPoint, Mat, VecKeyPoint, - VecDMatch, Mat, Scalar, Scalar, VecChar, int)>(); - - ffi.Pointer DrawMatches_Async( - Mat img1, - VecKeyPoint kp1, - Mat img2, - VecKeyPoint kp2, - VecDMatch matches1to2, - Mat outImg, - Scalar matchesColor, - Scalar pointColor, - VecChar matchesMask, - int flags, - imp1.CvCallback_0 callback, - ) { - return _DrawMatches_Async( - img1, - kp1, - img2, - kp2, - matches1to2, - outImg, - matchesColor, - pointColor, - matchesMask, - flags, - callback, - ); - } - - late final _DrawMatches_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - VecKeyPoint, - Mat, - VecKeyPoint, - VecDMatch, - Mat, - Scalar, - Scalar, - VecChar, - ffi.Int, - imp1.CvCallback_0)>>('DrawMatches_Async'); - late final _DrawMatches_Async = _DrawMatches_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, VecKeyPoint, Mat, VecKeyPoint, - VecDMatch, Mat, Scalar, Scalar, VecChar, int, imp1.CvCallback_0)>(); - - void FastFeatureDetector_Close( - FastFeatureDetectorPtr f, - ) { - return _FastFeatureDetector_Close( - f, - ); - } - - late final _FastFeatureDetector_ClosePtr = - _lookup>( - 'FastFeatureDetector_Close'); - late final _FastFeatureDetector_Close = _FastFeatureDetector_ClosePtr - .asFunction(); - - ffi.Pointer FastFeatureDetector_Close_Async( - FastFeatureDetectorPtr self, - imp1.CvCallback_0 callback, - ) { - return _FastFeatureDetector_Close_Async( - self, - callback, - ); - } - - late final _FastFeatureDetector_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FastFeatureDetectorPtr, - imp1.CvCallback_0)>>('FastFeatureDetector_Close_Async'); - late final _FastFeatureDetector_Close_Async = - _FastFeatureDetector_Close_AsyncPtr.asFunction< - ffi.Pointer Function( - FastFeatureDetectorPtr, imp1.CvCallback_0)>(); - - ffi.Pointer FastFeatureDetector_Create( - ffi.Pointer rval, - ) { - return _FastFeatureDetector_Create( - rval, - ); - } - - late final _FastFeatureDetector_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('FastFeatureDetector_Create'); - late final _FastFeatureDetector_Create = - _FastFeatureDetector_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer FastFeatureDetector_CreateWithParams( - int threshold, - bool nonmaxSuppression, - int type, - ffi.Pointer rval, - ) { - return _FastFeatureDetector_CreateWithParams( - threshold, - nonmaxSuppression, - type, - rval, - ); - } - - late final _FastFeatureDetector_CreateWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Bool, ffi.Int, - ffi.Pointer)>>( - 'FastFeatureDetector_CreateWithParams'); - late final _FastFeatureDetector_CreateWithParams = - _FastFeatureDetector_CreateWithParamsPtr.asFunction< - ffi.Pointer Function( - int, bool, int, ffi.Pointer)>(); - - ffi.Pointer FastFeatureDetector_CreateWithParams_Async( - int threshold, - bool nonmaxSuppression, - int type, - imp1.CvCallback_1 callback, - ) { - return _FastFeatureDetector_CreateWithParams_Async( - threshold, - nonmaxSuppression, - type, - callback, - ); - } - - late final _FastFeatureDetector_CreateWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Bool, ffi.Int, imp1.CvCallback_1)>>( - 'FastFeatureDetector_CreateWithParams_Async'); - late final _FastFeatureDetector_CreateWithParams_Async = - _FastFeatureDetector_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(int, bool, int, imp1.CvCallback_1)>(); - - ffi.Pointer FastFeatureDetector_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _FastFeatureDetector_Create_Async( - callback, - ); - } - - late final _FastFeatureDetector_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'FastFeatureDetector_Create_Async'); - late final _FastFeatureDetector_Create_Async = - _FastFeatureDetector_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer FastFeatureDetector_Detect( - FastFeatureDetector f, - Mat src, - ffi.Pointer rval, - ) { - return _FastFeatureDetector_Detect( - f, - src, - rval, - ); - } - - late final _FastFeatureDetector_DetectPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FastFeatureDetector, Mat, - ffi.Pointer)>>('FastFeatureDetector_Detect'); - late final _FastFeatureDetector_Detect = - _FastFeatureDetector_DetectPtr.asFunction< - ffi.Pointer Function( - FastFeatureDetector, Mat, ffi.Pointer)>(); - - ffi.Pointer FastFeatureDetector_Detect_Async( - FastFeatureDetector self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _FastFeatureDetector_Detect_Async( - self, - src, - callback, - ); - } - - late final _FastFeatureDetector_Detect_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FastFeatureDetector, Mat, - imp1.CvCallback_1)>>('FastFeatureDetector_Detect_Async'); - late final _FastFeatureDetector_Detect_Async = - _FastFeatureDetector_Detect_AsyncPtr.asFunction< - ffi.Pointer Function( - FastFeatureDetector, Mat, imp1.CvCallback_1)>(); - - void FlannBasedMatcher_Close( - FlannBasedMatcherPtr f, - ) { - return _FlannBasedMatcher_Close( - f, - ); - } - - late final _FlannBasedMatcher_ClosePtr = - _lookup>( - 'FlannBasedMatcher_Close'); - late final _FlannBasedMatcher_Close = _FlannBasedMatcher_ClosePtr.asFunction< - void Function(FlannBasedMatcherPtr)>(); - - ffi.Pointer FlannBasedMatcher_Close_Async( + void cv_FlannBasedMatcher_close( FlannBasedMatcherPtr self, - imp1.CvCallback_0 callback, ) { - return _FlannBasedMatcher_Close_Async( + return _cv_FlannBasedMatcher_close( self, - callback, ); } - late final _FlannBasedMatcher_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FlannBasedMatcherPtr, - imp1.CvCallback_0)>>('FlannBasedMatcher_Close_Async'); - late final _FlannBasedMatcher_Close_Async = - _FlannBasedMatcher_Close_AsyncPtr.asFunction< - ffi.Pointer Function( - FlannBasedMatcherPtr, imp1.CvCallback_0)>(); + late final _cv_FlannBasedMatcher_closePtr = + _lookup>( + 'cv_FlannBasedMatcher_close'); + late final _cv_FlannBasedMatcher_close = _cv_FlannBasedMatcher_closePtr + .asFunction(); - ffi.Pointer FlannBasedMatcher_Create( + ffi.Pointer cv_FlannBasedMatcher_create( ffi.Pointer rval, ) { - return _FlannBasedMatcher_Create( + return _cv_FlannBasedMatcher_create( rval, ); } - late final _FlannBasedMatcher_CreatePtr = _lookup< + late final _cv_FlannBasedMatcher_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('FlannBasedMatcher_Create'); - late final _FlannBasedMatcher_Create = - _FlannBasedMatcher_CreatePtr.asFunction< + ffi.Pointer)>>('cv_FlannBasedMatcher_create'); + late final _cv_FlannBasedMatcher_create = + _cv_FlannBasedMatcher_createPtr.asFunction< ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer FlannBasedMatcher_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _FlannBasedMatcher_Create_Async( - callback, - ); - } - - late final _FlannBasedMatcher_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'FlannBasedMatcher_Create_Async'); - late final _FlannBasedMatcher_Create_Async = - _FlannBasedMatcher_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer FlannBasedMatcher_KnnMatch( - FlannBasedMatcher f, - Mat query, - Mat train, - int k, - ffi.Pointer rval, - ) { - return _FlannBasedMatcher_KnnMatch( - f, - query, - train, - k, - rval, - ); - } - - late final _FlannBasedMatcher_KnnMatchPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FlannBasedMatcher, Mat, Mat, ffi.Int, - ffi.Pointer)>>('FlannBasedMatcher_KnnMatch'); - late final _FlannBasedMatcher_KnnMatch = - _FlannBasedMatcher_KnnMatchPtr.asFunction< - ffi.Pointer Function( - FlannBasedMatcher, Mat, Mat, int, ffi.Pointer)>(); - - ffi.Pointer FlannBasedMatcher_KnnMatch_Async( + ffi.Pointer cv_FlannBasedMatcher_knnMatch( FlannBasedMatcher self, Mat query, Mat train, int k, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _FlannBasedMatcher_KnnMatch_Async( + return _cv_FlannBasedMatcher_knnMatch( self, query, train, k, + rval, callback, ); } - late final _FlannBasedMatcher_KnnMatch_AsyncPtr = _lookup< + late final _cv_FlannBasedMatcher_knnMatchPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(FlannBasedMatcher, Mat, Mat, ffi.Int, - imp1.CvCallback_1)>>('FlannBasedMatcher_KnnMatch_Async'); - late final _FlannBasedMatcher_KnnMatch_Async = - _FlannBasedMatcher_KnnMatch_AsyncPtr.asFunction< ffi.Pointer Function( - FlannBasedMatcher, Mat, Mat, int, imp1.CvCallback_1)>(); - - void GFTTDetector_Close( - GFTTDetectorPtr a, - ) { - return _GFTTDetector_Close( - a, - ); - } - - late final _GFTTDetector_ClosePtr = - _lookup>( - 'GFTTDetector_Close'); - late final _GFTTDetector_Close = - _GFTTDetector_ClosePtr.asFunction(); - - ffi.Pointer GFTTDetector_Close_Async( + FlannBasedMatcher, + Mat, + Mat, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_FlannBasedMatcher_knnMatch'); + late final _cv_FlannBasedMatcher_knnMatch = + _cv_FlannBasedMatcher_knnMatchPtr.asFunction< + ffi.Pointer Function(FlannBasedMatcher, Mat, Mat, int, + ffi.Pointer, imp1.CvCallback_0)>(); + + void cv_GFTTDetector_close( GFTTDetectorPtr self, - imp1.CvCallback_0 callback, ) { - return _GFTTDetector_Close_Async( + return _cv_GFTTDetector_close( self, - callback, ); } - late final _GFTTDetector_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - GFTTDetectorPtr, imp1.CvCallback_0)>>('GFTTDetector_Close_Async'); - late final _GFTTDetector_Close_Async = - _GFTTDetector_Close_AsyncPtr.asFunction< - ffi.Pointer Function(GFTTDetectorPtr, imp1.CvCallback_0)>(); + late final _cv_GFTTDetector_closePtr = + _lookup>( + 'cv_GFTTDetector_close'); + late final _cv_GFTTDetector_close = + _cv_GFTTDetector_closePtr.asFunction(); - ffi.Pointer GFTTDetector_Create( + ffi.Pointer cv_GFTTDetector_create( ffi.Pointer rval, ) { - return _GFTTDetector_Create( + return _cv_GFTTDetector_create( rval, ); } - late final _GFTTDetector_CreatePtr = _lookup< + late final _cv_GFTTDetector_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('GFTTDetector_Create'); - late final _GFTTDetector_Create = _GFTTDetector_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer GFTTDetector_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _GFTTDetector_Create_Async( - callback, - ); - } - - late final _GFTTDetector_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'GFTTDetector_Create_Async'); - late final _GFTTDetector_Create_Async = _GFTTDetector_Create_AsyncPtr - .asFunction Function(imp1.CvCallback_1)>(); - - ffi.Pointer GFTTDetector_Detect( - GFTTDetector a, - Mat src, - ffi.Pointer rval, - ) { - return _GFTTDetector_Detect( - a, - src, - rval, - ); - } - - late final _GFTTDetector_DetectPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(GFTTDetector, Mat, - ffi.Pointer)>>('GFTTDetector_Detect'); - late final _GFTTDetector_Detect = _GFTTDetector_DetectPtr.asFunction< - ffi.Pointer Function( - GFTTDetector, Mat, ffi.Pointer)>(); + ffi.Pointer)>>('cv_GFTTDetector_create'); + late final _cv_GFTTDetector_create = _cv_GFTTDetector_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer GFTTDetector_Detect_Async( + ffi.Pointer cv_GFTTDetector_detect( GFTTDetector self, Mat src, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _GFTTDetector_Detect_Async( + return _cv_GFTTDetector_detect( self, src, + rval, callback, ); } - late final _GFTTDetector_Detect_AsyncPtr = _lookup< + late final _cv_GFTTDetector_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(GFTTDetector, Mat, - imp1.CvCallback_1)>>('GFTTDetector_Detect_Async'); - late final _GFTTDetector_Detect_Async = - _GFTTDetector_Detect_AsyncPtr.asFunction< ffi.Pointer Function( - GFTTDetector, Mat, imp1.CvCallback_1)>(); - - void KAZE_Close( - KAZEPtr a, - ) { - return _KAZE_Close( - a, - ); - } - - late final _KAZE_ClosePtr = - _lookup>('KAZE_Close'); - late final _KAZE_Close = _KAZE_ClosePtr.asFunction(); + GFTTDetector, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_GFTTDetector_detect'); + late final _cv_GFTTDetector_detect = _cv_GFTTDetector_detectPtr.asFunction< + ffi.Pointer Function( + GFTTDetector, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer KAZE_Close_Async( + void cv_KAZE_close( KAZEPtr self, - imp1.CvCallback_0 callback, ) { - return _KAZE_Close_Async( + return _cv_KAZE_close( self, - callback, ); } - late final _KAZE_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KAZEPtr, imp1.CvCallback_0)>>('KAZE_Close_Async'); - late final _KAZE_Close_Async = _KAZE_Close_AsyncPtr.asFunction< - ffi.Pointer Function(KAZEPtr, imp1.CvCallback_0)>(); + late final _cv_KAZE_closePtr = + _lookup>('cv_KAZE_close'); + late final _cv_KAZE_close = + _cv_KAZE_closePtr.asFunction(); - ffi.Pointer KAZE_Create( + ffi.Pointer cv_KAZE_create( ffi.Pointer rval, ) { - return _KAZE_Create( + return _cv_KAZE_create( rval, ); } - late final _KAZE_CreatePtr = _lookup< + late final _cv_KAZE_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer)>>('KAZE_Create'); - late final _KAZE_Create = _KAZE_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer KAZE_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _KAZE_Create_Async( - callback, - ); - } - - late final _KAZE_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'KAZE_Create_Async'); - late final _KAZE_Create_Async = _KAZE_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + ffi.Pointer Function(ffi.Pointer)>>('cv_KAZE_create'); + late final _cv_KAZE_create = _cv_KAZE_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer KAZE_Detect( - KAZE a, + ffi.Pointer cv_KAZE_detect( + KAZE self, Mat src, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _KAZE_Detect( - a, + return _cv_KAZE_detect( + self, src, rval, + callback, ); } - late final _KAZE_DetectPtr = _lookup< + late final _cv_KAZE_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - KAZE, Mat, ffi.Pointer)>>('KAZE_Detect'); - late final _KAZE_Detect = _KAZE_DetectPtr.asFunction< - ffi.Pointer Function(KAZE, Mat, ffi.Pointer)>(); + ffi.Pointer Function(KAZE, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_KAZE_detect'); + late final _cv_KAZE_detect = _cv_KAZE_detectPtr.asFunction< + ffi.Pointer Function( + KAZE, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer KAZE_DetectAndCompute( - KAZE a, + ffi.Pointer cv_KAZE_detectAndCompute( + KAZE self, Mat src, Mat mask, Mat desc, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _KAZE_DetectAndCompute( - a, + return _cv_KAZE_detectAndCompute( + self, src, mask, desc, rval, - ); - } - - late final _KAZE_DetectAndComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KAZE, Mat, Mat, Mat, - ffi.Pointer)>>('KAZE_DetectAndCompute'); - late final _KAZE_DetectAndCompute = _KAZE_DetectAndComputePtr.asFunction< - ffi.Pointer Function( - KAZE, Mat, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer KAZE_DetectAndCompute_Async( - KAZE self, - Mat src, - Mat mask, - imp1.CvCallback_2 callback, - ) { - return _KAZE_DetectAndCompute_Async( - self, - src, - mask, - callback, - ); - } - - late final _KAZE_DetectAndCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KAZE, Mat, Mat, - imp1.CvCallback_2)>>('KAZE_DetectAndCompute_Async'); - late final _KAZE_DetectAndCompute_Async = - _KAZE_DetectAndCompute_AsyncPtr.asFunction< - ffi.Pointer Function(KAZE, Mat, Mat, imp1.CvCallback_2)>(); - - ffi.Pointer KAZE_Detect_Async( - KAZE self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _KAZE_Detect_Async( - self, - src, callback, ); } - late final _KAZE_Detect_AsyncPtr = _lookup< + late final _cv_KAZE_detectAndComputePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - KAZE, Mat, imp1.CvCallback_1)>>('KAZE_Detect_Async'); - late final _KAZE_Detect_Async = _KAZE_Detect_AsyncPtr.asFunction< - ffi.Pointer Function(KAZE, Mat, imp1.CvCallback_1)>(); - - void MSER_Close( - MSERPtr a, - ) { - return _MSER_Close( - a, - ); - } - - late final _MSER_ClosePtr = - _lookup>('MSER_Close'); - late final _MSER_Close = _MSER_ClosePtr.asFunction(); + KAZE, + Mat, + Mat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_KAZE_detectAndCompute'); + late final _cv_KAZE_detectAndCompute = + _cv_KAZE_detectAndComputePtr.asFunction< + ffi.Pointer Function(KAZE, Mat, Mat, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer MSER_Close_Async( + void cv_MSER_close( MSERPtr self, - imp1.CvCallback_0 callback, ) { - return _MSER_Close_Async( + return _cv_MSER_close( self, - callback, - ); - } - - late final _MSER_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - MSERPtr, imp1.CvCallback_0)>>('MSER_Close_Async'); - late final _MSER_Close_Async = _MSER_Close_AsyncPtr.asFunction< - ffi.Pointer Function(MSERPtr, imp1.CvCallback_0)>(); - - ffi.Pointer MSER_Create( - ffi.Pointer rval, - ) { - return _MSER_Create( - rval, ); } - late final _MSER_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer)>>('MSER_Create'); - late final _MSER_Create = _MSER_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer MSER_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _MSER_Create_Async( - callback, - ); - } - - late final _MSER_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'MSER_Create_Async'); - late final _MSER_Create_Async = _MSER_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + late final _cv_MSER_closePtr = + _lookup>('cv_MSER_close'); + late final _cv_MSER_close = + _cv_MSER_closePtr.asFunction(); - ffi.Pointer MSER_Detect( - MSER a, - Mat src, - ffi.Pointer rval, + ffi.Pointer cv_MSER_create( + ffi.Pointer rval, ) { - return _MSER_Detect( - a, - src, + return _cv_MSER_create( rval, ); } - late final _MSER_DetectPtr = _lookup< + late final _cv_MSER_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - MSER, Mat, ffi.Pointer)>>('MSER_Detect'); - late final _MSER_Detect = _MSER_DetectPtr.asFunction< - ffi.Pointer Function(MSER, Mat, ffi.Pointer)>(); + ffi.Pointer Function(ffi.Pointer)>>('cv_MSER_create'); + late final _cv_MSER_create = _cv_MSER_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer MSER_Detect_Async( + ffi.Pointer cv_MSER_detect( MSER self, Mat src, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _MSER_Detect_Async( + return _cv_MSER_detect( self, src, + rval, callback, ); } - late final _MSER_Detect_AsyncPtr = _lookup< + late final _cv_MSER_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - MSER, Mat, imp1.CvCallback_1)>>('MSER_Detect_Async'); - late final _MSER_Detect_Async = _MSER_Detect_AsyncPtr.asFunction< - ffi.Pointer Function(MSER, Mat, imp1.CvCallback_1)>(); - - void ORB_Close( - ORBPtr self, - ) { - return _ORB_Close( - self, - ); - } - - late final _ORB_ClosePtr = - _lookup>('ORB_Close'); - late final _ORB_Close = _ORB_ClosePtr.asFunction(); + ffi.Pointer Function(MSER, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_MSER_detect'); + late final _cv_MSER_detect = _cv_MSER_detectPtr.asFunction< + ffi.Pointer Function( + MSER, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ORB_Close_Async( + void cv_ORB_close( ORBPtr self, - imp1.CvCallback_0 callback, ) { - return _ORB_Close_Async( + return _cv_ORB_close( self, - callback, ); } - late final _ORB_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ORBPtr, imp1.CvCallback_0)>>('ORB_Close_Async'); - late final _ORB_Close_Async = _ORB_Close_AsyncPtr.asFunction< - ffi.Pointer Function(ORBPtr, imp1.CvCallback_0)>(); + late final _cv_ORB_closePtr = + _lookup>('cv_ORB_close'); + late final _cv_ORB_close = + _cv_ORB_closePtr.asFunction(); - ffi.Pointer ORB_Create( + ffi.Pointer cv_ORB_create( ffi.Pointer rval, ) { - return _ORB_Create( + return _cv_ORB_create( rval, ); } - late final _ORB_CreatePtr = _lookup< + late final _cv_ORB_createPtr = _lookup< ffi.NativeFunction Function(ffi.Pointer)>>( - 'ORB_Create'); - late final _ORB_Create = _ORB_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + 'cv_ORB_create'); + late final _cv_ORB_create = _cv_ORB_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer ORB_CreateWithParams( + ffi.Pointer cv_ORB_create_1( int nfeatures, double scaleFactor, int nlevels, @@ -1420,7 +726,7 @@ class CvNativeFeatures2d { int fastThreshold, ffi.Pointer rval, ) { - return _ORB_CreateWithParams( + return _cv_ORB_create_1( nfeatures, scaleFactor, nlevels, @@ -1434,7 +740,7 @@ class CvNativeFeatures2d { ); } - late final _ORB_CreateWithParamsPtr = _lookup< + late final _cv_ORB_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Int, @@ -1446,460 +752,310 @@ class CvNativeFeatures2d { ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('ORB_CreateWithParams'); - late final _ORB_CreateWithParams = _ORB_CreateWithParamsPtr.asFunction< + ffi.Pointer)>>('cv_ORB_create_1'); + late final _cv_ORB_create_1 = _cv_ORB_create_1Ptr.asFunction< ffi.Pointer Function( int, double, int, int, int, int, int, int, int, ffi.Pointer)>(); - ffi.Pointer ORB_CreateWithParams_Async( - int nfeatures, - double scaleFactor, - int nlevels, - int edgeThreshold, - int firstLevel, - int WTA_K, - int scoreType, - int patchSize, - int fastThreshold, - imp1.CvCallback_1 callback, - ) { - return _ORB_CreateWithParams_Async( - nfeatures, - scaleFactor, - nlevels, - edgeThreshold, - firstLevel, - WTA_K, - scoreType, - patchSize, - fastThreshold, - callback, - ); - } - - late final _ORB_CreateWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, - ffi.Float, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Int, - imp1.CvCallback_1)>>('ORB_CreateWithParams_Async'); - late final _ORB_CreateWithParams_Async = - _ORB_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(int, double, int, int, int, int, int, - int, int, imp1.CvCallback_1)>(); - - ffi.Pointer ORB_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _ORB_Create_Async( - callback, - ); - } - - late final _ORB_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'ORB_Create_Async'); - late final _ORB_Create_Async = _ORB_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer ORB_Detect( + ffi.Pointer cv_ORB_detect( ORB self, Mat src, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ORB_Detect( + return _cv_ORB_detect( self, src, rval, + callback, ); } - late final _ORB_DetectPtr = _lookup< + late final _cv_ORB_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - ORB, Mat, ffi.Pointer)>>('ORB_Detect'); - late final _ORB_Detect = _ORB_DetectPtr.asFunction< - ffi.Pointer Function(ORB, Mat, ffi.Pointer)>(); + ffi.Pointer Function(ORB, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_ORB_detect'); + late final _cv_ORB_detect = _cv_ORB_detectPtr.asFunction< + ffi.Pointer Function( + ORB, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ORB_DetectAndCompute( + ffi.Pointer cv_ORB_detectAndCompute( ORB self, Mat src, Mat mask, ffi.Pointer desc, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ORB_DetectAndCompute( + return _cv_ORB_detectAndCompute( self, src, mask, desc, rval, - ); - } - - late final _ORB_DetectAndComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ORB, Mat, Mat, ffi.Pointer, - ffi.Pointer)>>('ORB_DetectAndCompute'); - late final _ORB_DetectAndCompute = _ORB_DetectAndComputePtr.asFunction< - ffi.Pointer Function( - ORB, Mat, Mat, ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer ORB_DetectAndCompute_Async( - ORB self, - Mat src, - Mat mask, - imp1.CvCallback_2 callback, - ) { - return _ORB_DetectAndCompute_Async( - self, - src, - mask, - callback, - ); - } - - late final _ORB_DetectAndCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ORB, Mat, Mat, imp1.CvCallback_2)>>('ORB_DetectAndCompute_Async'); - late final _ORB_DetectAndCompute_Async = - _ORB_DetectAndCompute_AsyncPtr.asFunction< - ffi.Pointer Function(ORB, Mat, Mat, imp1.CvCallback_2)>(); - - ffi.Pointer ORB_Detect_Async( - ORB self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _ORB_Detect_Async( - self, - src, callback, ); } - late final _ORB_Detect_AsyncPtr = _lookup< + late final _cv_ORB_detectAndComputePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ORB, Mat, imp1.CvCallback_1)>>('ORB_Detect_Async'); - late final _ORB_Detect_Async = _ORB_Detect_AsyncPtr.asFunction< - ffi.Pointer Function(ORB, Mat, imp1.CvCallback_1)>(); - - void SIFT_Close( - SIFTPtr f, - ) { - return _SIFT_Close( - f, - ); - } - - late final _SIFT_ClosePtr = - _lookup>('SIFT_Close'); - late final _SIFT_Close = _SIFT_ClosePtr.asFunction(); - - ffi.Pointer SIFT_Close_Async( + ORB, + Mat, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_ORB_detectAndCompute'); + late final _cv_ORB_detectAndCompute = _cv_ORB_detectAndComputePtr.asFunction< + ffi.Pointer Function(ORB, Mat, Mat, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); + + void cv_SIFT_close( SIFTPtr self, - imp1.CvCallback_0 callback, ) { - return _SIFT_Close_Async( + return _cv_SIFT_close( self, - callback, ); } - late final _SIFT_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - SIFTPtr, imp1.CvCallback_0)>>('SIFT_Close_Async'); - late final _SIFT_Close_Async = _SIFT_Close_AsyncPtr.asFunction< - ffi.Pointer Function(SIFTPtr, imp1.CvCallback_0)>(); + late final _cv_SIFT_closePtr = + _lookup>('cv_SIFT_close'); + late final _cv_SIFT_close = + _cv_SIFT_closePtr.asFunction(); - ffi.Pointer SIFT_Create( + ffi.Pointer cv_SIFT_create( ffi.Pointer rval, ) { - return _SIFT_Create( + return _cv_SIFT_create( rval, ); } - late final _SIFT_CreatePtr = _lookup< + late final _cv_SIFT_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer)>>('SIFT_Create'); - late final _SIFT_Create = _SIFT_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer SIFT_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _SIFT_Create_Async( - callback, - ); - } - - late final _SIFT_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'SIFT_Create_Async'); - late final _SIFT_Create_Async = _SIFT_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + ffi.Pointer Function(ffi.Pointer)>>('cv_SIFT_create'); + late final _cv_SIFT_create = _cv_SIFT_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer SIFT_Detect( - SIFT f, + ffi.Pointer cv_SIFT_detect( + SIFT self, Mat src, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _SIFT_Detect( - f, + return _cv_SIFT_detect( + self, src, rval, + callback, ); } - late final _SIFT_DetectPtr = _lookup< + late final _cv_SIFT_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - SIFT, Mat, ffi.Pointer)>>('SIFT_Detect'); - late final _SIFT_Detect = _SIFT_DetectPtr.asFunction< - ffi.Pointer Function(SIFT, Mat, ffi.Pointer)>(); + ffi.Pointer Function(SIFT, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_SIFT_detect'); + late final _cv_SIFT_detect = _cv_SIFT_detectPtr.asFunction< + ffi.Pointer Function( + SIFT, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer SIFT_DetectAndCompute( - SIFT f, + ffi.Pointer cv_SIFT_detectAndCompute( + SIFT self, Mat src, Mat mask, Mat desc, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _SIFT_DetectAndCompute( - f, + return _cv_SIFT_detectAndCompute( + self, src, mask, desc, rval, - ); - } - - late final _SIFT_DetectAndComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(SIFT, Mat, Mat, Mat, - ffi.Pointer)>>('SIFT_DetectAndCompute'); - late final _SIFT_DetectAndCompute = _SIFT_DetectAndComputePtr.asFunction< - ffi.Pointer Function( - SIFT, Mat, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer SIFT_DetectAndCompute_Async( - SIFT self, - Mat src, - Mat mask, - imp1.CvCallback_2 callback, - ) { - return _SIFT_DetectAndCompute_Async( - self, - src, - mask, - callback, - ); - } - - late final _SIFT_DetectAndCompute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(SIFT, Mat, Mat, - imp1.CvCallback_2)>>('SIFT_DetectAndCompute_Async'); - late final _SIFT_DetectAndCompute_Async = - _SIFT_DetectAndCompute_AsyncPtr.asFunction< - ffi.Pointer Function(SIFT, Mat, Mat, imp1.CvCallback_2)>(); - - ffi.Pointer SIFT_Detect_Async( - SIFT self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _SIFT_Detect_Async( - self, - src, callback, ); } - late final _SIFT_Detect_AsyncPtr = _lookup< + late final _cv_SIFT_detectAndComputePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - SIFT, Mat, imp1.CvCallback_1)>>('SIFT_Detect_Async'); - late final _SIFT_Detect_Async = _SIFT_Detect_AsyncPtr.asFunction< - ffi.Pointer Function(SIFT, Mat, imp1.CvCallback_1)>(); + SIFT, + Mat, + Mat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_SIFT_detectAndCompute'); + late final _cv_SIFT_detectAndCompute = + _cv_SIFT_detectAndComputePtr.asFunction< + ffi.Pointer Function(SIFT, Mat, Mat, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer SimpleBlobDetectorParams_Create( + ffi.Pointer cv_SimpleBlobDetectorParams_create( ffi.Pointer rval, ) { - return _SimpleBlobDetectorParams_Create( + return _cv_SimpleBlobDetectorParams_create( rval, ); } - late final _SimpleBlobDetectorParams_CreatePtr = _lookup< + late final _cv_SimpleBlobDetectorParams_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer)>>( - 'SimpleBlobDetectorParams_Create'); - late final _SimpleBlobDetectorParams_Create = - _SimpleBlobDetectorParams_CreatePtr.asFunction< + 'cv_SimpleBlobDetectorParams_create'); + late final _cv_SimpleBlobDetectorParams_create = + _cv_SimpleBlobDetectorParams_createPtr.asFunction< ffi.Pointer Function( ffi.Pointer)>(); - void SimpleBlobDetector_Close( - SimpleBlobDetectorPtr b, - ) { - return _SimpleBlobDetector_Close( - b, - ); - } - - late final _SimpleBlobDetector_ClosePtr = - _lookup>( - 'SimpleBlobDetector_Close'); - late final _SimpleBlobDetector_Close = _SimpleBlobDetector_ClosePtr - .asFunction(); - - ffi.Pointer SimpleBlobDetector_Close_Async( + void cv_SimpleBlobDetector_close( SimpleBlobDetectorPtr self, - imp1.CvCallback_0 callback, ) { - return _SimpleBlobDetector_Close_Async( + return _cv_SimpleBlobDetector_close( self, - callback, ); } - late final _SimpleBlobDetector_Close_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(SimpleBlobDetectorPtr, - imp1.CvCallback_0)>>('SimpleBlobDetector_Close_Async'); - late final _SimpleBlobDetector_Close_Async = - _SimpleBlobDetector_Close_AsyncPtr.asFunction< - ffi.Pointer Function( - SimpleBlobDetectorPtr, imp1.CvCallback_0)>(); + late final _cv_SimpleBlobDetector_closePtr = + _lookup>( + 'cv_SimpleBlobDetector_close'); + late final _cv_SimpleBlobDetector_close = _cv_SimpleBlobDetector_closePtr + .asFunction(); - ffi.Pointer SimpleBlobDetector_Create( + ffi.Pointer cv_SimpleBlobDetector_create( ffi.Pointer rval, ) { - return _SimpleBlobDetector_Create( + return _cv_SimpleBlobDetector_create( rval, ); } - late final _SimpleBlobDetector_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('SimpleBlobDetector_Create'); - late final _SimpleBlobDetector_Create = - _SimpleBlobDetector_CreatePtr.asFunction< + late final _cv_SimpleBlobDetector_createPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer)>>( + 'cv_SimpleBlobDetector_create'); + late final _cv_SimpleBlobDetector_create = + _cv_SimpleBlobDetector_createPtr.asFunction< ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer SimpleBlobDetector_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _SimpleBlobDetector_Create_Async( - callback, - ); - } - - late final _SimpleBlobDetector_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'SimpleBlobDetector_Create_Async'); - late final _SimpleBlobDetector_Create_Async = - _SimpleBlobDetector_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer SimpleBlobDetector_Create_WithParams( + ffi.Pointer cv_SimpleBlobDetector_create_1( SimpleBlobDetectorParams params, ffi.Pointer rval, ) { - return _SimpleBlobDetector_Create_WithParams( + return _cv_SimpleBlobDetector_create_1( params, rval, ); } - late final _SimpleBlobDetector_Create_WithParamsPtr = _lookup< + late final _cv_SimpleBlobDetector_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( SimpleBlobDetectorParams, ffi.Pointer)>>( - 'SimpleBlobDetector_Create_WithParams'); - late final _SimpleBlobDetector_Create_WithParams = - _SimpleBlobDetector_Create_WithParamsPtr.asFunction< + 'cv_SimpleBlobDetector_create_1'); + late final _cv_SimpleBlobDetector_create_1 = + _cv_SimpleBlobDetector_create_1Ptr.asFunction< ffi.Pointer Function( SimpleBlobDetectorParams, ffi.Pointer)>(); - ffi.Pointer SimpleBlobDetector_Create_WithParams_Async( - SimpleBlobDetectorParams params, - imp1.CvCallback_1 callback, + ffi.Pointer cv_SimpleBlobDetector_detect( + SimpleBlobDetector self, + Mat src, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _SimpleBlobDetector_Create_WithParams_Async( - params, + return _cv_SimpleBlobDetector_detect( + self, + src, + rval, callback, ); } - late final _SimpleBlobDetector_Create_WithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - SimpleBlobDetectorParams, imp1.CvCallback_1)>>( - 'SimpleBlobDetector_Create_WithParams_Async'); - late final _SimpleBlobDetector_Create_WithParams_Async = - _SimpleBlobDetector_Create_WithParams_AsyncPtr.asFunction< + late final _cv_SimpleBlobDetector_detectPtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - SimpleBlobDetectorParams, imp1.CvCallback_1)>(); + SimpleBlobDetector, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_SimpleBlobDetector_detect'); + late final _cv_SimpleBlobDetector_detect = + _cv_SimpleBlobDetector_detectPtr.asFunction< + ffi.Pointer Function(SimpleBlobDetector, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer SimpleBlobDetector_Detect( - SimpleBlobDetector b, + ffi.Pointer cv_drawKeyPoints( Mat src, - ffi.Pointer rval, + VecKeyPoint kp, + Mat dst, + Scalar color, + int flags, + imp1.CvCallback_0 callback, ) { - return _SimpleBlobDetector_Detect( - b, + return _cv_drawKeyPoints( src, - rval, + kp, + dst, + color, + flags, + callback, ); } - late final _SimpleBlobDetector_DetectPtr = _lookup< + late final _cv_drawKeyPointsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(SimpleBlobDetector, Mat, - ffi.Pointer)>>('SimpleBlobDetector_Detect'); - late final _SimpleBlobDetector_Detect = - _SimpleBlobDetector_DetectPtr.asFunction< - ffi.Pointer Function( - SimpleBlobDetector, Mat, ffi.Pointer)>(); + ffi.Pointer Function(Mat, VecKeyPoint, Mat, Scalar, ffi.Int, + imp1.CvCallback_0)>>('cv_drawKeyPoints'); + late final _cv_drawKeyPoints = _cv_drawKeyPointsPtr.asFunction< + ffi.Pointer Function( + Mat, VecKeyPoint, Mat, Scalar, int, imp1.CvCallback_0)>(); - ffi.Pointer SimpleBlobDetector_Detect_Async( - SimpleBlobDetector self, - Mat src, - imp1.CvCallback_1 callback, + ffi.Pointer cv_drawMatches( + Mat img1, + VecKeyPoint kp1, + Mat img2, + VecKeyPoint kp2, + VecDMatch matches1to2, + Mat outImg, + Scalar matchesColor, + Scalar pointColor, + VecChar matchesMask, + int flags, + imp1.CvCallback_0 callback, ) { - return _SimpleBlobDetector_Detect_Async( - self, - src, + return _cv_drawMatches( + img1, + kp1, + img2, + kp2, + matches1to2, + outImg, + matchesColor, + pointColor, + matchesMask, + flags, callback, ); } - late final _SimpleBlobDetector_Detect_AsyncPtr = _lookup< + late final _cv_drawMatchesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(SimpleBlobDetector, Mat, - imp1.CvCallback_1)>>('SimpleBlobDetector_Detect_Async'); - late final _SimpleBlobDetector_Detect_Async = - _SimpleBlobDetector_Detect_AsyncPtr.asFunction< ffi.Pointer Function( - SimpleBlobDetector, Mat, imp1.CvCallback_1)>(); + Mat, + VecKeyPoint, + Mat, + VecKeyPoint, + VecDMatch, + Mat, + Scalar, + Scalar, + VecChar, + ffi.Int, + imp1.CvCallback_0)>>('cv_drawMatches'); + late final _cv_drawMatches = _cv_drawMatchesPtr.asFunction< + ffi.Pointer Function(Mat, VecKeyPoint, Mat, VecKeyPoint, + VecDMatch, Mat, Scalar, Scalar, VecChar, int, imp1.CvCallback_0)>(); late final addresses = _SymbolAddresses(this); } @@ -1908,86 +1064,32 @@ class _SymbolAddresses { final CvNativeFeatures2d _library; _SymbolAddresses(this._library); ffi.Pointer> - get AKAZE_Close => _library._AKAZE_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function(AKAZEPtr, imp1.CvCallback_0)>> - get AKAZE_Close_Async => _library._AKAZE_Close_AsyncPtr; + get cv_AKAZE_close => _library._cv_AKAZE_closePtr; ffi.Pointer> - get AgastFeatureDetector_Close => _library._AgastFeatureDetector_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function( - AgastFeatureDetectorPtr, imp1.CvCallback_0)>> - get AgastFeatureDetector_Close_Async => - _library._AgastFeatureDetector_Close_AsyncPtr; + get cv_AgastFeatureDetector_close => + _library._cv_AgastFeatureDetector_closePtr; ffi.Pointer> - get BFMatcher_Close => _library._BFMatcher_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function(BFMatcherPtr, imp1.CvCallback_0)>> - get BFMatcher_Close_Async => _library._BFMatcher_Close_AsyncPtr; + get cv_BFMatcher_close => _library._cv_BFMatcher_closePtr; ffi.Pointer> - get BRISK_Close => _library._BRISK_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function(BRISKPtr, imp1.CvCallback_0)>> - get BRISK_Close_Async => _library._BRISK_Close_AsyncPtr; + get cv_BRISK_close => _library._cv_BRISK_closePtr; ffi.Pointer> - get FastFeatureDetector_Close => _library._FastFeatureDetector_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function( - FastFeatureDetectorPtr, imp1.CvCallback_0)>> - get FastFeatureDetector_Close_Async => - _library._FastFeatureDetector_Close_AsyncPtr; + get cv_FastFeatureDetector_close => + _library._cv_FastFeatureDetector_closePtr; ffi.Pointer> - get FlannBasedMatcher_Close => _library._FlannBasedMatcher_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function( - FlannBasedMatcherPtr, imp1.CvCallback_0)>> - get FlannBasedMatcher_Close_Async => - _library._FlannBasedMatcher_Close_AsyncPtr; + get cv_FlannBasedMatcher_close => _library._cv_FlannBasedMatcher_closePtr; ffi.Pointer> - get GFTTDetector_Close => _library._GFTTDetector_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function( - GFTTDetectorPtr, imp1.CvCallback_0)>> - get GFTTDetector_Close_Async => _library._GFTTDetector_Close_AsyncPtr; - ffi.Pointer> get KAZE_Close => - _library._KAZE_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function(KAZEPtr, imp1.CvCallback_0)>> - get KAZE_Close_Async => _library._KAZE_Close_AsyncPtr; - ffi.Pointer> get MSER_Close => - _library._MSER_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function(MSERPtr, imp1.CvCallback_0)>> - get MSER_Close_Async => _library._MSER_Close_AsyncPtr; - ffi.Pointer> get ORB_Close => - _library._ORB_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function(ORBPtr, imp1.CvCallback_0)>> - get ORB_Close_Async => _library._ORB_Close_AsyncPtr; - ffi.Pointer> get SIFT_Close => - _library._SIFT_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function(SIFTPtr, imp1.CvCallback_0)>> - get SIFT_Close_Async => _library._SIFT_Close_AsyncPtr; + get cv_GFTTDetector_close => _library._cv_GFTTDetector_closePtr; + ffi.Pointer> + get cv_KAZE_close => _library._cv_KAZE_closePtr; + ffi.Pointer> + get cv_MSER_close => _library._cv_MSER_closePtr; + ffi.Pointer> get cv_ORB_close => + _library._cv_ORB_closePtr; + ffi.Pointer> + get cv_SIFT_close => _library._cv_SIFT_closePtr; ffi.Pointer> - get SimpleBlobDetector_Close => _library._SimpleBlobDetector_ClosePtr; - ffi.Pointer< - ffi.NativeFunction< - ffi.Pointer Function( - SimpleBlobDetectorPtr, imp1.CvCallback_0)>> - get SimpleBlobDetector_Close_Async => - _library._SimpleBlobDetector_Close_AsyncPtr; + get cv_SimpleBlobDetector_close => + _library._cv_SimpleBlobDetector_closePtr; } final class AKAZE extends ffi.Struct { diff --git a/packages/dartcv/lib/src/g/features2d.yaml b/packages/dartcv/lib/src/g/features2d.yaml index ce206ced..911527be 100644 --- a/packages/dartcv/lib/src/g/features2d.yaml +++ b/packages/dartcv/lib/src/g/features2d.yaml @@ -1,203 +1,107 @@ format_version: 1.0.0 files: - package:dartcv/src/g/features2d.g.dart: + package:dartcv4/src/g/features2d.g.dart: used-config: ffi-native: false symbols: - c:@F@AKAZE_Close: - name: AKAZE_Close - c:@F@AKAZE_Close_Async: - name: AKAZE_Close_Async - c:@F@AKAZE_Create: - name: AKAZE_Create - c:@F@AKAZE_Create_Async: - name: AKAZE_Create_Async - c:@F@AKAZE_Detect: - name: AKAZE_Detect - c:@F@AKAZE_DetectAndCompute: - name: AKAZE_DetectAndCompute - c:@F@AKAZE_DetectAndCompute_Async: - name: AKAZE_DetectAndCompute_Async - c:@F@AKAZE_Detect_Async: - name: AKAZE_Detect_Async - c:@F@AgastFeatureDetector_Close: - name: AgastFeatureDetector_Close - c:@F@AgastFeatureDetector_Close_Async: - name: AgastFeatureDetector_Close_Async - c:@F@AgastFeatureDetector_Create: - name: AgastFeatureDetector_Create - c:@F@AgastFeatureDetector_Create_Async: - name: AgastFeatureDetector_Create_Async - c:@F@AgastFeatureDetector_Detect: - name: AgastFeatureDetector_Detect - c:@F@AgastFeatureDetector_Detect_Async: - name: AgastFeatureDetector_Detect_Async - c:@F@BFMatcher_Close: - name: BFMatcher_Close - c:@F@BFMatcher_Close_Async: - name: BFMatcher_Close_Async - c:@F@BFMatcher_Create: - name: BFMatcher_Create - c:@F@BFMatcher_CreateWithParams: - name: BFMatcher_CreateWithParams - c:@F@BFMatcher_CreateWithParams_Async: - name: BFMatcher_CreateWithParams_Async - c:@F@BFMatcher_Create_Async: - name: BFMatcher_Create_Async - c:@F@BFMatcher_KnnMatch: - name: BFMatcher_KnnMatch - c:@F@BFMatcher_KnnMatch_Async: - name: BFMatcher_KnnMatch_Async - c:@F@BFMatcher_Match: - name: BFMatcher_Match - c:@F@BFMatcher_Match_Async: - name: BFMatcher_Match_Async - c:@F@BRISK_Close: - name: BRISK_Close - c:@F@BRISK_Close_Async: - name: BRISK_Close_Async - c:@F@BRISK_Create: - name: BRISK_Create - c:@F@BRISK_Create_Async: - name: BRISK_Create_Async - c:@F@BRISK_Detect: - name: BRISK_Detect - c:@F@BRISK_DetectAndCompute: - name: BRISK_DetectAndCompute - c:@F@BRISK_DetectAndCompute_Async: - name: BRISK_DetectAndCompute_Async - c:@F@BRISK_Detect_Async: - name: BRISK_Detect_Async - c:@F@DrawKeyPoints: - name: DrawKeyPoints - c:@F@DrawKeyPoints_Async: - name: DrawKeyPoints_Async - c:@F@DrawMatches: - name: DrawMatches - c:@F@DrawMatches_Async: - name: DrawMatches_Async - c:@F@FastFeatureDetector_Close: - name: FastFeatureDetector_Close - c:@F@FastFeatureDetector_Close_Async: - name: FastFeatureDetector_Close_Async - c:@F@FastFeatureDetector_Create: - name: FastFeatureDetector_Create - c:@F@FastFeatureDetector_CreateWithParams: - name: FastFeatureDetector_CreateWithParams - c:@F@FastFeatureDetector_CreateWithParams_Async: - name: FastFeatureDetector_CreateWithParams_Async - c:@F@FastFeatureDetector_Create_Async: - name: FastFeatureDetector_Create_Async - c:@F@FastFeatureDetector_Detect: - name: FastFeatureDetector_Detect - c:@F@FastFeatureDetector_Detect_Async: - name: FastFeatureDetector_Detect_Async - c:@F@FlannBasedMatcher_Close: - name: FlannBasedMatcher_Close - c:@F@FlannBasedMatcher_Close_Async: - name: FlannBasedMatcher_Close_Async - c:@F@FlannBasedMatcher_Create: - name: FlannBasedMatcher_Create - c:@F@FlannBasedMatcher_Create_Async: - name: FlannBasedMatcher_Create_Async - c:@F@FlannBasedMatcher_KnnMatch: - name: FlannBasedMatcher_KnnMatch - c:@F@FlannBasedMatcher_KnnMatch_Async: - name: FlannBasedMatcher_KnnMatch_Async - c:@F@GFTTDetector_Close: - name: GFTTDetector_Close - c:@F@GFTTDetector_Close_Async: - name: GFTTDetector_Close_Async - c:@F@GFTTDetector_Create: - name: GFTTDetector_Create - c:@F@GFTTDetector_Create_Async: - name: GFTTDetector_Create_Async - c:@F@GFTTDetector_Detect: - name: GFTTDetector_Detect - c:@F@GFTTDetector_Detect_Async: - name: GFTTDetector_Detect_Async - c:@F@KAZE_Close: - name: KAZE_Close - c:@F@KAZE_Close_Async: - name: KAZE_Close_Async - c:@F@KAZE_Create: - name: KAZE_Create - c:@F@KAZE_Create_Async: - name: KAZE_Create_Async - c:@F@KAZE_Detect: - name: KAZE_Detect - c:@F@KAZE_DetectAndCompute: - name: KAZE_DetectAndCompute - c:@F@KAZE_DetectAndCompute_Async: - name: KAZE_DetectAndCompute_Async - c:@F@KAZE_Detect_Async: - name: KAZE_Detect_Async - c:@F@MSER_Close: - name: MSER_Close - c:@F@MSER_Close_Async: - name: MSER_Close_Async - c:@F@MSER_Create: - name: MSER_Create - c:@F@MSER_Create_Async: - name: MSER_Create_Async - c:@F@MSER_Detect: - name: MSER_Detect - c:@F@MSER_Detect_Async: - name: MSER_Detect_Async - c:@F@ORB_Close: - name: ORB_Close - c:@F@ORB_Close_Async: - name: ORB_Close_Async - c:@F@ORB_Create: - name: ORB_Create - c:@F@ORB_CreateWithParams: - name: ORB_CreateWithParams - c:@F@ORB_CreateWithParams_Async: - name: ORB_CreateWithParams_Async - c:@F@ORB_Create_Async: - name: ORB_Create_Async - c:@F@ORB_Detect: - name: ORB_Detect - c:@F@ORB_DetectAndCompute: - name: ORB_DetectAndCompute - c:@F@ORB_DetectAndCompute_Async: - name: ORB_DetectAndCompute_Async - c:@F@ORB_Detect_Async: - name: ORB_Detect_Async - c:@F@SIFT_Close: - name: SIFT_Close - c:@F@SIFT_Close_Async: - name: SIFT_Close_Async - c:@F@SIFT_Create: - name: SIFT_Create - c:@F@SIFT_Create_Async: - name: SIFT_Create_Async - c:@F@SIFT_Detect: - name: SIFT_Detect - c:@F@SIFT_DetectAndCompute: - name: SIFT_DetectAndCompute - c:@F@SIFT_DetectAndCompute_Async: - name: SIFT_DetectAndCompute_Async - c:@F@SIFT_Detect_Async: - name: SIFT_Detect_Async - c:@F@SimpleBlobDetectorParams_Create: - name: SimpleBlobDetectorParams_Create - c:@F@SimpleBlobDetector_Close: - name: SimpleBlobDetector_Close - c:@F@SimpleBlobDetector_Close_Async: - name: SimpleBlobDetector_Close_Async - c:@F@SimpleBlobDetector_Create: - name: SimpleBlobDetector_Create - c:@F@SimpleBlobDetector_Create_Async: - name: SimpleBlobDetector_Create_Async - c:@F@SimpleBlobDetector_Create_WithParams: - name: SimpleBlobDetector_Create_WithParams - c:@F@SimpleBlobDetector_Create_WithParams_Async: - name: SimpleBlobDetector_Create_WithParams_Async - c:@F@SimpleBlobDetector_Detect: - name: SimpleBlobDetector_Detect - c:@F@SimpleBlobDetector_Detect_Async: - name: SimpleBlobDetector_Detect_Async + c:@F@cv_AKAZE_close: + name: cv_AKAZE_close + c:@F@cv_AKAZE_create: + name: cv_AKAZE_create + c:@F@cv_AKAZE_detect: + name: cv_AKAZE_detect + c:@F@cv_AKAZE_detectAndCompute: + name: cv_AKAZE_detectAndCompute + c:@F@cv_AgastFeatureDetector_close: + name: cv_AgastFeatureDetector_close + c:@F@cv_AgastFeatureDetector_create: + name: cv_AgastFeatureDetector_create + c:@F@cv_AgastFeatureDetector_detect: + name: cv_AgastFeatureDetector_detect + c:@F@cv_BFMatcher_close: + name: cv_BFMatcher_close + c:@F@cv_BFMatcher_create: + name: cv_BFMatcher_create + c:@F@cv_BFMatcher_create_1: + name: cv_BFMatcher_create_1 + c:@F@cv_BFMatcher_knnMatch: + name: cv_BFMatcher_knnMatch + c:@F@cv_BFMatcher_match: + name: cv_BFMatcher_match + c:@F@cv_BRISK_close: + name: cv_BRISK_close + c:@F@cv_BRISK_create: + name: cv_BRISK_create + c:@F@cv_BRISK_detect: + name: cv_BRISK_detect + c:@F@cv_BRISK_detectAndCompute: + name: cv_BRISK_detectAndCompute + c:@F@cv_FastFeatureDetector_close: + name: cv_FastFeatureDetector_close + c:@F@cv_FastFeatureDetector_create: + name: cv_FastFeatureDetector_create + c:@F@cv_FastFeatureDetector_create_1: + name: cv_FastFeatureDetector_create_1 + c:@F@cv_FastFeatureDetector_detect: + name: cv_FastFeatureDetector_detect + c:@F@cv_FlannBasedMatcher_close: + name: cv_FlannBasedMatcher_close + c:@F@cv_FlannBasedMatcher_create: + name: cv_FlannBasedMatcher_create + c:@F@cv_FlannBasedMatcher_knnMatch: + name: cv_FlannBasedMatcher_knnMatch + c:@F@cv_GFTTDetector_close: + name: cv_GFTTDetector_close + c:@F@cv_GFTTDetector_create: + name: cv_GFTTDetector_create + c:@F@cv_GFTTDetector_detect: + name: cv_GFTTDetector_detect + c:@F@cv_KAZE_close: + name: cv_KAZE_close + c:@F@cv_KAZE_create: + name: cv_KAZE_create + c:@F@cv_KAZE_detect: + name: cv_KAZE_detect + c:@F@cv_KAZE_detectAndCompute: + name: cv_KAZE_detectAndCompute + c:@F@cv_MSER_close: + name: cv_MSER_close + c:@F@cv_MSER_create: + name: cv_MSER_create + c:@F@cv_MSER_detect: + name: cv_MSER_detect + c:@F@cv_ORB_close: + name: cv_ORB_close + c:@F@cv_ORB_create: + name: cv_ORB_create + c:@F@cv_ORB_create_1: + name: cv_ORB_create_1 + c:@F@cv_ORB_detect: + name: cv_ORB_detect + c:@F@cv_ORB_detectAndCompute: + name: cv_ORB_detectAndCompute + c:@F@cv_SIFT_close: + name: cv_SIFT_close + c:@F@cv_SIFT_create: + name: cv_SIFT_create + c:@F@cv_SIFT_detect: + name: cv_SIFT_detect + c:@F@cv_SIFT_detectAndCompute: + name: cv_SIFT_detectAndCompute + c:@F@cv_SimpleBlobDetectorParams_create: + name: cv_SimpleBlobDetectorParams_create + c:@F@cv_SimpleBlobDetector_close: + name: cv_SimpleBlobDetector_close + c:@F@cv_SimpleBlobDetector_create: + name: cv_SimpleBlobDetector_create + c:@F@cv_SimpleBlobDetector_create_1: + name: cv_SimpleBlobDetector_create_1 + c:@F@cv_SimpleBlobDetector_detect: + name: cv_SimpleBlobDetector_detect + c:@F@cv_drawKeyPoints: + name: cv_drawKeyPoints + c:@F@cv_drawMatches: + name: cv_drawMatches c:@S@AKAZE: name: AKAZE c:@S@AgastFeatureDetector: diff --git a/packages/dartcv/lib/src/g/gapi.g.dart b/packages/dartcv/lib/src/g/gapi.g.dart index 5be595ff..67560d76 100644 --- a/packages/dartcv/lib/src/g/gapi.g.dart +++ b/packages/dartcv/lib/src/g/gapi.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Gapi /// diff --git a/packages/dartcv/lib/src/g/gapi.yaml b/packages/dartcv/lib/src/g/gapi.yaml index 9f6519e1..fde28ed1 100644 --- a/packages/dartcv/lib/src/g/gapi.yaml +++ b/packages/dartcv/lib/src/g/gapi.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:dartcv/src/g/gapi.g.dart: + package:dartcv4/src/g/gapi.g.dart: used-config: ffi-native: false symbols: diff --git a/packages/dartcv/lib/src/g/highgui.g.dart b/packages/dartcv/lib/src/g/highgui.g.dart index 8f369a20..de5b27f6 100644 --- a/packages/dartcv/lib/src/g/highgui.g.dart +++ b/packages/dartcv/lib/src/g/highgui.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Highgui /// @@ -30,353 +30,499 @@ class CvNativeHighgui { lookup) : _lookup = lookup; - ffi.Pointer Trackbar_Create( + ffi.Pointer cv_createTrackbar( ffi.Pointer winname, ffi.Pointer trackname, int max, ) { - return _Trackbar_Create( + return _cv_createTrackbar( winname, trackname, max, ); } - late final _Trackbar_CreatePtr = _lookup< + late final _cv_createTrackbarPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Int)>>('Trackbar_Create'); - late final _Trackbar_Create = _Trackbar_CreatePtr.asFunction< + ffi.Pointer, ffi.Int)>>('cv_createTrackbar'); + late final _cv_createTrackbar = _cv_createTrackbarPtr.asFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer, int)>(); - ffi.Pointer Trackbar_CreateWithValue( + ffi.Pointer cv_createTrackbar_1( ffi.Pointer winname, ffi.Pointer trackname, ffi.Pointer value, int max, + cv_TrackbarCallback onChange, + ffi.Pointer userdata, ) { - return _Trackbar_CreateWithValue( + return _cv_createTrackbar_1( winname, trackname, value, max, + onChange, + userdata, ); } - late final _Trackbar_CreateWithValuePtr = _lookup< + late final _cv_createTrackbar_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer, ffi.Pointer, - ffi.Int)>>('Trackbar_CreateWithValue'); - late final _Trackbar_CreateWithValue = - _Trackbar_CreateWithValuePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Int, + cv_TrackbarCallback, + ffi.Pointer)>>('cv_createTrackbar_1'); + late final _cv_createTrackbar_1 = _cv_createTrackbar_1Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + cv_TrackbarCallback, + ffi.Pointer)>(); + + ffi.Pointer cv_currentUIFramework() { + return _cv_currentUIFramework(); + } - ffi.Pointer Trackbar_GetPos( - ffi.Pointer winname, - ffi.Pointer trackname, - ffi.Pointer rval, - ) { - return _Trackbar_GetPos( - winname, - trackname, - rval, - ); + late final _cv_currentUIFrameworkPtr = + _lookup Function()>>( + 'cv_currentUIFramework'); + late final _cv_currentUIFramework = + _cv_currentUIFrameworkPtr.asFunction Function()>(); + + ffi.Pointer cv_destroyAllWindows() { + return _cv_destroyAllWindows(); } - late final _Trackbar_GetPosPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer)>>('Trackbar_GetPos'); - late final _Trackbar_GetPos = _Trackbar_GetPosPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer)>(); + late final _cv_destroyAllWindowsPtr = + _lookup Function()>>( + 'cv_destroyAllWindows'); + late final _cv_destroyAllWindows = + _cv_destroyAllWindowsPtr.asFunction Function()>(); - ffi.Pointer Trackbar_SetMax( + ffi.Pointer cv_destroyWindow( ffi.Pointer winname, - ffi.Pointer trackname, - int pos, ) { - return _Trackbar_SetMax( + return _cv_destroyWindow( winname, - trackname, - pos, ); } - late final _Trackbar_SetMaxPtr = _lookup< + late final _cv_destroyWindowPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Int)>>('Trackbar_SetMax'); - late final _Trackbar_SetMax = _Trackbar_SetMaxPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer Function( + ffi.Pointer)>>('cv_destroyWindow'); + late final _cv_destroyWindow = _cv_destroyWindowPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer Trackbar_SetMin( - ffi.Pointer winname, - ffi.Pointer trackname, - int pos, + int cv_getMouseWheelDelta( + int flags, ) { - return _Trackbar_SetMin( - winname, - trackname, - pos, + return _cv_getMouseWheelDelta( + flags, ); } - late final _Trackbar_SetMinPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Int)>>('Trackbar_SetMin'); - late final _Trackbar_SetMin = _Trackbar_SetMinPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + late final _cv_getMouseWheelDeltaPtr = + _lookup>( + 'cv_getMouseWheelDelta'); + late final _cv_getMouseWheelDelta = + _cv_getMouseWheelDeltaPtr.asFunction(); - ffi.Pointer Trackbar_SetPos( + ffi.Pointer cv_getTrackbarPos( ffi.Pointer winname, ffi.Pointer trackname, - int pos, + ffi.Pointer rval, ) { - return _Trackbar_SetPos( + return _cv_getTrackbarPos( winname, trackname, - pos, + rval, ); } - late final _Trackbar_SetPosPtr = _lookup< + late final _cv_getTrackbarPosPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Int)>>('Trackbar_SetPos'); - late final _Trackbar_SetPos = _Trackbar_SetPosPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('cv_getTrackbarPos'); + late final _cv_getTrackbarPos = _cv_getTrackbarPosPtr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); - void Window_Close( + ffi.Pointer cv_getWindowImageRect( ffi.Pointer winname, + ffi.Pointer rval, ) { - return _Window_Close( + return _cv_getWindowImageRect( winname, + rval, ); } - late final _Window_ClosePtr = - _lookup)>>( - 'Window_Close'); - late final _Window_Close = - _Window_ClosePtr.asFunction)>(); + late final _cv_getWindowImageRectPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer)>>('cv_getWindowImageRect'); + late final _cv_getWindowImageRect = _cv_getWindowImageRectPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer Window_GetProperty( + ffi.Pointer cv_getWindowProperty( ffi.Pointer winname, int flag, ffi.Pointer rval, ) { - return _Window_GetProperty( + return _cv_getWindowProperty( winname, flag, rval, ); } - late final _Window_GetPropertyPtr = _lookup< + late final _cv_getWindowPropertyPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, ffi.Int, - ffi.Pointer)>>('Window_GetProperty'); - late final _Window_GetProperty = _Window_GetPropertyPtr.asFunction< + ffi.Pointer)>>('cv_getWindowProperty'); + late final _cv_getWindowProperty = _cv_getWindowPropertyPtr.asFunction< ffi.Pointer Function( ffi.Pointer, int, ffi.Pointer)>(); - ffi.Pointer Window_IMShow( + ffi.Pointer cv_imshow( ffi.Pointer winname, Mat mat, ) { - return _Window_IMShow( + return _cv_imshow( winname, mat, ); } - late final _Window_IMShowPtr = _lookup< + late final _cv_imshowPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, Mat)>>('Window_IMShow'); - late final _Window_IMShow = _Window_IMShowPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, Mat)>(); + ffi.Pointer, Mat)>>('cv_imshow'); + late final _cv_imshow = _cv_imshowPtr + .asFunction Function(ffi.Pointer, Mat)>(); - ffi.Pointer Window_Move( + ffi.Pointer cv_moveWindow( ffi.Pointer winname, int x, int y, ) { - return _Window_Move( + return _cv_moveWindow( winname, x, y, ); } - late final _Window_MovePtr = _lookup< + late final _cv_moveWindowPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Int, ffi.Int)>>('Window_Move'); - late final _Window_Move = _Window_MovePtr.asFunction< + ffi.Pointer, ffi.Int, ffi.Int)>>('cv_moveWindow'); + late final _cv_moveWindow = _cv_moveWindowPtr.asFunction< ffi.Pointer Function(ffi.Pointer, int, int)>(); - ffi.Pointer Window_New( + ffi.Pointer cv_namedWindow( ffi.Pointer winname, int flags, ) { - return _Window_New( + return _cv_namedWindow( winname, flags, ); } - late final _Window_NewPtr = _lookup< + late final _cv_namedWindowPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Int)>>('Window_New'); - late final _Window_New = _Window_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.Pointer, ffi.Int)>>('cv_namedWindow'); + late final _cv_namedWindow = _cv_namedWindowPtr + .asFunction Function(ffi.Pointer, int)>(); - ffi.Pointer Window_Resize( + int cv_pollKey() { + return _cv_pollKey(); + } + + late final _cv_pollKeyPtr = + _lookup>('cv_pollKey'); + late final _cv_pollKey = _cv_pollKeyPtr.asFunction(); + + ffi.Pointer cv_resizeWindow( ffi.Pointer winname, int width, int height, ) { - return _Window_Resize( + return _cv_resizeWindow( winname, width, height, ); } - late final _Window_ResizePtr = _lookup< + late final _cv_resizeWindowPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Int, ffi.Int)>>('Window_Resize'); - late final _Window_Resize = _Window_ResizePtr.asFunction< + ffi.Pointer, ffi.Int, ffi.Int)>>('cv_resizeWindow'); + late final _cv_resizeWindow = _cv_resizeWindowPtr.asFunction< ffi.Pointer Function(ffi.Pointer, int, int)>(); - ffi.Pointer Window_SelectROI( + ffi.Pointer cv_selectROI( ffi.Pointer winname, Mat img, + bool showCrosshair, + bool fromCenter, + bool printNotice, ffi.Pointer rval, ) { - return _Window_SelectROI( + return _cv_selectROI( winname, img, + showCrosshair, + fromCenter, + printNotice, rval, ); } - late final _Window_SelectROIPtr = _lookup< + late final _cv_selectROIPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer)>>('Window_SelectROI'); - late final _Window_SelectROI = _Window_SelectROIPtr.asFunction< + ffi.Pointer Function(ffi.Pointer, Mat, ffi.Bool, + ffi.Bool, ffi.Bool, ffi.Pointer)>>('cv_selectROI'); + late final _cv_selectROI = _cv_selectROIPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, Mat, ffi.Pointer)>(); + ffi.Pointer, Mat, bool, bool, bool, ffi.Pointer)>(); + + ffi.Pointer cv_selectROI_1( + Mat img, + bool showCrosshair, + bool fromCenter, + bool printNotice, + ffi.Pointer rval, + ) { + return _cv_selectROI_1( + img, + showCrosshair, + fromCenter, + printNotice, + rval, + ); + } - ffi.Pointer Window_SelectROIs( + late final _cv_selectROI_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, ffi.Bool, ffi.Bool, ffi.Bool, + ffi.Pointer)>>('cv_selectROI_1'); + late final _cv_selectROI_1 = _cv_selectROI_1Ptr.asFunction< + ffi.Pointer Function( + Mat, bool, bool, bool, ffi.Pointer)>(); + + ffi.Pointer cv_selectROIs( ffi.Pointer winname, Mat img, ffi.Pointer rval, + bool showCrosshair, + bool fromCenter, + bool printNotice, ) { - return _Window_SelectROIs( + return _cv_selectROIs( winname, img, rval, + showCrosshair, + fromCenter, + printNotice, ); } - late final _Window_SelectROIsPtr = _lookup< + late final _cv_selectROIsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer)>>('Window_SelectROIs'); - late final _Window_SelectROIs = _Window_SelectROIsPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + Mat, + ffi.Pointer, + ffi.Bool, + ffi.Bool, + ffi.Bool)>>('cv_selectROIs'); + late final _cv_selectROIs = _cv_selectROIsPtr.asFunction< + ffi.Pointer Function(ffi.Pointer, Mat, + ffi.Pointer, bool, bool, bool)>(); + + ffi.Pointer cv_setMouseCallback( + ffi.Pointer winname, + cv_MouseCallback onMouse, + ffi.Pointer userdata, + ) { + return _cv_setMouseCallback( + winname, + onMouse, + userdata, + ); + } + + late final _cv_setMouseCallbackPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + cv_MouseCallback, ffi.Pointer)>>('cv_setMouseCallback'); + late final _cv_setMouseCallback = _cv_setMouseCallbackPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, Mat, ffi.Pointer)>(); + ffi.Pointer, cv_MouseCallback, ffi.Pointer)>(); - ffi.Pointer Window_SetProperty( + ffi.Pointer cv_setTrackbarMax( + ffi.Pointer winname, + ffi.Pointer trackname, + int val, + ) { + return _cv_setTrackbarMax( + winname, + trackname, + val, + ); + } + + late final _cv_setTrackbarMaxPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int)>>('cv_setTrackbarMax'); + late final _cv_setTrackbarMax = _cv_setTrackbarMaxPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + ffi.Pointer cv_setTrackbarMin( + ffi.Pointer winname, + ffi.Pointer trackname, + int val, + ) { + return _cv_setTrackbarMin( + winname, + trackname, + val, + ); + } + + late final _cv_setTrackbarMinPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int)>>('cv_setTrackbarMin'); + late final _cv_setTrackbarMin = _cv_setTrackbarMinPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + ffi.Pointer cv_setTrackbarPos( + ffi.Pointer winname, + ffi.Pointer trackname, + int pos, + ) { + return _cv_setTrackbarPos( + winname, + trackname, + pos, + ); + } + + late final _cv_setTrackbarPosPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int)>>('cv_setTrackbarPos'); + late final _cv_setTrackbarPos = _cv_setTrackbarPosPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + ffi.Pointer cv_setWindowProperty( ffi.Pointer winname, int flag, double value, ) { - return _Window_SetProperty( + return _cv_setWindowProperty( winname, flag, value, ); } - late final _Window_SetPropertyPtr = _lookup< + late final _cv_setWindowPropertyPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, ffi.Int, - ffi.Double)>>('Window_SetProperty'); - late final _Window_SetProperty = _Window_SetPropertyPtr.asFunction< + ffi.Double)>>('cv_setWindowProperty'); + late final _cv_setWindowProperty = _cv_setWindowPropertyPtr.asFunction< ffi.Pointer Function(ffi.Pointer, int, double)>(); - ffi.Pointer Window_SetTitle( + ffi.Pointer cv_setWindowTitle( ffi.Pointer winname, ffi.Pointer title, ) { - return _Window_SetTitle( + return _cv_setWindowTitle( winname, title, ); } - late final _Window_SetTitlePtr = _lookup< + late final _cv_setWindowTitlePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('Window_SetTitle'); - late final _Window_SetTitle = _Window_SetTitlePtr.asFunction< + ffi.Pointer)>>('cv_setWindowTitle'); + late final _cv_setWindowTitle = _cv_setWindowTitlePtr.asFunction< ffi.Pointer Function( ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer Window_WaitKey( + int cv_waitKey( int delay, - ffi.Pointer rval, ) { - return _Window_WaitKey( + return _cv_waitKey( delay, - rval, ); } - late final _Window_WaitKeyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Pointer)>>('Window_WaitKey'); - late final _Window_WaitKey = _Window_WaitKeyPtr.asFunction< - ffi.Pointer Function(int, ffi.Pointer)>(); + late final _cv_waitKeyPtr = + _lookup>('cv_waitKey'); + late final _cv_waitKey = _cv_waitKeyPtr.asFunction(); - ffi.Pointer destroyAllWindows() { - return _destroyAllWindows(); + int cv_waitKeyEx( + int delay, + ) { + return _cv_waitKeyEx( + delay, + ); } - late final _destroyAllWindowsPtr = - _lookup Function()>>( - 'destroyAllWindows'); - late final _destroyAllWindows = - _destroyAllWindowsPtr.asFunction Function()>(); - - late final addresses = _SymbolAddresses(this); -} - -class _SymbolAddresses { - final CvNativeHighgui _library; - _SymbolAddresses(this._library); - ffi.Pointer)>> - get Window_Close => _library._Window_ClosePtr; + late final _cv_waitKeyExPtr = + _lookup>('cv_waitKeyEx'); + late final _cv_waitKeyEx = _cv_waitKeyExPtr.asFunction(); } typedef CvRect = imp1.CvRect; typedef CvStatus = imp1.CvStatus; typedef Mat = imp1.Mat; typedef VecRect = imp1.VecRect; +typedef cv_ButtonCallback + = ffi.Pointer>; +typedef cv_ButtonCallbackFunction = ffi.Void Function( + ffi.Int state, ffi.Pointer userdata); +typedef Dartcv_ButtonCallbackFunction = void Function( + int state, ffi.Pointer userdata); +typedef cv_MouseCallback + = ffi.Pointer>; +typedef cv_MouseCallbackFunction = ffi.Void Function(ffi.Int event, ffi.Int x, + ffi.Int y, ffi.Int flags, ffi.Pointer userdata); +typedef Dartcv_MouseCallbackFunction = void Function( + int event, int x, int y, int flags, ffi.Pointer userdata); +typedef cv_OpenGlDrawCallback + = ffi.Pointer>; +typedef cv_OpenGlDrawCallbackFunction = ffi.Void Function( + ffi.Pointer userdata); +typedef Dartcv_OpenGlDrawCallbackFunction = void Function( + ffi.Pointer userdata); +typedef cv_TrackbarCallback + = ffi.Pointer>; +typedef cv_TrackbarCallbackFunction = ffi.Void Function( + ffi.Int pos, ffi.Pointer userdata); +typedef Dartcv_TrackbarCallbackFunction = void Function( + int pos, ffi.Pointer userdata); diff --git a/packages/dartcv/lib/src/g/highgui.yaml b/packages/dartcv/lib/src/g/highgui.yaml index f0cd41b7..2a2e37e2 100644 --- a/packages/dartcv/lib/src/g/highgui.yaml +++ b/packages/dartcv/lib/src/g/highgui.yaml @@ -1,45 +1,67 @@ format_version: 1.0.0 files: - package:dartcv/src/g/highgui.g.dart: + package:dartcv4/src/g/highgui.g.dart: used-config: ffi-native: false symbols: - c:@F@Trackbar_Create: - name: Trackbar_Create - c:@F@Trackbar_CreateWithValue: - name: Trackbar_CreateWithValue - c:@F@Trackbar_GetPos: - name: Trackbar_GetPos - c:@F@Trackbar_SetMax: - name: Trackbar_SetMax - c:@F@Trackbar_SetMin: - name: Trackbar_SetMin - c:@F@Trackbar_SetPos: - name: Trackbar_SetPos - c:@F@Window_Close: - name: Window_Close - c:@F@Window_GetProperty: - name: Window_GetProperty - c:@F@Window_IMShow: - name: Window_IMShow - c:@F@Window_Move: - name: Window_Move - c:@F@Window_New: - name: Window_New - c:@F@Window_Resize: - name: Window_Resize - c:@F@Window_SelectROI: - name: Window_SelectROI - c:@F@Window_SelectROIs: - name: Window_SelectROIs - c:@F@Window_SetProperty: - name: Window_SetProperty - c:@F@Window_SetTitle: - name: Window_SetTitle - c:@F@Window_WaitKey: - name: Window_WaitKey - c:@F@destroyAllWindows: - name: destroyAllWindows + c:@F@cv_createTrackbar: + name: cv_createTrackbar + c:@F@cv_createTrackbar_1: + name: cv_createTrackbar_1 + c:@F@cv_currentUIFramework: + name: cv_currentUIFramework + c:@F@cv_destroyAllWindows: + name: cv_destroyAllWindows + c:@F@cv_destroyWindow: + name: cv_destroyWindow + c:@F@cv_getMouseWheelDelta: + name: cv_getMouseWheelDelta + c:@F@cv_getTrackbarPos: + name: cv_getTrackbarPos + c:@F@cv_getWindowImageRect: + name: cv_getWindowImageRect + c:@F@cv_getWindowProperty: + name: cv_getWindowProperty + c:@F@cv_imshow: + name: cv_imshow + c:@F@cv_moveWindow: + name: cv_moveWindow + c:@F@cv_namedWindow: + name: cv_namedWindow + c:@F@cv_pollKey: + name: cv_pollKey + c:@F@cv_resizeWindow: + name: cv_resizeWindow + c:@F@cv_selectROI: + name: cv_selectROI + c:@F@cv_selectROI_1: + name: cv_selectROI_1 + c:@F@cv_selectROIs: + name: cv_selectROIs + c:@F@cv_setMouseCallback: + name: cv_setMouseCallback + c:@F@cv_setTrackbarMax: + name: cv_setTrackbarMax + c:@F@cv_setTrackbarMin: + name: cv_setTrackbarMin + c:@F@cv_setTrackbarPos: + name: cv_setTrackbarPos + c:@F@cv_setWindowProperty: + name: cv_setWindowProperty + c:@F@cv_setWindowTitle: + name: cv_setWindowTitle + c:@F@cv_waitKey: + name: cv_waitKey + c:@F@cv_waitKeyEx: + name: cv_waitKeyEx + c:highgui.h@T@cv_ButtonCallback: + name: cv_ButtonCallback + c:highgui.h@T@cv_MouseCallback: + name: cv_MouseCallback + c:highgui.h@T@cv_OpenGlDrawCallback: + name: cv_OpenGlDrawCallback + c:highgui.h@T@cv_TrackbarCallback: + name: cv_TrackbarCallback c:types.h@T@CvRect: name: CvRect c:types.h@T@CvStatus: @@ -48,3 +70,11 @@ files: name: Mat c:types.h@T@VecRect: name: VecRect + cv_ButtonCallbackFunction: + name: cv_ButtonCallbackFunction + cv_MouseCallbackFunction: + name: cv_MouseCallbackFunction + cv_OpenGlDrawCallbackFunction: + name: cv_OpenGlDrawCallbackFunction + cv_TrackbarCallbackFunction: + name: cv_TrackbarCallbackFunction diff --git a/packages/dartcv/lib/src/g/imgcodecs.g.dart b/packages/dartcv/lib/src/g/imgcodecs.g.dart index 23c20318..8d217ffb 100644 --- a/packages/dartcv/lib/src/g/imgcodecs.g.dart +++ b/packages/dartcv/lib/src/g/imgcodecs.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Imgcodecs /// @@ -30,263 +30,197 @@ class CvNativeImgcodecs { lookup) : _lookup = lookup; - ffi.Pointer Image_IMDecode( - VecUChar buf, + bool cv_haveImageReader( + ffi.Pointer filename, + ) { + return _cv_haveImageReader( + filename, + ); + } + + late final _cv_haveImageReaderPtr = + _lookup)>>( + 'cv_haveImageReader'); + late final _cv_haveImageReader = + _cv_haveImageReaderPtr.asFunction)>(); + + bool cv_haveImageWriter( + ffi.Pointer filename, + ) { + return _cv_haveImageWriter( + filename, + ); + } + + late final _cv_haveImageWriterPtr = + _lookup)>>( + 'cv_haveImageWriter'); + late final _cv_haveImageWriter = + _cv_haveImageWriterPtr.asFunction)>(); + + int cv_imcount( + ffi.Pointer filename, int flags, - ffi.Pointer rval, ) { - return _Image_IMDecode( - buf, + return _cv_imcount( + filename, flags, - rval, ); } - late final _Image_IMDecodePtr = _lookup< + late final _cv_imcountPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - VecUChar, ffi.Int, ffi.Pointer)>>('Image_IMDecode'); - late final _Image_IMDecode = _Image_IMDecodePtr.asFunction< - ffi.Pointer Function(VecUChar, int, ffi.Pointer)>(); + ffi.Size Function(ffi.Pointer, ffi.Int)>>('cv_imcount'); + late final _cv_imcount = + _cv_imcountPtr.asFunction, int)>(); - ffi.Pointer Image_IMDecode_Async( + ffi.Pointer cv_imdecode( VecUChar buf, int flags, - imp1.CvCallback_1 callback, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Image_IMDecode_Async( + return _cv_imdecode( buf, flags, + rval, callback, ); } - late final _Image_IMDecode_AsyncPtr = _lookup< + late final _cv_imdecodePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VecUChar, ffi.Int, imp1.CvCallback_1)>>('Image_IMDecode_Async'); - late final _Image_IMDecode_Async = _Image_IMDecode_AsyncPtr.asFunction< - ffi.Pointer Function(VecUChar, int, imp1.CvCallback_1)>(); + VecUChar, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_imdecode'); + late final _cv_imdecode = _cv_imdecodePtr.asFunction< + ffi.Pointer Function(VecUChar, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Image_IMEncode( + ffi.Pointer cv_imencode( ffi.Pointer fileExt, Mat img, ffi.Pointer success, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Image_IMEncode( + return _cv_imencode( fileExt, img, success, rval, - ); - } - - late final _Image_IMEncodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer, ffi.Pointer)>>('Image_IMEncode'); - late final _Image_IMEncode = _Image_IMEncodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer Image_IMEncode_Async( - ffi.Pointer fileExt, - Mat img, - imp1.CvCallback_2 callback, - ) { - return _Image_IMEncode_Async( - fileExt, - img, callback, ); } - late final _Image_IMEncode_AsyncPtr = _lookup< + late final _cv_imencodePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - imp1.CvCallback_2)>>('Image_IMEncode_Async'); - late final _Image_IMEncode_Async = _Image_IMEncode_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, Mat, imp1.CvCallback_2)>(); + ffi.Pointer Function( + ffi.Pointer, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_imencode'); + late final _cv_imencode = _cv_imencodePtr.asFunction< + ffi.Pointer Function(ffi.Pointer, Mat, + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Image_IMEncode_WithParams( + ffi.Pointer cv_imencode_1( ffi.Pointer fileExt, Mat img, VecI32 params, ffi.Pointer success, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Image_IMEncode_WithParams( + return _cv_imencode_1( fileExt, img, params, success, rval, + callback, ); } - late final _Image_IMEncode_WithParamsPtr = _lookup< + late final _cv_imencode_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer, Mat, VecI32, ffi.Pointer, - ffi.Pointer)>>('Image_IMEncode_WithParams'); - late final _Image_IMEncode_WithParams = - _Image_IMEncode_WithParamsPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, Mat, VecI32, - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + imp1.CvCallback_0)>>('cv_imencode_1'); + late final _cv_imencode_1 = _cv_imencode_1Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, Mat, VecI32, + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Image_IMEncode_WithParams_Async( - ffi.Pointer fileExt, - Mat img, - VecI32 params, - imp1.CvCallback_2 callback, - ) { - return _Image_IMEncode_WithParams_Async( - fileExt, - img, - params, - callback, - ); - } - - late final _Image_IMEncode_WithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, VecI32, - imp1.CvCallback_2)>>('Image_IMEncode_WithParams_Async'); - late final _Image_IMEncode_WithParams_Async = - _Image_IMEncode_WithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, Mat, VecI32, imp1.CvCallback_2)>(); - - ffi.Pointer Image_IMRead( + ffi.Pointer cv_imread( ffi.Pointer filename, int flags, - ffi.Pointer rval, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Image_IMRead( + return _cv_imread( filename, flags, rval, - ); - } - - late final _Image_IMReadPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, - ffi.Pointer)>>('Image_IMRead'); - late final _Image_IMRead = _Image_IMReadPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); - - ffi.Pointer Image_IMRead_Async( - ffi.Pointer filename, - int flags, - imp1.CvCallback_1 callback, - ) { - return _Image_IMRead_Async( - filename, - flags, callback, ); } - late final _Image_IMRead_AsyncPtr = _lookup< + late final _cv_imreadPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, - imp1.CvCallback_1)>>('Image_IMRead_Async'); - late final _Image_IMRead_Async = _Image_IMRead_AsyncPtr.asFunction< + ffi.Pointer Function(ffi.Pointer, ffi.Int, Mat, + imp1.CvCallback_0)>>('cv_imread'); + late final _cv_imread = _cv_imreadPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, int, imp1.CvCallback_1)>(); + ffi.Pointer, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Image_IMWrite( + ffi.Pointer cv_imwrite( ffi.Pointer filename, Mat img, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Image_IMWrite( + return _cv_imwrite( filename, img, rval, - ); - } - - late final _Image_IMWritePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, - ffi.Pointer)>>('Image_IMWrite'); - late final _Image_IMWrite = _Image_IMWritePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, Mat, ffi.Pointer)>(); - - ffi.Pointer Image_IMWrite_Async( - ffi.Pointer filename, - Mat img, - imp1.CvCallback_1 callback, - ) { - return _Image_IMWrite_Async( - filename, - img, callback, ); } - late final _Image_IMWrite_AsyncPtr = _lookup< + late final _cv_imwritePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, Mat, - imp1.CvCallback_1)>>('Image_IMWrite_Async'); - late final _Image_IMWrite_Async = _Image_IMWrite_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, Mat, imp1.CvCallback_1)>(); + ffi.Pointer, imp1.CvCallback_0)>>('cv_imwrite'); + late final _cv_imwrite = _cv_imwritePtr.asFunction< + ffi.Pointer Function(ffi.Pointer, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Image_IMWrite_WithParams( + ffi.Pointer cv_imwrite_1( ffi.Pointer filename, Mat img, VecI32 params, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Image_IMWrite_WithParams( + return _cv_imwrite_1( filename, img, params, rval, - ); - } - - late final _Image_IMWrite_WithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, Mat, VecI32, - ffi.Pointer)>>('Image_IMWrite_WithParams'); - late final _Image_IMWrite_WithParams = - _Image_IMWrite_WithParamsPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, Mat, VecI32, ffi.Pointer)>(); - - ffi.Pointer Image_IMWrite_WithParams_Async( - ffi.Pointer filename, - Mat img, - VecI32 params, - imp1.CvCallback_1 callback, - ) { - return _Image_IMWrite_WithParams_Async( - filename, - img, - params, callback, ); } - late final _Image_IMWrite_WithParams_AsyncPtr = _lookup< + late final _cv_imwrite_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function(ffi.Pointer, Mat, VecI32, - imp1.CvCallback_1)>>('Image_IMWrite_WithParams_Async'); - late final _Image_IMWrite_WithParams_Async = - _Image_IMWrite_WithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, Mat, VecI32, imp1.CvCallback_1)>(); + ffi.Pointer, imp1.CvCallback_0)>>('cv_imwrite_1'); + late final _cv_imwrite_1 = _cv_imwrite_1Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, Mat, VecI32, + ffi.Pointer, imp1.CvCallback_0)>(); } typedef CvStatus = imp1.CvStatus; diff --git a/packages/dartcv/lib/src/g/imgcodecs.yaml b/packages/dartcv/lib/src/g/imgcodecs.yaml index 227b4785..2f65f570 100644 --- a/packages/dartcv/lib/src/g/imgcodecs.yaml +++ b/packages/dartcv/lib/src/g/imgcodecs.yaml @@ -1,33 +1,27 @@ format_version: 1.0.0 files: - package:dartcv/src/g/imgcodecs.g.dart: + package:dartcv4/src/g/imgcodecs.g.dart: used-config: ffi-native: false symbols: - c:@F@Image_IMDecode: - name: Image_IMDecode - c:@F@Image_IMDecode_Async: - name: Image_IMDecode_Async - c:@F@Image_IMEncode: - name: Image_IMEncode - c:@F@Image_IMEncode_Async: - name: Image_IMEncode_Async - c:@F@Image_IMEncode_WithParams: - name: Image_IMEncode_WithParams - c:@F@Image_IMEncode_WithParams_Async: - name: Image_IMEncode_WithParams_Async - c:@F@Image_IMRead: - name: Image_IMRead - c:@F@Image_IMRead_Async: - name: Image_IMRead_Async - c:@F@Image_IMWrite: - name: Image_IMWrite - c:@F@Image_IMWrite_Async: - name: Image_IMWrite_Async - c:@F@Image_IMWrite_WithParams: - name: Image_IMWrite_WithParams - c:@F@Image_IMWrite_WithParams_Async: - name: Image_IMWrite_WithParams_Async + c:@F@cv_haveImageReader: + name: cv_haveImageReader + c:@F@cv_haveImageWriter: + name: cv_haveImageWriter + c:@F@cv_imcount: + name: cv_imcount + c:@F@cv_imdecode: + name: cv_imdecode + c:@F@cv_imencode: + name: cv_imencode + c:@F@cv_imencode_1: + name: cv_imencode_1 + c:@F@cv_imread: + name: cv_imread + c:@F@cv_imwrite: + name: cv_imwrite + c:@F@cv_imwrite_1: + name: cv_imwrite_1 c:types.h@T@CvStatus: name: CvStatus c:types.h@T@Mat: diff --git a/packages/dartcv/lib/src/g/imgproc.g.dart b/packages/dartcv/lib/src/g/imgproc.g.dart index 09265c77..1df68dba 100644 --- a/packages/dartcv/lib/src/g/imgproc.g.dart +++ b/packages/dartcv/lib/src/g/imgproc.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Imgproc /// @@ -30,6262 +30,3500 @@ class CvNativeImgproc { lookup) : _lookup = lookup; - ffi.Pointer AdaptiveThreshold( + ffi.Pointer cv_CLAHE_apply( + CLAHE self, Mat src, Mat dst, - double maxValue, - int adaptiveTyp, - int typ, - int blockSize, - double c, + imp1.CvCallback_0 callback, ) { - return _AdaptiveThreshold( + return _cv_CLAHE_apply( + self, src, dst, - maxValue, - adaptiveTyp, - typ, - blockSize, - c, - ); - } - - late final _AdaptiveThresholdPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Int, ffi.Int, - ffi.Int, ffi.Double)>>('AdaptiveThreshold'); - late final _AdaptiveThreshold = _AdaptiveThresholdPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, int, int, int, double)>(); - - ffi.Pointer AdaptiveThreshold_Async( - Mat src, - double maxValue, - int adaptiveTyp, - int typ, - int blockSize, - double c, - imp1.CvCallback_1 callback, - ) { - return _AdaptiveThreshold_Async( - src, - maxValue, - adaptiveTyp, - typ, - blockSize, - c, callback, ); } - late final _AdaptiveThreshold_AsyncPtr = _lookup< + late final _cv_CLAHE_applyPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Double, - imp1.CvCallback_1)>>('AdaptiveThreshold_Async'); - late final _AdaptiveThreshold_Async = _AdaptiveThreshold_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, int, int, int, double, imp1.CvCallback_1)>(); + CLAHE, Mat, Mat, imp1.CvCallback_0)>>('cv_CLAHE_apply'); + late final _cv_CLAHE_apply = _cv_CLAHE_applyPtr.asFunction< + ffi.Pointer Function(CLAHE, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ApplyColorMap( - Mat src, - Mat dst, - int colormap, + void cv_CLAHE_close( + CLAHEPtr self, ) { - return _ApplyColorMap( - src, - dst, - colormap, + return _cv_CLAHE_close( + self, ); } - late final _ApplyColorMapPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('ApplyColorMap'); - late final _ApplyColorMap = _ApplyColorMapPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int)>(); + late final _cv_CLAHE_closePtr = + _lookup>( + 'cv_CLAHE_close'); + late final _cv_CLAHE_close = + _cv_CLAHE_closePtr.asFunction(); - ffi.Pointer ApplyColorMap_Async( - Mat src, - int colormap, - imp1.CvCallback_1 callback, + ffi.Pointer cv_CLAHE_collectGarbage( + CLAHE self, + imp1.CvCallback_0 callback, ) { - return _ApplyColorMap_Async( - src, - colormap, + return _cv_CLAHE_collectGarbage( + self, callback, ); } - late final _ApplyColorMap_AsyncPtr = _lookup< + late final _cv_CLAHE_collectGarbagePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('ApplyColorMap_Async'); - late final _ApplyColorMap_Async = _ApplyColorMap_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + CLAHE, imp1.CvCallback_0)>>('cv_CLAHE_collectGarbage'); + late final _cv_CLAHE_collectGarbage = _cv_CLAHE_collectGarbagePtr + .asFunction Function(CLAHE, imp1.CvCallback_0)>(); - ffi.Pointer ApplyCustomColorMap( - Mat src, - Mat dst, - Mat colormap, + ffi.Pointer cv_CLAHE_create( + ffi.Pointer rval, ) { - return _ApplyCustomColorMap( - src, - dst, - colormap, + return _cv_CLAHE_create( + rval, ); } - late final _ApplyCustomColorMapPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'ApplyCustomColorMap'); - late final _ApplyCustomColorMap = _ApplyCustomColorMapPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); + late final _cv_CLAHE_createPtr = _lookup< + ffi + .NativeFunction Function(ffi.Pointer)>>( + 'cv_CLAHE_create'); + late final _cv_CLAHE_create = _cv_CLAHE_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer ApplyCustomColorMap_Async( - Mat src, - Mat colormap, - imp1.CvCallback_1 callback, + ffi.Pointer cv_CLAHE_create_1( + double clipLimit, + CvSize tileGridSize, + ffi.Pointer rval, ) { - return _ApplyCustomColorMap_Async( - src, - colormap, - callback, + return _cv_CLAHE_create_1( + clipLimit, + tileGridSize, + rval, ); } - late final _ApplyCustomColorMap_AsyncPtr = _lookup< + late final _cv_CLAHE_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('ApplyCustomColorMap_Async'); - late final _ApplyCustomColorMap_Async = - _ApplyCustomColorMap_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + ffi.Double, CvSize, ffi.Pointer)>>('cv_CLAHE_create_1'); + late final _cv_CLAHE_create_1 = _cv_CLAHE_create_1Ptr.asFunction< + ffi.Pointer Function(double, CvSize, ffi.Pointer)>(); - ffi.Pointer ApproxPolyDP( - VecPoint curve, - double epsilon, - bool closed, - ffi.Pointer rval, + ffi.Pointer cv_CLAHE_getClipLimit( + CLAHE self, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ApproxPolyDP( - curve, - epsilon, - closed, + return _cv_CLAHE_getClipLimit( + self, rval, - ); - } - - late final _ApproxPolyDPPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, ffi.Double, ffi.Bool, - ffi.Pointer)>>('ApproxPolyDP'); - late final _ApproxPolyDP = _ApproxPolyDPPtr.asFunction< - ffi.Pointer Function( - VecPoint, double, bool, ffi.Pointer)>(); - - ffi.Pointer ApproxPolyDP_Async( - VecPoint curve, - double epsilon, - bool closed, - imp1.CvCallback_1 callback, - ) { - return _ApproxPolyDP_Async( - curve, - epsilon, - closed, callback, ); } - late final _ApproxPolyDP_AsyncPtr = _lookup< + late final _cv_CLAHE_getClipLimitPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint, ffi.Double, ffi.Bool, - imp1.CvCallback_1)>>('ApproxPolyDP_Async'); - late final _ApproxPolyDP_Async = _ApproxPolyDP_AsyncPtr.asFunction< + ffi.Pointer Function(CLAHE, ffi.Pointer, + imp1.CvCallback_0)>>('cv_CLAHE_getClipLimit'); + late final _cv_CLAHE_getClipLimit = _cv_CLAHE_getClipLimitPtr.asFunction< ffi.Pointer Function( - VecPoint, double, bool, imp1.CvCallback_1)>(); + CLAHE, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ArcLength( - VecPoint curve, - bool is_closed, - ffi.Pointer rval, + ffi.Pointer cv_CLAHE_getTilesGridSize( + CLAHE self, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ArcLength( - curve, - is_closed, + return _cv_CLAHE_getTilesGridSize( + self, rval, + callback, ); } - late final _ArcLengthPtr = _lookup< + late final _cv_CLAHE_getTilesGridSizePtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(CLAHE, ffi.Pointer, + imp1.CvCallback_0)>>('cv_CLAHE_getTilesGridSize'); + late final _cv_CLAHE_getTilesGridSize = + _cv_CLAHE_getTilesGridSizePtr.asFunction< ffi.Pointer Function( - VecPoint, ffi.Bool, ffi.Pointer)>>('ArcLength'); - late final _ArcLength = _ArcLengthPtr.asFunction< - ffi.Pointer Function( - VecPoint, bool, ffi.Pointer)>(); + CLAHE, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ArcLength_Async( - VecPoint curve, - bool is_closed, - imp1.CvCallback_1 callback, + ffi.Pointer cv_CLAHE_setClipLimit( + CLAHE self, + double clipLimit, + imp1.CvCallback_0 callback, ) { - return _ArcLength_Async( - curve, - is_closed, + return _cv_CLAHE_setClipLimit( + self, + clipLimit, callback, ); } - late final _ArcLength_AsyncPtr = _lookup< + late final _cv_CLAHE_setClipLimitPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VecPoint, ffi.Bool, imp1.CvCallback_1)>>('ArcLength_Async'); - late final _ArcLength_Async = _ArcLength_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint, bool, imp1.CvCallback_1)>(); - - ffi.Pointer ArrowedLine( - Mat img, - CvPoint pt1, - CvPoint pt2, - Scalar color, - int thickness, - int line_type, - int shift, - double tipLength, - ) { - return _ArrowedLine( - img, - pt1, - pt2, - color, - thickness, - line_type, - shift, - tipLength, - ); - } + CLAHE, ffi.Double, imp1.CvCallback_0)>>('cv_CLAHE_setClipLimit'); + late final _cv_CLAHE_setClipLimit = _cv_CLAHE_setClipLimitPtr.asFunction< + ffi.Pointer Function(CLAHE, double, imp1.CvCallback_0)>(); - late final _ArrowedLinePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, ffi.Int, - ffi.Int, ffi.Int, ffi.Double)>>('ArrowedLine'); - late final _ArrowedLine = _ArrowedLinePtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint, CvPoint, Scalar, int, int, int, double)>(); - - ffi.Pointer ArrowedLine_Async( - Mat img, - CvPoint pt1, - CvPoint pt2, - Scalar color, - int thickness, - int line_type, - int shift, - double tipLength, + ffi.Pointer cv_CLAHE_setTilesGridSize( + CLAHE self, + CvSize size, imp1.CvCallback_0 callback, ) { - return _ArrowedLine_Async( - img, - pt1, - pt2, - color, - thickness, - line_type, - shift, - tipLength, + return _cv_CLAHE_setTilesGridSize( + self, + size, callback, ); } - late final _ArrowedLine_AsyncPtr = _lookup< + late final _cv_CLAHE_setTilesGridSizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, - CvPoint, - CvPoint, - Scalar, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Double, - imp1.CvCallback_0)>>('ArrowedLine_Async'); - late final _ArrowedLine_Async = _ArrowedLine_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, int, int, - int, double, imp1.CvCallback_0)>(); + CLAHE, CvSize, imp1.CvCallback_0)>>('cv_CLAHE_setTilesGridSize'); + late final _cv_CLAHE_setTilesGridSize = + _cv_CLAHE_setTilesGridSizePtr.asFunction< + ffi.Pointer Function(CLAHE, CvSize, imp1.CvCallback_0)>(); - ffi.Pointer BilateralFilter( + ffi.Pointer cv_GaussianBlur( Mat src, Mat dst, - int d, - double sc, - double ss, + CvSize ps, + double sX, + double sY, + int bt, + imp1.CvCallback_0 callback, ) { - return _BilateralFilter( + return _cv_GaussianBlur( src, dst, - d, - sc, - ss, + ps, + sX, + sY, + bt, + callback, ); } - late final _BilateralFilterPtr = _lookup< + late final _cv_GaussianBlurPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Double, ffi.Double)>>('BilateralFilter'); - late final _BilateralFilter = _BilateralFilterPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, double, double)>(); + ffi.Pointer Function(Mat, Mat, CvSize, ffi.Double, + ffi.Double, ffi.Int, imp1.CvCallback_0)>>('cv_GaussianBlur'); + late final _cv_GaussianBlur = _cv_GaussianBlurPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, CvSize, double, double, int, imp1.CvCallback_0)>(); - ffi.Pointer BilateralFilter_Async( + ffi.Pointer cv_HoughCircles( Mat src, - int d, - double sc, - double ss, - imp1.CvCallback_1 callback, + Mat circles, + int method, + double dp, + double minDist, + imp1.CvCallback_0 callback, ) { - return _BilateralFilter_Async( + return _cv_HoughCircles( src, - d, - sc, - ss, + circles, + method, + dp, + minDist, callback, ); } - late final _BilateralFilter_AsyncPtr = _lookup< + late final _cv_HoughCirclesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Double, ffi.Double, - imp1.CvCallback_1)>>('BilateralFilter_Async'); - late final _BilateralFilter_Async = _BilateralFilter_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Double, + ffi.Double, imp1.CvCallback_0)>>('cv_HoughCircles'); + late final _cv_HoughCircles = _cv_HoughCirclesPtr.asFunction< ffi.Pointer Function( - Mat, int, double, double, imp1.CvCallback_1)>(); - - ffi.Pointer Blur( - Mat src, - Mat dst, - CvSize ps, - ) { - return _Blur( - src, - dst, - ps, - ); - } - - late final _BlurPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, CvSize)>>( - 'Blur'); - late final _Blur = - _BlurPtr.asFunction Function(Mat, Mat, CvSize)>(); + Mat, Mat, int, double, double, imp1.CvCallback_0)>(); - ffi.Pointer Blur_Async( + ffi.Pointer cv_HoughCircles_1( Mat src, - CvSize ps, - imp1.CvCallback_1 callback, + Mat circles, + int method, + double dp, + double minDist, + double param1, + double param2, + int minRadius, + int maxRadius, + imp1.CvCallback_0 callback, ) { - return _Blur_Async( + return _cv_HoughCircles_1( src, - ps, + circles, + method, + dp, + minDist, + param1, + param2, + minRadius, + maxRadius, callback, ); } - late final _Blur_AsyncPtr = _lookup< + late final _cv_HoughCircles_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, CvSize, imp1.CvCallback_1)>>('Blur_Async'); - late final _Blur_Async = _Blur_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, CvSize, imp1.CvCallback_1)>(); + Mat, + Mat, + ffi.Int, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Int, + ffi.Int, + imp1.CvCallback_0)>>('cv_HoughCircles_1'); + late final _cv_HoughCircles_1 = _cv_HoughCircles_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, int, double, double, double, + double, int, int, imp1.CvCallback_0)>(); - ffi.Pointer BoundingRect( - VecPoint pts, - ffi.Pointer rval, - ) { - return _BoundingRect( - pts, - rval, - ); - } - - late final _BoundingRectPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, ffi.Pointer)>>('BoundingRect'); - late final _BoundingRect = _BoundingRectPtr.asFunction< - ffi.Pointer Function(VecPoint, ffi.Pointer)>(); - - ffi.Pointer BoundingRect_Async( - VecPoint pts, - imp1.CvCallback_1 callback, + ffi.Pointer cv_HoughLines( + Mat src, + Mat lines, + double rho, + double theta, + int threshold, + double srn, + double stn, + double min_theta, + double max_theta, + imp1.CvCallback_0 callback, ) { - return _BoundingRect_Async( - pts, + return _cv_HoughLines( + src, + lines, + rho, + theta, + threshold, + srn, + stn, + min_theta, + max_theta, callback, ); } - late final _BoundingRect_AsyncPtr = _lookup< + late final _cv_HoughLinesPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VecPoint, imp1.CvCallback_1)>>('BoundingRect_Async'); - late final _BoundingRect_Async = _BoundingRect_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint, imp1.CvCallback_1)>(); + Mat, + Mat, + ffi.Double, + ffi.Double, + ffi.Int, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Double, + imp1.CvCallback_0)>>('cv_HoughLines'); + late final _cv_HoughLines = _cv_HoughLinesPtr.asFunction< + ffi.Pointer Function(Mat, Mat, double, double, int, double, + double, double, double, imp1.CvCallback_0)>(); - ffi.Pointer BoxFilter( + ffi.Pointer cv_HoughLinesP( Mat src, - Mat dst, - int ddepth, - CvSize ps, - CvPoint anchor, - bool normalize, - int borderType, + Mat lines, + double rho, + double theta, + int threshold, + imp1.CvCallback_0 callback, ) { - return _BoxFilter( + return _cv_HoughLinesP( src, - dst, - ddepth, - ps, - anchor, - normalize, - borderType, + lines, + rho, + theta, + threshold, + callback, ); } - late final _BoxFilterPtr = _lookup< + late final _cv_HoughLinesPPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, CvSize, CvPoint, - ffi.Bool, ffi.Int)>>('BoxFilter'); - late final _BoxFilter = _BoxFilterPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Double, + ffi.Int, imp1.CvCallback_0)>>('cv_HoughLinesP'); + late final _cv_HoughLinesP = _cv_HoughLinesPPtr.asFunction< ffi.Pointer Function( - Mat, Mat, int, CvSize, CvPoint, bool, int)>(); + Mat, Mat, double, double, int, imp1.CvCallback_0)>(); - ffi.Pointer BoxFilter_Async( + ffi.Pointer cv_HoughLinesP_1( Mat src, - int ddepth, - CvSize ps, - imp1.CvCallback_1 callback, + Mat lines, + double rho, + double theta, + int threshold, + double minLineLength, + double maxLineGap, + imp1.CvCallback_0 callback, ) { - return _BoxFilter_Async( + return _cv_HoughLinesP_1( src, - ddepth, - ps, + lines, + rho, + theta, + threshold, + minLineLength, + maxLineGap, callback, ); } - late final _BoxFilter_AsyncPtr = _lookup< + late final _cv_HoughLinesP_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, CvSize, imp1.CvCallback_1)>>('BoxFilter_Async'); - late final _BoxFilter_Async = _BoxFilter_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, CvSize, imp1.CvCallback_1)>(); + Mat, + Mat, + ffi.Double, + ffi.Double, + ffi.Int, + ffi.Double, + ffi.Double, + imp1.CvCallback_0)>>('cv_HoughLinesP_1'); + late final _cv_HoughLinesP_1 = _cv_HoughLinesP_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, double, int, double, double, imp1.CvCallback_0)>(); - ffi.Pointer BoxPoints( - RotatedRect rect, - ffi.Pointer boxPts, + ffi.Pointer cv_HoughLinesPointSet( + Mat points, + Mat lines, + int lines_max, + int threshold, + double min_rho, + double max_rho, + double rho_step, + double min_theta, + double max_theta, + double theta_step, + imp1.CvCallback_0 callback, ) { - return _BoxPoints( - rect, - boxPts, + return _cv_HoughLinesPointSet( + points, + lines, + lines_max, + threshold, + min_rho, + max_rho, + rho_step, + min_theta, + max_theta, + theta_step, + callback, ); } - late final _BoxPointsPtr = _lookup< + late final _cv_HoughLinesPointSetPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - RotatedRect, ffi.Pointer)>>('BoxPoints'); - late final _BoxPoints = _BoxPointsPtr.asFunction< - ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); + Mat, + Mat, + ffi.Int, + ffi.Int, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Double, + ffi.Double, + imp1.CvCallback_0)>>('cv_HoughLinesPointSet'); + late final _cv_HoughLinesPointSet = _cv_HoughLinesPointSetPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, int, double, double, double, + double, double, double, imp1.CvCallback_0)>(); - ffi.Pointer BoxPoints_Async( - RotatedRect rect, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Laplacian( + Mat src, + Mat dst, + int dDepth, + int kSize, + double scale, + double delta, + int borderType, + imp1.CvCallback_0 callback, ) { - return _BoxPoints_Async( - rect, + return _cv_Laplacian( + src, + dst, + dDepth, + kSize, + scale, + delta, + borderType, callback, ); } - late final _BoxPoints_AsyncPtr = _lookup< + late final _cv_LaplacianPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - RotatedRect, imp1.CvCallback_1)>>('BoxPoints_Async'); - late final _BoxPoints_Async = _BoxPoints_AsyncPtr.asFunction< - ffi.Pointer Function(RotatedRect, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, ffi.Double, + ffi.Double, ffi.Int, imp1.CvCallback_0)>>('cv_Laplacian'); + late final _cv_Laplacian = _cv_LaplacianPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, int, double, double, int, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_Apply( - CLAHE c, + ffi.Pointer cv_Scharr( Mat src, Mat dst, + int dDepth, + int dx, + int dy, + double scale, + double delta, + int borderType, + imp1.CvCallback_0 callback, ) { - return _CLAHE_Apply( - c, + return _cv_Scharr( src, dst, + dDepth, + dx, + dy, + scale, + delta, + borderType, + callback, ); } - late final _CLAHE_ApplyPtr = _lookup< - ffi.NativeFunction Function(CLAHE, Mat, Mat)>>( - 'CLAHE_Apply'); - late final _CLAHE_Apply = _CLAHE_ApplyPtr.asFunction< - ffi.Pointer Function(CLAHE, Mat, Mat)>(); + late final _cv_ScharrPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, + Mat, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Double, + ffi.Double, + ffi.Int, + imp1.CvCallback_0)>>('cv_Scharr'); + late final _cv_Scharr = _cv_ScharrPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, int, int, double, double, int, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_Apply_Async( - CLAHE self, + ffi.Pointer cv_Sobel( Mat src, - imp1.CvCallback_1 callback, + Mat dst, + int ddepth, + int dx, + int dy, + int ksize, + double scale, + double delta, + int borderType, + imp1.CvCallback_0 callback, ) { - return _CLAHE_Apply_Async( - self, + return _cv_Sobel( src, + dst, + ddepth, + dx, + dy, + ksize, + scale, + delta, + borderType, callback, ); } - late final _CLAHE_Apply_AsyncPtr = _lookup< + late final _cv_SobelPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CLAHE, Mat, imp1.CvCallback_1)>>('CLAHE_Apply_Async'); - late final _CLAHE_Apply_Async = _CLAHE_Apply_AsyncPtr.asFunction< - ffi.Pointer Function(CLAHE, Mat, imp1.CvCallback_1)>(); + Mat, + Mat, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Double, + ffi.Double, + ffi.Int, + imp1.CvCallback_0)>>('cv_Sobel'); + late final _cv_Sobel = _cv_SobelPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, int, int, int, double, + double, int, imp1.CvCallback_0)>(); - void CLAHE_Close( - CLAHEPtr c, + void cv_Subdiv2D_close( + Subdiv2DPtr self, ) { - return _CLAHE_Close( - c, + return _cv_Subdiv2D_close( + self, ); } - late final _CLAHE_ClosePtr = - _lookup>('CLAHE_Close'); - late final _CLAHE_Close = - _CLAHE_ClosePtr.asFunction(); + late final _cv_Subdiv2D_closePtr = + _lookup>( + 'cv_Subdiv2D_close'); + late final _cv_Subdiv2D_close = + _cv_Subdiv2D_closePtr.asFunction(); - void CLAHE_Close_Async( - CLAHEPtr self, - imp1.CvCallback_0 callback, + ffi.Pointer cv_Subdiv2D_create( + ffi.Pointer rval, ) { - return _CLAHE_Close_Async( - self, - callback, + return _cv_Subdiv2D_create( + rval, ); } - late final _CLAHE_Close_AsyncPtr = _lookup< - ffi.NativeFunction>( - 'CLAHE_Close_Async'); - late final _CLAHE_Close_Async = _CLAHE_Close_AsyncPtr.asFunction< - void Function(CLAHEPtr, imp1.CvCallback_0)>(); + late final _cv_Subdiv2D_createPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('cv_Subdiv2D_create'); + late final _cv_Subdiv2D_create = _cv_Subdiv2D_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer CLAHE_CollectGarbage( - CLAHE c, + ffi.Pointer cv_Subdiv2D_create_1( + CvRect rect, + ffi.Pointer rval, ) { - return _CLAHE_CollectGarbage( - c, + return _cv_Subdiv2D_create_1( + rect, + rval, ); } - late final _CLAHE_CollectGarbagePtr = - _lookup Function(CLAHE)>>( - 'CLAHE_CollectGarbage'); - late final _CLAHE_CollectGarbage = _CLAHE_CollectGarbagePtr.asFunction< - ffi.Pointer Function(CLAHE)>(); + late final _cv_Subdiv2D_create_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + CvRect, ffi.Pointer)>>('cv_Subdiv2D_create_1'); + late final _cv_Subdiv2D_create_1 = _cv_Subdiv2D_create_1Ptr.asFunction< + ffi.Pointer Function(CvRect, ffi.Pointer)>(); - ffi.Pointer CLAHE_CollectGarbage_Async( - CLAHE self, + ffi.Pointer cv_Subdiv2D_edgeDst( + Subdiv2D self, + int edge, + ffi.Pointer dstpt, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _CLAHE_CollectGarbage_Async( + return _cv_Subdiv2D_edgeDst( self, + edge, + dstpt, + rval, callback, ); } - late final _CLAHE_CollectGarbage_AsyncPtr = _lookup< + late final _cv_Subdiv2D_edgeDstPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CLAHE, imp1.CvCallback_0)>>('CLAHE_CollectGarbage_Async'); - late final _CLAHE_CollectGarbage_Async = _CLAHE_CollectGarbage_AsyncPtr - .asFunction Function(CLAHE, imp1.CvCallback_0)>(); + Subdiv2D, + ffi.Int, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_edgeDst'); + late final _cv_Subdiv2D_edgeDst = _cv_Subdiv2D_edgeDstPtr.asFunction< + ffi.Pointer Function(Subdiv2D, int, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_Create( - ffi.Pointer rval, + ffi.Pointer cv_Subdiv2D_edgeOrg( + Subdiv2D self, + int edge, + ffi.Pointer orgpt, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CLAHE_Create( + return _cv_Subdiv2D_edgeOrg( + self, + edge, + orgpt, rval, + callback, ); } - late final _CLAHE_CreatePtr = _lookup< + late final _cv_Subdiv2D_edgeOrgPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer)>>('CLAHE_Create'); - late final _CLAHE_Create = _CLAHE_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + ffi.Pointer Function( + Subdiv2D, + ffi.Int, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_edgeOrg'); + late final _cv_Subdiv2D_edgeOrg = _cv_Subdiv2D_edgeOrgPtr.asFunction< + ffi.Pointer Function(Subdiv2D, int, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_CreateWithParams( - double clipLimit, - CvSize tileGridSize, - ffi.Pointer rval, + ffi.Pointer cv_Subdiv2D_findNearest( + Subdiv2D self, + CvPoint2f pt, + ffi.Pointer nearestPt, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CLAHE_CreateWithParams( - clipLimit, - tileGridSize, - rval, - ); - } - - late final _CLAHE_CreateWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Double, CvSize, - ffi.Pointer)>>('CLAHE_CreateWithParams'); - late final _CLAHE_CreateWithParams = _CLAHE_CreateWithParamsPtr.asFunction< - ffi.Pointer Function(double, CvSize, ffi.Pointer)>(); - - ffi.Pointer CLAHE_CreateWithParams_Async( - double clipLimit, - CvSize tileGridSize, - imp1.CvCallback_1 callback, - ) { - return _CLAHE_CreateWithParams_Async( - clipLimit, - tileGridSize, + return _cv_Subdiv2D_findNearest( + self, + pt, + nearestPt, + rval, callback, ); } - late final _CLAHE_CreateWithParams_AsyncPtr = _lookup< + late final _cv_Subdiv2D_findNearestPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Double, CvSize, - imp1.CvCallback_1)>>('CLAHE_CreateWithParams_Async'); - late final _CLAHE_CreateWithParams_Async = - _CLAHE_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(double, CvSize, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Subdiv2D, + CvPoint2f, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_findNearest'); + late final _cv_Subdiv2D_findNearest = _cv_Subdiv2D_findNearestPtr.asFunction< + ffi.Pointer Function(Subdiv2D, CvPoint2f, + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_Create_Async( - imp1.CvCallback_1 callback, + ffi.Pointer cv_Subdiv2D_getEdge( + Subdiv2D self, + int edge, + int nextEdgeType, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CLAHE_Create_Async( + return _cv_Subdiv2D_getEdge( + self, + edge, + nextEdgeType, + rval, callback, ); } - late final _CLAHE_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'CLAHE_Create_Async'); - late final _CLAHE_Create_Async = _CLAHE_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + late final _cv_Subdiv2D_getEdgePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Subdiv2D, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Subdiv2D_getEdge'); + late final _cv_Subdiv2D_getEdge = _cv_Subdiv2D_getEdgePtr.asFunction< + ffi.Pointer Function( + Subdiv2D, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_GetClipLimit( - CLAHE c, - ffi.Pointer rval, + ffi.Pointer cv_Subdiv2D_getEdgeList( + Subdiv2D self, + ffi.Pointer> rval, + ffi.Pointer size, + imp1.CvCallback_0 callback, ) { - return _CLAHE_GetClipLimit( - c, + return _cv_Subdiv2D_getEdgeList( + self, rval, + size, + callback, ); } - late final _CLAHE_GetClipLimitPtr = _lookup< + late final _cv_Subdiv2D_getEdgeListPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CLAHE, ffi.Pointer)>>('CLAHE_GetClipLimit'); - late final _CLAHE_GetClipLimit = _CLAHE_GetClipLimitPtr.asFunction< - ffi.Pointer Function(CLAHE, ffi.Pointer)>(); + Subdiv2D, + ffi.Pointer>, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_getEdgeList'); + late final _cv_Subdiv2D_getEdgeList = _cv_Subdiv2D_getEdgeListPtr.asFunction< + ffi.Pointer Function(Subdiv2D, ffi.Pointer>, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_GetClipLimit_Async( - CLAHE self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Subdiv2D_getLeadingEdgeList( + Subdiv2D self, + ffi.Pointer leadingEdgeList, + imp1.CvCallback_0 callback, ) { - return _CLAHE_GetClipLimit_Async( + return _cv_Subdiv2D_getLeadingEdgeList( self, + leadingEdgeList, callback, ); } - late final _CLAHE_GetClipLimit_AsyncPtr = _lookup< + late final _cv_Subdiv2D_getLeadingEdgeListPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(Subdiv2D, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_getLeadingEdgeList'); + late final _cv_Subdiv2D_getLeadingEdgeList = + _cv_Subdiv2D_getLeadingEdgeListPtr.asFunction< ffi.Pointer Function( - CLAHE, imp1.CvCallback_1)>>('CLAHE_GetClipLimit_Async'); - late final _CLAHE_GetClipLimit_Async = _CLAHE_GetClipLimit_AsyncPtr - .asFunction Function(CLAHE, imp1.CvCallback_1)>(); + Subdiv2D, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_GetTilesGridSize( - CLAHE c, - ffi.Pointer rval, + ffi.Pointer cv_Subdiv2D_getTriangleList( + Subdiv2D self, + ffi.Pointer> rval, + ffi.Pointer size, + imp1.CvCallback_0 callback, ) { - return _CLAHE_GetTilesGridSize( - c, + return _cv_Subdiv2D_getTriangleList( + self, rval, + size, + callback, ); } - late final _CLAHE_GetTilesGridSizePtr = _lookup< + late final _cv_Subdiv2D_getTriangleListPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CLAHE, ffi.Pointer)>>('CLAHE_GetTilesGridSize'); - late final _CLAHE_GetTilesGridSize = _CLAHE_GetTilesGridSizePtr.asFunction< - ffi.Pointer Function(CLAHE, ffi.Pointer)>(); + Subdiv2D, + ffi.Pointer>, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_getTriangleList'); + late final _cv_Subdiv2D_getTriangleList = + _cv_Subdiv2D_getTriangleListPtr.asFunction< + ffi.Pointer Function( + Subdiv2D, + ffi.Pointer>, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_GetTilesGridSize_Async( - CLAHE self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Subdiv2D_getVertex( + Subdiv2D self, + int vertex, + ffi.Pointer firstEdge, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CLAHE_GetTilesGridSize_Async( + return _cv_Subdiv2D_getVertex( self, + vertex, + firstEdge, + rval, callback, ); } - late final _CLAHE_GetTilesGridSize_AsyncPtr = _lookup< + late final _cv_Subdiv2D_getVertexPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CLAHE, imp1.CvCallback_1)>>('CLAHE_GetTilesGridSize_Async'); - late final _CLAHE_GetTilesGridSize_Async = _CLAHE_GetTilesGridSize_AsyncPtr - .asFunction Function(CLAHE, imp1.CvCallback_1)>(); + Subdiv2D, + ffi.Int, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_getVertex'); + late final _cv_Subdiv2D_getVertex = _cv_Subdiv2D_getVertexPtr.asFunction< + ffi.Pointer Function(Subdiv2D, int, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_SetClipLimit( - CLAHE c, - double clipLimit, + ffi.Pointer cv_Subdiv2D_getVoronoiFacetList( + Subdiv2D self, + VecI32 idx, + ffi.Pointer facetList, + ffi.Pointer facetCenters, + imp1.CvCallback_0 callback, ) { - return _CLAHE_SetClipLimit( - c, - clipLimit, + return _cv_Subdiv2D_getVoronoiFacetList( + self, + idx, + facetList, + facetCenters, + callback, ); } - late final _CLAHE_SetClipLimitPtr = _lookup< - ffi - .NativeFunction Function(CLAHE, ffi.Double)>>( - 'CLAHE_SetClipLimit'); - late final _CLAHE_SetClipLimit = _CLAHE_SetClipLimitPtr.asFunction< - ffi.Pointer Function(CLAHE, double)>(); + late final _cv_Subdiv2D_getVoronoiFacetListPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Subdiv2D, + VecI32, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_getVoronoiFacetList'); + late final _cv_Subdiv2D_getVoronoiFacetList = + _cv_Subdiv2D_getVoronoiFacetListPtr.asFunction< + ffi.Pointer Function( + Subdiv2D, + VecI32, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_SetClipLimit_Async( - CLAHE self, - double clipLimit, + ffi.Pointer cv_Subdiv2D_initDelaunay( + Subdiv2D self, + CvRect rect, imp1.CvCallback_0 callback, ) { - return _CLAHE_SetClipLimit_Async( + return _cv_Subdiv2D_initDelaunay( self, - clipLimit, + rect, callback, ); } - late final _CLAHE_SetClipLimit_AsyncPtr = _lookup< + late final _cv_Subdiv2D_initDelaunayPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CLAHE, ffi.Double, - imp1.CvCallback_0)>>('CLAHE_SetClipLimit_Async'); - late final _CLAHE_SetClipLimit_Async = - _CLAHE_SetClipLimit_AsyncPtr.asFunction< - ffi.Pointer Function(CLAHE, double, imp1.CvCallback_0)>(); + ffi.Pointer Function(Subdiv2D, CvRect, + imp1.CvCallback_0)>>('cv_Subdiv2D_initDelaunay'); + late final _cv_Subdiv2D_initDelaunay = + _cv_Subdiv2D_initDelaunayPtr.asFunction< + ffi.Pointer Function( + Subdiv2D, CvRect, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_SetTilesGridSize( - CLAHE c, - CvSize size, + ffi.Pointer cv_Subdiv2D_insert( + Subdiv2D self, + CvPoint2f pt, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CLAHE_SetTilesGridSize( - c, - size, + return _cv_Subdiv2D_insert( + self, + pt, + rval, + callback, ); } - late final _CLAHE_SetTilesGridSizePtr = _lookup< - ffi.NativeFunction Function(CLAHE, CvSize)>>( - 'CLAHE_SetTilesGridSize'); - late final _CLAHE_SetTilesGridSize = _CLAHE_SetTilesGridSizePtr.asFunction< - ffi.Pointer Function(CLAHE, CvSize)>(); + late final _cv_Subdiv2D_insertPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Subdiv2D, CvPoint2f, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Subdiv2D_insert'); + late final _cv_Subdiv2D_insert = _cv_Subdiv2D_insertPtr.asFunction< + ffi.Pointer Function( + Subdiv2D, CvPoint2f, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CLAHE_SetTilesGridSize_Async( - CLAHE self, - CvSize size, + ffi.Pointer cv_Subdiv2D_insertVec( + Subdiv2D self, + VecPoint2f ptvec, imp1.CvCallback_0 callback, ) { - return _CLAHE_SetTilesGridSize_Async( + return _cv_Subdiv2D_insertVec( self, - size, + ptvec, callback, ); } - late final _CLAHE_SetTilesGridSize_AsyncPtr = _lookup< + late final _cv_Subdiv2D_insertVecPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CLAHE, CvSize, - imp1.CvCallback_0)>>('CLAHE_SetTilesGridSize_Async'); - late final _CLAHE_SetTilesGridSize_Async = - _CLAHE_SetTilesGridSize_AsyncPtr.asFunction< - ffi.Pointer Function(CLAHE, CvSize, imp1.CvCallback_0)>(); + ffi.Pointer Function(Subdiv2D, VecPoint2f, + imp1.CvCallback_0)>>('cv_Subdiv2D_insertVec'); + late final _cv_Subdiv2D_insertVec = _cv_Subdiv2D_insertVecPtr.asFunction< + ffi.Pointer Function( + Subdiv2D, VecPoint2f, imp1.CvCallback_0)>(); - ffi.Pointer CalcBackProject( - VecMat mats, - VecI32 chans, - Mat hist, - ffi.Pointer backProject, - VecF32 rng, - double scale, + ffi.Pointer cv_Subdiv2D_locate( + Subdiv2D self, + CvPoint2f pt, + ffi.Pointer edge, + ffi.Pointer vertex, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CalcBackProject( - mats, - chans, - hist, - backProject, - rng, - scale, + return _cv_Subdiv2D_locate( + self, + pt, + edge, + vertex, + rval, + callback, ); } - late final _CalcBackProjectPtr = _lookup< + late final _cv_Subdiv2D_locatePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecMat, VecI32, Mat, ffi.Pointer, - VecF32, ffi.Double)>>('CalcBackProject'); - late final _CalcBackProject = _CalcBackProjectPtr.asFunction< - ffi.Pointer Function( - VecMat, VecI32, Mat, ffi.Pointer, VecF32, double)>(); + ffi.Pointer Function( + Subdiv2D, + CvPoint2f, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_locate'); + late final _cv_Subdiv2D_locate = _cv_Subdiv2D_locatePtr.asFunction< + ffi.Pointer Function(Subdiv2D, CvPoint2f, ffi.Pointer, + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CalcBackProject_Async( - VecMat mats, - VecI32 chans, - Mat backProject, - VecF32 rng, - double scale, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Subdiv2D_nextEdge( + Subdiv2D self, + int edge, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CalcBackProject_Async( - mats, - chans, - backProject, - rng, - scale, + return _cv_Subdiv2D_nextEdge( + self, + edge, + rval, callback, ); } - late final _CalcBackProject_AsyncPtr = _lookup< + late final _cv_Subdiv2D_nextEdgePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecMat, VecI32, Mat, VecF32, - ffi.Double, imp1.CvCallback_1)>>('CalcBackProject_Async'); - late final _CalcBackProject_Async = _CalcBackProject_AsyncPtr.asFunction< + ffi.Pointer Function( + Subdiv2D, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_nextEdge'); + late final _cv_Subdiv2D_nextEdge = _cv_Subdiv2D_nextEdgePtr.asFunction< ffi.Pointer Function( - VecMat, VecI32, Mat, VecF32, double, imp1.CvCallback_1)>(); + Subdiv2D, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CalcHist( - VecMat mats, - VecI32 chans, - Mat mask, - Mat hist, - VecI32 sz, - VecF32 rng, - bool acc, + ffi.Pointer cv_Subdiv2D_rotateEdge( + Subdiv2D self, + int edge, + int rotate, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CalcHist( - mats, - chans, - mask, - hist, - sz, - rng, - acc, + return _cv_Subdiv2D_rotateEdge( + self, + edge, + rotate, + rval, + callback, ); } - late final _CalcHistPtr = _lookup< + late final _cv_Subdiv2D_rotateEdgePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VecMat, VecI32, Mat, Mat, VecI32, VecF32, ffi.Bool)>>('CalcHist'); - late final _CalcHist = _CalcHistPtr.asFunction< + Subdiv2D, + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Subdiv2D_rotateEdge'); + late final _cv_Subdiv2D_rotateEdge = _cv_Subdiv2D_rotateEdgePtr.asFunction< ffi.Pointer Function( - VecMat, VecI32, Mat, Mat, VecI32, VecF32, bool)>(); + Subdiv2D, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CalcHist_Async( - VecMat mats, - VecI32 chans, - Mat mask, - VecI32 sz, - VecF32 rng, - bool acc, - imp1.CvCallback_1 callback, + ffi.Pointer cv_Subdiv2D_symEdge( + Subdiv2D self, + int edge, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CalcHist_Async( - mats, - chans, - mask, - sz, - rng, - acc, + return _cv_Subdiv2D_symEdge( + self, + edge, + rval, callback, ); } - late final _CalcHist_AsyncPtr = _lookup< + late final _cv_Subdiv2D_symEdgePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecMat, VecI32, Mat, VecI32, VecF32, - ffi.Bool, imp1.CvCallback_1)>>('CalcHist_Async'); - late final _CalcHist_Async = _CalcHist_AsyncPtr.asFunction< + ffi.Pointer Function(Subdiv2D, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Subdiv2D_symEdge'); + late final _cv_Subdiv2D_symEdge = _cv_Subdiv2D_symEdgePtr.asFunction< ffi.Pointer Function( - VecMat, VecI32, Mat, VecI32, VecF32, bool, imp1.CvCallback_1)>(); + Subdiv2D, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Canny( + ffi.Pointer cv_accumulate( Mat src, - Mat edges, - double t1, - double t2, - int apertureSize, - bool l2gradient, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _Canny( + return _cv_accumulate( src, - edges, - t1, - t2, - apertureSize, - l2gradient, + dst, + callback, ); } - late final _CannyPtr = _lookup< + late final _cv_accumulatePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, ffi.Double, ffi.Double, ffi.Int, ffi.Bool)>>('Canny'); - late final _Canny = _CannyPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, double, int, bool)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_accumulate'); + late final _cv_accumulate = _cv_accumulatePtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Canny_Async( - Mat src, - double t1, - double t2, - int apertureSize, - bool l2gradient, - imp1.CvCallback_1 callback, - ) { - return _Canny_Async( - src, - t1, - t2, - apertureSize, - l2gradient, - callback, - ); - } - - late final _Canny_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, ffi.Double, ffi.Int, - ffi.Bool, imp1.CvCallback_1)>>('Canny_Async'); - late final _Canny_Async = _Canny_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, double, int, bool, imp1.CvCallback_1)>(); - - ffi.Pointer Circle( - Mat img, - CvPoint center, - int radius, - Scalar color, - int thickness, + ffi.Pointer cv_accumulateProduct( + Mat src1, + Mat src2, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _Circle( - img, - center, - radius, - color, - thickness, + return _cv_accumulateProduct( + src1, + src2, + dst, + callback, ); } - late final _CirclePtr = _lookup< + late final _cv_accumulateProductPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, CvPoint, ffi.Int, Scalar, ffi.Int)>>('Circle'); - late final _Circle = _CirclePtr.asFunction< - ffi.Pointer Function(Mat, CvPoint, int, Scalar, int)>(); - - ffi.Pointer CircleWithParams( - Mat img, - CvPoint center, - int radius, - Scalar color, - int thickness, - int lineType, - int shift, - ) { - return _CircleWithParams( - img, - center, - radius, - color, - thickness, - lineType, - shift, - ); - } - - late final _CircleWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint, ffi.Int, Scalar, ffi.Int, - ffi.Int, ffi.Int)>>('CircleWithParams'); - late final _CircleWithParams = _CircleWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint, int, Scalar, int, int, int)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_accumulateProduct'); + late final _cv_accumulateProduct = _cv_accumulateProductPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer CircleWithParams_Async( - Mat img, - CvPoint center, - int radius, - Scalar color, - int thickness, - int lineType, - int shift, + ffi.Pointer cv_accumulateProduct_1( + Mat src1, + Mat src2, + Mat dst, + Mat mask, imp1.CvCallback_0 callback, ) { - return _CircleWithParams_Async( - img, - center, - radius, - color, - thickness, - lineType, - shift, + return _cv_accumulateProduct_1( + src1, + src2, + dst, + mask, callback, ); } - late final _CircleWithParams_AsyncPtr = _lookup< + late final _cv_accumulateProduct_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint, ffi.Int, Scalar, ffi.Int, - ffi.Int, ffi.Int, imp1.CvCallback_0)>>('CircleWithParams_Async'); - late final _CircleWithParams_Async = _CircleWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint, int, Scalar, int, int, int, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, Mat, Mat, Mat, + imp1.CvCallback_0)>>('cv_accumulateProduct_1'); + late final _cv_accumulateProduct_1 = _cv_accumulateProduct_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Circle_Async( - Mat img, - CvPoint center, - int radius, - Scalar color, - int thickness, + ffi.Pointer cv_accumulateSquare( + Mat src, + Mat dst, imp1.CvCallback_0 callback, ) { - return _Circle_Async( - img, - center, - radius, - color, - thickness, + return _cv_accumulateSquare( + src, + dst, callback, ); } - late final _Circle_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint, ffi.Int, Scalar, ffi.Int, - imp1.CvCallback_0)>>('Circle_Async'); - late final _Circle_Async = _Circle_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint, int, Scalar, int, imp1.CvCallback_0)>(); - - ffi.Pointer ClipLine( - CvRect imgRect, - CvPoint pt1, - CvPoint pt2, - ffi.Pointer rval, - ) { - return _ClipLine( - imgRect, - pt1, - pt2, - rval, - ); - } - - late final _ClipLinePtr = _lookup< + late final _cv_accumulateSquarePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CvRect, CvPoint, CvPoint, ffi.Pointer)>>('ClipLine'); - late final _ClipLine = _ClipLinePtr.asFunction< - ffi.Pointer Function( - CvRect, CvPoint, CvPoint, ffi.Pointer)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_accumulateSquare'); + late final _cv_accumulateSquare = _cv_accumulateSquarePtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ClipLine_Async( - CvRect imgRect, - CvPoint pt1, - CvPoint pt2, - imp1.CvCallback_1 callback, + ffi.Pointer cv_accumulateSquare_1( + Mat src, + Mat dst, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _ClipLine_Async( - imgRect, - pt1, - pt2, + return _cv_accumulateSquare_1( + src, + dst, + mask, callback, ); } - late final _ClipLine_AsyncPtr = _lookup< + late final _cv_accumulateSquare_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CvRect, CvPoint, CvPoint, imp1.CvCallback_1)>>('ClipLine_Async'); - late final _ClipLine_Async = _ClipLine_AsyncPtr.asFunction< - ffi.Pointer Function( - CvRect, CvPoint, CvPoint, imp1.CvCallback_1)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_accumulateSquare_1'); + late final _cv_accumulateSquare_1 = _cv_accumulateSquare_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer CompareHist( - Mat hist1, - Mat hist2, - int method, - ffi.Pointer rval, + ffi.Pointer cv_accumulate_1( + Mat src, + Mat dst, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _CompareHist( - hist1, - hist2, - method, - rval, + return _cv_accumulate_1( + src, + dst, + mask, + callback, ); } - late final _CompareHistPtr = _lookup< + late final _cv_accumulate_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Pointer)>>('CompareHist'); - late final _CompareHist = _CompareHistPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, ffi.Pointer)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_accumulate_1'); + late final _cv_accumulate_1 = _cv_accumulate_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer CompareHist_Async( - Mat hist1, - Mat hist2, - int method, - imp1.CvCallback_1 callback, + ffi.Pointer cv_accumulatedWeighted( + Mat src, + Mat dst, + double alpha, + imp1.CvCallback_0 callback, ) { - return _CompareHist_Async( - hist1, - hist2, - method, + return _cv_accumulatedWeighted( + src, + dst, + alpha, callback, ); } - late final _CompareHist_AsyncPtr = _lookup< + late final _cv_accumulatedWeightedPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, imp1.CvCallback_1)>>('CompareHist_Async'); - late final _CompareHist_Async = _CompareHist_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Double, + imp1.CvCallback_0)>>('cv_accumulatedWeighted'); + late final _cv_accumulatedWeighted = _cv_accumulatedWeightedPtr.asFunction< + ffi.Pointer Function(Mat, Mat, double, imp1.CvCallback_0)>(); - ffi.Pointer ConnectedComponents( + ffi.Pointer cv_accumulatedWeighted_1( Mat src, Mat dst, - int connectivity, - int ltype, - int ccltype, - ffi.Pointer rval, + double alpha, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _ConnectedComponents( + return _cv_accumulatedWeighted_1( src, dst, - connectivity, - ltype, - ccltype, - rval, + alpha, + mask, + callback, ); } - late final _ConnectedComponentsPtr = _lookup< + late final _cv_accumulatedWeighted_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('ConnectedComponents'); - late final _ConnectedComponents = _ConnectedComponentsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, int, int, ffi.Pointer)>(); + ffi.Pointer Function(Mat, Mat, ffi.Double, Mat, + imp1.CvCallback_0)>>('cv_accumulatedWeighted_1'); + late final _cv_accumulatedWeighted_1 = + _cv_accumulatedWeighted_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ConnectedComponentsWithStats( + ffi.Pointer cv_adaptiveThreshold( Mat src, - Mat labels, - Mat stats, - Mat centroids, - int connectivity, - int ltype, - int ccltype, - ffi.Pointer rval, + Mat dst, + double maxValue, + int adaptiveTyp, + int typ, + int blockSize, + double c, + imp1.CvCallback_0 callback, ) { - return _ConnectedComponentsWithStats( + return _cv_adaptiveThreshold( src, - labels, - stats, - centroids, - connectivity, - ltype, - ccltype, - rval, + dst, + maxValue, + adaptiveTyp, + typ, + blockSize, + c, + callback, ); } - late final _ConnectedComponentsWithStatsPtr = _lookup< + late final _cv_adaptiveThresholdPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Int, ffi.Int, - ffi.Int, ffi.Pointer)>>('ConnectedComponentsWithStats'); - late final _ConnectedComponentsWithStats = - _ConnectedComponentsWithStatsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, int, int, int, ffi.Pointer)>(); + ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Int, ffi.Int, + ffi.Int, ffi.Double, imp1.CvCallback_0)>>('cv_adaptiveThreshold'); + late final _cv_adaptiveThreshold = _cv_adaptiveThresholdPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, int, int, int, double, imp1.CvCallback_0)>(); - ffi.Pointer ConnectedComponentsWithStats_Async( + ffi.Pointer cv_applyColorMap( Mat src, - int connectivity, - int ltype, - int ccltype, - imp1.CvCallback_4 callback, + Mat dst, + int colormap, + imp1.CvCallback_0 callback, ) { - return _ConnectedComponentsWithStats_Async( + return _cv_applyColorMap( src, - connectivity, - ltype, - ccltype, + dst, + colormap, callback, ); } - late final _ConnectedComponentsWithStats_AsyncPtr = _lookup< + late final _cv_applyColorMapPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_4)>>('ConnectedComponentsWithStats_Async'); - late final _ConnectedComponentsWithStats_Async = - _ConnectedComponentsWithStats_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, int, int, int, imp1.CvCallback_4)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_applyColorMap'); + late final _cv_applyColorMap = _cv_applyColorMapPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer ConnectedComponents_Async( + ffi.Pointer cv_applyColorMap_1( Mat src, - int connectivity, - int ltype, - int ccltype, - imp1.CvCallback_2 callback, + Mat dst, + Mat colormap, + imp1.CvCallback_0 callback, ) { - return _ConnectedComponents_Async( + return _cv_applyColorMap_1( src, - connectivity, - ltype, - ccltype, + dst, + colormap, callback, ); } - late final _ConnectedComponents_AsyncPtr = _lookup< + late final _cv_applyColorMap_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_2)>>('ConnectedComponents_Async'); - late final _ConnectedComponents_Async = - _ConnectedComponents_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, int, int, int, imp1.CvCallback_2)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_applyColorMap_1'); + late final _cv_applyColorMap_1 = _cv_applyColorMap_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ContourArea( - VecPoint pts, - ffi.Pointer rval, + ffi.Pointer cv_approxPolyDP( + VecPoint curve, + double epsilon, + bool closed, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ContourArea( - pts, + return _cv_approxPolyDP( + curve, + epsilon, + closed, rval, + callback, ); } - late final _ContourAreaPtr = _lookup< + late final _cv_approxPolyDPPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, ffi.Pointer)>>('ContourArea'); - late final _ContourArea = _ContourAreaPtr.asFunction< - ffi.Pointer Function(VecPoint, ffi.Pointer)>(); + ffi.Pointer Function(VecPoint, ffi.Double, ffi.Bool, + ffi.Pointer, imp1.CvCallback_0)>>('cv_approxPolyDP'); + late final _cv_approxPolyDP = _cv_approxPolyDPPtr.asFunction< + ffi.Pointer Function( + VecPoint, double, bool, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ContourArea_Async( - VecPoint pts, - imp1.CvCallback_1 callback, + ffi.Pointer cv_arcLength( + VecPoint curve, + bool is_closed, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _ContourArea_Async( - pts, + return _cv_arcLength( + curve, + is_closed, + rval, callback, ); } - late final _ContourArea_AsyncPtr = _lookup< + late final _cv_arcLengthPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, imp1.CvCallback_1)>>('ContourArea_Async'); - late final _ContourArea_Async = _ContourArea_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint, imp1.CvCallback_1)>(); + ffi.Pointer Function(VecPoint, ffi.Bool, + ffi.Pointer, imp1.CvCallback_0)>>('cv_arcLength'); + late final _cv_arcLength = _cv_arcLengthPtr.asFunction< + ffi.Pointer Function( + VecPoint, bool, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer ConvexHull( - VecPoint points, - Mat hull, - bool clockwise, - bool returnPoints, - ) { - return _ConvexHull( - points, - hull, - clockwise, - returnPoints, - ); - } - - late final _ConvexHullPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, Mat, ffi.Bool, ffi.Bool)>>('ConvexHull'); - late final _ConvexHull = _ConvexHullPtr.asFunction< - ffi.Pointer Function(VecPoint, Mat, bool, bool)>(); - - ffi.Pointer ConvexHull_Async( - VecPoint points, - bool clockwise, - bool returnPoints, - imp1.CvCallback_1 callback, - ) { - return _ConvexHull_Async( - points, - clockwise, - returnPoints, - callback, - ); - } - - late final _ConvexHull_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, ffi.Bool, ffi.Bool, - imp1.CvCallback_1)>>('ConvexHull_Async'); - late final _ConvexHull_Async = _ConvexHull_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint, bool, bool, imp1.CvCallback_1)>(); - - ffi.Pointer ConvexityDefects( - VecPoint points, - Mat hull, - Mat result, - ) { - return _ConvexityDefects( - points, - hull, - result, - ); - } - - late final _ConvexityDefectsPtr = _lookup< - ffi - .NativeFunction Function(VecPoint, Mat, Mat)>>( - 'ConvexityDefects'); - late final _ConvexityDefects = _ConvexityDefectsPtr.asFunction< - ffi.Pointer Function(VecPoint, Mat, Mat)>(); - - ffi.Pointer ConvexityDefects_Async( - VecPoint points, - Mat hull, - imp1.CvCallback_1 callback, - ) { - return _ConvexityDefects_Async( - points, - hull, - callback, - ); - } - - late final _ConvexityDefects_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, Mat, imp1.CvCallback_1)>>('ConvexityDefects_Async'); - late final _ConvexityDefects_Async = _ConvexityDefects_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer CornerSubPix( - Mat img, - VecPoint2f corners, - CvSize winSize, - CvSize zeroZone, - TermCriteria criteria, - ) { - return _CornerSubPix( - img, - corners, - winSize, - zeroZone, - criteria, - ); - } - - late final _CornerSubPixPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, VecPoint2f, CvSize, CvSize, TermCriteria)>>('CornerSubPix'); - late final _CornerSubPix = _CornerSubPixPtr.asFunction< - ffi.Pointer Function( - Mat, VecPoint2f, CvSize, CvSize, TermCriteria)>(); - - ffi.Pointer CornerSubPix_Async( + ffi.Pointer cv_arrowedLine( Mat img, - VecPoint2f corners, - CvSize winSize, - CvSize zeroZone, - TermCriteria criteria, + CvPoint pt1, + CvPoint pt2, + Scalar color, + int thickness, + int line_type, + int shift, + double tipLength, imp1.CvCallback_0 callback, ) { - return _CornerSubPix_Async( + return _cv_arrowedLine( img, - corners, - winSize, - zeroZone, - criteria, + pt1, + pt2, + color, + thickness, + line_type, + shift, + tipLength, callback, ); } - late final _CornerSubPix_AsyncPtr = _lookup< + late final _cv_arrowedLinePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, VecPoint2f, CvSize, CvSize, - TermCriteria, imp1.CvCallback_0)>>('CornerSubPix_Async'); - late final _CornerSubPix_Async = _CornerSubPix_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, VecPoint2f, CvSize, CvSize, TermCriteria, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, + CvPoint, + CvPoint, + Scalar, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Double, + imp1.CvCallback_0)>>('cv_arrowedLine'); + late final _cv_arrowedLine = _cv_arrowedLinePtr.asFunction< + ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, int, int, + int, double, imp1.CvCallback_0)>(); - ffi.Pointer CvtColor( + ffi.Pointer cv_bilateralFilter( Mat src, Mat dst, - int code, + int d, + double sc, + double ss, + imp1.CvCallback_0 callback, ) { - return _CvtColor( + return _cv_bilateralFilter( src, dst, - code, + d, + sc, + ss, + callback, ); } - late final _CvtColorPtr = _lookup< + late final _cv_bilateralFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('CvtColor'); - late final _CvtColor = - _CvtColorPtr.asFunction Function(Mat, Mat, int)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Double, + ffi.Double, imp1.CvCallback_0)>>('cv_bilateralFilter'); + late final _cv_bilateralFilter = _cv_bilateralFilterPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, double, double, imp1.CvCallback_0)>(); - ffi.Pointer CvtColor_Async( + ffi.Pointer cv_blur( Mat src, - int code, - imp1.CvCallback_1 callback, + Mat dst, + CvSize ps, + imp1.CvCallback_0 callback, ) { - return _CvtColor_Async( + return _cv_blur( src, - code, + dst, + ps, callback, ); } - late final _CvtColor_AsyncPtr = _lookup< + late final _cv_blurPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('CvtColor_Async'); - late final _CvtColor_Async = _CvtColor_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); + Mat, Mat, CvSize, imp1.CvCallback_0)>>('cv_blur'); + late final _cv_blur = _cv_blurPtr.asFunction< + ffi.Pointer Function(Mat, Mat, CvSize, imp1.CvCallback_0)>(); - ffi.Pointer Dilate( - Mat src, - Mat dst, - Mat kernel, + ffi.Pointer cv_boundingRect( + VecPoint pts, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Dilate( - src, - dst, - kernel, + return _cv_boundingRect( + pts, + rval, + callback, ); } - late final _DilatePtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Mat)>>('Dilate'); - late final _Dilate = - _DilatePtr.asFunction Function(Mat, Mat, Mat)>(); + late final _cv_boundingRectPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VecPoint, ffi.Pointer, + imp1.CvCallback_0)>>('cv_boundingRect'); + late final _cv_boundingRect = _cv_boundingRectPtr.asFunction< + ffi.Pointer Function( + VecPoint, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer DilateWithParams( + ffi.Pointer cv_boxFilter( Mat src, Mat dst, - Mat kernel, + int ddepth, + CvSize ps, CvPoint anchor, - int iterations, + bool normalize, int borderType, - Scalar borderValue, + imp1.CvCallback_0 callback, ) { - return _DilateWithParams( + return _cv_boxFilter( src, dst, - kernel, + ddepth, + ps, anchor, - iterations, + normalize, borderType, - borderValue, + callback, ); } - late final _DilateWithParamsPtr = _lookup< + late final _cv_boxFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, CvPoint, ffi.Int, - ffi.Int, Scalar)>>('DilateWithParams'); - late final _DilateWithParams = _DilateWithParamsPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Int, CvSize, CvPoint, + ffi.Bool, ffi.Int, imp1.CvCallback_0)>>('cv_boxFilter'); + late final _cv_boxFilter = _cv_boxFilterPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, CvPoint, int, int, Scalar)>(); + Mat, Mat, int, CvSize, CvPoint, bool, int, imp1.CvCallback_0)>(); - ffi.Pointer DilateWithParams_Async( - Mat src, - Mat kernel, - CvPoint anchor, - int iterations, - int borderType, - Scalar borderValue, - imp1.CvCallback_1 callback, + ffi.Pointer cv_boxPoints( + RotatedRect rect, + ffi.Pointer boxPts, + imp1.CvCallback_0 callback, ) { - return _DilateWithParams_Async( - src, - kernel, - anchor, - iterations, - borderType, - borderValue, + return _cv_boxPoints( + rect, + boxPts, callback, ); } - late final _DilateWithParams_AsyncPtr = _lookup< + late final _cv_boxPointsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvPoint, ffi.Int, ffi.Int, - Scalar, imp1.CvCallback_1)>>('DilateWithParams_Async'); - late final _DilateWithParams_Async = _DilateWithParams_AsyncPtr.asFunction< + ffi.Pointer Function(RotatedRect, ffi.Pointer, + imp1.CvCallback_0)>>('cv_boxPoints'); + late final _cv_boxPoints = _cv_boxPointsPtr.asFunction< ffi.Pointer Function( - Mat, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_1)>(); + RotatedRect, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Dilate_Async( - Mat src, - Mat kernel, - imp1.CvCallback_1 callback, + ffi.Pointer cv_calcBackProject( + VecMat mats, + VecI32 chans, + Mat hist, + Mat backProject, + VecF32 rng, + double scale, + imp1.CvCallback_0 callback, ) { - return _Dilate_Async( - src, - kernel, + return _cv_calcBackProject( + mats, + chans, + hist, + backProject, + rng, + scale, callback, ); } - late final _Dilate_AsyncPtr = _lookup< + late final _cv_calcBackProjectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('Dilate_Async'); - late final _Dilate_Async = _Dilate_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); + ffi.Pointer Function(VecMat, VecI32, Mat, Mat, VecF32, + ffi.Double, imp1.CvCallback_0)>>('cv_calcBackProject'); + late final _cv_calcBackProject = _cv_calcBackProjectPtr.asFunction< + ffi.Pointer Function( + VecMat, VecI32, Mat, Mat, VecF32, double, imp1.CvCallback_0)>(); - ffi.Pointer DistanceTransform( - Mat src, - Mat dst, - Mat labels, - int distanceType, - int maskSize, - int labelType, + ffi.Pointer cv_calcHist( + VecMat mats, + VecI32 chans, + Mat mask, + Mat hist, + VecI32 sz, + VecF32 rng, + bool acc, + imp1.CvCallback_0 callback, ) { - return _DistanceTransform( - src, - dst, - labels, - distanceType, - maskSize, - labelType, + return _cv_calcHist( + mats, + chans, + mask, + hist, + sz, + rng, + acc, + callback, ); } - late final _DistanceTransformPtr = _lookup< + late final _cv_calcHistPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Int, ffi.Int, ffi.Int)>>('DistanceTransform'); - late final _DistanceTransform = _DistanceTransformPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int, int, int)>(); + ffi.Pointer Function(VecMat, VecI32, Mat, Mat, VecI32, + VecF32, ffi.Bool, imp1.CvCallback_0)>>('cv_calcHist'); + late final _cv_calcHist = _cv_calcHistPtr.asFunction< + ffi.Pointer Function( + VecMat, VecI32, Mat, Mat, VecI32, VecF32, bool, imp1.CvCallback_0)>(); - ffi.Pointer DistanceTransform_Async( + ffi.Pointer cv_canny( Mat src, - int distanceType, - int maskSize, - int labelType, - imp1.CvCallback_2 callback, + Mat edges, + double t1, + double t2, + int apertureSize, + bool l2gradient, + imp1.CvCallback_0 callback, ) { - return _DistanceTransform_Async( + return _cv_canny( src, - distanceType, - maskSize, - labelType, + edges, + t1, + t2, + apertureSize, + l2gradient, callback, ); } - late final _DistanceTransform_AsyncPtr = _lookup< + late final _cv_cannyPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_2)>>('DistanceTransform_Async'); - late final _DistanceTransform_Async = _DistanceTransform_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, int, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Double, + ffi.Int, ffi.Bool, imp1.CvCallback_0)>>('cv_canny'); + late final _cv_canny = _cv_cannyPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, double, int, bool, imp1.CvCallback_0)>(); - ffi.Pointer DrawContours( - Mat src, - VecVecPoint contours, - int contourIdx, + ffi.Pointer cv_circle( + Mat img, + CvPoint center, + int radius, Scalar color, int thickness, + imp1.CvCallback_0 callback, ) { - return _DrawContours( - src, - contours, - contourIdx, + return _cv_circle( + img, + center, + radius, color, thickness, + callback, ); } - late final _DrawContoursPtr = _lookup< + late final _cv_circlePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, VecVecPoint, ffi.Int, Scalar, ffi.Int)>>('DrawContours'); - late final _DrawContours = _DrawContoursPtr.asFunction< - ffi.Pointer Function(Mat, VecVecPoint, int, Scalar, int)>(); + ffi.Pointer Function(Mat, CvPoint, ffi.Int, Scalar, ffi.Int, + imp1.CvCallback_0)>>('cv_circle'); + late final _cv_circle = _cv_circlePtr.asFunction< + ffi.Pointer Function( + Mat, CvPoint, int, Scalar, int, imp1.CvCallback_0)>(); - ffi.Pointer DrawContoursWithParams( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - int lineType, - Mat hierarchy, - int maxLevel, - CvPoint offset, - ) { - return _DrawContoursWithParams( - src, - contours, - contourIdx, - color, - thickness, - lineType, - hierarchy, - maxLevel, - offset, - ); - } - - late final _DrawContoursWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - VecVecPoint, - ffi.Int, - Scalar, - ffi.Int, - ffi.Int, - Mat, - ffi.Int, - CvPoint)>>('DrawContoursWithParams'); - late final _DrawContoursWithParams = _DrawContoursWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, VecVecPoint, int, Scalar, int, int, Mat, int, CvPoint)>(); - - ffi.Pointer DrawContoursWithParams_Async( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - int lineType, - Mat hierarchy, - int maxLevel, - CvPoint offset, - imp1.CvCallback_0 callback, - ) { - return _DrawContoursWithParams_Async( - src, - contours, - contourIdx, - color, - thickness, - lineType, - hierarchy, - maxLevel, - offset, - callback, - ); - } - - late final _DrawContoursWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - VecVecPoint, - ffi.Int, - Scalar, - ffi.Int, - ffi.Int, - Mat, - ffi.Int, - CvPoint, - imp1.CvCallback_0)>>('DrawContoursWithParams_Async'); - late final _DrawContoursWithParams_Async = - _DrawContoursWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, VecVecPoint, int, Scalar, int, - int, Mat, int, CvPoint, imp1.CvCallback_0)>(); - - ffi.Pointer DrawContours_Async( - Mat src, - VecVecPoint contours, - int contourIdx, - Scalar color, - int thickness, - imp1.CvCallback_0 callback, - ) { - return _DrawContours_Async( - src, - contours, - contourIdx, - color, - thickness, - callback, - ); - } - - late final _DrawContours_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, VecVecPoint, ffi.Int, Scalar, - ffi.Int, imp1.CvCallback_0)>>('DrawContours_Async'); - late final _DrawContours_Async = _DrawContours_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, VecVecPoint, int, Scalar, int, imp1.CvCallback_0)>(); - - ffi.Pointer Ellipse( - Mat img, - CvPoint center, - CvPoint axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - ) { - return _Ellipse( - img, - center, - axes, - angle, - startAngle, - endAngle, - color, - thickness, - ); - } - - late final _EllipsePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint, CvPoint, ffi.Double, - ffi.Double, ffi.Double, Scalar, ffi.Int)>>('Ellipse'); - late final _Ellipse = _EllipsePtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint, CvPoint, double, double, double, Scalar, int)>(); - - ffi.Pointer EllipseWithParams( - Mat img, - CvPoint center, - CvPoint axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - int lineType, - int shift, - ) { - return _EllipseWithParams( - img, - center, - axes, - angle, - startAngle, - endAngle, - color, - thickness, - lineType, - shift, - ); - } - - late final _EllipseWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - CvPoint, - CvPoint, - ffi.Double, - ffi.Double, - ffi.Double, - Scalar, - ffi.Int, - ffi.Int, - ffi.Int)>>('EllipseWithParams'); - late final _EllipseWithParams = _EllipseWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, CvPoint, CvPoint, double, double, - double, Scalar, int, int, int)>(); - - ffi.Pointer EllipseWithParams_Async( - Mat img, - CvPoint center, - CvPoint axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - int lineType, - int shift, - imp1.CvCallback_0 callback, - ) { - return _EllipseWithParams_Async( - img, - center, - axes, - angle, - startAngle, - endAngle, - color, - thickness, - lineType, - shift, - callback, - ); - } - - late final _EllipseWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - CvPoint, - CvPoint, - ffi.Double, - ffi.Double, - ffi.Double, - Scalar, - ffi.Int, - ffi.Int, - ffi.Int, - imp1.CvCallback_0)>>('EllipseWithParams_Async'); - late final _EllipseWithParams_Async = _EllipseWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, CvPoint, CvPoint, double, double, - double, Scalar, int, int, int, imp1.CvCallback_0)>(); - - ffi.Pointer Ellipse_Async( - Mat img, - CvPoint center, - CvPoint axes, - double angle, - double startAngle, - double endAngle, - Scalar color, - int thickness, - imp1.CvCallback_0 callback, - ) { - return _Ellipse_Async( - img, - center, - axes, - angle, - startAngle, - endAngle, - color, - thickness, - callback, - ); - } - - late final _Ellipse_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - CvPoint, - CvPoint, - ffi.Double, - ffi.Double, - ffi.Double, - Scalar, - ffi.Int, - imp1.CvCallback_0)>>('Ellipse_Async'); - late final _Ellipse_Async = _Ellipse_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, CvPoint, CvPoint, double, double, - double, Scalar, int, imp1.CvCallback_0)>(); - - ffi.Pointer EqualizeHist( - Mat src, - Mat dst, - ) { - return _EqualizeHist( - src, - dst, - ); - } - - late final _EqualizeHistPtr = - _lookup Function(Mat, Mat)>>( - 'EqualizeHist'); - late final _EqualizeHist = - _EqualizeHistPtr.asFunction Function(Mat, Mat)>(); - - ffi.Pointer EqualizeHist_Async( - Mat src, - imp1.CvCallback_1 callback, - ) { - return _EqualizeHist_Async( - src, - callback, - ); - } - - late final _EqualizeHist_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('EqualizeHist_Async'); - late final _EqualizeHist_Async = _EqualizeHist_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, imp1.CvCallback_1)>(); - - ffi.Pointer Erode( - Mat src, - Mat dst, - Mat kernel, - ) { - return _Erode( - src, - dst, - kernel, - ); - } - - late final _ErodePtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Mat)>>('Erode'); - late final _Erode = - _ErodePtr.asFunction Function(Mat, Mat, Mat)>(); - - ffi.Pointer ErodeWithParams( - Mat src, - Mat dst, - Mat kernel, - CvPoint anchor, - int iterations, - int borderType, - Scalar borderValue, - ) { - return _ErodeWithParams( - src, - dst, - kernel, - anchor, - iterations, - borderType, - borderValue, - ); - } - - late final _ErodeWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, CvPoint, ffi.Int, - ffi.Int, Scalar)>>('ErodeWithParams'); - late final _ErodeWithParams = _ErodeWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, CvPoint, int, int, Scalar)>(); - - ffi.Pointer ErodeWithParams_Async( - Mat src, - Mat kernel, - CvPoint anchor, - int iterations, - int borderType, - Scalar borderValue, - imp1.CvCallback_1 callback, - ) { - return _ErodeWithParams_Async( - src, - kernel, - anchor, - iterations, - borderType, - borderValue, - callback, - ); - } - - late final _ErodeWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvPoint, ffi.Int, ffi.Int, - Scalar, imp1.CvCallback_1)>>('ErodeWithParams_Async'); - late final _ErodeWithParams_Async = _ErodeWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_1)>(); - - ffi.Pointer Erode_Async( - Mat src, - Mat kernel, - imp1.CvCallback_1 callback, - ) { - return _Erode_Async( - src, - kernel, - callback, - ); - } - - late final _Erode_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_1)>>('Erode_Async'); - late final _Erode_Async = _Erode_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer FillPoly( - Mat img, - VecVecPoint points, - Scalar color, - ) { - return _FillPoly( - img, - points, - color, - ); - } - - late final _FillPolyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, VecVecPoint, Scalar)>>('FillPoly'); - late final _FillPoly = _FillPolyPtr.asFunction< - ffi.Pointer Function(Mat, VecVecPoint, Scalar)>(); - - ffi.Pointer FillPolyWithParams( - Mat img, - VecVecPoint points, - Scalar color, - int lineType, - int shift, - CvPoint offset, - ) { - return _FillPolyWithParams( - img, - points, - color, - lineType, - shift, - offset, - ); - } - - late final _FillPolyWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, VecVecPoint, Scalar, ffi.Int, - ffi.Int, CvPoint)>>('FillPolyWithParams'); - late final _FillPolyWithParams = _FillPolyWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, VecVecPoint, Scalar, int, int, CvPoint)>(); - - ffi.Pointer FillPolyWithParams_Async( - Mat img, - VecVecPoint points, - Scalar color, - int lineType, - int shift, - CvPoint offset, - imp1.CvCallback_0 callback, - ) { - return _FillPolyWithParams_Async( - img, - points, - color, - lineType, - shift, - offset, - callback, - ); - } - - late final _FillPolyWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - VecVecPoint, - Scalar, - ffi.Int, - ffi.Int, - CvPoint, - imp1.CvCallback_0)>>('FillPolyWithParams_Async'); - late final _FillPolyWithParams_Async = - _FillPolyWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, VecVecPoint, Scalar, int, int, - CvPoint, imp1.CvCallback_0)>(); - - ffi.Pointer FillPoly_Async( - Mat img, - VecVecPoint points, - Scalar color, - imp1.CvCallback_0 callback, - ) { - return _FillPoly_Async( - img, - points, - color, - callback, - ); - } - - late final _FillPoly_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, VecVecPoint, Scalar, imp1.CvCallback_0)>>('FillPoly_Async'); - late final _FillPoly_Async = _FillPoly_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, VecVecPoint, Scalar, imp1.CvCallback_0)>(); - - ffi.Pointer Filter2D( - Mat src, - Mat dst, - int ddepth, - Mat kernel, - CvPoint anchor, - double delta, - int borderType, - ) { - return _Filter2D( - src, - dst, - ddepth, - kernel, - anchor, - delta, - borderType, - ); - } - - late final _Filter2DPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, CvPoint, - ffi.Double, ffi.Int)>>('Filter2D'); - late final _Filter2D = _Filter2DPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, Mat, CvPoint, double, int)>(); - - ffi.Pointer Filter2D_Async( - Mat src, - int ddepth, - Mat kernel, - CvPoint anchor, - double delta, - int borderType, - imp1.CvCallback_1 callback, - ) { - return _Filter2D_Async( - src, - ddepth, - kernel, - anchor, - delta, - borderType, - callback, - ); - } - - late final _Filter2D_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, Mat, CvPoint, ffi.Double, - ffi.Int, imp1.CvCallback_1)>>('Filter2D_Async'); - late final _Filter2D_Async = _Filter2D_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, Mat, CvPoint, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer FindContours( - Mat src, - Mat hierarchy, - int mode, - int method, - ffi.Pointer rval, - ) { - return _FindContours( - src, - hierarchy, - mode, - method, - rval, - ); - } - - late final _FindContoursPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, - ffi.Pointer)>>('FindContours'); - late final _FindContours = _FindContoursPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, int, ffi.Pointer)>(); - - ffi.Pointer FindContours_Async( - Mat src, - int mode, - int method, - imp1.CvCallback_2 callback, - ) { - return _FindContours_Async( - src, - mode, - method, - callback, - ); - } - - late final _FindContours_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, imp1.CvCallback_2)>>('FindContours_Async'); - late final _FindContours_Async = _FindContours_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_2)>(); - - ffi.Pointer FitEllipse( - VecPoint pts, - ffi.Pointer rval, - ) { - return _FitEllipse( - pts, - rval, - ); - } - - late final _FitEllipsePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, ffi.Pointer)>>('FitEllipse'); - late final _FitEllipse = _FitEllipsePtr.asFunction< - ffi.Pointer Function(VecPoint, ffi.Pointer)>(); - - ffi.Pointer FitEllipse_Async( - VecPoint pts, - imp1.CvCallback_1 callback, - ) { - return _FitEllipse_Async( - pts, - callback, - ); - } - - late final _FitEllipse_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, imp1.CvCallback_1)>>('FitEllipse_Async'); - late final _FitEllipse_Async = _FitEllipse_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint, imp1.CvCallback_1)>(); - - ffi.Pointer FitLine( - VecPoint pts, - Mat line, - int distType, - double param, - double reps, - double aeps, - ) { - return _FitLine( - pts, - line, - distType, - param, - reps, - aeps, - ); - } - - late final _FitLinePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, Mat, ffi.Int, ffi.Double, - ffi.Double, ffi.Double)>>('FitLine'); - late final _FitLine = _FitLinePtr.asFunction< - ffi.Pointer Function( - VecPoint, Mat, int, double, double, double)>(); - - ffi.Pointer FitLine_Async( - VecPoint pts, - int distType, - double param, - double reps, - double aeps, - imp1.CvCallback_1 callback, - ) { - return _FitLine_Async( - pts, - distType, - param, - reps, - aeps, - callback, - ); - } - - late final _FitLine_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, ffi.Int, ffi.Double, - ffi.Double, ffi.Double, imp1.CvCallback_1)>>('FitLine_Async'); - late final _FitLine_Async = _FitLine_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint, int, double, double, double, imp1.CvCallback_1)>(); - - ffi.Pointer FloodFill( - Mat src, - Mat mask, - CvPoint seedPoint, - Scalar newVal, - ffi.Pointer rect, - Scalar loDiff, - Scalar upDiff, - int flags, - ffi.Pointer rval, - ) { - return _FloodFill( - src, - mask, - seedPoint, - newVal, - rect, - loDiff, - upDiff, - flags, - rval, - ); - } - - late final _FloodFillPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - CvPoint, - Scalar, - ffi.Pointer, - Scalar, - Scalar, - ffi.Int, - ffi.Pointer)>>('FloodFill'); - late final _FloodFill = _FloodFillPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvPoint, Scalar, - ffi.Pointer, Scalar, Scalar, int, ffi.Pointer)>(); - - ffi.Pointer FloodFill_Async( - Mat src, - Mat mask, - CvPoint seedPoint, - Scalar newVal, - Scalar loDiff, - Scalar upDiff, - int flags, - imp1.CvCallback_2 callback, - ) { - return _FloodFill_Async( - src, - mask, - seedPoint, - newVal, - loDiff, - upDiff, - flags, - callback, - ); - } - - late final _FloodFill_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvPoint, Scalar, Scalar, - Scalar, ffi.Int, imp1.CvCallback_2)>>('FloodFill_Async'); - late final _FloodFill_Async = _FloodFill_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, CvPoint, Scalar, Scalar, Scalar, int, imp1.CvCallback_2)>(); - - ffi.Pointer GaussianBlur( - Mat src, - Mat dst, - CvSize ps, - double sX, - double sY, - int bt, - ) { - return _GaussianBlur( - src, - dst, - ps, - sX, - sY, - bt, - ); - } - - late final _GaussianBlurPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvSize, ffi.Double, - ffi.Double, ffi.Int)>>('GaussianBlur'); - late final _GaussianBlur = _GaussianBlurPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvSize, double, double, int)>(); - - ffi.Pointer GaussianBlur_Async( - Mat src, - CvSize ps, - double sX, - double sY, - int bt, - imp1.CvCallback_1 callback, - ) { - return _GaussianBlur_Async( - src, - ps, - sX, - sY, - bt, - callback, - ); - } - - late final _GaussianBlur_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, ffi.Double, ffi.Double, - ffi.Int, imp1.CvCallback_1)>>('GaussianBlur_Async'); - late final _GaussianBlur_Async = _GaussianBlur_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvSize, double, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer GetAffineTransform( - VecPoint src, - VecPoint dst, - ffi.Pointer rval, - ) { - return _GetAffineTransform( - src, - dst, - rval, - ); - } - - late final _GetAffineTransformPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, VecPoint, ffi.Pointer)>>('GetAffineTransform'); - late final _GetAffineTransform = _GetAffineTransformPtr.asFunction< - ffi.Pointer Function(VecPoint, VecPoint, ffi.Pointer)>(); - - ffi.Pointer GetAffineTransform2f( - VecPoint2f src, - VecPoint2f dst, - ffi.Pointer rval, - ) { - return _GetAffineTransform2f( - src, - dst, - rval, - ); - } - - late final _GetAffineTransform2fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, - ffi.Pointer)>>('GetAffineTransform2f'); - late final _GetAffineTransform2f = _GetAffineTransform2fPtr.asFunction< - ffi.Pointer Function( - VecPoint2f, VecPoint2f, ffi.Pointer)>(); - - ffi.Pointer GetAffineTransform2f_Async( - VecPoint2f src, - VecPoint2f dst, - imp1.CvCallback_1 callback, - ) { - return _GetAffineTransform2f_Async( - src, - dst, - callback, - ); - } - - late final _GetAffineTransform2f_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, - imp1.CvCallback_1)>>('GetAffineTransform2f_Async'); - late final _GetAffineTransform2f_Async = - _GetAffineTransform2f_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint2f, VecPoint2f, imp1.CvCallback_1)>(); - - ffi.Pointer GetAffineTransform_Async( - VecPoint src, - VecPoint dst, - imp1.CvCallback_1 callback, - ) { - return _GetAffineTransform_Async( - src, - dst, - callback, - ); - } - - late final _GetAffineTransform_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, VecPoint, - imp1.CvCallback_1)>>('GetAffineTransform_Async'); - late final _GetAffineTransform_Async = - _GetAffineTransform_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint, VecPoint, imp1.CvCallback_1)>(); - - ffi.Pointer GetGaussianKernel( - int ksize, - double sigma, - int ktype, - ffi.Pointer rval, - ) { - return _GetGaussianKernel( - ksize, - sigma, - ktype, - rval, - ); - } - - late final _GetGaussianKernelPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Int, - ffi.Pointer)>>('GetGaussianKernel'); - late final _GetGaussianKernel = _GetGaussianKernelPtr.asFunction< - ffi.Pointer Function(int, double, int, ffi.Pointer)>(); - - ffi.Pointer GetGaussianKernel_Async( - int ksize, - double sigma, - int ktype, - imp1.CvCallback_1 callback, - ) { - return _GetGaussianKernel_Async( - ksize, - sigma, - ktype, - callback, - ); - } - - late final _GetGaussianKernel_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('GetGaussianKernel_Async'); - late final _GetGaussianKernel_Async = _GetGaussianKernel_AsyncPtr.asFunction< - ffi.Pointer Function(int, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer GetPerspectiveTransform( - VecPoint src, - VecPoint dst, - ffi.Pointer rval, - int solveMethod, - ) { - return _GetPerspectiveTransform( - src, - dst, - rval, - solveMethod, - ); - } - - late final _GetPerspectiveTransformPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, VecPoint, ffi.Pointer, - ffi.Int)>>('GetPerspectiveTransform'); - late final _GetPerspectiveTransform = _GetPerspectiveTransformPtr.asFunction< - ffi.Pointer Function( - VecPoint, VecPoint, ffi.Pointer, int)>(); - - ffi.Pointer GetPerspectiveTransform2f( - VecPoint2f src, - VecPoint2f dst, - ffi.Pointer rval, - int solveMethod, - ) { - return _GetPerspectiveTransform2f( - src, - dst, - rval, - solveMethod, - ); - } - - late final _GetPerspectiveTransform2fPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, - ffi.Pointer, ffi.Int)>>('GetPerspectiveTransform2f'); - late final _GetPerspectiveTransform2f = - _GetPerspectiveTransform2fPtr.asFunction< - ffi.Pointer Function( - VecPoint2f, VecPoint2f, ffi.Pointer, int)>(); - - ffi.Pointer GetPerspectiveTransform2f_Async( - VecPoint2f src, - VecPoint2f dst, - int solveMethod, - imp1.CvCallback_1 callback, - ) { - return _GetPerspectiveTransform2f_Async( - src, - dst, - solveMethod, - callback, - ); - } - - late final _GetPerspectiveTransform2f_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, ffi.Int, - imp1.CvCallback_1)>>('GetPerspectiveTransform2f_Async'); - late final _GetPerspectiveTransform2f_Async = - _GetPerspectiveTransform2f_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint2f, VecPoint2f, int, imp1.CvCallback_1)>(); - - ffi.Pointer GetPerspectiveTransform_Async( - VecPoint src, - VecPoint dst, - int solveMethod, - imp1.CvCallback_1 callback, - ) { - return _GetPerspectiveTransform_Async( - src, - dst, - solveMethod, - callback, - ); - } - - late final _GetPerspectiveTransform_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, VecPoint, ffi.Int, - imp1.CvCallback_1)>>('GetPerspectiveTransform_Async'); - late final _GetPerspectiveTransform_Async = - _GetPerspectiveTransform_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint, VecPoint, int, imp1.CvCallback_1)>(); - - ffi.Pointer GetRectSubPix( - Mat src, - CvSize patchSize, - CvPoint2f center, - Mat dst, - ) { - return _GetRectSubPix( - src, - patchSize, - center, - dst, - ); - } - - late final _GetRectSubPixPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, CvSize, CvPoint2f, Mat)>>('GetRectSubPix'); - late final _GetRectSubPix = _GetRectSubPixPtr.asFunction< - ffi.Pointer Function(Mat, CvSize, CvPoint2f, Mat)>(); - - ffi.Pointer GetRectSubPix_Async( - Mat src, - CvSize patchSize, - CvPoint2f center, - imp1.CvCallback_1 callback, - ) { - return _GetRectSubPix_Async( - src, - patchSize, - center, - callback, - ); - } - - late final _GetRectSubPix_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, CvPoint2f, - imp1.CvCallback_1)>>('GetRectSubPix_Async'); - late final _GetRectSubPix_Async = _GetRectSubPix_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvSize, CvPoint2f, imp1.CvCallback_1)>(); - - ffi.Pointer GetRotationMatrix2D( - CvPoint2f center, - double angle, - double scale, - ffi.Pointer rval, - ) { - return _GetRotationMatrix2D( - center, - angle, - scale, - rval, - ); - } - - late final _GetRotationMatrix2DPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(CvPoint2f, ffi.Double, ffi.Double, - ffi.Pointer)>>('GetRotationMatrix2D'); - late final _GetRotationMatrix2D = _GetRotationMatrix2DPtr.asFunction< - ffi.Pointer Function( - CvPoint2f, double, double, ffi.Pointer)>(); - - ffi.Pointer GetRotationMatrix2D_Async( - CvPoint2f center, - double angle, - double scale, - imp1.CvCallback_1 callback, - ) { - return _GetRotationMatrix2D_Async( - center, - angle, - scale, - callback, - ); - } - - late final _GetRotationMatrix2D_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(CvPoint2f, ffi.Double, ffi.Double, - imp1.CvCallback_1)>>('GetRotationMatrix2D_Async'); - late final _GetRotationMatrix2D_Async = - _GetRotationMatrix2D_AsyncPtr.asFunction< - ffi.Pointer Function( - CvPoint2f, double, double, imp1.CvCallback_1)>(); - - ffi.Pointer GetStructuringElement( - int shape, - CvSize ksize, - ffi.Pointer rval, - ) { - return _GetStructuringElement( - shape, - ksize, - rval, - ); - } - - late final _GetStructuringElementPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, CvSize, ffi.Pointer)>>('GetStructuringElement'); - late final _GetStructuringElement = _GetStructuringElementPtr.asFunction< - ffi.Pointer Function(int, CvSize, ffi.Pointer)>(); - - ffi.Pointer GetStructuringElement_Async( - int shape, - CvSize ksize, - CvPoint anchor, - imp1.CvCallback_1 callback, - ) { - return _GetStructuringElement_Async( - shape, - ksize, - anchor, - callback, - ); - } - - late final _GetStructuringElement_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, CvSize, CvPoint, - imp1.CvCallback_1)>>('GetStructuringElement_Async'); - late final _GetStructuringElement_Async = - _GetStructuringElement_AsyncPtr.asFunction< - ffi.Pointer Function( - int, CvSize, CvPoint, imp1.CvCallback_1)>(); - - ffi.Pointer GetTextSizeWithBaseline( - ffi.Pointer text, - int fontFace, - double fontScale, - int thickness, - ffi.Pointer baseline, - ffi.Pointer rval, - ) { - return _GetTextSizeWithBaseline( - text, - fontFace, - fontScale, - thickness, - baseline, - rval, - ); - } - - late final _GetTextSizeWithBaselinePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Int, - ffi.Double, - ffi.Int, - ffi.Pointer, - ffi.Pointer)>>('GetTextSizeWithBaseline'); - late final _GetTextSizeWithBaseline = _GetTextSizeWithBaselinePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, double, int, - ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer GetTextSizeWithBaseline_Async( - ffi.Pointer text, - int fontFace, - double fontScale, - int thickness, - imp1.CvCallback_2 callback, - ) { - return _GetTextSizeWithBaseline_Async( - text, - fontFace, - fontScale, - thickness, - callback, - ); - } - - late final _GetTextSizeWithBaseline_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Int, - ffi.Double, - ffi.Int, - imp1.CvCallback_2)>>('GetTextSizeWithBaseline_Async'); - late final _GetTextSizeWithBaseline_Async = - _GetTextSizeWithBaseline_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, int, double, int, imp1.CvCallback_2)>(); - - ffi.Pointer GoodFeaturesToTrack( - Mat img, - ffi.Pointer corners, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - bool useHarrisDetector, - double k, - ) { - return _GoodFeaturesToTrack( - img, - corners, - maxCorners, - quality, - minDist, - mask, - blockSize, - useHarrisDetector, - k, - ); - } - - late final _GoodFeaturesToTrackPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - ffi.Int, - ffi.Double, - ffi.Double, - Mat, - ffi.Int, - ffi.Bool, - ffi.Double)>>('GoodFeaturesToTrack'); - late final _GoodFeaturesToTrack = _GoodFeaturesToTrackPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, int, double, - double, Mat, int, bool, double)>(); - - ffi.Pointer GoodFeaturesToTrackWithGradient( - Mat img, - ffi.Pointer corners, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - int gradientSize, - bool useHarrisDetector, - double k, - ) { - return _GoodFeaturesToTrackWithGradient( - img, - corners, - maxCorners, - quality, - minDist, - mask, - blockSize, - gradientSize, - useHarrisDetector, - k, - ); - } - - late final _GoodFeaturesToTrackWithGradientPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - ffi.Int, - ffi.Double, - ffi.Double, - Mat, - ffi.Int, - ffi.Int, - ffi.Bool, - ffi.Double)>>('GoodFeaturesToTrackWithGradient'); - late final _GoodFeaturesToTrackWithGradient = - _GoodFeaturesToTrackWithGradientPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, int, - double, double, Mat, int, int, bool, double)>(); - - ffi.Pointer GoodFeaturesToTrackWithGradient_Async( - Mat img, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - int gradientSize, - bool useHarrisDetector, - double k, - imp1.CvCallback_1 callback, - ) { - return _GoodFeaturesToTrackWithGradient_Async( - img, - maxCorners, - quality, - minDist, - mask, - blockSize, - gradientSize, - useHarrisDetector, - k, - callback, - ); - } - - late final _GoodFeaturesToTrackWithGradient_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Int, - ffi.Double, - ffi.Double, - Mat, - ffi.Int, - ffi.Int, - ffi.Bool, - ffi.Double, - imp1.CvCallback_1)>>('GoodFeaturesToTrackWithGradient_Async'); - late final _GoodFeaturesToTrackWithGradient_Async = - _GoodFeaturesToTrackWithGradient_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, double, double, Mat, int, - int, bool, double, imp1.CvCallback_1)>(); - - ffi.Pointer GoodFeaturesToTrack_Async( - Mat img, - int maxCorners, - double quality, - double minDist, - Mat mask, - int blockSize, - bool useHarrisDetector, - double k, - imp1.CvCallback_1 callback, - ) { - return _GoodFeaturesToTrack_Async( - img, - maxCorners, - quality, - minDist, - mask, - blockSize, - useHarrisDetector, - k, - callback, - ); - } - - late final _GoodFeaturesToTrack_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Int, - ffi.Double, - ffi.Double, - Mat, - ffi.Int, - ffi.Bool, - ffi.Double, - imp1.CvCallback_1)>>('GoodFeaturesToTrack_Async'); - late final _GoodFeaturesToTrack_Async = - _GoodFeaturesToTrack_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, double, double, Mat, int, - bool, double, imp1.CvCallback_1)>(); - - ffi.Pointer GrabCut( - Mat img, - Mat mask, - CvRect rect, - Mat bgdModel, - Mat fgdModel, - int iterCount, - int mode, - ) { - return _GrabCut( - img, - mask, - rect, - bgdModel, - fgdModel, - iterCount, - mode, - ); - } - - late final _GrabCutPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, CvRect, Mat, Mat, ffi.Int, ffi.Int)>>('GrabCut'); - late final _GrabCut = _GrabCutPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvRect, Mat, Mat, int, int)>(); - - ffi.Pointer GrabCut_Async( - Mat img, - Mat mask, - CvRect rect, - Mat bgdModel, - Mat fgdModel, - int iterCount, - int mode, - imp1.CvCallback_0 callback, - ) { - return _GrabCut_Async( - img, - mask, - rect, - bgdModel, - fgdModel, - iterCount, - mode, - callback, - ); - } - - late final _GrabCut_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvRect, Mat, Mat, ffi.Int, - ffi.Int, imp1.CvCallback_0)>>('GrabCut_Async'); - late final _GrabCut_Async = _GrabCut_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, CvRect, Mat, Mat, int, int, imp1.CvCallback_0)>(); - - ffi.Pointer HoughCircles( - Mat src, - Mat circles, - int method, - double dp, - double minDist, - ) { - return _HoughCircles( - src, - circles, - method, - dp, - minDist, - ); - } - - late final _HoughCirclesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, ffi.Double, ffi.Double)>>('HoughCircles'); - late final _HoughCircles = _HoughCirclesPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, double, double)>(); - - ffi.Pointer HoughCirclesWithParams( - Mat src, - Mat circles, - int method, - double dp, - double minDist, - double param1, - double param2, - int minRadius, - int maxRadius, - ) { - return _HoughCirclesWithParams( - src, - circles, - method, - dp, - minDist, - param1, - param2, - minRadius, - maxRadius, - ); - } - - late final _HoughCirclesWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - ffi.Int, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Int, - ffi.Int)>>('HoughCirclesWithParams'); - late final _HoughCirclesWithParams = _HoughCirclesWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, double, double, double, double, int, int)>(); - - ffi.Pointer HoughCirclesWithParams_Async( - Mat src, - int method, - double dp, - double minDist, - double param1, - double param2, - int minRadius, - int maxRadius, - imp1.CvCallback_1 callback, - ) { - return _HoughCirclesWithParams_Async( - src, - method, - dp, - minDist, - param1, - param2, - minRadius, - maxRadius, - callback, - ); - } - - late final _HoughCirclesWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Int, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Int, - ffi.Int, - imp1.CvCallback_1)>>('HoughCirclesWithParams_Async'); - late final _HoughCirclesWithParams_Async = - _HoughCirclesWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, double, double, double, - double, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer HoughCircles_Async( - Mat src, - int method, - double dp, - double minDist, - imp1.CvCallback_1 callback, - ) { - return _HoughCircles_Async( - src, - method, - dp, - minDist, - callback, - ); - } - - late final _HoughCircles_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Double, ffi.Double, - imp1.CvCallback_1)>>('HoughCircles_Async'); - late final _HoughCircles_Async = _HoughCircles_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, double, double, imp1.CvCallback_1)>(); - - ffi.Pointer HoughLines( - Mat src, - Mat lines, - double rho, - double theta, - int threshold, - double srn, - double stn, - double min_theta, - double max_theta, - ) { - return _HoughLines( - src, - lines, - rho, - theta, - threshold, - srn, - stn, - min_theta, - max_theta, - ); - } - - late final _HoughLinesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - ffi.Double, - ffi.Double, - ffi.Int, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double)>>('HoughLines'); - late final _HoughLines = _HoughLinesPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, double, int, double, double, double, double)>(); - - ffi.Pointer HoughLinesP( - Mat src, - Mat lines, - double rho, - double theta, - int threshold, - ) { - return _HoughLinesP( - src, - lines, - rho, - theta, - threshold, - ); - } - - late final _HoughLinesPPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Double, ffi.Double, ffi.Int)>>('HoughLinesP'); - late final _HoughLinesP = _HoughLinesPPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, double, int)>(); - - ffi.Pointer HoughLinesPWithParams( - Mat src, - Mat lines, - double rho, - double theta, - int threshold, - double minLineLength, - double maxLineGap, - ) { - return _HoughLinesPWithParams( - src, - lines, - rho, - theta, - threshold, - minLineLength, - maxLineGap, - ); - } - - late final _HoughLinesPWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Double, - ffi.Int, ffi.Double, ffi.Double)>>('HoughLinesPWithParams'); - late final _HoughLinesPWithParams = _HoughLinesPWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, double, int, double, double)>(); - - ffi.Pointer HoughLinesPWithParams_Async( - Mat src, - double rho, - double theta, - int threshold, - double minLineLength, - double maxLineGap, - imp1.CvCallback_1 callback, - ) { - return _HoughLinesPWithParams_Async( - src, - rho, - theta, - threshold, - minLineLength, - maxLineGap, - callback, - ); - } - - late final _HoughLinesPWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Double, - ffi.Double, - ffi.Int, - ffi.Double, - ffi.Double, - imp1.CvCallback_1)>>('HoughLinesPWithParams_Async'); - late final _HoughLinesPWithParams_Async = - _HoughLinesPWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, double, int, double, double, imp1.CvCallback_1)>(); - - ffi.Pointer HoughLinesP_Async( - Mat src, - double rho, - double theta, - int threshold, - imp1.CvCallback_1 callback, - ) { - return _HoughLinesP_Async( - src, - rho, - theta, - threshold, - callback, - ); - } - - late final _HoughLinesP_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('HoughLinesP_Async'); - late final _HoughLinesP_Async = _HoughLinesP_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer HoughLinesPointSet( - Mat points, - Mat lines, - int lines_max, - int threshold, - double min_rho, - double max_rho, - double rho_step, - double min_theta, - double max_theta, - double theta_step, - ) { - return _HoughLinesPointSet( - points, - lines, - lines_max, - threshold, - min_rho, - max_rho, - rho_step, - min_theta, - max_theta, - theta_step, - ); - } - - late final _HoughLinesPointSetPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - ffi.Int, - ffi.Int, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double)>>('HoughLinesPointSet'); - late final _HoughLinesPointSet = _HoughLinesPointSetPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, int, double, double, double, - double, double, double)>(); - - ffi.Pointer HoughLinesPointSet_Async( - Mat points, - int lines_max, - int threshold, - double min_rho, - double max_rho, - double rho_step, - double min_theta, - double max_theta, - double theta_step, - imp1.CvCallback_1 callback, - ) { - return _HoughLinesPointSet_Async( - points, - lines_max, - threshold, - min_rho, - max_rho, - rho_step, - min_theta, - max_theta, - theta_step, - callback, - ); - } - - late final _HoughLinesPointSet_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Int, - ffi.Int, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - imp1.CvCallback_1)>>('HoughLinesPointSet_Async'); - late final _HoughLinesPointSet_Async = - _HoughLinesPointSet_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, double, double, double, - double, double, double, imp1.CvCallback_1)>(); - - ffi.Pointer HoughLines_Async( - Mat src, - double rho, - double theta, - int threshold, - double srn, - double stn, - double min_theta, - double max_theta, - imp1.CvCallback_1 callback, - ) { - return _HoughLines_Async( - src, - rho, - theta, - threshold, - srn, - stn, - min_theta, - max_theta, - callback, - ); - } - - late final _HoughLines_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Double, - ffi.Double, - ffi.Int, - ffi.Double, - ffi.Double, - ffi.Double, - ffi.Double, - imp1.CvCallback_1)>>('HoughLines_Async'); - late final _HoughLines_Async = _HoughLines_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, double, double, int, double, double, - double, double, imp1.CvCallback_1)>(); - - ffi.Pointer Integral( - Mat src, - Mat sum, - Mat sqsum, - Mat tilted, - int sdepth, - int sqdepth, - ) { - return _Integral( - src, - sum, - sqsum, - tilted, - sdepth, - sqdepth, - ); - } - - late final _IntegralPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, ffi.Int, ffi.Int)>>('Integral'); - late final _Integral = _IntegralPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, int, int)>(); - - ffi.Pointer Integral_Async( - Mat src, - int sdepth, - int sqdepth, - imp1.CvCallback_3 callback, - ) { - return _Integral_Async( - src, - sdepth, - sqdepth, - callback, - ); - } - - late final _Integral_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, imp1.CvCallback_3)>>('Integral_Async'); - late final _Integral_Async = _Integral_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_3)>(); - - ffi.Pointer InvertAffineTransform( - Mat src, - Mat dst, - ) { - return _InvertAffineTransform( - src, - dst, - ); - } - - late final _InvertAffineTransformPtr = - _lookup Function(Mat, Mat)>>( - 'InvertAffineTransform'); - late final _InvertAffineTransform = _InvertAffineTransformPtr.asFunction< - ffi.Pointer Function(Mat, Mat)>(); - - ffi.Pointer InvertAffineTransform_Async( - Mat src, - imp1.CvCallback_1 callback, - ) { - return _InvertAffineTransform_Async( - src, - callback, - ); - } - - late final _InvertAffineTransform_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('InvertAffineTransform_Async'); - late final _InvertAffineTransform_Async = _InvertAffineTransform_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); - - ffi.Pointer Laplacian( - Mat src, - Mat dst, - int dDepth, - int kSize, - double scale, - double delta, - int borderType, - ) { - return _Laplacian( - src, - dst, - dDepth, - kSize, - scale, - delta, - borderType, - ); - } - - late final _LaplacianPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, ffi.Double, - ffi.Double, ffi.Int)>>('Laplacian'); - late final _Laplacian = _LaplacianPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, int, double, double, int)>(); - - ffi.Pointer Laplacian_Async( - Mat src, - int dDepth, - int kSize, - double scale, - double delta, - int borderType, - imp1.CvCallback_1 callback, - ) { - return _Laplacian_Async( - src, - dDepth, - kSize, - scale, - delta, - borderType, - callback, - ); - } - - late final _Laplacian_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Double, - ffi.Double, ffi.Int, imp1.CvCallback_1)>>('Laplacian_Async'); - late final _Laplacian_Async = _Laplacian_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, double, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer Line( - Mat img, - CvPoint pt1, - CvPoint pt2, - Scalar color, - int thickness, - int lineType, - int shift, - ) { - return _Line( - img, - pt1, - pt2, - color, - thickness, - lineType, - shift, - ); - } - - late final _LinePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, ffi.Int, - ffi.Int, ffi.Int)>>('Line'); - late final _Line = _LinePtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint, CvPoint, Scalar, int, int, int)>(); - - ffi.Pointer Line_Async( - Mat img, - CvPoint pt1, - CvPoint pt2, - Scalar color, - int thickness, - int lineType, - int shift, - imp1.CvCallback_0 callback, - ) { - return _Line_Async( - img, - pt1, - pt2, - color, - thickness, - lineType, - shift, - callback, - ); - } - - late final _Line_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, ffi.Int, - ffi.Int, ffi.Int, imp1.CvCallback_0)>>('Line_Async'); - late final _Line_Async = _Line_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint, CvPoint, Scalar, int, int, int, imp1.CvCallback_0)>(); - - ffi.Pointer LinearPolar( - Mat src, - Mat dst, - CvPoint2f center, - double maxRadius, - int flags, - ) { - return _LinearPolar( - src, - dst, - center, - maxRadius, - flags, - ); - } - - late final _LinearPolarPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, CvPoint2f, ffi.Double, ffi.Int)>>('LinearPolar'); - late final _LinearPolar = _LinearPolarPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvPoint2f, double, int)>(); - - ffi.Pointer LinearPolar_Async( - Mat src, - CvPoint2f center, - double maxRadius, - int flags, - imp1.CvCallback_1 callback, - ) { - return _LinearPolar_Async( - src, - center, - maxRadius, - flags, - callback, - ); - } - - late final _LinearPolar_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint2f, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('LinearPolar_Async'); - late final _LinearPolar_Async = _LinearPolar_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint2f, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer LogPolar( - Mat src, - Mat dst, - CvPoint2f center, - double m, - int flags, - ) { - return _LogPolar( - src, - dst, - center, - m, - flags, - ); - } - - late final _LogPolarPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, CvPoint2f, ffi.Double, ffi.Int)>>('LogPolar'); - late final _LogPolar = _LogPolarPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvPoint2f, double, int)>(); - - ffi.Pointer LogPolar_Async( - Mat src, - CvPoint2f center, - double m, - int flags, - imp1.CvCallback_1 callback, - ) { - return _LogPolar_Async( - src, - center, - m, - flags, - callback, - ); - } - - late final _LogPolar_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvPoint2f, ffi.Double, ffi.Int, - imp1.CvCallback_1)>>('LogPolar_Async'); - late final _LogPolar_Async = _LogPolar_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, CvPoint2f, double, int, imp1.CvCallback_1)>(); - - ffi.Pointer Mat_Accumulate( - Mat src, - Mat dst, - ) { - return _Mat_Accumulate( - src, - dst, - ); - } - - late final _Mat_AccumulatePtr = - _lookup Function(Mat, Mat)>>( - 'Mat_Accumulate'); - late final _Mat_Accumulate = - _Mat_AccumulatePtr.asFunction Function(Mat, Mat)>(); - - ffi.Pointer Mat_AccumulateProduct( - Mat src1, - Mat src2, - Mat dst, - ) { - return _Mat_AccumulateProduct( - src1, - src2, - dst, - ); - } - - late final _Mat_AccumulateProductPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_AccumulateProduct'); - late final _Mat_AccumulateProduct = _Mat_AccumulateProductPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_AccumulateProductWithMask( - Mat src1, - Mat src2, - Mat dst, - Mat mask, - ) { - return _Mat_AccumulateProductWithMask( - src1, - src2, - dst, - mask, - ); - } - - late final _Mat_AccumulateProductWithMaskPtr = _lookup< - ffi - .NativeFunction Function(Mat, Mat, Mat, Mat)>>( - 'Mat_AccumulateProductWithMask'); - late final _Mat_AccumulateProductWithMask = _Mat_AccumulateProductWithMaskPtr - .asFunction Function(Mat, Mat, Mat, Mat)>(); - - ffi.Pointer Mat_AccumulateProductWithMask_Async( - Mat src1, - Mat src2, - Mat dst, - Mat mask, - imp1.CvCallback_0 callback, - ) { - return _Mat_AccumulateProductWithMask_Async( - src1, - src2, - dst, - mask, - callback, - ); - } - - late final _Mat_AccumulateProductWithMask_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, - imp1.CvCallback_0)>>('Mat_AccumulateProductWithMask_Async'); - late final _Mat_AccumulateProductWithMask_Async = - _Mat_AccumulateProductWithMask_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer Mat_AccumulateProduct_Async( - Mat src1, - Mat src2, - Mat dst, - imp1.CvCallback_0 callback, - ) { - return _Mat_AccumulateProduct_Async( - src1, - src2, - dst, - callback, - ); - } - - late final _Mat_AccumulateProduct_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_0)>>('Mat_AccumulateProduct_Async'); - late final _Mat_AccumulateProduct_Async = - _Mat_AccumulateProduct_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer Mat_AccumulateSquare( - Mat src, - Mat dst, - ) { - return _Mat_AccumulateSquare( - src, - dst, - ); - } - - late final _Mat_AccumulateSquarePtr = - _lookup Function(Mat, Mat)>>( - 'Mat_AccumulateSquare'); - late final _Mat_AccumulateSquare = _Mat_AccumulateSquarePtr.asFunction< - ffi.Pointer Function(Mat, Mat)>(); - - ffi.Pointer Mat_AccumulateSquareWithMask( - Mat src, - Mat dst, - Mat mask, - ) { - return _Mat_AccumulateSquareWithMask( - src, - dst, - mask, - ); - } - - late final _Mat_AccumulateSquareWithMaskPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_AccumulateSquareWithMask'); - late final _Mat_AccumulateSquareWithMask = _Mat_AccumulateSquareWithMaskPtr - .asFunction Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_AccumulateSquareWithMask_Async( - Mat src, - Mat dst, - Mat mask, - imp1.CvCallback_0 callback, - ) { - return _Mat_AccumulateSquareWithMask_Async( - src, - dst, - mask, - callback, - ); - } - - late final _Mat_AccumulateSquareWithMask_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_0)>>('Mat_AccumulateSquareWithMask_Async'); - late final _Mat_AccumulateSquareWithMask_Async = - _Mat_AccumulateSquareWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer Mat_AccumulateSquare_Async( - Mat src, - Mat dst, - imp1.CvCallback_0 callback, - ) { - return _Mat_AccumulateSquare_Async( - src, - dst, - callback, - ); - } - - late final _Mat_AccumulateSquare_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_0)>>('Mat_AccumulateSquare_Async'); - late final _Mat_AccumulateSquare_Async = - _Mat_AccumulateSquare_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer Mat_AccumulateWithMask( - Mat src, - Mat dst, - Mat mask, - ) { - return _Mat_AccumulateWithMask( - src, - dst, - mask, - ); - } - - late final _Mat_AccumulateWithMaskPtr = _lookup< - ffi.NativeFunction Function(Mat, Mat, Mat)>>( - 'Mat_AccumulateWithMask'); - late final _Mat_AccumulateWithMask = _Mat_AccumulateWithMaskPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat)>(); - - ffi.Pointer Mat_AccumulateWithMask_Async( - Mat src, - Mat dst, - Mat mask, - imp1.CvCallback_0 callback, - ) { - return _Mat_AccumulateWithMask_Async( - src, - dst, - mask, - callback, - ); - } - - late final _Mat_AccumulateWithMask_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, - imp1.CvCallback_0)>>('Mat_AccumulateWithMask_Async'); - late final _Mat_AccumulateWithMask_Async = - _Mat_AccumulateWithMask_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer Mat_Accumulate_Async( - Mat src, - Mat dst, - imp1.CvCallback_0 callback, - ) { - return _Mat_Accumulate_Async( - src, - dst, - callback, - ); - } - - late final _Mat_Accumulate_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_0)>>('Mat_Accumulate_Async'); - late final _Mat_Accumulate_Async = _Mat_Accumulate_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer Mat_AccumulatedWeighted( - Mat src, - Mat dst, - double alpha, - ) { - return _Mat_AccumulatedWeighted( - src, - dst, - alpha, - ); - } - - late final _Mat_AccumulatedWeightedPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Double)>>('Mat_AccumulatedWeighted'); - late final _Mat_AccumulatedWeighted = _Mat_AccumulatedWeightedPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double)>(); - - ffi.Pointer Mat_AccumulatedWeightedWithMask( - Mat src, - Mat dst, - double alpha, - Mat mask, - ) { - return _Mat_AccumulatedWeightedWithMask( - src, - dst, - alpha, - mask, - ); - } - - late final _Mat_AccumulatedWeightedWithMaskPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Double, Mat)>>('Mat_AccumulatedWeightedWithMask'); - late final _Mat_AccumulatedWeightedWithMask = - _Mat_AccumulatedWeightedWithMaskPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, Mat)>(); - - ffi.Pointer Mat_AccumulatedWeightedWithMask_Async( - Mat src, - Mat dst, - double alpha, - Mat mask, - imp1.CvCallback_0 callback, - ) { - return _Mat_AccumulatedWeightedWithMask_Async( - src, - dst, - alpha, - mask, - callback, - ); - } - - late final _Mat_AccumulatedWeightedWithMask_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, Mat, - imp1.CvCallback_0)>>('Mat_AccumulatedWeightedWithMask_Async'); - late final _Mat_AccumulatedWeightedWithMask_Async = - _Mat_AccumulatedWeightedWithMask_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, Mat, imp1.CvCallback_0)>(); - - ffi.Pointer Mat_AccumulatedWeighted_Async( - Mat src, - Mat dst, - double alpha, - imp1.CvCallback_0 callback, - ) { - return _Mat_AccumulatedWeighted_Async( - src, - dst, - alpha, - callback, - ); - } - - late final _Mat_AccumulatedWeighted_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, - imp1.CvCallback_0)>>('Mat_AccumulatedWeighted_Async'); - late final _Mat_AccumulatedWeighted_Async = - _Mat_AccumulatedWeighted_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, imp1.CvCallback_0)>(); - - ffi.Pointer MatchShapes( - VecPoint contour1, - VecPoint contour2, - int method, - double parameter, - ffi.Pointer rval, - ) { - return _MatchShapes( - contour1, - contour2, - method, - parameter, - rval, - ); - } - - late final _MatchShapesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, VecPoint, ffi.Int, - ffi.Double, ffi.Pointer)>>('MatchShapes'); - late final _MatchShapes = _MatchShapesPtr.asFunction< - ffi.Pointer Function( - VecPoint, VecPoint, int, double, ffi.Pointer)>(); - - ffi.Pointer MatchShapes_Async( - VecPoint contour1, - VecPoint contour2, - int method, - double parameter, - imp1.CvCallback_1 callback, - ) { - return _MatchShapes_Async( - contour1, - contour2, - method, - parameter, - callback, - ); - } - - late final _MatchShapes_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, VecPoint, ffi.Int, - ffi.Double, imp1.CvCallback_1)>>('MatchShapes_Async'); - late final _MatchShapes_Async = _MatchShapes_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint, VecPoint, int, double, imp1.CvCallback_1)>(); - - ffi.Pointer MatchTemplate( - Mat image, - Mat templ, - Mat result, - int method, - Mat mask, - ) { - return _MatchTemplate( - image, - templ, - result, - method, - mask, - ); - } - - late final _MatchTemplatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Int, Mat)>>('MatchTemplate'); - late final _MatchTemplate = _MatchTemplatePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int, Mat)>(); - - ffi.Pointer MatchTemplate_Async( - Mat image, - Mat templ, - int method, - Mat mask, - imp1.CvCallback_1 callback, - ) { - return _MatchTemplate_Async( - image, - templ, - method, - mask, - callback, - ); - } - - late final _MatchTemplate_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, - imp1.CvCallback_1)>>('MatchTemplate_Async'); - late final _MatchTemplate_Async = _MatchTemplate_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer MedianBlur( - Mat src, - Mat dst, - int ksize, - ) { - return _MedianBlur( - src, - dst, - ksize, - ); - } - - late final _MedianBlurPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int)>>('MedianBlur'); - late final _MedianBlur = _MedianBlurPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int)>(); - - ffi.Pointer MedianBlur_Async( - Mat src, - int ksize, - imp1.CvCallback_1 callback, - ) { - return _MedianBlur_Async( - src, - ksize, - callback, - ); - } - - late final _MedianBlur_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, imp1.CvCallback_1)>>('MedianBlur_Async'); - late final _MedianBlur_Async = _MedianBlur_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, imp1.CvCallback_1)>(); - - ffi.Pointer MinAreaRect( - VecPoint pts, - ffi.Pointer rval, - ) { - return _MinAreaRect( - pts, - rval, - ); - } - - late final _MinAreaRectPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, ffi.Pointer)>>('MinAreaRect'); - late final _MinAreaRect = _MinAreaRectPtr.asFunction< - ffi.Pointer Function(VecPoint, ffi.Pointer)>(); - - ffi.Pointer MinAreaRect_Async( - VecPoint pts, - imp1.CvCallback_1 callback, - ) { - return _MinAreaRect_Async( - pts, - callback, - ); - } - - late final _MinAreaRect_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, imp1.CvCallback_1)>>('MinAreaRect_Async'); - late final _MinAreaRect_Async = _MinAreaRect_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint, imp1.CvCallback_1)>(); - - ffi.Pointer MinEnclosingCircle( - VecPoint pts, - ffi.Pointer center, - ffi.Pointer radius, - ) { - return _MinEnclosingCircle( - pts, - center, - radius, - ); - } - - late final _MinEnclosingCirclePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, ffi.Pointer, - ffi.Pointer)>>('MinEnclosingCircle'); - late final _MinEnclosingCircle = _MinEnclosingCirclePtr.asFunction< - ffi.Pointer Function( - VecPoint, ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer MinEnclosingCircle_Async( - VecPoint pts, - imp1.CvCallback_2 callback, - ) { - return _MinEnclosingCircle_Async( - pts, - callback, - ); - } - - late final _MinEnclosingCircle_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VecPoint, imp1.CvCallback_2)>>('MinEnclosingCircle_Async'); - late final _MinEnclosingCircle_Async = - _MinEnclosingCircle_AsyncPtr.asFunction< - ffi.Pointer Function(VecPoint, imp1.CvCallback_2)>(); - - ffi.Pointer Moments( - Mat src, - bool binaryImage, - ffi.Pointer rval, - ) { - return _Moments( - src, - binaryImage, - rval, - ); - } - - late final _MomentsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Bool, ffi.Pointer)>>('Moments'); - late final _Moments = _MomentsPtr.asFunction< - ffi.Pointer Function(Mat, bool, ffi.Pointer)>(); - - ffi.Pointer Moments_Async( - Mat src, - bool binaryImage, - imp1.CvCallback_1 callback, - ) { - return _Moments_Async( - src, - binaryImage, - callback, - ); - } - - late final _Moments_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Bool, imp1.CvCallback_1)>>('Moments_Async'); - late final _Moments_Async = _Moments_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, bool, imp1.CvCallback_1)>(); - - ffi.Pointer MorphologyDefaultBorderValue( - ffi.Pointer rval, - ) { - return _MorphologyDefaultBorderValue( - rval, - ); - } - - late final _MorphologyDefaultBorderValuePtr = _lookup< - ffi - .NativeFunction Function(ffi.Pointer)>>( - 'MorphologyDefaultBorderValue'); - late final _MorphologyDefaultBorderValue = _MorphologyDefaultBorderValuePtr - .asFunction Function(ffi.Pointer)>(); - - ffi.Pointer MorphologyDefaultBorderValue_Async( - imp1.CvCallback_1 callback, - ) { - return _MorphologyDefaultBorderValue_Async( - callback, - ); - } - - late final _MorphologyDefaultBorderValue_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'MorphologyDefaultBorderValue_Async'); - late final _MorphologyDefaultBorderValue_Async = - _MorphologyDefaultBorderValue_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer MorphologyEx( - Mat src, - Mat dst, - int op, - Mat kernel, - ) { - return _MorphologyEx( - src, - dst, - op, - kernel, - ); - } - - late final _MorphologyExPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Int, Mat)>>('MorphologyEx'); - late final _MorphologyEx = _MorphologyExPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, Mat)>(); - - ffi.Pointer MorphologyExWithParams( - Mat src, - Mat dst, - int op, - Mat kernel, - CvPoint pt, - int iterations, - int borderType, - Scalar borderValue, - ) { - return _MorphologyExWithParams( - src, - dst, - op, - kernel, - pt, - iterations, - borderType, - borderValue, - ); - } - - late final _MorphologyExWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, CvPoint, - ffi.Int, ffi.Int, Scalar)>>('MorphologyExWithParams'); - late final _MorphologyExWithParams = _MorphologyExWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, Mat, CvPoint, int, int, Scalar)>(); - - ffi.Pointer MorphologyExWithParams_Async( - Mat src, - int op, - Mat kernel, - CvPoint pt, - int iterations, - int borderType, - Scalar borderValue, - imp1.CvCallback_1 callback, - ) { - return _MorphologyExWithParams_Async( - src, - op, - kernel, - pt, - iterations, - borderType, - borderValue, - callback, - ); - } - - late final _MorphologyExWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Int, - Mat, - CvPoint, - ffi.Int, - ffi.Int, - Scalar, - imp1.CvCallback_1)>>('MorphologyExWithParams_Async'); - late final _MorphologyExWithParams_Async = - _MorphologyExWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_1)>(); - - ffi.Pointer MorphologyEx_Async( - Mat src, - int op, - Mat kernel, - imp1.CvCallback_1 callback, - ) { - return _MorphologyEx_Async( - src, - op, - kernel, - callback, - ); - } - - late final _MorphologyEx_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, Mat, imp1.CvCallback_1)>>('MorphologyEx_Async'); - late final _MorphologyEx_Async = _MorphologyEx_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer PhaseCorrelate( - Mat src1, - Mat src2, - Mat window, - ffi.Pointer response, - ffi.Pointer rval, - ) { - return _PhaseCorrelate( - src1, - src2, - window, - response, - rval, - ); - } - - late final _PhaseCorrelatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer, - ffi.Pointer)>>('PhaseCorrelate'); - late final _PhaseCorrelate = _PhaseCorrelatePtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer PhaseCorrelate_Async( - Mat src1, - Mat src2, - Mat window, - imp1.CvCallback_2 callback, - ) { - return _PhaseCorrelate_Async( - src1, - src2, - window, - callback, - ); - } - - late final _PhaseCorrelate_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, imp1.CvCallback_2)>>('PhaseCorrelate_Async'); - late final _PhaseCorrelate_Async = _PhaseCorrelate_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_2)>(); - - ffi.Pointer PointPolygonTest( - VecPoint pts, - CvPoint2f pt, - bool measureDist, - ffi.Pointer rval, - ) { - return _PointPolygonTest( - pts, - pt, - measureDist, - rval, - ); - } - - late final _PointPolygonTestPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, CvPoint2f, ffi.Bool, - ffi.Pointer)>>('PointPolygonTest'); - late final _PointPolygonTest = _PointPolygonTestPtr.asFunction< - ffi.Pointer Function( - VecPoint, CvPoint2f, bool, ffi.Pointer)>(); - - ffi.Pointer PointPolygonTest_Async( - VecPoint pts, - CvPoint2f pt, - bool measureDist, - imp1.CvCallback_1 callback, - ) { - return _PointPolygonTest_Async( - pts, - pt, - measureDist, - callback, - ); - } - - late final _PointPolygonTest_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecPoint, CvPoint2f, ffi.Bool, - imp1.CvCallback_1)>>('PointPolygonTest_Async'); - late final _PointPolygonTest_Async = _PointPolygonTest_AsyncPtr.asFunction< - ffi.Pointer Function( - VecPoint, CvPoint2f, bool, imp1.CvCallback_1)>(); - - ffi.Pointer Polylines( - Mat img, - VecVecPoint points, - bool isClosed, - Scalar color, - int thickness, - ) { - return _Polylines( - img, - points, - isClosed, - color, - thickness, - ); - } - - late final _PolylinesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, VecVecPoint, ffi.Bool, Scalar, ffi.Int)>>('Polylines'); - late final _Polylines = _PolylinesPtr.asFunction< - ffi.Pointer Function(Mat, VecVecPoint, bool, Scalar, int)>(); - - ffi.Pointer Polylines_Async( - Mat img, - VecVecPoint points, - bool isClosed, - Scalar color, - int thickness, - imp1.CvCallback_0 callback, - ) { - return _Polylines_Async( - img, - points, - isClosed, - color, - thickness, - callback, - ); - } - - late final _Polylines_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, VecVecPoint, ffi.Bool, Scalar, - ffi.Int, imp1.CvCallback_0)>>('Polylines_Async'); - late final _Polylines_Async = _Polylines_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, VecVecPoint, bool, Scalar, int, imp1.CvCallback_0)>(); - - ffi.Pointer PutText( - Mat img, - ffi.Pointer text, - CvPoint org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - ) { - return _PutText( - img, - text, - org, - fontFace, - fontScale, - color, - thickness, - ); - } - - late final _PutTextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, - ffi.Int, ffi.Double, Scalar, ffi.Int)>>('PutText'); - late final _PutText = _PutTextPtr.asFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, CvPoint, int, double, Scalar, int)>(); - - ffi.Pointer PutTextWithParams( - Mat img, - ffi.Pointer text, - CvPoint org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - int lineType, - bool bottomLeftOrigin, - ) { - return _PutTextWithParams( - img, - text, - org, - fontFace, - fontScale, - color, - thickness, - lineType, - bottomLeftOrigin, - ); - } - - late final _PutTextWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - CvPoint, - ffi.Int, - ffi.Double, - Scalar, - ffi.Int, - ffi.Int, - ffi.Bool)>>('PutTextWithParams'); - late final _PutTextWithParams = _PutTextWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, int, - double, Scalar, int, int, bool)>(); - - ffi.Pointer PutTextWithParams_Async( - Mat img, - ffi.Pointer text, - CvPoint org, - int fontFace, - double fontScale, - Scalar color, - int thickness, - int lineType, - bool bottomLeftOrigin, - imp1.CvCallback_0 callback, - ) { - return _PutTextWithParams_Async( - img, - text, - org, - fontFace, - fontScale, - color, - thickness, - lineType, - bottomLeftOrigin, - callback, - ); - } - - late final _PutTextWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - CvPoint, - ffi.Int, - ffi.Double, - Scalar, - ffi.Int, - ffi.Int, - ffi.Bool, - imp1.CvCallback_0)>>('PutTextWithParams_Async'); - late final _PutTextWithParams_Async = _PutTextWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, int, - double, Scalar, int, int, bool, imp1.CvCallback_0)>(); - - ffi.Pointer PutText_Async( + ffi.Pointer cv_circle_1( Mat img, - ffi.Pointer text, - CvPoint org, - int fontFace, - double fontScale, + CvPoint center, + int radius, Scalar color, int thickness, + int lineType, + int shift, imp1.CvCallback_0 callback, ) { - return _PutText_Async( + return _cv_circle_1( img, - text, - org, - fontFace, - fontScale, + center, + radius, color, thickness, + lineType, + shift, callback, ); } - late final _PutText_AsyncPtr = _lookup< + late final _cv_circle_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, - ffi.Pointer, - CvPoint, - ffi.Int, - ffi.Double, - Scalar, - ffi.Int, - imp1.CvCallback_0)>>('PutText_Async'); - late final _PutText_Async = _PutText_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, int, - double, Scalar, int, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, CvPoint, ffi.Int, Scalar, ffi.Int, + ffi.Int, ffi.Int, imp1.CvCallback_0)>>('cv_circle_1'); + late final _cv_circle_1 = _cv_circle_1Ptr.asFunction< + ffi.Pointer Function( + Mat, CvPoint, int, Scalar, int, int, int, imp1.CvCallback_0)>(); - ffi.Pointer PyrDown( - Mat src, - Mat dst, - CvSize dstsize, - int borderType, + ffi.Pointer cv_clipLine( + CvRect imgRect, + CvPoint pt1, + CvPoint pt2, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _PyrDown( - src, - dst, - dstsize, - borderType, + return _cv_clipLine( + imgRect, + pt1, + pt2, + rval, + callback, ); } - late final _PyrDownPtr = _lookup< + late final _cv_clipLinePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, CvSize, ffi.Int)>>('PyrDown'); - late final _PyrDown = _PyrDownPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvSize, int)>(); + ffi.Pointer Function(CvRect, CvPoint, CvPoint, + ffi.Pointer, imp1.CvCallback_0)>>('cv_clipLine'); + late final _cv_clipLine = _cv_clipLinePtr.asFunction< + ffi.Pointer Function(CvRect, CvPoint, CvPoint, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer PyrDown_Async( - Mat src, - CvSize dstsize, - int borderType, - imp1.CvCallback_1 callback, + ffi.Pointer cv_compareHist( + Mat hist1, + Mat hist2, + int method, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _PyrDown_Async( - src, - dstsize, - borderType, + return _cv_compareHist( + hist1, + hist2, + method, + rval, callback, ); } - late final _PyrDown_AsyncPtr = _lookup< + late final _cv_compareHistPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, CvSize, ffi.Int, imp1.CvCallback_1)>>('PyrDown_Async'); - late final _PyrDown_Async = _PyrDown_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, CvSize, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_compareHist'); + late final _cv_compareHist = _cv_compareHistPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer PyrUp( + ffi.Pointer cv_connectedComponents( Mat src, Mat dst, - CvSize dstsize, - int borderType, + int connectivity, + int ltype, + int ccltype, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _PyrUp( + return _cv_connectedComponents( src, dst, - dstsize, - borderType, - ); - } - - late final _PyrUpPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvSize, ffi.Int)>>('PyrUp'); - late final _PyrUp = _PyrUpPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvSize, int)>(); - - ffi.Pointer PyrUp_Async( - Mat src, - CvSize dstsize, - int borderType, - imp1.CvCallback_1 callback, - ) { - return _PyrUp_Async( - src, - dstsize, - borderType, + connectivity, + ltype, + ccltype, + rval, callback, ); } - late final _PyrUp_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, CvSize, ffi.Int, imp1.CvCallback_1)>>('PyrUp_Async'); - late final _PyrUp_Async = _PyrUp_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, CvSize, int, imp1.CvCallback_1)>(); - - ffi.Pointer Rectangle( - Mat img, - CvRect rect, - Scalar color, - int thickness, - ) { - return _Rectangle( - img, - rect, - color, - thickness, - ); - } - - late final _RectanglePtr = _lookup< + late final _cv_connectedComponentsPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, CvRect, Scalar, ffi.Int)>>('Rectangle'); - late final _Rectangle = _RectanglePtr.asFunction< - ffi.Pointer Function(Mat, CvRect, Scalar, int)>(); - - ffi.Pointer RectangleWithParams( - Mat img, - CvRect rect, - Scalar color, - int thickness, - int lineType, - int shift, - ) { - return _RectangleWithParams( - img, - rect, - color, - thickness, - lineType, - shift, - ); - } - - late final _RectangleWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, CvRect, Scalar, ffi.Int, ffi.Int, - ffi.Int)>>('RectangleWithParams'); - late final _RectangleWithParams = _RectangleWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, CvRect, Scalar, int, int, int)>(); + Mat, + Mat, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_connectedComponents'); + late final _cv_connectedComponents = _cv_connectedComponentsPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer RectangleWithParams_Async( - Mat img, - CvRect rect, - Scalar color, - int thickness, - int lineType, - int shift, + ffi.Pointer cv_connectedComponents_1( + Mat src, + Mat labels, + Mat stats, + Mat centroids, + int connectivity, + int ltype, + int ccltype, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _RectangleWithParams_Async( - img, - rect, - color, - thickness, - lineType, - shift, + return _cv_connectedComponents_1( + src, + labels, + stats, + centroids, + connectivity, + ltype, + ccltype, + rval, callback, ); } - late final _RectangleWithParams_AsyncPtr = _lookup< + late final _cv_connectedComponents_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, CvRect, Scalar, ffi.Int, ffi.Int, - ffi.Int, imp1.CvCallback_0)>>('RectangleWithParams_Async'); - late final _RectangleWithParams_Async = - _RectangleWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, CvRect, Scalar, int, int, int, imp1.CvCallback_0)>(); + Mat, + Mat, + Mat, + Mat, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_connectedComponents_1'); + late final _cv_connectedComponents_1 = + _cv_connectedComponents_1Ptr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, int, int, int, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Rectangle_Async( - Mat img, - CvRect rect, - Scalar color, - int thickness, + ffi.Pointer cv_contourArea( + VecPoint pts, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _Rectangle_Async( - img, - rect, - color, - thickness, + return _cv_contourArea( + pts, + rval, callback, ); } - late final _Rectangle_AsyncPtr = _lookup< + late final _cv_contourAreaPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, CvRect, Scalar, ffi.Int, - imp1.CvCallback_0)>>('Rectangle_Async'); - late final _Rectangle_Async = _Rectangle_AsyncPtr.asFunction< + ffi.Pointer Function(VecPoint, ffi.Pointer, + imp1.CvCallback_0)>>('cv_contourArea'); + late final _cv_contourArea = _cv_contourAreaPtr.asFunction< ffi.Pointer Function( - Mat, CvRect, Scalar, int, imp1.CvCallback_0)>(); - - ffi.Pointer Remap( - Mat src, - Mat dst, - Mat map1, - Mat map2, - int interpolation, - int borderMode, - Scalar borderValue, - ) { - return _Remap( - src, - dst, - map1, - map2, - interpolation, - borderMode, - borderValue, - ); - } - - late final _RemapPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, Mat, ffi.Int, ffi.Int, Scalar)>>('Remap'); - late final _Remap = _RemapPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, Mat, int, int, Scalar)>(); + VecPoint, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Remap_Async( - Mat src, - Mat map1, - Mat map2, - int interpolation, - int borderMode, - Scalar borderValue, - imp1.CvCallback_1 callback, + ffi.Pointer cv_convexHull( + VecPoint points, + Mat hull, + bool clockwise, + bool returnPoints, + imp1.CvCallback_0 callback, ) { - return _Remap_Async( - src, - map1, - map2, - interpolation, - borderMode, - borderValue, + return _cv_convexHull( + points, + hull, + clockwise, + returnPoints, callback, ); } - late final _Remap_AsyncPtr = _lookup< + late final _cv_convexHullPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, ffi.Int, - Scalar, imp1.CvCallback_1)>>('Remap_Async'); - late final _Remap_Async = _Remap_AsyncPtr.asFunction< + ffi.Pointer Function(VecPoint, Mat, ffi.Bool, ffi.Bool, + imp1.CvCallback_0)>>('cv_convexHull'); + late final _cv_convexHull = _cv_convexHullPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, int, int, Scalar, imp1.CvCallback_1)>(); + VecPoint, Mat, bool, bool, imp1.CvCallback_0)>(); - ffi.Pointer Resize( - Mat src, - Mat dst, - CvSize sz, - double fx, - double fy, - int interp, + ffi.Pointer cv_convexityDefects( + VecPoint points, + Mat hull, + Mat result, + imp1.CvCallback_0 callback, ) { - return _Resize( - src, - dst, - sz, - fx, - fy, - interp, + return _cv_convexityDefects( + points, + hull, + result, + callback, ); } - late final _ResizePtr = _lookup< + late final _cv_convexityDefectsPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, CvSize, ffi.Double, ffi.Double, ffi.Int)>>('Resize'); - late final _Resize = _ResizePtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvSize, double, double, int)>(); + VecPoint, Mat, Mat, imp1.CvCallback_0)>>('cv_convexityDefects'); + late final _cv_convexityDefects = _cv_convexityDefectsPtr.asFunction< + ffi.Pointer Function(VecPoint, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Resize_Async( - Mat src, - CvSize sz, - double fx, - double fy, - int interp, - imp1.CvCallback_1 callback, + ffi.Pointer cv_cornerSubPix( + Mat img, + VecPoint2f corners, + CvSize winSize, + CvSize zeroZone, + TermCriteria criteria, + imp1.CvCallback_0 callback, ) { - return _Resize_Async( - src, - sz, - fx, - fy, - interp, + return _cv_cornerSubPix( + img, + corners, + winSize, + zeroZone, + criteria, callback, ); } - late final _Resize_AsyncPtr = _lookup< + late final _cv_cornerSubPixPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, ffi.Double, ffi.Double, - ffi.Int, imp1.CvCallback_1)>>('Resize_Async'); - late final _Resize_Async = _Resize_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, VecPoint2f, CvSize, CvSize, + TermCriteria, imp1.CvCallback_0)>>('cv_cornerSubPix'); + late final _cv_cornerSubPix = _cv_cornerSubPixPtr.asFunction< ffi.Pointer Function( - Mat, CvSize, double, double, int, imp1.CvCallback_1)>(); + Mat, VecPoint2f, CvSize, CvSize, TermCriteria, imp1.CvCallback_0)>(); - ffi.Pointer Scharr( + ffi.Pointer cv_cvtColor( Mat src, Mat dst, - int dDepth, - int dx, - int dy, - double scale, - double delta, - int borderType, + int code, + imp1.CvCallback_0 callback, ) { - return _Scharr( + return _cv_cvtColor( src, dst, - dDepth, - dx, - dy, - scale, - delta, - borderType, + code, + callback, ); } - late final _ScharrPtr = _lookup< + late final _cv_cvtColorPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Double, ffi.Double, ffi.Int)>>('Scharr'); - late final _Scharr = _ScharrPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, int, int, double, double, int)>(); + ffi.Pointer Function( + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_cvtColor'); + late final _cv_cvtColor = _cv_cvtColorPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer Scharr_Async( + ffi.Pointer cv_dilate( Mat src, - int dDepth, - int dx, - int dy, - double scale, - double delta, - int borderType, - imp1.CvCallback_1 callback, + Mat dst, + Mat kernel, + imp1.CvCallback_0 callback, ) { - return _Scharr_Async( + return _cv_dilate( src, - dDepth, - dx, - dy, - scale, - delta, - borderType, + dst, + kernel, callback, ); } - late final _Scharr_AsyncPtr = _lookup< + late final _cv_dilatePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Double, - ffi.Double, - ffi.Int, - imp1.CvCallback_1)>>('Scharr_Async'); - late final _Scharr_Async = _Scharr_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, double, double, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_dilate'); + late final _cv_dilate = _cv_dilatePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer SepFilter2D( + ffi.Pointer cv_dilate_1( Mat src, Mat dst, - int ddepth, - Mat kernelX, - Mat kernelY, + Mat kernel, CvPoint anchor, - double delta, + int iterations, int borderType, + Scalar borderValue, + imp1.CvCallback_0 callback, ) { - return _SepFilter2D( + return _cv_dilate_1( src, dst, - ddepth, - kernelX, - kernelY, + kernel, anchor, - delta, + iterations, borderType, + borderValue, + callback, ); } - late final _SepFilter2DPtr = _lookup< + late final _cv_dilate_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, Mat, CvPoint, - ffi.Double, ffi.Int)>>('SepFilter2D'); - late final _SepFilter2D = _SepFilter2DPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, CvPoint, ffi.Int, + ffi.Int, Scalar, imp1.CvCallback_0)>>('cv_dilate_1'); + late final _cv_dilate_1 = _cv_dilate_1Ptr.asFunction< ffi.Pointer Function( - Mat, Mat, int, Mat, Mat, CvPoint, double, int)>(); + Mat, Mat, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer SepFilter2D_Async( + ffi.Pointer cv_distanceTransform( Mat src, - int ddepth, - Mat kernelX, - Mat kernelY, - CvPoint anchor, - double delta, - int borderType, - imp1.CvCallback_1 callback, + Mat dst, + Mat labels, + int distanceType, + int maskSize, + int labelType, + imp1.CvCallback_0 callback, ) { - return _SepFilter2D_Async( + return _cv_distanceTransform( src, - ddepth, - kernelX, - kernelY, - anchor, - delta, - borderType, + dst, + labels, + distanceType, + maskSize, + labelType, callback, ); } - late final _SepFilter2D_AsyncPtr = _lookup< + late final _cv_distanceTransformPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, Mat, Mat, CvPoint, - ffi.Double, ffi.Int, imp1.CvCallback_1)>>('SepFilter2D_Async'); - late final _SepFilter2D_Async = _SepFilter2D_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, ffi.Int, + ffi.Int, imp1.CvCallback_0)>>('cv_distanceTransform'); + late final _cv_distanceTransform = _cv_distanceTransformPtr.asFunction< ffi.Pointer Function( - Mat, int, Mat, Mat, CvPoint, double, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, int, int, int, imp1.CvCallback_0)>(); - ffi.Pointer Sobel( + ffi.Pointer cv_drawContours( Mat src, - Mat dst, - int ddepth, - int dx, - int dy, - int ksize, - double scale, - double delta, - int borderType, + VecVecPoint contours, + int contourIdx, + Scalar color, + int thickness, + imp1.CvCallback_0 callback, ) { - return _Sobel( + return _cv_drawContours( src, - dst, - ddepth, - dx, - dy, - ksize, - scale, - delta, - borderType, + contours, + contourIdx, + color, + thickness, + callback, ); } - late final _SobelPtr = _lookup< + late final _cv_drawContoursPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Int, ffi.Double, ffi.Double, ffi.Int)>>('Sobel'); - late final _Sobel = _SobelPtr.asFunction< + ffi.Pointer Function(Mat, VecVecPoint, ffi.Int, Scalar, + ffi.Int, imp1.CvCallback_0)>>('cv_drawContours'); + late final _cv_drawContours = _cv_drawContoursPtr.asFunction< ffi.Pointer Function( - Mat, Mat, int, int, int, int, double, double, int)>(); + Mat, VecVecPoint, int, Scalar, int, imp1.CvCallback_0)>(); - ffi.Pointer Sobel_Async( + ffi.Pointer cv_drawContours_1( Mat src, - int ddepth, - int dx, - int dy, - int ksize, - double scale, - double delta, - int borderType, - imp1.CvCallback_1 callback, + VecVecPoint contours, + int contourIdx, + Scalar color, + int thickness, + int lineType, + Mat hierarchy, + int maxLevel, + CvPoint offset, + imp1.CvCallback_0 callback, ) { - return _Sobel_Async( + return _cv_drawContours_1( src, - ddepth, - dx, - dy, - ksize, - scale, - delta, - borderType, + contours, + contourIdx, + color, + thickness, + lineType, + hierarchy, + maxLevel, + offset, callback, ); } - late final _Sobel_AsyncPtr = _lookup< + late final _cv_drawContours_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( Mat, + VecVecPoint, ffi.Int, + Scalar, ffi.Int, ffi.Int, + Mat, ffi.Int, + CvPoint, + imp1.CvCallback_0)>>('cv_drawContours_1'); + late final _cv_drawContours_1 = _cv_drawContours_1Ptr.asFunction< + ffi.Pointer Function(Mat, VecVecPoint, int, Scalar, int, int, + Mat, int, CvPoint, imp1.CvCallback_0)>(); + + ffi.Pointer cv_ellipse( + Mat img, + CvPoint center, + CvPoint axes, + double angle, + double startAngle, + double endAngle, + Scalar color, + int thickness, + imp1.CvCallback_0 callback, + ) { + return _cv_ellipse( + img, + center, + axes, + angle, + startAngle, + endAngle, + color, + thickness, + callback, + ); + } + + late final _cv_ellipsePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, + CvPoint, + CvPoint, + ffi.Double, ffi.Double, ffi.Double, + Scalar, ffi.Int, - imp1.CvCallback_1)>>('Sobel_Async'); - late final _Sobel_Async = _Sobel_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, int, int, int, double, double, int, imp1.CvCallback_1)>(); + imp1.CvCallback_0)>>('cv_ellipse'); + late final _cv_ellipse = _cv_ellipsePtr.asFunction< + ffi.Pointer Function(Mat, CvPoint, CvPoint, double, double, + double, Scalar, int, imp1.CvCallback_0)>(); + + ffi.Pointer cv_ellipse_1( + Mat img, + CvPoint center, + CvPoint axes, + double angle, + double startAngle, + double endAngle, + Scalar color, + int thickness, + int lineType, + int shift, + imp1.CvCallback_0 callback, + ) { + return _cv_ellipse_1( + img, + center, + axes, + angle, + startAngle, + endAngle, + color, + thickness, + lineType, + shift, + callback, + ); + } + + late final _cv_ellipse_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, + CvPoint, + CvPoint, + ffi.Double, + ffi.Double, + ffi.Double, + Scalar, + ffi.Int, + ffi.Int, + ffi.Int, + imp1.CvCallback_0)>>('cv_ellipse_1'); + late final _cv_ellipse_1 = _cv_ellipse_1Ptr.asFunction< + ffi.Pointer Function(Mat, CvPoint, CvPoint, double, double, + double, Scalar, int, int, int, imp1.CvCallback_0)>(); - ffi.Pointer SpatialGradient( + ffi.Pointer cv_equalizeHist( Mat src, - Mat dx, - Mat dy, - int ksize, - int borderType, + Mat dst, + imp1.CvCallback_0 callback, + ) { + return _cv_equalizeHist( + src, + dst, + callback, + ); + } + + late final _cv_equalizeHistPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, imp1.CvCallback_0)>>('cv_equalizeHist'); + late final _cv_equalizeHist = _cv_equalizeHistPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_erode( + Mat src, + Mat dst, + Mat kernel, + imp1.CvCallback_0 callback, ) { - return _SpatialGradient( + return _cv_erode( src, - dx, - dy, - ksize, - borderType, + dst, + kernel, + callback, ); } - late final _SpatialGradientPtr = _lookup< + late final _cv_erodePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, ffi.Int, ffi.Int)>>('SpatialGradient'); - late final _SpatialGradient = _SpatialGradientPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int, int)>(); + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_erode'); + late final _cv_erode = _cv_erodePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer SpatialGradient_Async( + ffi.Pointer cv_erode_1( Mat src, - int ksize, + Mat dst, + Mat kernel, + CvPoint anchor, + int iterations, int borderType, - imp1.CvCallback_2 callback, + Scalar borderValue, + imp1.CvCallback_0 callback, ) { - return _SpatialGradient_Async( + return _cv_erode_1( src, - ksize, + dst, + kernel, + anchor, + iterations, borderType, + borderValue, callback, ); } - late final _SpatialGradient_AsyncPtr = _lookup< + late final _cv_erode_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, - imp1.CvCallback_2)>>('SpatialGradient_Async'); - late final _SpatialGradient_Async = _SpatialGradient_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, int, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, Mat, Mat, CvPoint, ffi.Int, + ffi.Int, Scalar, imp1.CvCallback_0)>>('cv_erode_1'); + late final _cv_erode_1 = _cv_erode_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer SqBoxFilter_Async( - Mat src, - int ddepth, - CvSize ps, - imp1.CvCallback_1 callback, + ffi.Pointer cv_fillPoly( + Mat img, + VecVecPoint points, + Scalar color, + imp1.CvCallback_0 callback, ) { - return _SqBoxFilter_Async( - src, - ddepth, - ps, + return _cv_fillPoly( + img, + points, + color, callback, ); } - late final _SqBoxFilter_AsyncPtr = _lookup< + late final _cv_fillPolyPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Int, CvSize, imp1.CvCallback_1)>>('SqBoxFilter_Async'); - late final _SqBoxFilter_Async = _SqBoxFilter_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, int, CvSize, imp1.CvCallback_1)>(); + Mat, VecVecPoint, Scalar, imp1.CvCallback_0)>>('cv_fillPoly'); + late final _cv_fillPoly = _cv_fillPolyPtr.asFunction< + ffi.Pointer Function( + Mat, VecVecPoint, Scalar, imp1.CvCallback_0)>(); + + ffi.Pointer cv_fillPoly_1( + Mat img, + VecVecPoint points, + Scalar color, + int lineType, + int shift, + CvPoint offset, + imp1.CvCallback_0 callback, + ) { + return _cv_fillPoly_1( + img, + points, + color, + lineType, + shift, + offset, + callback, + ); + } + + late final _cv_fillPoly_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, VecVecPoint, Scalar, ffi.Int, + ffi.Int, CvPoint, imp1.CvCallback_0)>>('cv_fillPoly_1'); + late final _cv_fillPoly_1 = _cv_fillPoly_1Ptr.asFunction< + ffi.Pointer Function( + Mat, VecVecPoint, Scalar, int, int, CvPoint, imp1.CvCallback_0)>(); - ffi.Pointer SqrBoxFilter( + ffi.Pointer cv_filter2D( Mat src, Mat dst, int ddepth, - CvSize ps, + Mat kernel, CvPoint anchor, - bool normalize, + double delta, int borderType, + imp1.CvCallback_0 callback, ) { - return _SqrBoxFilter( + return _cv_filter2D( src, dst, ddepth, - ps, + kernel, anchor, - normalize, + delta, borderType, + callback, ); } - late final _SqrBoxFilterPtr = _lookup< + late final _cv_filter2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, CvSize, CvPoint, - ffi.Bool, ffi.Int)>>('SqrBoxFilter'); - late final _SqrBoxFilter = _SqrBoxFilterPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, CvPoint, + ffi.Double, ffi.Int, imp1.CvCallback_0)>>('cv_filter2D'); + late final _cv_filter2D = _cv_filter2DPtr.asFunction< ffi.Pointer Function( - Mat, Mat, int, CvSize, CvPoint, bool, int)>(); + Mat, Mat, int, Mat, CvPoint, double, int, imp1.CvCallback_0)>(); - void Subdiv2D_Close( - Subdiv2DPtr self, + ffi.Pointer cv_findContours( + Mat src, + Mat hierarchy, + int mode, + int method, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_Close( - self, + return _cv_findContours( + src, + hierarchy, + mode, + method, + rval, + callback, ); } - late final _Subdiv2D_ClosePtr = - _lookup>( - 'Subdiv2D_Close'); - late final _Subdiv2D_Close = - _Subdiv2D_ClosePtr.asFunction(); + late final _cv_findContoursPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_findContours'); + late final _cv_findContours = _cv_findContoursPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - void Subdiv2D_Close_Async( - Subdiv2DPtr self, + ffi.Pointer cv_fitEllipse( + VecPoint pts, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _Subdiv2D_Close_Async( - self, + return _cv_fitEllipse( + pts, + rval, callback, ); } - late final _Subdiv2D_Close_AsyncPtr = _lookup< - ffi - .NativeFunction>( - 'Subdiv2D_Close_Async'); - late final _Subdiv2D_Close_Async = _Subdiv2D_Close_AsyncPtr.asFunction< - void Function(Subdiv2DPtr, imp1.CvCallback_0)>(); + late final _cv_fitEllipsePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VecPoint, ffi.Pointer, + imp1.CvCallback_0)>>('cv_fitEllipse'); + late final _cv_fitEllipse = _cv_fitEllipsePtr.asFunction< + ffi.Pointer Function( + VecPoint, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_EdgeDst( - Subdiv2D self, - int edge, - ffi.Pointer dstpt, + ffi.Pointer cv_fitLine( + VecPoint pts, + Mat line, + int distType, + double param, + double reps, + double aeps, + imp1.CvCallback_0 callback, + ) { + return _cv_fitLine( + pts, + line, + distType, + param, + reps, + aeps, + callback, + ); + } + + late final _cv_fitLinePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VecPoint, Mat, ffi.Int, ffi.Double, + ffi.Double, ffi.Double, imp1.CvCallback_0)>>('cv_fitLine'); + late final _cv_fitLine = _cv_fitLinePtr.asFunction< + ffi.Pointer Function( + VecPoint, Mat, int, double, double, double, imp1.CvCallback_0)>(); + + ffi.Pointer cv_floodFill( + Mat src, + Mat mask, + CvPoint seedPoint, + Scalar newVal, + ffi.Pointer rect, + Scalar loDiff, + Scalar upDiff, + int flags, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_EdgeDst( - self, - edge, - dstpt, + return _cv_floodFill( + src, + mask, + seedPoint, + newVal, + rect, + loDiff, + upDiff, + flags, rval, + callback, ); } - late final _Subdiv2D_EdgeDstPtr = _lookup< + late final _cv_floodFillPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Subdiv2D, + Mat, + Mat, + CvPoint, + Scalar, + ffi.Pointer, + Scalar, + Scalar, ffi.Int, - ffi.Pointer, - ffi.Pointer)>>('Subdiv2D_EdgeDst'); - late final _Subdiv2D_EdgeDst = _Subdiv2D_EdgeDstPtr.asFunction< + ffi.Pointer, + imp1.CvCallback_0)>>('cv_floodFill'); + late final _cv_floodFill = _cv_floodFillPtr.asFunction< + ffi.Pointer Function( + Mat, + Mat, + CvPoint, + Scalar, + ffi.Pointer, + Scalar, + Scalar, + int, + ffi.Pointer, + imp1.CvCallback_0)>(); + + ffi.Pointer cv_getAffineTransform( + VecPoint src, + VecPoint dst, + Mat rval, + imp1.CvCallback_0 callback, + ) { + return _cv_getAffineTransform( + src, + dst, + rval, + callback, + ); + } + + late final _cv_getAffineTransformPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(VecPoint, VecPoint, Mat, + imp1.CvCallback_0)>>('cv_getAffineTransform'); + late final _cv_getAffineTransform = _cv_getAffineTransformPtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); + VecPoint, VecPoint, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_EdgeDst_Async( - Subdiv2D self, - int edge, - imp1.CvCallback_2 callback, + ffi.Pointer cv_getAffineTransform2f( + VecPoint2f src, + VecPoint2f dst, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_EdgeDst_Async( - self, - edge, + return _cv_getAffineTransform2f( + src, + dst, + rval, callback, ); } - late final _Subdiv2D_EdgeDst_AsyncPtr = _lookup< + late final _cv_getAffineTransform2fPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, ffi.Int, imp1.CvCallback_2)>>('Subdiv2D_EdgeDst_Async'); - late final _Subdiv2D_EdgeDst_Async = _Subdiv2D_EdgeDst_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, int, imp1.CvCallback_2)>(); + ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, + imp1.CvCallback_0)>>('cv_getAffineTransform2f'); + late final _cv_getAffineTransform2f = _cv_getAffineTransform2fPtr.asFunction< + ffi.Pointer Function( + VecPoint2f, VecPoint2f, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_EdgeOrg( - Subdiv2D self, - int edge, - ffi.Pointer orgpt, - ffi.Pointer rval, + ffi.Pointer cv_getGaussianKernel( + int ksize, + double sigma, + int ktype, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_EdgeOrg( - self, - edge, - orgpt, + return _cv_getGaussianKernel( + ksize, + sigma, + ktype, rval, + callback, ); } - late final _Subdiv2D_EdgeOrgPtr = _lookup< + late final _cv_getGaussianKernelPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, - ffi.Int, - ffi.Pointer, - ffi.Pointer)>>('Subdiv2D_EdgeOrg'); - late final _Subdiv2D_EdgeOrg = _Subdiv2D_EdgeOrgPtr.asFunction< + ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Int, Mat, + imp1.CvCallback_0)>>('cv_getGaussianKernel'); + late final _cv_getGaussianKernel = _cv_getGaussianKernelPtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); + int, double, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_EdgeOrg_Async( - Subdiv2D self, - int edge, - imp1.CvCallback_2 callback, + ffi.Pointer cv_getPerspectiveTransform( + VecPoint src, + VecPoint dst, + Mat rval, + int solveMethod, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_EdgeOrg_Async( - self, - edge, + return _cv_getPerspectiveTransform( + src, + dst, + rval, + solveMethod, callback, ); } - late final _Subdiv2D_EdgeOrg_AsyncPtr = _lookup< + late final _cv_getPerspectiveTransformPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(VecPoint, VecPoint, Mat, ffi.Int, + imp1.CvCallback_0)>>('cv_getPerspectiveTransform'); + late final _cv_getPerspectiveTransform = + _cv_getPerspectiveTransformPtr.asFunction< ffi.Pointer Function( - Subdiv2D, ffi.Int, imp1.CvCallback_2)>>('Subdiv2D_EdgeOrg_Async'); - late final _Subdiv2D_EdgeOrg_Async = _Subdiv2D_EdgeOrg_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, int, imp1.CvCallback_2)>(); + VecPoint, VecPoint, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_FindNearest( - Subdiv2D self, - CvPoint2f pt, - ffi.Pointer nearestPt, - ffi.Pointer rval, + ffi.Pointer cv_getPerspectiveTransform2f( + VecPoint2f src, + VecPoint2f dst, + Mat rval, + int solveMethod, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_FindNearest( - self, - pt, - nearestPt, + return _cv_getPerspectiveTransform2f( + src, + dst, rval, + solveMethod, + callback, ); } - late final _Subdiv2D_FindNearestPtr = _lookup< + late final _cv_getPerspectiveTransform2fPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, ffi.Int, + imp1.CvCallback_0)>>('cv_getPerspectiveTransform2f'); + late final _cv_getPerspectiveTransform2f = + _cv_getPerspectiveTransform2fPtr.asFunction< ffi.Pointer Function( - Subdiv2D, - CvPoint2f, - ffi.Pointer, - ffi.Pointer)>>('Subdiv2D_FindNearest'); - late final _Subdiv2D_FindNearest = _Subdiv2D_FindNearestPtr.asFunction< - ffi.Pointer Function( - Subdiv2D, CvPoint2f, ffi.Pointer, ffi.Pointer)>(); + VecPoint2f, VecPoint2f, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_FindNearest_Async( - Subdiv2D self, - CvPoint2f pt, - imp1.CvCallback_2 callback, + ffi.Pointer cv_getRectSubPix( + Mat src, + CvSize patchSize, + CvPoint2f center, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_FindNearest_Async( - self, - pt, + return _cv_getRectSubPix( + src, + patchSize, + center, + dst, callback, ); } - late final _Subdiv2D_FindNearest_AsyncPtr = _lookup< + late final _cv_getRectSubPixPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, CvPoint2f, - imp1.CvCallback_2)>>('Subdiv2D_FindNearest_Async'); - late final _Subdiv2D_FindNearest_Async = - _Subdiv2D_FindNearest_AsyncPtr.asFunction< - ffi.Pointer Function( - Subdiv2D, CvPoint2f, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, CvSize, CvPoint2f, Mat, + imp1.CvCallback_0)>>('cv_getRectSubPix'); + late final _cv_getRectSubPix = _cv_getRectSubPixPtr.asFunction< + ffi.Pointer Function( + Mat, CvSize, CvPoint2f, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetEdge( - Subdiv2D self, - int edge, - int nextEdgeType, - ffi.Pointer rval, + ffi.Pointer cv_getRotationMatrix2D( + CvPoint2f center, + double angle, + double scale, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetEdge( - self, - edge, - nextEdgeType, + return _cv_getRotationMatrix2D( + center, + angle, + scale, rval, + callback, ); } - late final _Subdiv2D_GetEdgePtr = _lookup< + late final _cv_getRotationMatrix2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, ffi.Int, ffi.Int, - ffi.Pointer)>>('Subdiv2D_GetEdge'); - late final _Subdiv2D_GetEdge = _Subdiv2D_GetEdgePtr.asFunction< + ffi.Pointer Function(CvPoint2f, ffi.Double, ffi.Double, Mat, + imp1.CvCallback_0)>>('cv_getRotationMatrix2D'); + late final _cv_getRotationMatrix2D = _cv_getRotationMatrix2DPtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, int, ffi.Pointer)>(); + CvPoint2f, double, double, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetEdgeList( - Subdiv2D self, - ffi.Pointer> rval, - ffi.Pointer size, + ffi.Pointer cv_getStructuringElement( + int shape, + CvSize ksize, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetEdgeList( - self, + return _cv_getStructuringElement( + shape, + ksize, rval, - size, + callback, ); } - late final _Subdiv2D_GetEdgeListPtr = _lookup< + late final _cv_getStructuringElementPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(ffi.Int, CvSize, Mat, + imp1.CvCallback_0)>>('cv_getStructuringElement'); + late final _cv_getStructuringElement = + _cv_getStructuringElementPtr.asFunction< ffi.Pointer Function( - Subdiv2D, - ffi.Pointer>, - ffi.Pointer)>>('Subdiv2D_GetEdgeList'); - late final _Subdiv2D_GetEdgeList = _Subdiv2D_GetEdgeListPtr.asFunction< - ffi.Pointer Function( - Subdiv2D, ffi.Pointer>, ffi.Pointer)>(); + int, CvSize, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetEdgeList_Async( - Subdiv2D self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_getTextSize( + ffi.Pointer text, + int fontFace, + double fontScale, + int thickness, + ffi.Pointer baseline, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetEdgeList_Async( - self, + return _cv_getTextSize( + text, + fontFace, + fontScale, + thickness, + baseline, + rval, callback, ); } - late final _Subdiv2D_GetEdgeList_AsyncPtr = _lookup< + late final _cv_getTextSizePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Subdiv2D, imp1.CvCallback_1)>>('Subdiv2D_GetEdgeList_Async'); - late final _Subdiv2D_GetEdgeList_Async = - _Subdiv2D_GetEdgeList_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, imp1.CvCallback_1)>(); + ffi.Pointer, + ffi.Int, + ffi.Double, + ffi.Int, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_getTextSize'); + late final _cv_getTextSize = _cv_getTextSizePtr.asFunction< + ffi.Pointer Function(ffi.Pointer, int, double, int, + ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetEdge_Async( - Subdiv2D self, - int edge, - int nextEdgeType, - imp1.CvCallback_1 callback, + ffi.Pointer cv_goodFeaturesToTrack( + Mat img, + ffi.Pointer corners, + int maxCorners, + double quality, + double minDist, + Mat mask, + int blockSize, + bool useHarrisDetector, + double k, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetEdge_Async( - self, - edge, - nextEdgeType, + return _cv_goodFeaturesToTrack( + img, + corners, + maxCorners, + quality, + minDist, + mask, + blockSize, + useHarrisDetector, + k, callback, ); } - late final _Subdiv2D_GetEdge_AsyncPtr = _lookup< + late final _cv_goodFeaturesToTrackPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('Subdiv2D_GetEdge_Async'); - late final _Subdiv2D_GetEdge_Async = _Subdiv2D_GetEdge_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, int, int, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Mat, + ffi.Pointer, + ffi.Int, + ffi.Double, + ffi.Double, + Mat, + ffi.Int, + ffi.Bool, + ffi.Double, + imp1.CvCallback_0)>>('cv_goodFeaturesToTrack'); + late final _cv_goodFeaturesToTrack = _cv_goodFeaturesToTrackPtr.asFunction< + ffi.Pointer Function(Mat, ffi.Pointer, int, double, + double, Mat, int, bool, double, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetLeadingEdgeList( - Subdiv2D self, - ffi.Pointer leadingEdgeList, + ffi.Pointer cv_goodFeaturesToTrack_1( + Mat img, + ffi.Pointer corners, + int maxCorners, + double quality, + double minDist, + Mat mask, + int blockSize, + int gradientSize, + bool useHarrisDetector, + double k, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetLeadingEdgeList( - self, - leadingEdgeList, + return _cv_goodFeaturesToTrack_1( + img, + corners, + maxCorners, + quality, + minDist, + mask, + blockSize, + gradientSize, + useHarrisDetector, + k, + callback, ); } - late final _Subdiv2D_GetLeadingEdgeListPtr = _lookup< + late final _cv_goodFeaturesToTrack_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Subdiv2D, ffi.Pointer)>>('Subdiv2D_GetLeadingEdgeList'); - late final _Subdiv2D_GetLeadingEdgeList = - _Subdiv2D_GetLeadingEdgeListPtr.asFunction< - ffi.Pointer Function(Subdiv2D, ffi.Pointer)>(); + Mat, + ffi.Pointer, + ffi.Int, + ffi.Double, + ffi.Double, + Mat, + ffi.Int, + ffi.Int, + ffi.Bool, + ffi.Double, + imp1.CvCallback_0)>>('cv_goodFeaturesToTrack_1'); + late final _cv_goodFeaturesToTrack_1 = + _cv_goodFeaturesToTrack_1Ptr.asFunction< + ffi.Pointer Function( + Mat, + ffi.Pointer, + int, + double, + double, + Mat, + int, + int, + bool, + double, + imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetLeadingEdgeList_Async( - Subdiv2D self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_grabCut( + Mat img, + Mat mask, + CvRect rect, + Mat bgdModel, + Mat fgdModel, + int iterCount, + int mode, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetLeadingEdgeList_Async( - self, + return _cv_grabCut( + img, + mask, + rect, + bgdModel, + fgdModel, + iterCount, + mode, callback, ); } - late final _Subdiv2D_GetLeadingEdgeList_AsyncPtr = _lookup< + late final _cv_grabCutPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, - imp1.CvCallback_1)>>('Subdiv2D_GetLeadingEdgeList_Async'); - late final _Subdiv2D_GetLeadingEdgeList_Async = - _Subdiv2D_GetLeadingEdgeList_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, CvRect, Mat, Mat, ffi.Int, + ffi.Int, imp1.CvCallback_0)>>('cv_grabCut'); + late final _cv_grabCut = _cv_grabCutPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, CvRect, Mat, Mat, int, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetTriangleList( - Subdiv2D self, - ffi.Pointer> rval, - ffi.Pointer size, + ffi.Pointer cv_integral( + Mat src, + Mat sum, + Mat sqsum, + Mat tilted, + int sdepth, + int sqdepth, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetTriangleList( - self, - rval, - size, + return _cv_integral( + src, + sum, + sqsum, + tilted, + sdepth, + sqdepth, + callback, ); } - late final _Subdiv2D_GetTriangleListPtr = _lookup< + late final _cv_integralPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, - ffi.Pointer>, - ffi.Pointer)>>('Subdiv2D_GetTriangleList'); - late final _Subdiv2D_GetTriangleList = - _Subdiv2D_GetTriangleListPtr.asFunction< - ffi.Pointer Function(Subdiv2D, - ffi.Pointer>, ffi.Pointer)>(); + ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Int, ffi.Int, + imp1.CvCallback_0)>>('cv_integral'); + late final _cv_integral = _cv_integralPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, int, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetTriangleList_Async( - Subdiv2D self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_invertAffineTransform( + Mat src, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetTriangleList_Async( - self, + return _cv_invertAffineTransform( + src, + dst, callback, ); } - late final _Subdiv2D_GetTriangleList_AsyncPtr = _lookup< + late final _cv_invertAffineTransformPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Subdiv2D, imp1.CvCallback_1)>>('Subdiv2D_GetTriangleList_Async'); - late final _Subdiv2D_GetTriangleList_Async = - _Subdiv2D_GetTriangleList_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, imp1.CvCallback_1)>(); + Mat, Mat, imp1.CvCallback_0)>>('cv_invertAffineTransform'); + late final _cv_invertAffineTransform = + _cv_invertAffineTransformPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetVertex( - Subdiv2D self, - int vertex, - ffi.Pointer firstEdge, - ffi.Pointer rval, + ffi.Pointer cv_line( + Mat img, + CvPoint pt1, + CvPoint pt2, + Scalar color, + int thickness, + int lineType, + int shift, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetVertex( - self, - vertex, - firstEdge, - rval, + return _cv_line( + img, + pt1, + pt2, + color, + thickness, + lineType, + shift, + callback, ); } - late final _Subdiv2D_GetVertexPtr = _lookup< + late final _cv_linePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, - ffi.Int, - ffi.Pointer, - ffi.Pointer)>>('Subdiv2D_GetVertex'); - late final _Subdiv2D_GetVertex = _Subdiv2D_GetVertexPtr.asFunction< + ffi.Pointer Function(Mat, CvPoint, CvPoint, Scalar, ffi.Int, + ffi.Int, ffi.Int, imp1.CvCallback_0)>>('cv_line'); + late final _cv_line = _cv_linePtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, ffi.Pointer, ffi.Pointer)>(); + Mat, CvPoint, CvPoint, Scalar, int, int, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetVertex_Async( - Subdiv2D self, - int vertex, - imp1.CvCallback_2 callback, + ffi.Pointer cv_linearPolar( + Mat src, + Mat dst, + CvPoint2f center, + double maxRadius, + int flags, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetVertex_Async( - self, - vertex, + return _cv_linearPolar( + src, + dst, + center, + maxRadius, + flags, callback, ); } - late final _Subdiv2D_GetVertex_AsyncPtr = _lookup< + late final _cv_linearPolarPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, ffi.Int, - imp1.CvCallback_2)>>('Subdiv2D_GetVertex_Async'); - late final _Subdiv2D_GetVertex_Async = - _Subdiv2D_GetVertex_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, int, imp1.CvCallback_2)>(); + ffi.Pointer Function(Mat, Mat, CvPoint2f, ffi.Double, + ffi.Int, imp1.CvCallback_0)>>('cv_linearPolar'); + late final _cv_linearPolar = _cv_linearPolarPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, CvPoint2f, double, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetVoronoiFacetList( - Subdiv2D self, - VecI32 idx, - ffi.Pointer facetList, - ffi.Pointer facetCenters, + ffi.Pointer cv_logPolar( + Mat src, + Mat dst, + CvPoint2f center, + double m, + int flags, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetVoronoiFacetList( - self, - idx, - facetList, - facetCenters, + return _cv_logPolar( + src, + dst, + center, + m, + flags, + callback, ); } - late final _Subdiv2D_GetVoronoiFacetListPtr = _lookup< + late final _cv_logPolarPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, - VecI32, - ffi.Pointer, - ffi.Pointer)>>('Subdiv2D_GetVoronoiFacetList'); - late final _Subdiv2D_GetVoronoiFacetList = - _Subdiv2D_GetVoronoiFacetListPtr.asFunction< - ffi.Pointer Function(Subdiv2D, VecI32, - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer Function(Mat, Mat, CvPoint2f, ffi.Double, + ffi.Int, imp1.CvCallback_0)>>('cv_logPolar'); + late final _cv_logPolar = _cv_logPolarPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, CvPoint2f, double, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_GetVoronoiFacetList_Async( - Subdiv2D self, - VecI32 idx, - imp1.CvCallback_2 callback, + ffi.Pointer cv_matchShapes( + VecPoint contour1, + VecPoint contour2, + int method, + double parameter, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_GetVoronoiFacetList_Async( - self, - idx, + return _cv_matchShapes( + contour1, + contour2, + method, + parameter, + rval, callback, ); } - late final _Subdiv2D_GetVoronoiFacetList_AsyncPtr = _lookup< + late final _cv_matchShapesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, VecI32, - imp1.CvCallback_2)>>('Subdiv2D_GetVoronoiFacetList_Async'); - late final _Subdiv2D_GetVoronoiFacetList_Async = - _Subdiv2D_GetVoronoiFacetList_AsyncPtr.asFunction< ffi.Pointer Function( - Subdiv2D, VecI32, imp1.CvCallback_2)>(); + VecPoint, + VecPoint, + ffi.Int, + ffi.Double, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_matchShapes'); + late final _cv_matchShapes = _cv_matchShapesPtr.asFunction< + ffi.Pointer Function(VecPoint, VecPoint, int, double, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_InitDelaunay( - Subdiv2D self, - CvRect rect, + ffi.Pointer cv_matchTemplate( + Mat image, + Mat templ, + Mat result, + int method, + Mat mask, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_InitDelaunay( - self, - rect, + return _cv_matchTemplate( + image, + templ, + result, + method, + mask, + callback, ); } - late final _Subdiv2D_InitDelaunayPtr = _lookup< - ffi.NativeFunction Function(Subdiv2D, CvRect)>>( - 'Subdiv2D_InitDelaunay'); - late final _Subdiv2D_InitDelaunay = _Subdiv2D_InitDelaunayPtr.asFunction< - ffi.Pointer Function(Subdiv2D, CvRect)>(); + late final _cv_matchTemplatePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, Mat, + imp1.CvCallback_0)>>('cv_matchTemplate'); + late final _cv_matchTemplate = _cv_matchTemplatePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_InitDelaunay_Async( - Subdiv2D self, - CvRect rect, + ffi.Pointer cv_medianBlur( + Mat src, + Mat dst, + int ksize, imp1.CvCallback_0 callback, ) { - return _Subdiv2D_InitDelaunay_Async( - self, - rect, + return _cv_medianBlur( + src, + dst, + ksize, callback, ); } - late final _Subdiv2D_InitDelaunay_AsyncPtr = _lookup< + late final _cv_medianBlurPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, CvRect, - imp1.CvCallback_0)>>('Subdiv2D_InitDelaunay_Async'); - late final _Subdiv2D_InitDelaunay_Async = - _Subdiv2D_InitDelaunay_AsyncPtr.asFunction< ffi.Pointer Function( - Subdiv2D, CvRect, imp1.CvCallback_0)>(); + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_medianBlur'); + late final _cv_medianBlur = _cv_medianBlurPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_Insert( - Subdiv2D self, - CvPoint2f pt, - ffi.Pointer rval, + ffi.Pointer cv_minAreaRect( + VecPoint pts, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_Insert( - self, - pt, + return _cv_minAreaRect( + pts, rval, + callback, ); } - late final _Subdiv2D_InsertPtr = _lookup< + late final _cv_minAreaRectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, CvPoint2f, ffi.Pointer)>>('Subdiv2D_Insert'); - late final _Subdiv2D_Insert = _Subdiv2D_InsertPtr.asFunction< + ffi.Pointer Function(VecPoint, ffi.Pointer, + imp1.CvCallback_0)>>('cv_minAreaRect'); + late final _cv_minAreaRect = _cv_minAreaRectPtr.asFunction< ffi.Pointer Function( - Subdiv2D, CvPoint2f, ffi.Pointer)>(); - - ffi.Pointer Subdiv2D_InsertVec( - Subdiv2D self, - VecPoint2f ptvec, - ) { - return _Subdiv2D_InsertVec( - self, - ptvec, - ); - } - - late final _Subdiv2D_InsertVecPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, VecPoint2f)>>('Subdiv2D_InsertVec'); - late final _Subdiv2D_InsertVec = _Subdiv2D_InsertVecPtr.asFunction< - ffi.Pointer Function(Subdiv2D, VecPoint2f)>(); + VecPoint, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_InsertVec_Async( - Subdiv2D self, - VecPoint2f ptvec, + ffi.Pointer cv_minEnclosingCircle( + VecPoint pts, + ffi.Pointer center, + ffi.Pointer radius, imp1.CvCallback_0 callback, ) { - return _Subdiv2D_InsertVec_Async( - self, - ptvec, + return _cv_minEnclosingCircle( + pts, + center, + radius, callback, ); } - late final _Subdiv2D_InsertVec_AsyncPtr = _lookup< + late final _cv_minEnclosingCirclePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, VecPoint2f, - imp1.CvCallback_0)>>('Subdiv2D_InsertVec_Async'); - late final _Subdiv2D_InsertVec_Async = - _Subdiv2D_InsertVec_AsyncPtr.asFunction< ffi.Pointer Function( - Subdiv2D, VecPoint2f, imp1.CvCallback_0)>(); + VecPoint, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_minEnclosingCircle'); + late final _cv_minEnclosingCircle = _cv_minEnclosingCirclePtr.asFunction< + ffi.Pointer Function(VecPoint, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_Insert_Async( - Subdiv2D self, - CvPoint2f pt, - imp1.CvCallback_1 callback, + ffi.Pointer cv_moments( + Mat src, + bool binaryImage, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_Insert_Async( - self, - pt, + return _cv_moments( + src, + binaryImage, + rval, callback, ); } - late final _Subdiv2D_Insert_AsyncPtr = _lookup< + late final _cv_momentsPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, CvPoint2f, - imp1.CvCallback_1)>>('Subdiv2D_Insert_Async'); - late final _Subdiv2D_Insert_Async = _Subdiv2D_Insert_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, CvPoint2f, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, ffi.Bool, ffi.Pointer, + imp1.CvCallback_0)>>('cv_moments'); + late final _cv_moments = _cv_momentsPtr.asFunction< + ffi.Pointer Function( + Mat, bool, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_Locate( - Subdiv2D self, - CvPoint2f pt, - ffi.Pointer edge, - ffi.Pointer vertex, - ffi.Pointer rval, + ffi.Pointer cv_morphologyDefaultBorderValue( + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_Locate( - self, - pt, - edge, - vertex, + return _cv_morphologyDefaultBorderValue( rval, + callback, ); } - late final _Subdiv2D_LocatePtr = _lookup< + late final _cv_morphologyDefaultBorderValuePtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + imp1.CvCallback_0)>>('cv_morphologyDefaultBorderValue'); + late final _cv_morphologyDefaultBorderValue = + _cv_morphologyDefaultBorderValuePtr.asFunction< ffi.Pointer Function( - Subdiv2D, - CvPoint2f, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('Subdiv2D_Locate'); - late final _Subdiv2D_Locate = _Subdiv2D_LocatePtr.asFunction< - ffi.Pointer Function(Subdiv2D, CvPoint2f, ffi.Pointer, - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_Locate_Async( - Subdiv2D self, - CvPoint2f pt, - imp1.CvCallback_3 callback, + ffi.Pointer cv_morphologyEx( + Mat src, + Mat dst, + int op, + Mat kernel, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_Locate_Async( - self, - pt, + return _cv_morphologyEx( + src, + dst, + op, + kernel, callback, ); } - late final _Subdiv2D_Locate_AsyncPtr = _lookup< + late final _cv_morphologyExPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, CvPoint2f, - imp1.CvCallback_3)>>('Subdiv2D_Locate_Async'); - late final _Subdiv2D_Locate_Async = _Subdiv2D_Locate_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, CvPoint2f, imp1.CvCallback_3)>(); + ffi.Pointer Function( + Mat, Mat, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_morphologyEx'); + late final _cv_morphologyEx = _cv_morphologyExPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, Mat, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_NewEmpty( - ffi.Pointer rval, + ffi.Pointer cv_morphologyEx_1( + Mat src, + Mat dst, + int op, + Mat kernel, + CvPoint pt, + int iterations, + int borderType, + Scalar borderValue, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_NewEmpty( - rval, + return _cv_morphologyEx_1( + src, + dst, + op, + kernel, + pt, + iterations, + borderType, + borderValue, + callback, ); } - late final _Subdiv2D_NewEmptyPtr = _lookup< + late final _cv_morphologyEx_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('Subdiv2D_NewEmpty'); - late final _Subdiv2D_NewEmpty = _Subdiv2D_NewEmptyPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + Mat, + Mat, + ffi.Int, + Mat, + CvPoint, + ffi.Int, + ffi.Int, + Scalar, + imp1.CvCallback_0)>>('cv_morphologyEx_1'); + late final _cv_morphologyEx_1 = _cv_morphologyEx_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, Mat, CvPoint, int, int, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_NewEmpty_Async( - imp1.CvCallback_1 callback, + ffi.Pointer cv_phaseCorrelate( + Mat src1, + Mat src2, + Mat window, + ffi.Pointer response, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_NewEmpty_Async( + return _cv_phaseCorrelate( + src1, + src2, + window, + response, + rval, callback, ); } - late final _Subdiv2D_NewEmpty_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'Subdiv2D_NewEmpty_Async'); - late final _Subdiv2D_NewEmpty_Async = _Subdiv2D_NewEmpty_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + late final _cv_phaseCorrelatePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>>('cv_phaseCorrelate'); + late final _cv_phaseCorrelate = _cv_phaseCorrelatePtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_NewWithRect( - CvRect rect, - ffi.Pointer rval, + ffi.Pointer cv_pointPolygonTest( + VecPoint pts, + CvPoint2f pt, + bool measureDist, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_NewWithRect( - rect, + return _cv_pointPolygonTest( + pts, + pt, + measureDist, rval, + callback, ); } - late final _Subdiv2D_NewWithRectPtr = _lookup< + late final _cv_pointPolygonTestPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CvRect, ffi.Pointer)>>('Subdiv2D_NewWithRect'); - late final _Subdiv2D_NewWithRect = _Subdiv2D_NewWithRectPtr.asFunction< - ffi.Pointer Function(CvRect, ffi.Pointer)>(); + VecPoint, + CvPoint2f, + ffi.Bool, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_pointPolygonTest'); + late final _cv_pointPolygonTest = _cv_pointPolygonTestPtr.asFunction< + ffi.Pointer Function(VecPoint, CvPoint2f, bool, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_NewWithRect_Async( - CvRect rect, - imp1.CvCallback_1 callback, + ffi.Pointer cv_polylines( + Mat img, + VecVecPoint points, + bool isClosed, + Scalar color, + int thickness, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_NewWithRect_Async( - rect, + return _cv_polylines( + img, + points, + isClosed, + color, + thickness, callback, ); } - late final _Subdiv2D_NewWithRect_AsyncPtr = _lookup< + late final _cv_polylinesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - CvRect, imp1.CvCallback_1)>>('Subdiv2D_NewWithRect_Async'); - late final _Subdiv2D_NewWithRect_Async = _Subdiv2D_NewWithRect_AsyncPtr - .asFunction Function(CvRect, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, VecVecPoint, ffi.Bool, Scalar, + ffi.Int, imp1.CvCallback_0)>>('cv_polylines'); + late final _cv_polylines = _cv_polylinesPtr.asFunction< + ffi.Pointer Function( + Mat, VecVecPoint, bool, Scalar, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_NextEdge( - Subdiv2D self, - int edge, - ffi.Pointer rval, + ffi.Pointer cv_putText( + Mat img, + ffi.Pointer text, + CvPoint org, + int fontFace, + double fontScale, + Scalar color, + int thickness, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_NextEdge( - self, - edge, - rval, + return _cv_putText( + img, + text, + org, + fontFace, + fontScale, + color, + thickness, + callback, ); } - late final _Subdiv2D_NextEdgePtr = _lookup< + late final _cv_putTextPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Subdiv2D, ffi.Int, ffi.Pointer)>>('Subdiv2D_NextEdge'); - late final _Subdiv2D_NextEdge = _Subdiv2D_NextEdgePtr.asFunction< - ffi.Pointer Function(Subdiv2D, int, ffi.Pointer)>(); + Mat, + ffi.Pointer, + CvPoint, + ffi.Int, + ffi.Double, + Scalar, + ffi.Int, + imp1.CvCallback_0)>>('cv_putText'); + late final _cv_putText = _cv_putTextPtr.asFunction< + ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, int, + double, Scalar, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_NextEdge_Async( - Subdiv2D self, - int edge, - imp1.CvCallback_1 callback, + ffi.Pointer cv_putText_1( + Mat img, + ffi.Pointer text, + CvPoint org, + int fontFace, + double fontScale, + Scalar color, + int thickness, + int lineType, + bool bottomLeftOrigin, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_NextEdge_Async( - self, - edge, + return _cv_putText_1( + img, + text, + org, + fontFace, + fontScale, + color, + thickness, + lineType, + bottomLeftOrigin, callback, ); } - late final _Subdiv2D_NextEdge_AsyncPtr = _lookup< + late final _cv_putText_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, ffi.Int, - imp1.CvCallback_1)>>('Subdiv2D_NextEdge_Async'); - late final _Subdiv2D_NextEdge_Async = _Subdiv2D_NextEdge_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, int, imp1.CvCallback_1)>(); - - ffi.Pointer Subdiv2D_RotateEdge( - Subdiv2D self, - int edge, - int rotate, - ffi.Pointer rval, + ffi.Pointer Function( + Mat, + ffi.Pointer, + CvPoint, + ffi.Int, + ffi.Double, + Scalar, + ffi.Int, + ffi.Int, + ffi.Bool, + imp1.CvCallback_0)>>('cv_putText_1'); + late final _cv_putText_1 = _cv_putText_1Ptr.asFunction< + ffi.Pointer Function(Mat, ffi.Pointer, CvPoint, int, + double, Scalar, int, int, bool, imp1.CvCallback_0)>(); + + ffi.Pointer cv_pyrDown( + Mat src, + Mat dst, + CvSize dstsize, + int borderType, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_RotateEdge( - self, - edge, - rotate, - rval, + return _cv_pyrDown( + src, + dst, + dstsize, + borderType, + callback, ); } - late final _Subdiv2D_RotateEdgePtr = _lookup< + late final _cv_pyrDownPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, ffi.Int, ffi.Int, - ffi.Pointer)>>('Subdiv2D_RotateEdge'); - late final _Subdiv2D_RotateEdge = _Subdiv2D_RotateEdgePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, CvSize, ffi.Int, imp1.CvCallback_0)>>('cv_pyrDown'); + late final _cv_pyrDown = _cv_pyrDownPtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, int, ffi.Pointer)>(); + Mat, Mat, CvSize, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_RotateEdge_Async( - Subdiv2D self, - int edge, - int rotate, - imp1.CvCallback_1 callback, + ffi.Pointer cv_pyrUp( + Mat src, + Mat dst, + CvSize dstsize, + int borderType, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_RotateEdge_Async( - self, - edge, - rotate, + return _cv_pyrUp( + src, + dst, + dstsize, + borderType, callback, ); } - late final _Subdiv2D_RotateEdge_AsyncPtr = _lookup< + late final _cv_pyrUpPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Subdiv2D, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('Subdiv2D_RotateEdge_Async'); - late final _Subdiv2D_RotateEdge_Async = - _Subdiv2D_RotateEdge_AsyncPtr.asFunction< ffi.Pointer Function( - Subdiv2D, int, int, imp1.CvCallback_1)>(); + Mat, Mat, CvSize, ffi.Int, imp1.CvCallback_0)>>('cv_pyrUp'); + late final _cv_pyrUp = _cv_pyrUpPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, CvSize, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_SymEdge( - Subdiv2D self, - int edge, - ffi.Pointer rval, + ffi.Pointer cv_rectangle( + Mat img, + CvRect rect, + Scalar color, + int thickness, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_SymEdge( - self, - edge, - rval, + return _cv_rectangle( + img, + rect, + color, + thickness, + callback, ); } - late final _Subdiv2D_SymEdgePtr = _lookup< + late final _cv_rectanglePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, ffi.Int, ffi.Pointer)>>('Subdiv2D_SymEdge'); - late final _Subdiv2D_SymEdge = _Subdiv2D_SymEdgePtr.asFunction< - ffi.Pointer Function(Subdiv2D, int, ffi.Pointer)>(); + ffi.Pointer Function(Mat, CvRect, Scalar, ffi.Int, + imp1.CvCallback_0)>>('cv_rectangle'); + late final _cv_rectangle = _cv_rectanglePtr.asFunction< + ffi.Pointer Function( + Mat, CvRect, Scalar, int, imp1.CvCallback_0)>(); - ffi.Pointer Subdiv2D_SymEdge_Async( - Subdiv2D self, - int edge, - imp1.CvCallback_1 callback, + ffi.Pointer cv_rectangle_1( + Mat img, + CvRect rect, + Scalar color, + int thickness, + int lineType, + int shift, + imp1.CvCallback_0 callback, ) { - return _Subdiv2D_SymEdge_Async( - self, - edge, + return _cv_rectangle_1( + img, + rect, + color, + thickness, + lineType, + shift, callback, ); } - late final _Subdiv2D_SymEdge_AsyncPtr = _lookup< + late final _cv_rectangle_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Subdiv2D, ffi.Int, imp1.CvCallback_1)>>('Subdiv2D_SymEdge_Async'); - late final _Subdiv2D_SymEdge_Async = _Subdiv2D_SymEdge_AsyncPtr.asFunction< - ffi.Pointer Function(Subdiv2D, int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, CvRect, Scalar, ffi.Int, ffi.Int, + ffi.Int, imp1.CvCallback_0)>>('cv_rectangle_1'); + late final _cv_rectangle_1 = _cv_rectangle_1Ptr.asFunction< + ffi.Pointer Function( + Mat, CvRect, Scalar, int, int, int, imp1.CvCallback_0)>(); - ffi.Pointer Threshold( + ffi.Pointer cv_remap( Mat src, Mat dst, - double thresh, - double maxvalue, - int typ, - ffi.Pointer rval, + Mat map1, + Mat map2, + int interpolation, + int borderMode, + Scalar borderValue, + imp1.CvCallback_0 callback, ) { - return _Threshold( + return _cv_remap( src, dst, - thresh, - maxvalue, - typ, - rval, + map1, + map2, + interpolation, + borderMode, + borderValue, + callback, ); } - late final _ThresholdPtr = _lookup< + late final _cv_remapPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Double, ffi.Double, - ffi.Int, ffi.Pointer)>>('Threshold'); - late final _Threshold = _ThresholdPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Int, ffi.Int, + Scalar, imp1.CvCallback_0)>>('cv_remap'); + late final _cv_remap = _cv_remapPtr.asFunction< ffi.Pointer Function( - Mat, Mat, double, double, int, ffi.Pointer)>(); + Mat, Mat, Mat, Mat, int, int, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer Threshold_Async( + ffi.Pointer cv_resize( Mat src, - double thresh, - double maxvalue, - int typ, - imp1.CvCallback_2 callback, + Mat dst, + CvSize sz, + double fx, + double fy, + int interp, + imp1.CvCallback_0 callback, ) { - return _Threshold_Async( + return _cv_resize( src, - thresh, - maxvalue, - typ, + dst, + sz, + fx, + fy, + interp, callback, ); } - late final _Threshold_AsyncPtr = _lookup< + late final _cv_resizePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Double, ffi.Double, ffi.Int, - imp1.CvCallback_2)>>('Threshold_Async'); - late final _Threshold_Async = _Threshold_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, CvSize, ffi.Double, + ffi.Double, ffi.Int, imp1.CvCallback_0)>>('cv_resize'); + late final _cv_resize = _cv_resizePtr.asFunction< ffi.Pointer Function( - Mat, double, double, int, imp1.CvCallback_2)>(); + Mat, Mat, CvSize, double, double, int, imp1.CvCallback_0)>(); - ffi.Pointer WarpAffine( + ffi.Pointer cv_sepFilter2D( Mat src, Mat dst, - Mat rot_mat, - CvSize dsize, + int ddepth, + Mat kernelX, + Mat kernelY, + CvPoint anchor, + double delta, + int borderType, + imp1.CvCallback_0 callback, ) { - return _WarpAffine( + return _cv_sepFilter2D( src, dst, - rot_mat, - dsize, + ddepth, + kernelX, + kernelY, + anchor, + delta, + borderType, + callback, ); } - late final _WarpAffinePtr = _lookup< + late final _cv_sepFilter2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, CvSize)>>('WarpAffine'); - late final _WarpAffine = _WarpAffinePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, CvSize)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, Mat, Mat, CvPoint, + ffi.Double, ffi.Int, imp1.CvCallback_0)>>('cv_sepFilter2D'); + late final _cv_sepFilter2D = _cv_sepFilter2DPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, Mat, Mat, CvPoint, double, int, imp1.CvCallback_0)>(); - ffi.Pointer WarpAffineWithParams( + ffi.Pointer cv_spatialGradient( Mat src, - Mat dst, - Mat rot_mat, - CvSize dsize, - int flags, - int borderMode, - Scalar borderValue, + Mat dx, + Mat dy, + int ksize, + int borderType, + imp1.CvCallback_0 callback, ) { - return _WarpAffineWithParams( + return _cv_spatialGradient( src, - dst, - rot_mat, - dsize, - flags, - borderMode, - borderValue, + dx, + dy, + ksize, + borderType, + callback, ); } - late final _WarpAffineWithParamsPtr = _lookup< + late final _cv_spatialGradientPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, CvSize, ffi.Int, - ffi.Int, Scalar)>>('WarpAffineWithParams'); - late final _WarpAffineWithParams = _WarpAffineWithParamsPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, ffi.Int, + imp1.CvCallback_0)>>('cv_spatialGradient'); + late final _cv_spatialGradient = _cv_spatialGradientPtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, CvSize, int, int, Scalar)>(); + Mat, Mat, Mat, int, int, imp1.CvCallback_0)>(); - ffi.Pointer WarpAffineWithParams_Async( + ffi.Pointer cv_sqrBoxFilter( Mat src, - Mat rot_mat, - CvSize dsize, - int flags, - int borderMode, - Scalar borderValue, - imp1.CvCallback_1 callback, + Mat dst, + int ddepth, + CvSize ps, + CvPoint anchor, + bool normalize, + int borderType, + imp1.CvCallback_0 callback, ) { - return _WarpAffineWithParams_Async( + return _cv_sqrBoxFilter( src, - rot_mat, - dsize, - flags, - borderMode, - borderValue, + dst, + ddepth, + ps, + anchor, + normalize, + borderType, callback, ); } - late final _WarpAffineWithParams_AsyncPtr = _lookup< + late final _cv_sqrBoxFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvSize, ffi.Int, ffi.Int, - Scalar, imp1.CvCallback_1)>>('WarpAffineWithParams_Async'); - late final _WarpAffineWithParams_Async = - _WarpAffineWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, CvSize, int, int, Scalar, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, CvSize, CvPoint, + ffi.Bool, ffi.Int, imp1.CvCallback_0)>>('cv_sqrBoxFilter'); + late final _cv_sqrBoxFilter = _cv_sqrBoxFilterPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, CvSize, CvPoint, bool, int, imp1.CvCallback_0)>(); - ffi.Pointer WarpAffine_Async( + ffi.Pointer cv_threshold( Mat src, - Mat rot_mat, - CvSize dsize, - imp1.CvCallback_1 callback, + Mat dst, + double thresh, + double maxvalue, + int typ, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _WarpAffine_Async( + return _cv_threshold( src, - rot_mat, - dsize, + dst, + thresh, + maxvalue, + typ, + rval, callback, ); } - late final _WarpAffine_AsyncPtr = _lookup< + late final _cv_thresholdPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, CvSize, imp1.CvCallback_1)>>('WarpAffine_Async'); - late final _WarpAffine_Async = _WarpAffine_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvSize, imp1.CvCallback_1)>(); + Mat, + Mat, + ffi.Double, + ffi.Double, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_threshold'); + late final _cv_threshold = _cv_thresholdPtr.asFunction< + ffi.Pointer Function(Mat, Mat, double, double, int, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer WarpPerspective( + ffi.Pointer cv_warpAffine( Mat src, Mat dst, - Mat m, + Mat rot_mat, CvSize dsize, + imp1.CvCallback_0 callback, ) { - return _WarpPerspective( + return _cv_warpAffine( src, dst, - m, + rot_mat, dsize, + callback, ); } - late final _WarpPerspectivePtr = _lookup< + late final _cv_warpAffinePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, CvSize)>>('WarpPerspective'); - late final _WarpPerspective = _WarpPerspectivePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, CvSize)>(); + Mat, Mat, Mat, CvSize, imp1.CvCallback_0)>>('cv_warpAffine'); + late final _cv_warpAffine = _cv_warpAffinePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, CvSize, imp1.CvCallback_0)>(); - ffi.Pointer WarpPerspectiveWithParams( + ffi.Pointer cv_warpAffine_1( Mat src, Mat dst, Mat rot_mat, @@ -6293,8 +3531,9 @@ class CvNativeImgproc { int flags, int borderMode, Scalar borderValue, + imp1.CvCallback_0 callback, ) { - return _WarpPerspectiveWithParams( + return _cv_warpAffine_1( src, dst, rot_mat, @@ -6302,101 +3541,89 @@ class CvNativeImgproc { flags, borderMode, borderValue, + callback, ); } - late final _WarpPerspectiveWithParamsPtr = _lookup< + late final _cv_warpAffine_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Mat, Mat, Mat, CvSize, ffi.Int, - ffi.Int, Scalar)>>('WarpPerspectiveWithParams'); - late final _WarpPerspectiveWithParams = - _WarpPerspectiveWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, CvSize, int, int, Scalar)>(); + ffi.Int, Scalar, imp1.CvCallback_0)>>('cv_warpAffine_1'); + late final _cv_warpAffine_1 = _cv_warpAffine_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, CvSize, int, int, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer WarpPerspectiveWithParams_Async( + ffi.Pointer cv_warpPerspective( Mat src, - Mat rot_mat, + Mat dst, + Mat m, CvSize dsize, - int flags, - int borderMode, - Scalar borderValue, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _WarpPerspectiveWithParams_Async( + return _cv_warpPerspective( src, - rot_mat, + dst, + m, dsize, - flags, - borderMode, - borderValue, callback, ); } - late final _WarpPerspectiveWithParams_AsyncPtr = _lookup< + late final _cv_warpPerspectivePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, CvSize, ffi.Int, ffi.Int, - Scalar, imp1.CvCallback_1)>>('WarpPerspectiveWithParams_Async'); - late final _WarpPerspectiveWithParams_Async = - _WarpPerspectiveWithParams_AsyncPtr.asFunction< ffi.Pointer Function( - Mat, Mat, CvSize, int, int, Scalar, imp1.CvCallback_1)>(); + Mat, Mat, Mat, CvSize, imp1.CvCallback_0)>>('cv_warpPerspective'); + late final _cv_warpPerspective = _cv_warpPerspectivePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, CvSize, imp1.CvCallback_0)>(); - ffi.Pointer WarpPerspective_Async( + ffi.Pointer cv_warpPerspective_1( Mat src, - Mat m, + Mat dst, + Mat rot_mat, CvSize dsize, - imp1.CvCallback_1 callback, + int flags, + int borderMode, + Scalar borderValue, + imp1.CvCallback_0 callback, ) { - return _WarpPerspective_Async( + return _cv_warpPerspective_1( src, - m, + dst, + rot_mat, dsize, + flags, + borderMode, + borderValue, callback, ); } - late final _WarpPerspective_AsyncPtr = _lookup< + late final _cv_warpPerspective_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, CvSize, imp1.CvCallback_1)>>('WarpPerspective_Async'); - late final _WarpPerspective_Async = _WarpPerspective_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvSize, imp1.CvCallback_1)>(); - - ffi.Pointer Watershed( - Mat image, - Mat markers, - ) { - return _Watershed( - image, - markers, - ); - } - - late final _WatershedPtr = - _lookup Function(Mat, Mat)>>( - 'Watershed'); - late final _Watershed = - _WatershedPtr.asFunction Function(Mat, Mat)>(); + ffi.Pointer Function(Mat, Mat, Mat, CvSize, ffi.Int, + ffi.Int, Scalar, imp1.CvCallback_0)>>('cv_warpPerspective_1'); + late final _cv_warpPerspective_1 = _cv_warpPerspective_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, CvSize, int, int, Scalar, imp1.CvCallback_0)>(); - ffi.Pointer Watershed_Async( + ffi.Pointer cv_watershed( Mat image, Mat markers, imp1.CvCallback_0 callback, ) { - return _Watershed_Async( + return _cv_watershed( image, markers, callback, ); } - late final _Watershed_AsyncPtr = _lookup< + late final _cv_watershedPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_0)>>('Watershed_Async'); - late final _Watershed_Async = _Watershed_AsyncPtr.asFunction< + Mat, Mat, imp1.CvCallback_0)>>('cv_watershed'); + late final _cv_watershed = _cv_watershedPtr.asFunction< ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); late final addresses = _SymbolAddresses(this); @@ -6406,15 +3633,9 @@ class _SymbolAddresses { final CvNativeImgproc _library; _SymbolAddresses(this._library); ffi.Pointer> - get CLAHE_Close => _library._CLAHE_ClosePtr; - ffi.Pointer< - ffi.NativeFunction> - get CLAHE_Close_Async => _library._CLAHE_Close_AsyncPtr; + get cv_CLAHE_close => _library._cv_CLAHE_closePtr; ffi.Pointer> - get Subdiv2D_Close => _library._Subdiv2D_ClosePtr; - ffi.Pointer< - ffi.NativeFunction> - get Subdiv2D_Close_Async => _library._Subdiv2D_Close_AsyncPtr; + get cv_Subdiv2D_close => _library._cv_Subdiv2D_closePtr; } final class CLAHE extends ffi.Struct { diff --git a/packages/dartcv/lib/src/g/imgproc.yaml b/packages/dartcv/lib/src/g/imgproc.yaml index 540e43ff..9dbe7fd8 100644 --- a/packages/dartcv/lib/src/g/imgproc.yaml +++ b/packages/dartcv/lib/src/g/imgproc.yaml @@ -1,545 +1,277 @@ format_version: 1.0.0 files: - package:dartcv/src/g/imgproc.g.dart: + package:dartcv4/src/g/imgproc.g.dart: used-config: ffi-native: false symbols: - c:@F@AdaptiveThreshold: - name: AdaptiveThreshold - c:@F@AdaptiveThreshold_Async: - name: AdaptiveThreshold_Async - c:@F@ApplyColorMap: - name: ApplyColorMap - c:@F@ApplyColorMap_Async: - name: ApplyColorMap_Async - c:@F@ApplyCustomColorMap: - name: ApplyCustomColorMap - c:@F@ApplyCustomColorMap_Async: - name: ApplyCustomColorMap_Async - c:@F@ApproxPolyDP: - name: ApproxPolyDP - c:@F@ApproxPolyDP_Async: - name: ApproxPolyDP_Async - c:@F@ArcLength: - name: ArcLength - c:@F@ArcLength_Async: - name: ArcLength_Async - c:@F@ArrowedLine: - name: ArrowedLine - c:@F@ArrowedLine_Async: - name: ArrowedLine_Async - c:@F@BilateralFilter: - name: BilateralFilter - c:@F@BilateralFilter_Async: - name: BilateralFilter_Async - c:@F@Blur: - name: Blur - c:@F@Blur_Async: - name: Blur_Async - c:@F@BoundingRect: - name: BoundingRect - c:@F@BoundingRect_Async: - name: BoundingRect_Async - c:@F@BoxFilter: - name: BoxFilter - c:@F@BoxFilter_Async: - name: BoxFilter_Async - c:@F@BoxPoints: - name: BoxPoints - c:@F@BoxPoints_Async: - name: BoxPoints_Async - c:@F@CLAHE_Apply: - name: CLAHE_Apply - c:@F@CLAHE_Apply_Async: - name: CLAHE_Apply_Async - c:@F@CLAHE_Close: - name: CLAHE_Close - c:@F@CLAHE_Close_Async: - name: CLAHE_Close_Async - c:@F@CLAHE_CollectGarbage: - name: CLAHE_CollectGarbage - c:@F@CLAHE_CollectGarbage_Async: - name: CLAHE_CollectGarbage_Async - c:@F@CLAHE_Create: - name: CLAHE_Create - c:@F@CLAHE_CreateWithParams: - name: CLAHE_CreateWithParams - c:@F@CLAHE_CreateWithParams_Async: - name: CLAHE_CreateWithParams_Async - c:@F@CLAHE_Create_Async: - name: CLAHE_Create_Async - c:@F@CLAHE_GetClipLimit: - name: CLAHE_GetClipLimit - c:@F@CLAHE_GetClipLimit_Async: - name: CLAHE_GetClipLimit_Async - c:@F@CLAHE_GetTilesGridSize: - name: CLAHE_GetTilesGridSize - c:@F@CLAHE_GetTilesGridSize_Async: - name: CLAHE_GetTilesGridSize_Async - c:@F@CLAHE_SetClipLimit: - name: CLAHE_SetClipLimit - c:@F@CLAHE_SetClipLimit_Async: - name: CLAHE_SetClipLimit_Async - c:@F@CLAHE_SetTilesGridSize: - name: CLAHE_SetTilesGridSize - c:@F@CLAHE_SetTilesGridSize_Async: - name: CLAHE_SetTilesGridSize_Async - c:@F@CalcBackProject: - name: CalcBackProject - c:@F@CalcBackProject_Async: - name: CalcBackProject_Async - c:@F@CalcHist: - name: CalcHist - c:@F@CalcHist_Async: - name: CalcHist_Async - c:@F@Canny: - name: Canny - c:@F@Canny_Async: - name: Canny_Async - c:@F@Circle: - name: Circle - c:@F@CircleWithParams: - name: CircleWithParams - c:@F@CircleWithParams_Async: - name: CircleWithParams_Async - c:@F@Circle_Async: - name: Circle_Async - c:@F@ClipLine: - name: ClipLine - c:@F@ClipLine_Async: - name: ClipLine_Async - c:@F@CompareHist: - name: CompareHist - c:@F@CompareHist_Async: - name: CompareHist_Async - c:@F@ConnectedComponents: - name: ConnectedComponents - c:@F@ConnectedComponentsWithStats: - name: ConnectedComponentsWithStats - c:@F@ConnectedComponentsWithStats_Async: - name: ConnectedComponentsWithStats_Async - c:@F@ConnectedComponents_Async: - name: ConnectedComponents_Async - c:@F@ContourArea: - name: ContourArea - c:@F@ContourArea_Async: - name: ContourArea_Async - c:@F@ConvexHull: - name: ConvexHull - c:@F@ConvexHull_Async: - name: ConvexHull_Async - c:@F@ConvexityDefects: - name: ConvexityDefects - c:@F@ConvexityDefects_Async: - name: ConvexityDefects_Async - c:@F@CornerSubPix: - name: CornerSubPix - c:@F@CornerSubPix_Async: - name: CornerSubPix_Async - c:@F@CvtColor: - name: CvtColor - c:@F@CvtColor_Async: - name: CvtColor_Async - c:@F@Dilate: - name: Dilate - c:@F@DilateWithParams: - name: DilateWithParams - c:@F@DilateWithParams_Async: - name: DilateWithParams_Async - c:@F@Dilate_Async: - name: Dilate_Async - c:@F@DistanceTransform: - name: DistanceTransform - c:@F@DistanceTransform_Async: - name: DistanceTransform_Async - c:@F@DrawContours: - name: DrawContours - c:@F@DrawContoursWithParams: - name: DrawContoursWithParams - c:@F@DrawContoursWithParams_Async: - name: DrawContoursWithParams_Async - c:@F@DrawContours_Async: - name: DrawContours_Async - c:@F@Ellipse: - name: Ellipse - c:@F@EllipseWithParams: - name: EllipseWithParams - c:@F@EllipseWithParams_Async: - name: EllipseWithParams_Async - c:@F@Ellipse_Async: - name: Ellipse_Async - c:@F@EqualizeHist: - name: EqualizeHist - c:@F@EqualizeHist_Async: - name: EqualizeHist_Async - c:@F@Erode: - name: Erode - c:@F@ErodeWithParams: - name: ErodeWithParams - c:@F@ErodeWithParams_Async: - name: ErodeWithParams_Async - c:@F@Erode_Async: - name: Erode_Async - c:@F@FillPoly: - name: FillPoly - c:@F@FillPolyWithParams: - name: FillPolyWithParams - c:@F@FillPolyWithParams_Async: - name: FillPolyWithParams_Async - c:@F@FillPoly_Async: - name: FillPoly_Async - c:@F@Filter2D: - name: Filter2D - c:@F@Filter2D_Async: - name: Filter2D_Async - c:@F@FindContours: - name: FindContours - c:@F@FindContours_Async: - name: FindContours_Async - c:@F@FitEllipse: - name: FitEllipse - c:@F@FitEllipse_Async: - name: FitEllipse_Async - c:@F@FitLine: - name: FitLine - c:@F@FitLine_Async: - name: FitLine_Async - c:@F@FloodFill: - name: FloodFill - c:@F@FloodFill_Async: - name: FloodFill_Async - c:@F@GaussianBlur: - name: GaussianBlur - c:@F@GaussianBlur_Async: - name: GaussianBlur_Async - c:@F@GetAffineTransform: - name: GetAffineTransform - c:@F@GetAffineTransform2f: - name: GetAffineTransform2f - c:@F@GetAffineTransform2f_Async: - name: GetAffineTransform2f_Async - c:@F@GetAffineTransform_Async: - name: GetAffineTransform_Async - c:@F@GetGaussianKernel: - name: GetGaussianKernel - c:@F@GetGaussianKernel_Async: - name: GetGaussianKernel_Async - c:@F@GetPerspectiveTransform: - name: GetPerspectiveTransform - c:@F@GetPerspectiveTransform2f: - name: GetPerspectiveTransform2f - c:@F@GetPerspectiveTransform2f_Async: - name: GetPerspectiveTransform2f_Async - c:@F@GetPerspectiveTransform_Async: - name: GetPerspectiveTransform_Async - c:@F@GetRectSubPix: - name: GetRectSubPix - c:@F@GetRectSubPix_Async: - name: GetRectSubPix_Async - c:@F@GetRotationMatrix2D: - name: GetRotationMatrix2D - c:@F@GetRotationMatrix2D_Async: - name: GetRotationMatrix2D_Async - c:@F@GetStructuringElement: - name: GetStructuringElement - c:@F@GetStructuringElement_Async: - name: GetStructuringElement_Async - c:@F@GetTextSizeWithBaseline: - name: GetTextSizeWithBaseline - c:@F@GetTextSizeWithBaseline_Async: - name: GetTextSizeWithBaseline_Async - c:@F@GoodFeaturesToTrack: - name: GoodFeaturesToTrack - c:@F@GoodFeaturesToTrackWithGradient: - name: GoodFeaturesToTrackWithGradient - c:@F@GoodFeaturesToTrackWithGradient_Async: - name: GoodFeaturesToTrackWithGradient_Async - c:@F@GoodFeaturesToTrack_Async: - name: GoodFeaturesToTrack_Async - c:@F@GrabCut: - name: GrabCut - c:@F@GrabCut_Async: - name: GrabCut_Async - c:@F@HoughCircles: - name: HoughCircles - c:@F@HoughCirclesWithParams: - name: HoughCirclesWithParams - c:@F@HoughCirclesWithParams_Async: - name: HoughCirclesWithParams_Async - c:@F@HoughCircles_Async: - name: HoughCircles_Async - c:@F@HoughLines: - name: HoughLines - c:@F@HoughLinesP: - name: HoughLinesP - c:@F@HoughLinesPWithParams: - name: HoughLinesPWithParams - c:@F@HoughLinesPWithParams_Async: - name: HoughLinesPWithParams_Async - c:@F@HoughLinesP_Async: - name: HoughLinesP_Async - c:@F@HoughLinesPointSet: - name: HoughLinesPointSet - c:@F@HoughLinesPointSet_Async: - name: HoughLinesPointSet_Async - c:@F@HoughLines_Async: - name: HoughLines_Async - c:@F@Integral: - name: Integral - c:@F@Integral_Async: - name: Integral_Async - c:@F@InvertAffineTransform: - name: InvertAffineTransform - c:@F@InvertAffineTransform_Async: - name: InvertAffineTransform_Async - c:@F@Laplacian: - name: Laplacian - c:@F@Laplacian_Async: - name: Laplacian_Async - c:@F@Line: - name: Line - c:@F@Line_Async: - name: Line_Async - c:@F@LinearPolar: - name: LinearPolar - c:@F@LinearPolar_Async: - name: LinearPolar_Async - c:@F@LogPolar: - name: LogPolar - c:@F@LogPolar_Async: - name: LogPolar_Async - c:@F@Mat_Accumulate: - name: Mat_Accumulate - c:@F@Mat_AccumulateProduct: - name: Mat_AccumulateProduct - c:@F@Mat_AccumulateProductWithMask: - name: Mat_AccumulateProductWithMask - c:@F@Mat_AccumulateProductWithMask_Async: - name: Mat_AccumulateProductWithMask_Async - c:@F@Mat_AccumulateProduct_Async: - name: Mat_AccumulateProduct_Async - c:@F@Mat_AccumulateSquare: - name: Mat_AccumulateSquare - c:@F@Mat_AccumulateSquareWithMask: - name: Mat_AccumulateSquareWithMask - c:@F@Mat_AccumulateSquareWithMask_Async: - name: Mat_AccumulateSquareWithMask_Async - c:@F@Mat_AccumulateSquare_Async: - name: Mat_AccumulateSquare_Async - c:@F@Mat_AccumulateWithMask: - name: Mat_AccumulateWithMask - c:@F@Mat_AccumulateWithMask_Async: - name: Mat_AccumulateWithMask_Async - c:@F@Mat_Accumulate_Async: - name: Mat_Accumulate_Async - c:@F@Mat_AccumulatedWeighted: - name: Mat_AccumulatedWeighted - c:@F@Mat_AccumulatedWeightedWithMask: - name: Mat_AccumulatedWeightedWithMask - c:@F@Mat_AccumulatedWeightedWithMask_Async: - name: Mat_AccumulatedWeightedWithMask_Async - c:@F@Mat_AccumulatedWeighted_Async: - name: Mat_AccumulatedWeighted_Async - c:@F@MatchShapes: - name: MatchShapes - c:@F@MatchShapes_Async: - name: MatchShapes_Async - c:@F@MatchTemplate: - name: MatchTemplate - c:@F@MatchTemplate_Async: - name: MatchTemplate_Async - c:@F@MedianBlur: - name: MedianBlur - c:@F@MedianBlur_Async: - name: MedianBlur_Async - c:@F@MinAreaRect: - name: MinAreaRect - c:@F@MinAreaRect_Async: - name: MinAreaRect_Async - c:@F@MinEnclosingCircle: - name: MinEnclosingCircle - c:@F@MinEnclosingCircle_Async: - name: MinEnclosingCircle_Async - c:@F@Moments: - name: Moments - c:@F@Moments_Async: - name: Moments_Async - c:@F@MorphologyDefaultBorderValue: - name: MorphologyDefaultBorderValue - c:@F@MorphologyDefaultBorderValue_Async: - name: MorphologyDefaultBorderValue_Async - c:@F@MorphologyEx: - name: MorphologyEx - c:@F@MorphologyExWithParams: - name: MorphologyExWithParams - c:@F@MorphologyExWithParams_Async: - name: MorphologyExWithParams_Async - c:@F@MorphologyEx_Async: - name: MorphologyEx_Async - c:@F@PhaseCorrelate: - name: PhaseCorrelate - c:@F@PhaseCorrelate_Async: - name: PhaseCorrelate_Async - c:@F@PointPolygonTest: - name: PointPolygonTest - c:@F@PointPolygonTest_Async: - name: PointPolygonTest_Async - c:@F@Polylines: - name: Polylines - c:@F@Polylines_Async: - name: Polylines_Async - c:@F@PutText: - name: PutText - c:@F@PutTextWithParams: - name: PutTextWithParams - c:@F@PutTextWithParams_Async: - name: PutTextWithParams_Async - c:@F@PutText_Async: - name: PutText_Async - c:@F@PyrDown: - name: PyrDown - c:@F@PyrDown_Async: - name: PyrDown_Async - c:@F@PyrUp: - name: PyrUp - c:@F@PyrUp_Async: - name: PyrUp_Async - c:@F@Rectangle: - name: Rectangle - c:@F@RectangleWithParams: - name: RectangleWithParams - c:@F@RectangleWithParams_Async: - name: RectangleWithParams_Async - c:@F@Rectangle_Async: - name: Rectangle_Async - c:@F@Remap: - name: Remap - c:@F@Remap_Async: - name: Remap_Async - c:@F@Resize: - name: Resize - c:@F@Resize_Async: - name: Resize_Async - c:@F@Scharr: - name: Scharr - c:@F@Scharr_Async: - name: Scharr_Async - c:@F@SepFilter2D: - name: SepFilter2D - c:@F@SepFilter2D_Async: - name: SepFilter2D_Async - c:@F@Sobel: - name: Sobel - c:@F@Sobel_Async: - name: Sobel_Async - c:@F@SpatialGradient: - name: SpatialGradient - c:@F@SpatialGradient_Async: - name: SpatialGradient_Async - c:@F@SqBoxFilter_Async: - name: SqBoxFilter_Async - c:@F@SqrBoxFilter: - name: SqrBoxFilter - c:@F@Subdiv2D_Close: - name: Subdiv2D_Close - c:@F@Subdiv2D_Close_Async: - name: Subdiv2D_Close_Async - c:@F@Subdiv2D_EdgeDst: - name: Subdiv2D_EdgeDst - c:@F@Subdiv2D_EdgeDst_Async: - name: Subdiv2D_EdgeDst_Async - c:@F@Subdiv2D_EdgeOrg: - name: Subdiv2D_EdgeOrg - c:@F@Subdiv2D_EdgeOrg_Async: - name: Subdiv2D_EdgeOrg_Async - c:@F@Subdiv2D_FindNearest: - name: Subdiv2D_FindNearest - c:@F@Subdiv2D_FindNearest_Async: - name: Subdiv2D_FindNearest_Async - c:@F@Subdiv2D_GetEdge: - name: Subdiv2D_GetEdge - c:@F@Subdiv2D_GetEdgeList: - name: Subdiv2D_GetEdgeList - c:@F@Subdiv2D_GetEdgeList_Async: - name: Subdiv2D_GetEdgeList_Async - c:@F@Subdiv2D_GetEdge_Async: - name: Subdiv2D_GetEdge_Async - c:@F@Subdiv2D_GetLeadingEdgeList: - name: Subdiv2D_GetLeadingEdgeList - c:@F@Subdiv2D_GetLeadingEdgeList_Async: - name: Subdiv2D_GetLeadingEdgeList_Async - c:@F@Subdiv2D_GetTriangleList: - name: Subdiv2D_GetTriangleList - c:@F@Subdiv2D_GetTriangleList_Async: - name: Subdiv2D_GetTriangleList_Async - c:@F@Subdiv2D_GetVertex: - name: Subdiv2D_GetVertex - c:@F@Subdiv2D_GetVertex_Async: - name: Subdiv2D_GetVertex_Async - c:@F@Subdiv2D_GetVoronoiFacetList: - name: Subdiv2D_GetVoronoiFacetList - c:@F@Subdiv2D_GetVoronoiFacetList_Async: - name: Subdiv2D_GetVoronoiFacetList_Async - c:@F@Subdiv2D_InitDelaunay: - name: Subdiv2D_InitDelaunay - c:@F@Subdiv2D_InitDelaunay_Async: - name: Subdiv2D_InitDelaunay_Async - c:@F@Subdiv2D_Insert: - name: Subdiv2D_Insert - c:@F@Subdiv2D_InsertVec: - name: Subdiv2D_InsertVec - c:@F@Subdiv2D_InsertVec_Async: - name: Subdiv2D_InsertVec_Async - c:@F@Subdiv2D_Insert_Async: - name: Subdiv2D_Insert_Async - c:@F@Subdiv2D_Locate: - name: Subdiv2D_Locate - c:@F@Subdiv2D_Locate_Async: - name: Subdiv2D_Locate_Async - c:@F@Subdiv2D_NewEmpty: - name: Subdiv2D_NewEmpty - c:@F@Subdiv2D_NewEmpty_Async: - name: Subdiv2D_NewEmpty_Async - c:@F@Subdiv2D_NewWithRect: - name: Subdiv2D_NewWithRect - c:@F@Subdiv2D_NewWithRect_Async: - name: Subdiv2D_NewWithRect_Async - c:@F@Subdiv2D_NextEdge: - name: Subdiv2D_NextEdge - c:@F@Subdiv2D_NextEdge_Async: - name: Subdiv2D_NextEdge_Async - c:@F@Subdiv2D_RotateEdge: - name: Subdiv2D_RotateEdge - c:@F@Subdiv2D_RotateEdge_Async: - name: Subdiv2D_RotateEdge_Async - c:@F@Subdiv2D_SymEdge: - name: Subdiv2D_SymEdge - c:@F@Subdiv2D_SymEdge_Async: - name: Subdiv2D_SymEdge_Async - c:@F@Threshold: - name: Threshold - c:@F@Threshold_Async: - name: Threshold_Async - c:@F@WarpAffine: - name: WarpAffine - c:@F@WarpAffineWithParams: - name: WarpAffineWithParams - c:@F@WarpAffineWithParams_Async: - name: WarpAffineWithParams_Async - c:@F@WarpAffine_Async: - name: WarpAffine_Async - c:@F@WarpPerspective: - name: WarpPerspective - c:@F@WarpPerspectiveWithParams: - name: WarpPerspectiveWithParams - c:@F@WarpPerspectiveWithParams_Async: - name: WarpPerspectiveWithParams_Async - c:@F@WarpPerspective_Async: - name: WarpPerspective_Async - c:@F@Watershed: - name: Watershed - c:@F@Watershed_Async: - name: Watershed_Async + c:@F@cv_CLAHE_apply: + name: cv_CLAHE_apply + c:@F@cv_CLAHE_close: + name: cv_CLAHE_close + c:@F@cv_CLAHE_collectGarbage: + name: cv_CLAHE_collectGarbage + c:@F@cv_CLAHE_create: + name: cv_CLAHE_create + c:@F@cv_CLAHE_create_1: + name: cv_CLAHE_create_1 + c:@F@cv_CLAHE_getClipLimit: + name: cv_CLAHE_getClipLimit + c:@F@cv_CLAHE_getTilesGridSize: + name: cv_CLAHE_getTilesGridSize + c:@F@cv_CLAHE_setClipLimit: + name: cv_CLAHE_setClipLimit + c:@F@cv_CLAHE_setTilesGridSize: + name: cv_CLAHE_setTilesGridSize + c:@F@cv_GaussianBlur: + name: cv_GaussianBlur + c:@F@cv_HoughCircles: + name: cv_HoughCircles + c:@F@cv_HoughCircles_1: + name: cv_HoughCircles_1 + c:@F@cv_HoughLines: + name: cv_HoughLines + c:@F@cv_HoughLinesP: + name: cv_HoughLinesP + c:@F@cv_HoughLinesP_1: + name: cv_HoughLinesP_1 + c:@F@cv_HoughLinesPointSet: + name: cv_HoughLinesPointSet + c:@F@cv_Laplacian: + name: cv_Laplacian + c:@F@cv_Scharr: + name: cv_Scharr + c:@F@cv_Sobel: + name: cv_Sobel + c:@F@cv_Subdiv2D_close: + name: cv_Subdiv2D_close + c:@F@cv_Subdiv2D_create: + name: cv_Subdiv2D_create + c:@F@cv_Subdiv2D_create_1: + name: cv_Subdiv2D_create_1 + c:@F@cv_Subdiv2D_edgeDst: + name: cv_Subdiv2D_edgeDst + c:@F@cv_Subdiv2D_edgeOrg: + name: cv_Subdiv2D_edgeOrg + c:@F@cv_Subdiv2D_findNearest: + name: cv_Subdiv2D_findNearest + c:@F@cv_Subdiv2D_getEdge: + name: cv_Subdiv2D_getEdge + c:@F@cv_Subdiv2D_getEdgeList: + name: cv_Subdiv2D_getEdgeList + c:@F@cv_Subdiv2D_getLeadingEdgeList: + name: cv_Subdiv2D_getLeadingEdgeList + c:@F@cv_Subdiv2D_getTriangleList: + name: cv_Subdiv2D_getTriangleList + c:@F@cv_Subdiv2D_getVertex: + name: cv_Subdiv2D_getVertex + c:@F@cv_Subdiv2D_getVoronoiFacetList: + name: cv_Subdiv2D_getVoronoiFacetList + c:@F@cv_Subdiv2D_initDelaunay: + name: cv_Subdiv2D_initDelaunay + c:@F@cv_Subdiv2D_insert: + name: cv_Subdiv2D_insert + c:@F@cv_Subdiv2D_insertVec: + name: cv_Subdiv2D_insertVec + c:@F@cv_Subdiv2D_locate: + name: cv_Subdiv2D_locate + c:@F@cv_Subdiv2D_nextEdge: + name: cv_Subdiv2D_nextEdge + c:@F@cv_Subdiv2D_rotateEdge: + name: cv_Subdiv2D_rotateEdge + c:@F@cv_Subdiv2D_symEdge: + name: cv_Subdiv2D_symEdge + c:@F@cv_accumulate: + name: cv_accumulate + c:@F@cv_accumulateProduct: + name: cv_accumulateProduct + c:@F@cv_accumulateProduct_1: + name: cv_accumulateProduct_1 + c:@F@cv_accumulateSquare: + name: cv_accumulateSquare + c:@F@cv_accumulateSquare_1: + name: cv_accumulateSquare_1 + c:@F@cv_accumulate_1: + name: cv_accumulate_1 + c:@F@cv_accumulatedWeighted: + name: cv_accumulatedWeighted + c:@F@cv_accumulatedWeighted_1: + name: cv_accumulatedWeighted_1 + c:@F@cv_adaptiveThreshold: + name: cv_adaptiveThreshold + c:@F@cv_applyColorMap: + name: cv_applyColorMap + c:@F@cv_applyColorMap_1: + name: cv_applyColorMap_1 + c:@F@cv_approxPolyDP: + name: cv_approxPolyDP + c:@F@cv_arcLength: + name: cv_arcLength + c:@F@cv_arrowedLine: + name: cv_arrowedLine + c:@F@cv_bilateralFilter: + name: cv_bilateralFilter + c:@F@cv_blur: + name: cv_blur + c:@F@cv_boundingRect: + name: cv_boundingRect + c:@F@cv_boxFilter: + name: cv_boxFilter + c:@F@cv_boxPoints: + name: cv_boxPoints + c:@F@cv_calcBackProject: + name: cv_calcBackProject + c:@F@cv_calcHist: + name: cv_calcHist + c:@F@cv_canny: + name: cv_canny + c:@F@cv_circle: + name: cv_circle + c:@F@cv_circle_1: + name: cv_circle_1 + c:@F@cv_clipLine: + name: cv_clipLine + c:@F@cv_compareHist: + name: cv_compareHist + c:@F@cv_connectedComponents: + name: cv_connectedComponents + c:@F@cv_connectedComponents_1: + name: cv_connectedComponents_1 + c:@F@cv_contourArea: + name: cv_contourArea + c:@F@cv_convexHull: + name: cv_convexHull + c:@F@cv_convexityDefects: + name: cv_convexityDefects + c:@F@cv_cornerSubPix: + name: cv_cornerSubPix + c:@F@cv_cvtColor: + name: cv_cvtColor + c:@F@cv_dilate: + name: cv_dilate + c:@F@cv_dilate_1: + name: cv_dilate_1 + c:@F@cv_distanceTransform: + name: cv_distanceTransform + c:@F@cv_drawContours: + name: cv_drawContours + c:@F@cv_drawContours_1: + name: cv_drawContours_1 + c:@F@cv_ellipse: + name: cv_ellipse + c:@F@cv_ellipse_1: + name: cv_ellipse_1 + c:@F@cv_equalizeHist: + name: cv_equalizeHist + c:@F@cv_erode: + name: cv_erode + c:@F@cv_erode_1: + name: cv_erode_1 + c:@F@cv_fillPoly: + name: cv_fillPoly + c:@F@cv_fillPoly_1: + name: cv_fillPoly_1 + c:@F@cv_filter2D: + name: cv_filter2D + c:@F@cv_findContours: + name: cv_findContours + c:@F@cv_fitEllipse: + name: cv_fitEllipse + c:@F@cv_fitLine: + name: cv_fitLine + c:@F@cv_floodFill: + name: cv_floodFill + c:@F@cv_getAffineTransform: + name: cv_getAffineTransform + c:@F@cv_getAffineTransform2f: + name: cv_getAffineTransform2f + c:@F@cv_getGaussianKernel: + name: cv_getGaussianKernel + c:@F@cv_getPerspectiveTransform: + name: cv_getPerspectiveTransform + c:@F@cv_getPerspectiveTransform2f: + name: cv_getPerspectiveTransform2f + c:@F@cv_getRectSubPix: + name: cv_getRectSubPix + c:@F@cv_getRotationMatrix2D: + name: cv_getRotationMatrix2D + c:@F@cv_getStructuringElement: + name: cv_getStructuringElement + c:@F@cv_getTextSize: + name: cv_getTextSize + c:@F@cv_goodFeaturesToTrack: + name: cv_goodFeaturesToTrack + c:@F@cv_goodFeaturesToTrack_1: + name: cv_goodFeaturesToTrack_1 + c:@F@cv_grabCut: + name: cv_grabCut + c:@F@cv_integral: + name: cv_integral + c:@F@cv_invertAffineTransform: + name: cv_invertAffineTransform + c:@F@cv_line: + name: cv_line + c:@F@cv_linearPolar: + name: cv_linearPolar + c:@F@cv_logPolar: + name: cv_logPolar + c:@F@cv_matchShapes: + name: cv_matchShapes + c:@F@cv_matchTemplate: + name: cv_matchTemplate + c:@F@cv_medianBlur: + name: cv_medianBlur + c:@F@cv_minAreaRect: + name: cv_minAreaRect + c:@F@cv_minEnclosingCircle: + name: cv_minEnclosingCircle + c:@F@cv_moments: + name: cv_moments + c:@F@cv_morphologyDefaultBorderValue: + name: cv_morphologyDefaultBorderValue + c:@F@cv_morphologyEx: + name: cv_morphologyEx + c:@F@cv_morphologyEx_1: + name: cv_morphologyEx_1 + c:@F@cv_phaseCorrelate: + name: cv_phaseCorrelate + c:@F@cv_pointPolygonTest: + name: cv_pointPolygonTest + c:@F@cv_polylines: + name: cv_polylines + c:@F@cv_putText: + name: cv_putText + c:@F@cv_putText_1: + name: cv_putText_1 + c:@F@cv_pyrDown: + name: cv_pyrDown + c:@F@cv_pyrUp: + name: cv_pyrUp + c:@F@cv_rectangle: + name: cv_rectangle + c:@F@cv_rectangle_1: + name: cv_rectangle_1 + c:@F@cv_remap: + name: cv_remap + c:@F@cv_resize: + name: cv_resize + c:@F@cv_sepFilter2D: + name: cv_sepFilter2D + c:@F@cv_spatialGradient: + name: cv_spatialGradient + c:@F@cv_sqrBoxFilter: + name: cv_sqrBoxFilter + c:@F@cv_threshold: + name: cv_threshold + c:@F@cv_warpAffine: + name: cv_warpAffine + c:@F@cv_warpAffine_1: + name: cv_warpAffine_1 + c:@F@cv_warpPerspective: + name: cv_warpPerspective + c:@F@cv_warpPerspective_1: + name: cv_warpPerspective_1 + c:@F@cv_watershed: + name: cv_watershed c:@S@CLAHE: name: CLAHE c:@S@Subdiv2D: diff --git a/packages/dartcv/lib/src/g/objdetect.g.dart b/packages/dartcv/lib/src/g/objdetect.g.dart index ddb4d865..3da666fe 100644 --- a/packages/dartcv/lib/src/g/objdetect.g.dart +++ b/packages/dartcv/lib/src/g/objdetect.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Objdetect /// @@ -30,103 +30,148 @@ class CvNativeObjdetect { lookup) : _lookup = lookup; - void CascadeClassifier_Close( + void cv_CascadeClassifier_close( CascadeClassifierPtr self, ) { - return _CascadeClassifier_Close( + return _cv_CascadeClassifier_close( self, ); } - late final _CascadeClassifier_ClosePtr = + late final _cv_CascadeClassifier_closePtr = _lookup>( - 'CascadeClassifier_Close'); - late final _CascadeClassifier_Close = _CascadeClassifier_ClosePtr.asFunction< - void Function(CascadeClassifierPtr)>(); + 'cv_CascadeClassifier_close'); + late final _cv_CascadeClassifier_close = _cv_CascadeClassifier_closePtr + .asFunction(); - ffi.Pointer CascadeClassifier_DetectMultiScale( + ffi.Pointer cv_CascadeClassifier_create( + ffi.Pointer rval, + ) { + return _cv_CascadeClassifier_create( + rval, + ); + } + + late final _cv_CascadeClassifier_createPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('cv_CascadeClassifier_create'); + late final _cv_CascadeClassifier_create = + _cv_CascadeClassifier_createPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); + + ffi.Pointer cv_CascadeClassifier_create_1( + ffi.Pointer filename, + ffi.Pointer rval, + ) { + return _cv_CascadeClassifier_create_1( + filename, + rval, + ); + } + + late final _cv_CascadeClassifier_create_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>( + 'cv_CascadeClassifier_create_1'); + late final _cv_CascadeClassifier_create_1 = + _cv_CascadeClassifier_create_1Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + ffi.Pointer cv_CascadeClassifier_detectMultiScale( CascadeClassifier self, Mat img, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _CascadeClassifier_DetectMultiScale( + return _cv_CascadeClassifier_detectMultiScale( self, img, rval, + callback, ); } - late final _CascadeClassifier_DetectMultiScalePtr = _lookup< + late final _cv_CascadeClassifier_detectMultiScalePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, Mat, - ffi.Pointer)>>('CascadeClassifier_DetectMultiScale'); - late final _CascadeClassifier_DetectMultiScale = - _CascadeClassifier_DetectMultiScalePtr.asFunction< ffi.Pointer Function( - CascadeClassifier, Mat, ffi.Pointer)>(); + CascadeClassifier, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_CascadeClassifier_detectMultiScale'); + late final _cv_CascadeClassifier_detectMultiScale = + _cv_CascadeClassifier_detectMultiScalePtr.asFunction< + ffi.Pointer Function(CascadeClassifier, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CascadeClassifier_DetectMultiScale2( + ffi.Pointer cv_CascadeClassifier_detectMultiScale_1( CascadeClassifier self, Mat img, ffi.Pointer objects, - ffi.Pointer numDetections, - double scaleFactor, + double scale, int minNeighbors, int flags, CvSize minSize, CvSize maxSize, + imp1.CvCallback_0 callback, ) { - return _CascadeClassifier_DetectMultiScale2( + return _cv_CascadeClassifier_detectMultiScale_1( self, img, objects, - numDetections, - scaleFactor, + scale, minNeighbors, flags, minSize, maxSize, + callback, ); } - late final _CascadeClassifier_DetectMultiScale2Ptr = _lookup< + late final _cv_CascadeClassifier_detectMultiScale_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( CascadeClassifier, Mat, ffi.Pointer, - ffi.Pointer, ffi.Double, ffi.Int, ffi.Int, CvSize, - CvSize)>>('CascadeClassifier_DetectMultiScale2'); - late final _CascadeClassifier_DetectMultiScale2 = - _CascadeClassifier_DetectMultiScale2Ptr.asFunction< + CvSize, + imp1.CvCallback_0)>>('cv_CascadeClassifier_detectMultiScale_1'); + late final _cv_CascadeClassifier_detectMultiScale_1 = + _cv_CascadeClassifier_detectMultiScale_1Ptr.asFunction< ffi.Pointer Function( CascadeClassifier, Mat, ffi.Pointer, - ffi.Pointer, double, int, int, CvSize, - CvSize)>(); + CvSize, + imp1.CvCallback_0)>(); - ffi.Pointer CascadeClassifier_DetectMultiScale2_Async( + ffi.Pointer cv_CascadeClassifier_detectMultiScale_2( CascadeClassifier self, Mat img, + ffi.Pointer objects, + ffi.Pointer numDetections, double scaleFactor, int minNeighbors, int flags, CvSize minSize, CvSize maxSize, - imp1.CvCallback_2 callback, + imp1.CvCallback_0 callback, ) { - return _CascadeClassifier_DetectMultiScale2_Async( + return _cv_CascadeClassifier_detectMultiScale_2( self, img, + objects, + numDetections, scaleFactor, minNeighbors, flags, @@ -136,23 +181,34 @@ class CvNativeObjdetect { ); } - late final _CascadeClassifier_DetectMultiScale2_AsyncPtr = _lookup< + late final _cv_CascadeClassifier_detectMultiScale_2Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( CascadeClassifier, Mat, + ffi.Pointer, + ffi.Pointer, ffi.Double, ffi.Int, ffi.Int, CvSize, CvSize, - imp1.CvCallback_2)>>('CascadeClassifier_DetectMultiScale2_Async'); - late final _CascadeClassifier_DetectMultiScale2_Async = - _CascadeClassifier_DetectMultiScale2_AsyncPtr.asFunction< - ffi.Pointer Function(CascadeClassifier, Mat, double, int, - int, CvSize, CvSize, imp1.CvCallback_2)>(); + imp1.CvCallback_0)>>('cv_CascadeClassifier_detectMultiScale_2'); + late final _cv_CascadeClassifier_detectMultiScale_2 = + _cv_CascadeClassifier_detectMultiScale_2Ptr.asFunction< + ffi.Pointer Function( + CascadeClassifier, + Mat, + ffi.Pointer, + ffi.Pointer, + double, + int, + int, + CvSize, + CvSize, + imp1.CvCallback_0)>(); - ffi.Pointer CascadeClassifier_DetectMultiScale3( + ffi.Pointer cv_CascadeClassifier_detectMultiScale_3( CascadeClassifier self, Mat img, ffi.Pointer objects, @@ -164,8 +220,9 @@ class CvNativeObjdetect { CvSize minSize, CvSize maxSize, bool outputRejectLevels, + imp1.CvCallback_0 callback, ) { - return _CascadeClassifier_DetectMultiScale3( + return _cv_CascadeClassifier_detectMultiScale_3( self, img, objects, @@ -177,10 +234,11 @@ class CvNativeObjdetect { minSize, maxSize, outputRejectLevels, + callback, ); } - late final _CascadeClassifier_DetectMultiScale3Ptr = _lookup< + late final _cv_CascadeClassifier_detectMultiScale_3Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( CascadeClassifier, @@ -193,9 +251,10 @@ class CvNativeObjdetect { ffi.Int, CvSize, CvSize, - ffi.Bool)>>('CascadeClassifier_DetectMultiScale3'); - late final _CascadeClassifier_DetectMultiScale3 = - _CascadeClassifier_DetectMultiScale3Ptr.asFunction< + ffi.Bool, + imp1.CvCallback_0)>>('cv_CascadeClassifier_detectMultiScale_3'); + late final _cv_CascadeClassifier_detectMultiScale_3 = + _cv_CascadeClassifier_detectMultiScale_3Ptr.asFunction< ffi.Pointer Function( CascadeClassifier, Mat, @@ -207,2471 +266,1327 @@ class CvNativeObjdetect { int, CvSize, CvSize, - bool)>(); + bool, + imp1.CvCallback_0)>(); - ffi.Pointer CascadeClassifier_DetectMultiScale3_Async( + ffi.Pointer cv_CascadeClassifier_empty( CascadeClassifier self, - Mat img, - double scaleFactor, - int minNeighbors, - int flags, - CvSize minSize, - CvSize maxSize, - bool outputRejectLevels, - imp1.CvCallback_3 callback, + ffi.Pointer rval, ) { - return _CascadeClassifier_DetectMultiScale3_Async( + return _cv_CascadeClassifier_empty( self, - img, - scaleFactor, - minNeighbors, - flags, - minSize, - maxSize, - outputRejectLevels, - callback, + rval, ); } - late final _CascadeClassifier_DetectMultiScale3_AsyncPtr = _lookup< + late final _cv_CascadeClassifier_emptyPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(CascadeClassifier, + ffi.Pointer)>>('cv_CascadeClassifier_empty'); + late final _cv_CascadeClassifier_empty = + _cv_CascadeClassifier_emptyPtr.asFunction< ffi.Pointer Function( - CascadeClassifier, - Mat, - ffi.Double, - ffi.Int, - ffi.Int, - CvSize, - CvSize, - ffi.Bool, - imp1.CvCallback_3)>>('CascadeClassifier_DetectMultiScale3_Async'); - late final _CascadeClassifier_DetectMultiScale3_Async = - _CascadeClassifier_DetectMultiScale3_AsyncPtr.asFunction< - ffi.Pointer Function(CascadeClassifier, Mat, double, int, - int, CvSize, CvSize, bool, imp1.CvCallback_3)>(); + CascadeClassifier, ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_DetectMultiScaleWithParams( + ffi.Pointer cv_CascadeClassifier_getFeatureType( CascadeClassifier self, - Mat img, - ffi.Pointer objects, - double scale, - int minNeighbors, - int flags, - CvSize minSize, - CvSize maxSize, + ffi.Pointer rval, ) { - return _CascadeClassifier_DetectMultiScaleWithParams( + return _cv_CascadeClassifier_getFeatureType( self, - img, - objects, - scale, - minNeighbors, - flags, - minSize, - maxSize, + rval, ); } - late final _CascadeClassifier_DetectMultiScaleWithParamsPtr = _lookup< + late final _cv_CascadeClassifier_getFeatureTypePtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(CascadeClassifier, + ffi.Pointer)>>('cv_CascadeClassifier_getFeatureType'); + late final _cv_CascadeClassifier_getFeatureType = + _cv_CascadeClassifier_getFeatureTypePtr.asFunction< ffi.Pointer Function( - CascadeClassifier, - Mat, - ffi.Pointer, - ffi.Double, - ffi.Int, - ffi.Int, - CvSize, - CvSize)>>('CascadeClassifier_DetectMultiScaleWithParams'); - late final _CascadeClassifier_DetectMultiScaleWithParams = - _CascadeClassifier_DetectMultiScaleWithParamsPtr.asFunction< - ffi.Pointer Function(CascadeClassifier, Mat, - ffi.Pointer, double, int, int, CvSize, CvSize)>(); + CascadeClassifier, ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_DetectMultiScaleWithParams_Async( + ffi.Pointer cv_CascadeClassifier_getOriginalWindowSize( CascadeClassifier self, - Mat img, - double scale, - int minNeighbors, - int flags, - CvSize minSize, - CvSize maxSize, - imp1.CvCallback_1 callback, + ffi.Pointer rval, ) { - return _CascadeClassifier_DetectMultiScaleWithParams_Async( + return _cv_CascadeClassifier_getOriginalWindowSize( self, - img, - scale, - minNeighbors, - flags, - minSize, - maxSize, - callback, + rval, ); } - late final _CascadeClassifier_DetectMultiScaleWithParams_AsyncPtr = _lookup< + late final _cv_CascadeClassifier_getOriginalWindowSizePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, Mat, ffi.Double, - ffi.Int, ffi.Int, CvSize, CvSize, imp1.CvCallback_1)>>( - 'CascadeClassifier_DetectMultiScaleWithParams_Async'); - late final _CascadeClassifier_DetectMultiScaleWithParams_Async = - _CascadeClassifier_DetectMultiScaleWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(CascadeClassifier, Mat, double, int, - int, CvSize, CvSize, imp1.CvCallback_1)>(); - - ffi.Pointer CascadeClassifier_DetectMultiScale_Async( + ffi.Pointer Function( + CascadeClassifier, ffi.Pointer)>>( + 'cv_CascadeClassifier_getOriginalWindowSize'); + late final _cv_CascadeClassifier_getOriginalWindowSize = + _cv_CascadeClassifier_getOriginalWindowSizePtr.asFunction< + ffi.Pointer Function( + CascadeClassifier, ffi.Pointer)>(); + + ffi.Pointer cv_CascadeClassifier_isOldFormatCascade( CascadeClassifier self, - Mat img, - imp1.CvCallback_1 callback, + ffi.Pointer rval, ) { - return _CascadeClassifier_DetectMultiScale_Async( + return _cv_CascadeClassifier_isOldFormatCascade( self, - img, - callback, + rval, ); } - late final _CascadeClassifier_DetectMultiScale_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, Mat, - imp1.CvCallback_1)>>('CascadeClassifier_DetectMultiScale_Async'); - late final _CascadeClassifier_DetectMultiScale_Async = - _CascadeClassifier_DetectMultiScale_AsyncPtr.asFunction< + late final _cv_CascadeClassifier_isOldFormatCascadePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + CascadeClassifier, ffi.Pointer)>>( + 'cv_CascadeClassifier_isOldFormatCascade'); + late final _cv_CascadeClassifier_isOldFormatCascade = + _cv_CascadeClassifier_isOldFormatCascadePtr.asFunction< ffi.Pointer Function( - CascadeClassifier, Mat, imp1.CvCallback_1)>(); + CascadeClassifier, ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_Empty( + ffi.Pointer cv_CascadeClassifier_load( CascadeClassifier self, - ffi.Pointer rval, + ffi.Pointer name, + ffi.Pointer rval, ) { - return _CascadeClassifier_Empty( + return _cv_CascadeClassifier_load( self, + name, rval, ); } - late final _CascadeClassifier_EmptyPtr = _lookup< + late final _cv_CascadeClassifier_loadPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function( + CascadeClassifier, + ffi.Pointer, + ffi.Pointer)>>('cv_CascadeClassifier_load'); + late final _cv_CascadeClassifier_load = + _cv_CascadeClassifier_loadPtr.asFunction< ffi.Pointer Function(CascadeClassifier, - ffi.Pointer)>>('CascadeClassifier_Empty'); - late final _CascadeClassifier_Empty = _CascadeClassifier_EmptyPtr.asFunction< - ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_Empty_Async( - CascadeClassifier self, - imp1.CvCallback_1 callback, + void cv_FaceDetectorYN_close( + FaceDetectorYNPtr self, ) { - return _CascadeClassifier_Empty_Async( + return _cv_FaceDetectorYN_close( self, - callback, ); } - late final _CascadeClassifier_Empty_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, - imp1.CvCallback_1)>>('CascadeClassifier_Empty_Async'); - late final _CascadeClassifier_Empty_Async = - _CascadeClassifier_Empty_AsyncPtr.asFunction< - ffi.Pointer Function( - CascadeClassifier, imp1.CvCallback_1)>(); + late final _cv_FaceDetectorYN_closePtr = + _lookup>( + 'cv_FaceDetectorYN_close'); + late final _cv_FaceDetectorYN_close = _cv_FaceDetectorYN_closePtr + .asFunction(); - ffi.Pointer CascadeClassifier_Load( - CascadeClassifier self, - ffi.Pointer name, - ffi.Pointer rval, + ffi.Pointer cv_FaceDetectorYN_create( + ffi.Pointer model, + ffi.Pointer config, + CvSize input_size, + double score_threshold, + double nms_threshold, + int top_k, + int backend_id, + int target_id, + ffi.Pointer rval, ) { - return _CascadeClassifier_Load( - self, - name, + return _cv_FaceDetectorYN_create( + model, + config, + input_size, + score_threshold, + nms_threshold, + top_k, + backend_id, + target_id, rval, ); } - late final _CascadeClassifier_LoadPtr = _lookup< + late final _cv_FaceDetectorYN_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CascadeClassifier, ffi.Pointer, - ffi.Pointer)>>('CascadeClassifier_Load'); - late final _CascadeClassifier_Load = _CascadeClassifier_LoadPtr.asFunction< - ffi.Pointer Function( - CascadeClassifier, ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + CvSize, + ffi.Float, + ffi.Float, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer)>>('cv_FaceDetectorYN_create'); + late final _cv_FaceDetectorYN_create = + _cv_FaceDetectorYN_createPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + CvSize, + double, + double, + int, + int, + int, + ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_Load_Async( - CascadeClassifier self, - ffi.Pointer name, - imp1.CvCallback_1 callback, + ffi.Pointer cv_FaceDetectorYN_create_1( + ffi.Pointer framework, + VecUChar buffer, + VecUChar buffer_config, + CvSize input_size, + double score_threshold, + double nms_threshold, + int top_k, + int backend_id, + int target_id, + ffi.Pointer rval, ) { - return _CascadeClassifier_Load_Async( - self, - name, - callback, + return _cv_FaceDetectorYN_create_1( + framework, + buffer, + buffer_config, + input_size, + score_threshold, + nms_threshold, + top_k, + backend_id, + target_id, + rval, ); } - late final _CascadeClassifier_Load_AsyncPtr = _lookup< + late final _cv_FaceDetectorYN_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - CascadeClassifier, ffi.Pointer, - imp1.CvCallback_1)>>('CascadeClassifier_Load_Async'); - late final _CascadeClassifier_Load_Async = - _CascadeClassifier_Load_AsyncPtr.asFunction< + VecUChar, + VecUChar, + CvSize, + ffi.Float, + ffi.Float, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer)>>('cv_FaceDetectorYN_create_1'); + late final _cv_FaceDetectorYN_create_1 = + _cv_FaceDetectorYN_create_1Ptr.asFunction< ffi.Pointer Function( - CascadeClassifier, ffi.Pointer, imp1.CvCallback_1)>(); + ffi.Pointer, + VecUChar, + VecUChar, + CvSize, + double, + double, + int, + int, + int, + ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_New( - ffi.Pointer rval, + ffi.Pointer cv_FaceDetectorYN_detect( + FaceDetectorYN self, + Mat img, + ffi.Pointer faces, + imp1.CvCallback_0 callback, ) { - return _CascadeClassifier_New( - rval, + return _cv_FaceDetectorYN_detect( + self, + img, + faces, + callback, ); } - late final _CascadeClassifier_NewPtr = _lookup< + late final _cv_FaceDetectorYN_detectPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(FaceDetectorYN, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_FaceDetectorYN_detect'); + late final _cv_FaceDetectorYN_detect = + _cv_FaceDetectorYN_detectPtr.asFunction< ffi.Pointer Function( - ffi.Pointer)>>('CascadeClassifier_New'); - late final _CascadeClassifier_New = _CascadeClassifier_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + FaceDetectorYN, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer CascadeClassifier_NewFromFile( - ffi.Pointer filename, - ffi.Pointer rval, + ffi.Pointer cv_FaceDetectorYN_getInputSize( + FaceDetectorYN self, + ffi.Pointer input_size, ) { - return _CascadeClassifier_NewFromFile( - filename, - rval, + return _cv_FaceDetectorYN_getInputSize( + self, + input_size, ); } - late final _CascadeClassifier_NewFromFilePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>>( - 'CascadeClassifier_NewFromFile'); - late final _CascadeClassifier_NewFromFile = - _CascadeClassifier_NewFromFilePtr.asFunction< + late final _cv_FaceDetectorYN_getInputSizePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(FaceDetectorYN, + ffi.Pointer)>>('cv_FaceDetectorYN_getInputSize'); + late final _cv_FaceDetectorYN_getInputSize = + _cv_FaceDetectorYN_getInputSizePtr.asFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + FaceDetectorYN, ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_NewFromFile_Async( - ffi.Pointer filename, - imp1.CvCallback_1 callback, + ffi.Pointer cv_FaceDetectorYN_getNMSThreshold( + FaceDetectorYN self, + ffi.Pointer nms_threshold, ) { - return _CascadeClassifier_NewFromFile_Async( - filename, - callback, + return _cv_FaceDetectorYN_getNMSThreshold( + self, + nms_threshold, ); } - late final _CascadeClassifier_NewFromFile_AsyncPtr = _lookup< + late final _cv_FaceDetectorYN_getNMSThresholdPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - imp1.CvCallback_1)>>('CascadeClassifier_NewFromFile_Async'); - late final _CascadeClassifier_NewFromFile_Async = - _CascadeClassifier_NewFromFile_AsyncPtr.asFunction< + ffi.Pointer Function(FaceDetectorYN, + ffi.Pointer)>>('cv_FaceDetectorYN_getNMSThreshold'); + late final _cv_FaceDetectorYN_getNMSThreshold = + _cv_FaceDetectorYN_getNMSThresholdPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, imp1.CvCallback_1)>(); + FaceDetectorYN, ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_New_Async( - imp1.CvCallback_1 callback, + ffi.Pointer cv_FaceDetectorYN_getScoreThreshold( + FaceDetectorYN self, + ffi.Pointer score_threshold, ) { - return _CascadeClassifier_New_Async( - callback, + return _cv_FaceDetectorYN_getScoreThreshold( + self, + score_threshold, ); } - late final _CascadeClassifier_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'CascadeClassifier_New_Async'); - late final _CascadeClassifier_New_Async = _CascadeClassifier_New_AsyncPtr - .asFunction Function(imp1.CvCallback_1)>(); + late final _cv_FaceDetectorYN_getScoreThresholdPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(FaceDetectorYN, + ffi.Pointer)>>('cv_FaceDetectorYN_getScoreThreshold'); + late final _cv_FaceDetectorYN_getScoreThreshold = + _cv_FaceDetectorYN_getScoreThresholdPtr.asFunction< + ffi.Pointer Function( + FaceDetectorYN, ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_getFeatureType( - CascadeClassifier self, - ffi.Pointer rval, + ffi.Pointer cv_FaceDetectorYN_getTopK( + FaceDetectorYN self, + ffi.Pointer top_k, ) { - return _CascadeClassifier_getFeatureType( + return _cv_FaceDetectorYN_getTopK( self, - rval, + top_k, ); } - late final _CascadeClassifier_getFeatureTypePtr = _lookup< + late final _cv_FaceDetectorYN_getTopKPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, - ffi.Pointer)>>('CascadeClassifier_getFeatureType'); - late final _CascadeClassifier_getFeatureType = - _CascadeClassifier_getFeatureTypePtr.asFunction< + ffi.Pointer Function(FaceDetectorYN, + ffi.Pointer)>>('cv_FaceDetectorYN_getTopK'); + late final _cv_FaceDetectorYN_getTopK = + _cv_FaceDetectorYN_getTopKPtr.asFunction< ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + FaceDetectorYN, ffi.Pointer)>(); - ffi.Pointer CascadeClassifier_getFeatureType_Async( - CascadeClassifier self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_FaceDetectorYN_setInputSize( + FaceDetectorYN self, + CvSize input_size, ) { - return _CascadeClassifier_getFeatureType_Async( + return _cv_FaceDetectorYN_setInputSize( self, - callback, + input_size, ); } - late final _CascadeClassifier_getFeatureType_AsyncPtr = _lookup< + late final _cv_FaceDetectorYN_setInputSizePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, - imp1.CvCallback_1)>>('CascadeClassifier_getFeatureType_Async'); - late final _CascadeClassifier_getFeatureType_Async = - _CascadeClassifier_getFeatureType_AsyncPtr.asFunction< ffi.Pointer Function( - CascadeClassifier, imp1.CvCallback_1)>(); + FaceDetectorYN, CvSize)>>('cv_FaceDetectorYN_setInputSize'); + late final _cv_FaceDetectorYN_setInputSize = + _cv_FaceDetectorYN_setInputSizePtr + .asFunction Function(FaceDetectorYN, CvSize)>(); - ffi.Pointer CascadeClassifier_getOriginalWindowSize( - CascadeClassifier self, - ffi.Pointer rval, + ffi.Pointer cv_FaceDetectorYN_setNMSThreshold( + FaceDetectorYN self, + double nms_threshold, ) { - return _CascadeClassifier_getOriginalWindowSize( + return _cv_FaceDetectorYN_setNMSThreshold( self, - rval, + nms_threshold, ); } - late final _CascadeClassifier_getOriginalWindowSizePtr = _lookup< + late final _cv_FaceDetectorYN_setNMSThresholdPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, - ffi.Pointer)>>('CascadeClassifier_getOriginalWindowSize'); - late final _CascadeClassifier_getOriginalWindowSize = - _CascadeClassifier_getOriginalWindowSizePtr.asFunction< ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + FaceDetectorYN, ffi.Float)>>('cv_FaceDetectorYN_setNMSThreshold'); + late final _cv_FaceDetectorYN_setNMSThreshold = + _cv_FaceDetectorYN_setNMSThresholdPtr + .asFunction Function(FaceDetectorYN, double)>(); - ffi.Pointer CascadeClassifier_getOriginalWindowSize_Async( - CascadeClassifier self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_FaceDetectorYN_setScoreThreshold( + FaceDetectorYN self, + double score_threshold, ) { - return _CascadeClassifier_getOriginalWindowSize_Async( + return _cv_FaceDetectorYN_setScoreThreshold( self, - callback, + score_threshold, ); } - late final _CascadeClassifier_getOriginalWindowSize_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - CascadeClassifier, imp1.CvCallback_1)>>( - 'CascadeClassifier_getOriginalWindowSize_Async'); - late final _CascadeClassifier_getOriginalWindowSize_Async = - _CascadeClassifier_getOriginalWindowSize_AsyncPtr.asFunction< - ffi.Pointer Function( - CascadeClassifier, imp1.CvCallback_1)>(); + late final _cv_FaceDetectorYN_setScoreThresholdPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(FaceDetectorYN, + ffi.Float)>>('cv_FaceDetectorYN_setScoreThreshold'); + late final _cv_FaceDetectorYN_setScoreThreshold = + _cv_FaceDetectorYN_setScoreThresholdPtr + .asFunction Function(FaceDetectorYN, double)>(); - ffi.Pointer CascadeClassifier_isOldFormatCascade( - CascadeClassifier self, - ffi.Pointer rval, + ffi.Pointer cv_FaceDetectorYN_setTopK( + FaceDetectorYN self, + int top_k, ) { - return _CascadeClassifier_isOldFormatCascade( + return _cv_FaceDetectorYN_setTopK( self, - rval, + top_k, ); } - late final _CascadeClassifier_isOldFormatCascadePtr = _lookup< + late final _cv_FaceDetectorYN_setTopKPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, - ffi.Pointer)>>('CascadeClassifier_isOldFormatCascade'); - late final _CascadeClassifier_isOldFormatCascade = - _CascadeClassifier_isOldFormatCascadePtr.asFunction< ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + FaceDetectorYN, ffi.Int)>>('cv_FaceDetectorYN_setTopK'); + late final _cv_FaceDetectorYN_setTopK = _cv_FaceDetectorYN_setTopKPtr + .asFunction Function(FaceDetectorYN, int)>(); - ffi.Pointer CascadeClassifier_isOldFormatCascade_Async( - CascadeClassifier self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_FaceRecognizerSF_alignCrop( + FaceRecognizerSF self, + Mat src_img, + Mat face_box, + ffi.Pointer aligned_img, + imp1.CvCallback_0 callback, ) { - return _CascadeClassifier_isOldFormatCascade_Async( + return _cv_FaceRecognizerSF_alignCrop( self, + src_img, + face_box, + aligned_img, callback, ); } - late final _CascadeClassifier_isOldFormatCascade_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - CascadeClassifier, imp1.CvCallback_1)>>( - 'CascadeClassifier_isOldFormatCascade_Async'); - late final _CascadeClassifier_isOldFormatCascade_Async = - _CascadeClassifier_isOldFormatCascade_AsyncPtr.asFunction< + late final _cv_FaceRecognizerSF_alignCropPtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - CascadeClassifier, imp1.CvCallback_1)>(); + FaceRecognizerSF, + Mat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_FaceRecognizerSF_alignCrop'); + late final _cv_FaceRecognizerSF_alignCrop = + _cv_FaceRecognizerSF_alignCropPtr.asFunction< + ffi.Pointer Function(FaceRecognizerSF, Mat, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - void FaceDetectorYN_Close( - FaceDetectorYNPtr self, + void cv_FaceRecognizerSF_close( + FaceRecognizerSFPtr self, ) { - return _FaceDetectorYN_Close( + return _cv_FaceRecognizerSF_close( self, ); } - late final _FaceDetectorYN_ClosePtr = - _lookup>( - 'FaceDetectorYN_Close'); - late final _FaceDetectorYN_Close = - _FaceDetectorYN_ClosePtr.asFunction(); + late final _cv_FaceRecognizerSF_closePtr = + _lookup>( + 'cv_FaceRecognizerSF_close'); + late final _cv_FaceRecognizerSF_close = _cv_FaceRecognizerSF_closePtr + .asFunction(); - ffi.Pointer FaceDetectorYN_Detect( - FaceDetectorYN self, - Mat img, - ffi.Pointer faces, + ffi.Pointer cv_FaceRecognizerSF_create( + ffi.Pointer model, + ffi.Pointer config, + int backend_id, + int target_id, + ffi.Pointer rval, ) { - return _FaceDetectorYN_Detect( - self, - img, - faces, + return _cv_FaceRecognizerSF_create( + model, + config, + backend_id, + target_id, + rval, ); } - late final _FaceDetectorYN_DetectPtr = _lookup< + late final _cv_FaceRecognizerSF_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - FaceDetectorYN, Mat, ffi.Pointer)>>('FaceDetectorYN_Detect'); - late final _FaceDetectorYN_Detect = _FaceDetectorYN_DetectPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, Mat, ffi.Pointer)>(); + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer)>>('cv_FaceRecognizerSF_create'); + late final _cv_FaceRecognizerSF_create = + _cv_FaceRecognizerSF_createPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ffi.Pointer)>(); - ffi.Pointer FaceDetectorYN_Detect_Async( - FaceDetectorYN self, - Mat img, - imp1.CvCallback_1 callback, + ffi.Pointer cv_FaceRecognizerSF_feature( + FaceRecognizerSF self, + Mat aligned_img, + bool clone, + ffi.Pointer face_feature, + imp1.CvCallback_0 callback, ) { - return _FaceDetectorYN_Detect_Async( + return _cv_FaceRecognizerSF_feature( self, - img, + aligned_img, + clone, + face_feature, callback, ); } - late final _FaceDetectorYN_Detect_AsyncPtr = _lookup< + late final _cv_FaceRecognizerSF_featurePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, Mat, - imp1.CvCallback_1)>>('FaceDetectorYN_Detect_Async'); - late final _FaceDetectorYN_Detect_Async = - _FaceDetectorYN_Detect_AsyncPtr.asFunction< ffi.Pointer Function( - FaceDetectorYN, Mat, imp1.CvCallback_1)>(); + FaceRecognizerSF, + Mat, + ffi.Bool, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_FaceRecognizerSF_feature'); + late final _cv_FaceRecognizerSF_feature = + _cv_FaceRecognizerSF_featurePtr.asFunction< + ffi.Pointer Function(FaceRecognizerSF, Mat, bool, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer FaceDetectorYN_GetInputSize( - FaceDetectorYN self, - ffi.Pointer input_size, + ffi.Pointer cv_FaceRecognizerSF_match( + FaceRecognizerSF self, + Mat face_feature1, + Mat face_feature2, + int dis_type, + ffi.Pointer distance, + imp1.CvCallback_0 callback, ) { - return _FaceDetectorYN_GetInputSize( + return _cv_FaceRecognizerSF_match( self, - input_size, + face_feature1, + face_feature2, + dis_type, + distance, + callback, ); } - late final _FaceDetectorYN_GetInputSizePtr = _lookup< + late final _cv_FaceRecognizerSF_matchPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - ffi.Pointer)>>('FaceDetectorYN_GetInputSize'); - late final _FaceDetectorYN_GetInputSize = - _FaceDetectorYN_GetInputSizePtr.asFunction< ffi.Pointer Function( - FaceDetectorYN, ffi.Pointer)>(); - - ffi.Pointer FaceDetectorYN_GetInputSize_Async( - FaceDetectorYN self, - imp1.CvCallback_1 callback, + FaceRecognizerSF, + Mat, + Mat, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_FaceRecognizerSF_match'); + late final _cv_FaceRecognizerSF_match = + _cv_FaceRecognizerSF_matchPtr.asFunction< + ffi.Pointer Function(FaceRecognizerSF, Mat, Mat, int, + ffi.Pointer, imp1.CvCallback_0)>(); + + void cv_HOGDescriptor_close( + HOGDescriptorPtr self, ) { - return _FaceDetectorYN_GetInputSize_Async( + return _cv_HOGDescriptor_close( self, - callback, ); } - late final _FaceDetectorYN_GetInputSize_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - imp1.CvCallback_1)>>('FaceDetectorYN_GetInputSize_Async'); - late final _FaceDetectorYN_GetInputSize_Async = - _FaceDetectorYN_GetInputSize_AsyncPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, imp1.CvCallback_1)>(); + late final _cv_HOGDescriptor_closePtr = + _lookup>( + 'cv_HOGDescriptor_close'); + late final _cv_HOGDescriptor_close = + _cv_HOGDescriptor_closePtr.asFunction(); - ffi.Pointer FaceDetectorYN_GetNMSThreshold( - FaceDetectorYN self, - ffi.Pointer nms_threshold, + ffi.Pointer cv_HOGDescriptor_compute( + HOGDescriptor self, + Mat img, + ffi.Pointer descriptors, + CvSize winStride, + CvSize padding, + ffi.Pointer locations, + imp1.CvCallback_0 callback, ) { - return _FaceDetectorYN_GetNMSThreshold( + return _cv_HOGDescriptor_compute( self, - nms_threshold, + img, + descriptors, + winStride, + padding, + locations, + callback, ); } - late final _FaceDetectorYN_GetNMSThresholdPtr = _lookup< + late final _cv_HOGDescriptor_computePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - ffi.Pointer)>>('FaceDetectorYN_GetNMSThreshold'); - late final _FaceDetectorYN_GetNMSThreshold = - _FaceDetectorYN_GetNMSThresholdPtr.asFunction< ffi.Pointer Function( - FaceDetectorYN, ffi.Pointer)>(); + HOGDescriptor, + Mat, + ffi.Pointer, + CvSize, + CvSize, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_HOGDescriptor_compute'); + late final _cv_HOGDescriptor_compute = + _cv_HOGDescriptor_computePtr.asFunction< + ffi.Pointer Function( + HOGDescriptor, + Mat, + ffi.Pointer, + CvSize, + CvSize, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer FaceDetectorYN_GetNMSThreshold_Async( - FaceDetectorYN self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_HOGDescriptor_computeGradient( + HOGDescriptor self, + Mat img, + Mat grad, + Mat angleOfs, + CvSize paddingTL, + CvSize paddingBR, + imp1.CvCallback_0 callback, ) { - return _FaceDetectorYN_GetNMSThreshold_Async( + return _cv_HOGDescriptor_computeGradient( self, + img, + grad, + angleOfs, + paddingTL, + paddingBR, callback, ); } - late final _FaceDetectorYN_GetNMSThreshold_AsyncPtr = _lookup< + late final _cv_HOGDescriptor_computeGradientPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - imp1.CvCallback_1)>>('FaceDetectorYN_GetNMSThreshold_Async'); - late final _FaceDetectorYN_GetNMSThreshold_Async = - _FaceDetectorYN_GetNMSThreshold_AsyncPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, imp1.CvCallback_1)>(); + ffi.Pointer Function(HOGDescriptor, Mat, Mat, Mat, CvSize, + CvSize, imp1.CvCallback_0)>>('cv_HOGDescriptor_computeGradient'); + late final _cv_HOGDescriptor_computeGradient = + _cv_HOGDescriptor_computeGradientPtr.asFunction< + ffi.Pointer Function(HOGDescriptor, Mat, Mat, Mat, CvSize, + CvSize, imp1.CvCallback_0)>(); - ffi.Pointer FaceDetectorYN_GetScoreThreshold( - FaceDetectorYN self, - ffi.Pointer score_threshold, + ffi.Pointer cv_HOGDescriptor_create( + ffi.Pointer rval, ) { - return _FaceDetectorYN_GetScoreThreshold( - self, - score_threshold, + return _cv_HOGDescriptor_create( + rval, ); } - late final _FaceDetectorYN_GetScoreThresholdPtr = _lookup< + late final _cv_HOGDescriptor_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - ffi.Pointer)>>('FaceDetectorYN_GetScoreThreshold'); - late final _FaceDetectorYN_GetScoreThreshold = - _FaceDetectorYN_GetScoreThresholdPtr.asFunction< ffi.Pointer Function( - FaceDetectorYN, ffi.Pointer)>(); - - ffi.Pointer FaceDetectorYN_GetScoreThreshold_Async( - FaceDetectorYN self, - imp1.CvCallback_1 callback, - ) { - return _FaceDetectorYN_GetScoreThreshold_Async( - self, - callback, - ); - } - - late final _FaceDetectorYN_GetScoreThreshold_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - imp1.CvCallback_1)>>('FaceDetectorYN_GetScoreThreshold_Async'); - late final _FaceDetectorYN_GetScoreThreshold_Async = - _FaceDetectorYN_GetScoreThreshold_AsyncPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, imp1.CvCallback_1)>(); + ffi.Pointer)>>('cv_HOGDescriptor_create'); + late final _cv_HOGDescriptor_create = _cv_HOGDescriptor_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer FaceDetectorYN_GetTopK( - FaceDetectorYN self, - ffi.Pointer top_k, + ffi.Pointer cv_HOGDescriptor_create_1( + ffi.Pointer filename, + ffi.Pointer rval, ) { - return _FaceDetectorYN_GetTopK( - self, - top_k, + return _cv_HOGDescriptor_create_1( + filename, + rval, ); } - late final _FaceDetectorYN_GetTopKPtr = _lookup< + late final _cv_HOGDescriptor_create_1Ptr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer)>>('cv_HOGDescriptor_create_1'); + late final _cv_HOGDescriptor_create_1 = + _cv_HOGDescriptor_create_1Ptr.asFunction< ffi.Pointer Function( - FaceDetectorYN, ffi.Pointer)>>('FaceDetectorYN_GetTopK'); - late final _FaceDetectorYN_GetTopK = _FaceDetectorYN_GetTopKPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, ffi.Pointer)>(); + ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer FaceDetectorYN_GetTopK_Async( - FaceDetectorYN self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_HOGDescriptor_detect( + HOGDescriptor self, + Mat img, + ffi.Pointer foundLocations, + ffi.Pointer weights, + double hitThresh, + CvSize winStride, + CvSize padding, + ffi.Pointer searchLocations, + imp1.CvCallback_0 callback, ) { - return _FaceDetectorYN_GetTopK_Async( + return _cv_HOGDescriptor_detect( self, + img, + foundLocations, + weights, + hitThresh, + winStride, + padding, + searchLocations, callback, ); } - late final _FaceDetectorYN_GetTopK_AsyncPtr = _lookup< + late final _cv_HOGDescriptor_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - imp1.CvCallback_1)>>('FaceDetectorYN_GetTopK_Async'); - late final _FaceDetectorYN_GetTopK_Async = - _FaceDetectorYN_GetTopK_AsyncPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, imp1.CvCallback_1)>(); - - ffi.Pointer FaceDetectorYN_New( - ffi.Pointer model, - ffi.Pointer config, - CvSize input_size, - double score_threshold, - double nms_threshold, - int top_k, - int backend_id, - int target_id, - ffi.Pointer rval, - ) { - return _FaceDetectorYN_New( - model, - config, - input_size, - score_threshold, - nms_threshold, - top_k, - backend_id, - target_id, - rval, - ); - } - - late final _FaceDetectorYN_NewPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - CvSize, - ffi.Float, - ffi.Float, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Pointer)>>('FaceDetectorYN_New'); - late final _FaceDetectorYN_New = _FaceDetectorYN_NewPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - CvSize, - double, - double, - int, - int, - int, - ffi.Pointer)>(); - - ffi.Pointer FaceDetectorYN_NewFromBuffer( - ffi.Pointer framework, - VecUChar buffer, - VecUChar buffer_config, - CvSize input_size, - double score_threshold, - double nms_threshold, - int top_k, - int backend_id, - int target_id, - ffi.Pointer rval, - ) { - return _FaceDetectorYN_NewFromBuffer( - framework, - buffer, - buffer_config, - input_size, - score_threshold, - nms_threshold, - top_k, - backend_id, - target_id, - rval, - ); - } - - late final _FaceDetectorYN_NewFromBufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - VecUChar, - VecUChar, - CvSize, - ffi.Float, - ffi.Float, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Pointer)>>('FaceDetectorYN_NewFromBuffer'); - late final _FaceDetectorYN_NewFromBuffer = - _FaceDetectorYN_NewFromBufferPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, - VecUChar, - VecUChar, - CvSize, - double, - double, - int, - int, - int, - ffi.Pointer)>(); - - ffi.Pointer FaceDetectorYN_NewFromBuffer_Async( - ffi.Pointer framework, - VecUChar buffer, - VecUChar buffer_config, - CvSize input_size, - double score_threshold, - double nms_threshold, - int top_k, - int backend_id, - int target_id, - imp1.CvCallback_1 callback, - ) { - return _FaceDetectorYN_NewFromBuffer_Async( - framework, - buffer, - buffer_config, - input_size, - score_threshold, - nms_threshold, - top_k, - backend_id, - target_id, - callback, - ); - } - - late final _FaceDetectorYN_NewFromBuffer_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - VecUChar, - VecUChar, - CvSize, - ffi.Float, - ffi.Float, - ffi.Int, - ffi.Int, - ffi.Int, - imp1.CvCallback_1)>>('FaceDetectorYN_NewFromBuffer_Async'); - late final _FaceDetectorYN_NewFromBuffer_Async = - _FaceDetectorYN_NewFromBuffer_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, - VecUChar, - VecUChar, - CvSize, - double, - double, - int, - int, - int, - imp1.CvCallback_1)>(); - - ffi.Pointer FaceDetectorYN_New_Async( - ffi.Pointer model, - ffi.Pointer config, - CvSize input_size, - double score_threshold, - double nms_threshold, - int top_k, - int backend_id, - int target_id, - imp1.CvCallback_1 callback, - ) { - return _FaceDetectorYN_New_Async( - model, - config, - input_size, - score_threshold, - nms_threshold, - top_k, - backend_id, - target_id, - callback, - ); - } - - late final _FaceDetectorYN_New_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - CvSize, - ffi.Float, - ffi.Float, - ffi.Int, - ffi.Int, - ffi.Int, - imp1.CvCallback_1)>>('FaceDetectorYN_New_Async'); - late final _FaceDetectorYN_New_Async = - _FaceDetectorYN_New_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - CvSize, - double, - double, - int, - int, - int, - imp1.CvCallback_1)>(); - - ffi.Pointer FaceDetectorYN_SetInputSize( - FaceDetectorYN self, - CvSize input_size, - ) { - return _FaceDetectorYN_SetInputSize( - self, - input_size, - ); - } - - late final _FaceDetectorYN_SetInputSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - FaceDetectorYN, CvSize)>>('FaceDetectorYN_SetInputSize'); - late final _FaceDetectorYN_SetInputSize = _FaceDetectorYN_SetInputSizePtr - .asFunction Function(FaceDetectorYN, CvSize)>(); - - ffi.Pointer FaceDetectorYN_SetInputSize_Async( - FaceDetectorYN self, - CvSize input_size, - imp1.CvCallback_0 callback, - ) { - return _FaceDetectorYN_SetInputSize_Async( - self, - input_size, - callback, - ); - } - - late final _FaceDetectorYN_SetInputSize_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, CvSize, - imp1.CvCallback_0)>>('FaceDetectorYN_SetInputSize_Async'); - late final _FaceDetectorYN_SetInputSize_Async = - _FaceDetectorYN_SetInputSize_AsyncPtr.asFunction< - ffi.Pointer Function( - FaceDetectorYN, CvSize, imp1.CvCallback_0)>(); - - ffi.Pointer FaceDetectorYN_SetNMSThreshold( - FaceDetectorYN self, - double nms_threshold, - ) { - return _FaceDetectorYN_SetNMSThreshold( - self, - nms_threshold, - ); - } - - late final _FaceDetectorYN_SetNMSThresholdPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Float)>>('FaceDetectorYN_SetNMSThreshold'); - late final _FaceDetectorYN_SetNMSThreshold = - _FaceDetectorYN_SetNMSThresholdPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, double)>(); - - ffi.Pointer FaceDetectorYN_SetNMSThreshold_Async( - FaceDetectorYN self, - double nms_threshold, - imp1.CvCallback_0 callback, - ) { - return _FaceDetectorYN_SetNMSThreshold_Async( - self, - nms_threshold, - callback, - ); - } - - late final _FaceDetectorYN_SetNMSThreshold_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, ffi.Float, - imp1.CvCallback_0)>>('FaceDetectorYN_SetNMSThreshold_Async'); - late final _FaceDetectorYN_SetNMSThreshold_Async = - _FaceDetectorYN_SetNMSThreshold_AsyncPtr.asFunction< - ffi.Pointer Function( - FaceDetectorYN, double, imp1.CvCallback_0)>(); - - ffi.Pointer FaceDetectorYN_SetScoreThreshold( - FaceDetectorYN self, - double score_threshold, - ) { - return _FaceDetectorYN_SetScoreThreshold( - self, - score_threshold, - ); - } - - late final _FaceDetectorYN_SetScoreThresholdPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Float)>>('FaceDetectorYN_SetScoreThreshold'); - late final _FaceDetectorYN_SetScoreThreshold = - _FaceDetectorYN_SetScoreThresholdPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, double)>(); - - ffi.Pointer FaceDetectorYN_SetScoreThreshold_Async( - FaceDetectorYN self, - double score_threshold, - imp1.CvCallback_0 callback, - ) { - return _FaceDetectorYN_SetScoreThreshold_Async( - self, - score_threshold, - callback, - ); - } - - late final _FaceDetectorYN_SetScoreThreshold_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, ffi.Float, - imp1.CvCallback_0)>>('FaceDetectorYN_SetScoreThreshold_Async'); - late final _FaceDetectorYN_SetScoreThreshold_Async = - _FaceDetectorYN_SetScoreThreshold_AsyncPtr.asFunction< - ffi.Pointer Function( - FaceDetectorYN, double, imp1.CvCallback_0)>(); - - ffi.Pointer FaceDetectorYN_SetTopK( - FaceDetectorYN self, - int top_k, - ) { - return _FaceDetectorYN_SetTopK( - self, - top_k, - ); - } - - late final _FaceDetectorYN_SetTopKPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Int)>>('FaceDetectorYN_SetTopK'); - late final _FaceDetectorYN_SetTopK = _FaceDetectorYN_SetTopKPtr.asFunction< - ffi.Pointer Function(FaceDetectorYN, int)>(); - - ffi.Pointer FaceDetectorYN_SetTopK_Async( - FaceDetectorYN self, - int top_k, - imp1.CvCallback_0 callback, - ) { - return _FaceDetectorYN_SetTopK_Async( - self, - top_k, - callback, - ); - } - - late final _FaceDetectorYN_SetTopK_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, ffi.Int, - imp1.CvCallback_0)>>('FaceDetectorYN_SetTopK_Async'); - late final _FaceDetectorYN_SetTopK_Async = - _FaceDetectorYN_SetTopK_AsyncPtr.asFunction< - ffi.Pointer Function( - FaceDetectorYN, int, imp1.CvCallback_0)>(); - - ffi.Pointer FaceRecognizerSF_AlignCrop( - FaceRecognizerSF self, - Mat src_img, - Mat face_box, - ffi.Pointer aligned_img, - ) { - return _FaceRecognizerSF_AlignCrop( - self, - src_img, - face_box, - aligned_img, - ); - } - - late final _FaceRecognizerSF_AlignCropPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceRecognizerSF, Mat, Mat, - ffi.Pointer)>>('FaceRecognizerSF_AlignCrop'); - late final _FaceRecognizerSF_AlignCrop = - _FaceRecognizerSF_AlignCropPtr.asFunction< - ffi.Pointer Function( - FaceRecognizerSF, Mat, Mat, ffi.Pointer)>(); - - ffi.Pointer FaceRecognizerSF_AlignCrop_Async( - FaceRecognizerSF self, - Mat src_img, - Mat face_box, - imp1.CvCallback_1 callback, - ) { - return _FaceRecognizerSF_AlignCrop_Async( - self, - src_img, - face_box, - callback, - ); - } - - late final _FaceRecognizerSF_AlignCrop_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceRecognizerSF, Mat, Mat, - imp1.CvCallback_1)>>('FaceRecognizerSF_AlignCrop_Async'); - late final _FaceRecognizerSF_AlignCrop_Async = - _FaceRecognizerSF_AlignCrop_AsyncPtr.asFunction< - ffi.Pointer Function( - FaceRecognizerSF, Mat, Mat, imp1.CvCallback_1)>(); - - void FaceRecognizerSF_Close( - FaceRecognizerSFPtr self, - ) { - return _FaceRecognizerSF_Close( - self, - ); - } - - late final _FaceRecognizerSF_ClosePtr = - _lookup>( - 'FaceRecognizerSF_Close'); - late final _FaceRecognizerSF_Close = _FaceRecognizerSF_ClosePtr.asFunction< - void Function(FaceRecognizerSFPtr)>(); - - ffi.Pointer FaceRecognizerSF_Feature( - FaceRecognizerSF self, - Mat aligned_img, - bool clone, - ffi.Pointer face_feature, - ) { - return _FaceRecognizerSF_Feature( - self, - aligned_img, - clone, - face_feature, - ); - } - - late final _FaceRecognizerSF_FeaturePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceRecognizerSF, Mat, ffi.Bool, - ffi.Pointer)>>('FaceRecognizerSF_Feature'); - late final _FaceRecognizerSF_Feature = - _FaceRecognizerSF_FeaturePtr.asFunction< - ffi.Pointer Function( - FaceRecognizerSF, Mat, bool, ffi.Pointer)>(); - - ffi.Pointer FaceRecognizerSF_Feature_Async( - FaceRecognizerSF self, - Mat aligned_img, - bool clone, - imp1.CvCallback_1 callback, - ) { - return _FaceRecognizerSF_Feature_Async( - self, - aligned_img, - clone, - callback, - ); - } - - late final _FaceRecognizerSF_Feature_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceRecognizerSF, Mat, ffi.Bool, - imp1.CvCallback_1)>>('FaceRecognizerSF_Feature_Async'); - late final _FaceRecognizerSF_Feature_Async = - _FaceRecognizerSF_Feature_AsyncPtr.asFunction< - ffi.Pointer Function( - FaceRecognizerSF, Mat, bool, imp1.CvCallback_1)>(); - - ffi.Pointer FaceRecognizerSF_Match( - FaceRecognizerSF self, - Mat face_feature1, - Mat face_feature2, - int dis_type, - ffi.Pointer distance, - ) { - return _FaceRecognizerSF_Match( - self, - face_feature1, - face_feature2, - dis_type, - distance, - ); - } - - late final _FaceRecognizerSF_MatchPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceRecognizerSF, Mat, Mat, ffi.Int, - ffi.Pointer)>>('FaceRecognizerSF_Match'); - late final _FaceRecognizerSF_Match = _FaceRecognizerSF_MatchPtr.asFunction< - ffi.Pointer Function( - FaceRecognizerSF, Mat, Mat, int, ffi.Pointer)>(); - - ffi.Pointer FaceRecognizerSF_Match_Async( - FaceRecognizerSF self, - Mat face_feature1, - Mat face_feature2, - int dis_type, - imp1.CvCallback_1 callback, - ) { - return _FaceRecognizerSF_Match_Async( - self, - face_feature1, - face_feature2, - dis_type, - callback, - ); - } - - late final _FaceRecognizerSF_Match_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceRecognizerSF, Mat, Mat, ffi.Int, - imp1.CvCallback_1)>>('FaceRecognizerSF_Match_Async'); - late final _FaceRecognizerSF_Match_Async = - _FaceRecognizerSF_Match_AsyncPtr.asFunction< - ffi.Pointer Function( - FaceRecognizerSF, Mat, Mat, int, imp1.CvCallback_1)>(); - - ffi.Pointer FaceRecognizerSF_New( - ffi.Pointer model, - ffi.Pointer config, - int backend_id, - int target_id, - ffi.Pointer rval, - ) { - return _FaceRecognizerSF_New( - model, - config, - backend_id, - target_id, - rval, - ); - } - - late final _FaceRecognizerSF_NewPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer)>>('FaceRecognizerSF_New'); - late final _FaceRecognizerSF_New = _FaceRecognizerSF_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, int, int, ffi.Pointer)>(); - - ffi.Pointer FaceRecognizerSF_New_Async( - ffi.Pointer model, - ffi.Pointer config, - int backend_id, - int target_id, - imp1.CvCallback_1 callback, - ) { - return _FaceRecognizerSF_New_Async( - model, - config, - backend_id, - target_id, - callback, - ); - } - - late final _FaceRecognizerSF_New_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Int, - imp1.CvCallback_1)>>('FaceRecognizerSF_New_Async'); - late final _FaceRecognizerSF_New_Async = - _FaceRecognizerSF_New_AsyncPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer GroupRectangles( - ffi.Pointer rects, - int groupThreshold, - double eps, - ) { - return _GroupRectangles( - rects, - groupThreshold, - eps, - ); - } - - late final _GroupRectanglesPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Int, ffi.Double)>>('GroupRectangles'); - late final _GroupRectangles = _GroupRectanglesPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, double)>(); - - ffi.Pointer GroupRectangles_Async( - ffi.Pointer rects, - int groupThreshold, - double eps, - imp1.CvCallback_0 callback, - ) { - return _GroupRectangles_Async( - rects, - groupThreshold, - eps, - callback, - ); - } - - late final _GroupRectangles_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, - ffi.Double, imp1.CvCallback_0)>>('GroupRectangles_Async'); - late final _GroupRectangles_Async = _GroupRectangles_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, int, double, imp1.CvCallback_0)>(); - - void HOGDescriptor_Close( - HOGDescriptorPtr self, - ) { - return _HOGDescriptor_Close( - self, - ); - } - - late final _HOGDescriptor_ClosePtr = - _lookup>( - 'HOGDescriptor_Close'); - late final _HOGDescriptor_Close = - _HOGDescriptor_ClosePtr.asFunction(); - - ffi.Pointer HOGDescriptor_Compute( - HOGDescriptor self, - Mat img, - ffi.Pointer descriptors, - CvSize winStride, - CvSize padding, - ffi.Pointer locations, - ) { - return _HOGDescriptor_Compute( - self, - img, - descriptors, - winStride, - padding, - locations, - ); - } - - late final _HOGDescriptor_ComputePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - HOGDescriptor, - Mat, - ffi.Pointer, - CvSize, - CvSize, - ffi.Pointer)>>('HOGDescriptor_Compute'); - late final _HOGDescriptor_Compute = _HOGDescriptor_ComputePtr.asFunction< - ffi.Pointer Function(HOGDescriptor, Mat, ffi.Pointer, - CvSize, CvSize, ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_Compute_Async( - HOGDescriptor self, - Mat img, - CvSize winStride, - CvSize padding, - imp1.CvCallback_2 callback, - ) { - return _HOGDescriptor_Compute_Async( - self, - img, - winStride, - padding, - callback, - ); - } - - late final _HOGDescriptor_Compute_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, CvSize, CvSize, - imp1.CvCallback_2)>>('HOGDescriptor_Compute_Async'); - late final _HOGDescriptor_Compute_Async = - _HOGDescriptor_Compute_AsyncPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, Mat, CvSize, CvSize, imp1.CvCallback_2)>(); - - ffi.Pointer HOGDescriptor_Detect( - HOGDescriptor self, - Mat img, - ffi.Pointer foundLocations, - ffi.Pointer weights, - double hitThresh, - CvSize winStride, - CvSize padding, - ffi.Pointer searchLocations, - ) { - return _HOGDescriptor_Detect( - self, - img, - foundLocations, - weights, - hitThresh, - winStride, - padding, - searchLocations, - ); - } - - late final _HOGDescriptor_DetectPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - HOGDescriptor, - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Double, - CvSize, - CvSize, - ffi.Pointer)>>('HOGDescriptor_Detect'); - late final _HOGDescriptor_Detect = _HOGDescriptor_DetectPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, - Mat, - ffi.Pointer, - ffi.Pointer, - double, - CvSize, - CvSize, - ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_Detect2( - HOGDescriptor self, - Mat img, - ffi.Pointer foundLocations, - double hitThresh, - CvSize winStride, - CvSize padding, - ffi.Pointer searchLocations, - ) { - return _HOGDescriptor_Detect2( - self, - img, - foundLocations, - hitThresh, - winStride, - padding, - searchLocations, - ); - } - - late final _HOGDescriptor_Detect2Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - HOGDescriptor, - Mat, - ffi.Pointer, - ffi.Double, - CvSize, - CvSize, - ffi.Pointer)>>('HOGDescriptor_Detect2'); - late final _HOGDescriptor_Detect2 = _HOGDescriptor_Detect2Ptr.asFunction< - ffi.Pointer Function(HOGDescriptor, Mat, ffi.Pointer, - double, CvSize, CvSize, ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_Detect2_Async( - HOGDescriptor self, - Mat img, - double hitThresh, - CvSize winStride, - CvSize padding, - imp1.CvCallback_2 callback, - ) { - return _HOGDescriptor_Detect2_Async( - self, - img, - hitThresh, - winStride, - padding, - callback, - ); - } - - late final _HOGDescriptor_Detect2_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, ffi.Double, CvSize, - CvSize, imp1.CvCallback_2)>>('HOGDescriptor_Detect2_Async'); - late final _HOGDescriptor_Detect2_Async = - _HOGDescriptor_Detect2_AsyncPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, Mat, double, CvSize, CvSize, imp1.CvCallback_2)>(); - - ffi.Pointer HOGDescriptor_DetectMultiScale( - HOGDescriptor self, - Mat img, - ffi.Pointer rval, - ) { - return _HOGDescriptor_DetectMultiScale( - self, - img, - rval, - ); - } - - late final _HOGDescriptor_DetectMultiScalePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, - ffi.Pointer)>>('HOGDescriptor_DetectMultiScale'); - late final _HOGDescriptor_DetectMultiScale = - _HOGDescriptor_DetectMultiScalePtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, Mat, ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_DetectMultiScaleWithParams( - HOGDescriptor self, - Mat img, - double hitThresh, - CvSize winStride, - CvSize padding, - double scale, - double finalThreshold, - bool useMeanshiftGrouping, - ffi.Pointer rval, - ) { - return _HOGDescriptor_DetectMultiScaleWithParams( - self, - img, - hitThresh, - winStride, - padding, - scale, - finalThreshold, - useMeanshiftGrouping, - rval, - ); - } - - late final _HOGDescriptor_DetectMultiScaleWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - HOGDescriptor, - Mat, - ffi.Double, - CvSize, - CvSize, - ffi.Double, - ffi.Double, - ffi.Bool, - ffi.Pointer)>>( - 'HOGDescriptor_DetectMultiScaleWithParams'); - late final _HOGDescriptor_DetectMultiScaleWithParams = - _HOGDescriptor_DetectMultiScaleWithParamsPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, Mat, double, CvSize, - CvSize, double, double, bool, ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_DetectMultiScaleWithParams_Async( - HOGDescriptor self, - Mat img, - double hitThresh, - CvSize winStride, - CvSize padding, - double scale, - double finalThreshold, - bool useMeanshiftGrouping, - imp1.CvCallback_1 callback, - ) { - return _HOGDescriptor_DetectMultiScaleWithParams_Async( - self, - img, - hitThresh, - winStride, - padding, - scale, - finalThreshold, - useMeanshiftGrouping, - callback, - ); - } - - late final _HOGDescriptor_DetectMultiScaleWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - HOGDescriptor, - Mat, - ffi.Double, - CvSize, - CvSize, - ffi.Double, - ffi.Double, - ffi.Bool, - imp1.CvCallback_1)>>( - 'HOGDescriptor_DetectMultiScaleWithParams_Async'); - late final _HOGDescriptor_DetectMultiScaleWithParams_Async = - _HOGDescriptor_DetectMultiScaleWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, Mat, double, CvSize, - CvSize, double, double, bool, imp1.CvCallback_1)>(); - - ffi.Pointer HOGDescriptor_DetectMultiScale_Async( - HOGDescriptor self, - Mat img, - imp1.CvCallback_1 callback, - ) { - return _HOGDescriptor_DetectMultiScale_Async( - self, - img, - callback, - ); - } - - late final _HOGDescriptor_DetectMultiScale_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, - imp1.CvCallback_1)>>('HOGDescriptor_DetectMultiScale_Async'); - late final _HOGDescriptor_DetectMultiScale_Async = - _HOGDescriptor_DetectMultiScale_AsyncPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer HOGDescriptor_Detect_Async( - HOGDescriptor self, - Mat img, - double hitThresh, - CvSize winStride, - CvSize padding, - imp1.CvCallback_3 callback, - ) { - return _HOGDescriptor_Detect_Async( - self, - img, - hitThresh, - winStride, - padding, - callback, - ); - } - - late final _HOGDescriptor_Detect_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, ffi.Double, CvSize, - CvSize, imp1.CvCallback_3)>>('HOGDescriptor_Detect_Async'); - late final _HOGDescriptor_Detect_Async = - _HOGDescriptor_Detect_AsyncPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, Mat, double, CvSize, CvSize, imp1.CvCallback_3)>(); - - ffi.Pointer HOGDescriptor_Load( - HOGDescriptor self, - ffi.Pointer name, - ffi.Pointer rval, - ) { - return _HOGDescriptor_Load( - self, - name, - rval, - ); - } - - late final _HOGDescriptor_LoadPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, ffi.Pointer, - ffi.Pointer)>>('HOGDescriptor_Load'); - late final _HOGDescriptor_Load = _HOGDescriptor_LoadPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_Load_Async( - HOGDescriptor self, - ffi.Pointer name, - imp1.CvCallback_1 callback, - ) { - return _HOGDescriptor_Load_Async( - self, - name, - callback, - ); - } - - late final _HOGDescriptor_Load_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, ffi.Pointer, - imp1.CvCallback_1)>>('HOGDescriptor_Load_Async'); - late final _HOGDescriptor_Load_Async = - _HOGDescriptor_Load_AsyncPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, ffi.Pointer, imp1.CvCallback_1)>(); - - ffi.Pointer HOGDescriptor_New( - ffi.Pointer rval, - ) { - return _HOGDescriptor_New( - rval, - ); - } - - late final _HOGDescriptor_NewPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('HOGDescriptor_New'); - late final _HOGDescriptor_New = _HOGDescriptor_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_NewFromFile( - ffi.Pointer filename, - ffi.Pointer rval, - ) { - return _HOGDescriptor_NewFromFile( - filename, - rval, - ); - } - - late final _HOGDescriptor_NewFromFilePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('HOGDescriptor_NewFromFile'); - late final _HOGDescriptor_NewFromFile = - _HOGDescriptor_NewFromFilePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_NewFromFile_Async( - ffi.Pointer filename, - imp1.CvCallback_1 callback, - ) { - return _HOGDescriptor_NewFromFile_Async( - filename, - callback, - ); - } - - late final _HOGDescriptor_NewFromFile_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - imp1.CvCallback_1)>>('HOGDescriptor_NewFromFile_Async'); - late final _HOGDescriptor_NewFromFile_Async = - _HOGDescriptor_NewFromFile_AsyncPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, imp1.CvCallback_1)>(); - - ffi.Pointer HOGDescriptor_New_Async( - imp1.CvCallback_1 callback, - ) { - return _HOGDescriptor_New_Async( - callback, - ); - } - - late final _HOGDescriptor_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'HOGDescriptor_New_Async'); - late final _HOGDescriptor_New_Async = _HOGDescriptor_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer HOGDescriptor_SetSVMDetector( - HOGDescriptor self, - VecF32 det, - ) { - return _HOGDescriptor_SetSVMDetector( - self, - det, - ); - } - - late final _HOGDescriptor_SetSVMDetectorPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - HOGDescriptor, VecF32)>>('HOGDescriptor_SetSVMDetector'); - late final _HOGDescriptor_SetSVMDetector = _HOGDescriptor_SetSVMDetectorPtr - .asFunction Function(HOGDescriptor, VecF32)>(); - - ffi.Pointer HOGDescriptor_SetSVMDetector_Async( - HOGDescriptor self, - VecF32 det, - imp1.CvCallback_0 callback, - ) { - return _HOGDescriptor_SetSVMDetector_Async( - self, - det, - callback, - ); - } - - late final _HOGDescriptor_SetSVMDetector_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, VecF32, - imp1.CvCallback_0)>>('HOGDescriptor_SetSVMDetector_Async'); - late final _HOGDescriptor_SetSVMDetector_Async = - _HOGDescriptor_SetSVMDetector_AsyncPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, VecF32, imp1.CvCallback_0)>(); - - ffi.Pointer HOGDescriptor_computeGradient( - HOGDescriptor self, - Mat img, - Mat grad, - Mat angleOfs, - CvSize paddingTL, - CvSize paddingBR, - ) { - return _HOGDescriptor_computeGradient( - self, - img, - grad, - angleOfs, - paddingTL, - paddingBR, - ); - } - - late final _HOGDescriptor_computeGradientPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, Mat, Mat, Mat, CvSize, - CvSize)>>('HOGDescriptor_computeGradient'); - late final _HOGDescriptor_computeGradient = - _HOGDescriptor_computeGradientPtr.asFunction< ffi.Pointer Function( - HOGDescriptor, Mat, Mat, Mat, CvSize, CvSize)>(); + HOGDescriptor, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Double, + CvSize, + CvSize, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_HOGDescriptor_detect'); + late final _cv_HOGDescriptor_detect = _cv_HOGDescriptor_detectPtr.asFunction< + ffi.Pointer Function( + HOGDescriptor, + Mat, + ffi.Pointer, + ffi.Pointer, + double, + CvSize, + CvSize, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer HOGDescriptor_computeGradient_Async( + ffi.Pointer cv_HOGDescriptor_detect2( HOGDescriptor self, Mat img, - Mat grad, - Mat angleOfs, - CvSize paddingTL, - CvSize paddingBR, + ffi.Pointer foundLocations, + double hitThresh, + CvSize winStride, + CvSize padding, + ffi.Pointer searchLocations, imp1.CvCallback_0 callback, ) { - return _HOGDescriptor_computeGradient_Async( + return _cv_HOGDescriptor_detect2( self, img, - grad, - angleOfs, - paddingTL, - paddingBR, + foundLocations, + hitThresh, + winStride, + padding, + searchLocations, callback, ); } - late final _HOGDescriptor_computeGradient_AsyncPtr = _lookup< + late final _cv_HOGDescriptor_detect2Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( HOGDescriptor, Mat, - Mat, - Mat, + ffi.Pointer, + ffi.Double, CvSize, CvSize, - imp1.CvCallback_0)>>('HOGDescriptor_computeGradient_Async'); - late final _HOGDescriptor_computeGradient_Async = - _HOGDescriptor_computeGradient_AsyncPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, Mat, Mat, Mat, CvSize, - CvSize, imp1.CvCallback_0)>(); - - ffi.Pointer HOGDescriptor_getDaimlerPeopleDetector( - ffi.Pointer rval, - ) { - return _HOGDescriptor_getDaimlerPeopleDetector( - rval, - ); - } - - late final _HOGDescriptor_getDaimlerPeopleDetectorPtr = _lookup< - ffi - .NativeFunction Function(ffi.Pointer)>>( - 'HOGDescriptor_getDaimlerPeopleDetector'); - late final _HOGDescriptor_getDaimlerPeopleDetector = - _HOGDescriptor_getDaimlerPeopleDetectorPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_getDaimlerPeopleDetector_Async( - imp1.CvCallback_1 callback, - ) { - return _HOGDescriptor_getDaimlerPeopleDetector_Async( - callback, - ); - } - - late final _HOGDescriptor_getDaimlerPeopleDetector_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'HOGDescriptor_getDaimlerPeopleDetector_Async'); - late final _HOGDescriptor_getDaimlerPeopleDetector_Async = - _HOGDescriptor_getDaimlerPeopleDetector_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer HOGDescriptor_getDescriptorSize( - HOGDescriptor self, - ffi.Pointer rval, - ) { - return _HOGDescriptor_getDescriptorSize( - self, - rval, - ); - } - - late final _HOGDescriptor_getDescriptorSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, - ffi.Pointer)>>('HOGDescriptor_getDescriptorSize'); - late final _HOGDescriptor_getDescriptorSize = - _HOGDescriptor_getDescriptorSizePtr.asFunction< + ffi.Pointer, + imp1.CvCallback_0)>>('cv_HOGDescriptor_detect2'); + late final _cv_HOGDescriptor_detect2 = + _cv_HOGDescriptor_detect2Ptr.asFunction< ffi.Pointer Function( - HOGDescriptor, ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_getDescriptorSize_Async( - HOGDescriptor self, - imp1.CvCallback_1 callback, - ) { - return _HOGDescriptor_getDescriptorSize_Async( - self, - callback, - ); - } - - late final _HOGDescriptor_getDescriptorSize_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, - imp1.CvCallback_1)>>('HOGDescriptor_getDescriptorSize_Async'); - late final _HOGDescriptor_getDescriptorSize_Async = - _HOGDescriptor_getDescriptorSize_AsyncPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, imp1.CvCallback_1)>(); + HOGDescriptor, + Mat, + ffi.Pointer, + double, + CvSize, + CvSize, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer HOGDescriptor_getWinSigma( + ffi.Pointer cv_HOGDescriptor_detectMultiScale( HOGDescriptor self, - ffi.Pointer rval, + Mat img, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _HOGDescriptor_getWinSigma( + return _cv_HOGDescriptor_detectMultiScale( self, + img, rval, - ); - } - - late final _HOGDescriptor_getWinSigmaPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, - ffi.Pointer)>>('HOGDescriptor_getWinSigma'); - late final _HOGDescriptor_getWinSigma = - _HOGDescriptor_getWinSigmaPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, ffi.Pointer)>(); - - ffi.Pointer HOGDescriptor_getWinSigma_Async( - HOGDescriptor self, - imp1.CvCallback_1 callback, - ) { - return _HOGDescriptor_getWinSigma_Async( - self, callback, ); } - late final _HOGDescriptor_getWinSigma_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, - imp1.CvCallback_1)>>('HOGDescriptor_getWinSigma_Async'); - late final _HOGDescriptor_getWinSigma_Async = - _HOGDescriptor_getWinSigma_AsyncPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, imp1.CvCallback_1)>(); - - ffi.Pointer HOGDescriptor_groupRectangles( - HOGDescriptor self, - ffi.Pointer rectList, - ffi.Pointer weights, - int groupThreshold, - double eps, - ) { - return _HOGDescriptor_groupRectangles( - self, - rectList, - weights, - groupThreshold, - eps, - ); - } - - late final _HOGDescriptor_groupRectanglesPtr = _lookup< + late final _cv_HOGDescriptor_detectMultiScalePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( HOGDescriptor, + Mat, ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Double)>>('HOGDescriptor_groupRectangles'); - late final _HOGDescriptor_groupRectangles = - _HOGDescriptor_groupRectanglesPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, ffi.Pointer, - ffi.Pointer, int, double)>(); + imp1.CvCallback_0)>>('cv_HOGDescriptor_detectMultiScale'); + late final _cv_HOGDescriptor_detectMultiScale = + _cv_HOGDescriptor_detectMultiScalePtr.asFunction< + ffi.Pointer Function( + HOGDescriptor, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer HOGDescriptor_groupRectangles_Async( + ffi.Pointer cv_HOGDescriptor_detectMultiScale_1( HOGDescriptor self, - ffi.Pointer rectList, - ffi.Pointer weights, - int groupThreshold, - double eps, + Mat img, + double hitThresh, + CvSize winStride, + CvSize padding, + double scale, + double finalThreshold, + bool useMeanshiftGrouping, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _HOGDescriptor_groupRectangles_Async( + return _cv_HOGDescriptor_detectMultiScale_1( self, - rectList, - weights, - groupThreshold, - eps, + img, + hitThresh, + winStride, + padding, + scale, + finalThreshold, + useMeanshiftGrouping, + rval, callback, ); } - late final _HOGDescriptor_groupRectangles_AsyncPtr = _lookup< + late final _cv_HOGDescriptor_detectMultiScale_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( HOGDescriptor, - ffi.Pointer, - ffi.Pointer, - ffi.Int, + Mat, ffi.Double, - imp1.CvCallback_0)>>('HOGDescriptor_groupRectangles_Async'); - late final _HOGDescriptor_groupRectangles_Async = - _HOGDescriptor_groupRectangles_AsyncPtr.asFunction< - ffi.Pointer Function(HOGDescriptor, ffi.Pointer, - ffi.Pointer, int, double, imp1.CvCallback_0)>(); - - ffi.Pointer HOG_GetDefaultPeopleDetector( - ffi.Pointer rval, - ) { - return _HOG_GetDefaultPeopleDetector( - rval, - ); - } - - late final _HOG_GetDefaultPeopleDetectorPtr = _lookup< - ffi - .NativeFunction Function(ffi.Pointer)>>( - 'HOG_GetDefaultPeopleDetector'); - late final _HOG_GetDefaultPeopleDetector = _HOG_GetDefaultPeopleDetectorPtr - .asFunction Function(ffi.Pointer)>(); - - ffi.Pointer HOG_GetDefaultPeopleDetector_Async( - imp1.CvCallback_1 callback, - ) { - return _HOG_GetDefaultPeopleDetector_Async( - callback, - ); - } - - late final _HOG_GetDefaultPeopleDetector_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'HOG_GetDefaultPeopleDetector_Async'); - late final _HOG_GetDefaultPeopleDetector_Async = - _HOG_GetDefaultPeopleDetector_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - void QRCodeDetector_Close( - QRCodeDetectorPtr self, - ) { - return _QRCodeDetector_Close( - self, - ); - } - - late final _QRCodeDetector_ClosePtr = - _lookup>( - 'QRCodeDetector_Close'); - late final _QRCodeDetector_Close = - _QRCodeDetector_ClosePtr.asFunction(); - - ffi.Pointer QRCodeDetector_Decode( - QRCodeDetector self, - Mat input, - ffi.Pointer points, - Mat straight_qrcode, - ffi.Pointer> rval, - ) { - return _QRCodeDetector_Decode( - self, - input, - points, - straight_qrcode, - rval, - ); - } - - late final _QRCodeDetector_DecodePtr = _lookup< - ffi.NativeFunction< + CvSize, + CvSize, + ffi.Double, + ffi.Double, + ffi.Bool, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_HOGDescriptor_detectMultiScale_1'); + late final _cv_HOGDescriptor_detectMultiScale_1 = + _cv_HOGDescriptor_detectMultiScale_1Ptr.asFunction< ffi.Pointer Function( - QRCodeDetector, - Mat, - ffi.Pointer, + HOGDescriptor, Mat, - ffi.Pointer>)>>('QRCodeDetector_Decode'); - late final _QRCodeDetector_Decode = _QRCodeDetector_DecodePtr.asFunction< - ffi.Pointer Function(QRCodeDetector, Mat, ffi.Pointer, - Mat, ffi.Pointer>)>(); - - ffi.Pointer QRCodeDetector_Decode_Async( - QRCodeDetector self, - Mat input, - imp1.CvCallback_3 callback, - ) { - return _QRCodeDetector_Decode_Async( - self, - input, - callback, - ); - } - - late final _QRCodeDetector_Decode_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, Mat, - imp1.CvCallback_3)>>('QRCodeDetector_Decode_Async'); - late final _QRCodeDetector_Decode_Async = - _QRCodeDetector_Decode_AsyncPtr.asFunction< - ffi.Pointer Function( - QRCodeDetector, Mat, imp1.CvCallback_3)>(); + double, + CvSize, + CvSize, + double, + double, + bool, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_Detect( - QRCodeDetector self, - Mat input, - ffi.Pointer points, - ffi.Pointer rval, - ) { - return _QRCodeDetector_Detect( - self, - input, - points, + ffi.Pointer cv_HOGDescriptor_getDaimlerPeopleDetector( + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_HOGDescriptor_getDaimlerPeopleDetector( rval, + callback, ); } - late final _QRCodeDetector_DetectPtr = _lookup< + late final _cv_HOGDescriptor_getDaimlerPeopleDetectorPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + imp1.CvCallback_0)>>('cv_HOGDescriptor_getDaimlerPeopleDetector'); + late final _cv_HOGDescriptor_getDaimlerPeopleDetector = + _cv_HOGDescriptor_getDaimlerPeopleDetectorPtr.asFunction< ffi.Pointer Function( - QRCodeDetector, - Mat, - ffi.Pointer, - ffi.Pointer)>>('QRCodeDetector_Detect'); - late final _QRCodeDetector_Detect = _QRCodeDetector_DetectPtr.asFunction< - ffi.Pointer Function( - QRCodeDetector, Mat, ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_DetectAndDecode( - QRCodeDetector self, - Mat input, - ffi.Pointer points, - ffi.Pointer straight_qrcode, - ffi.Pointer> rval, + ffi.Pointer cv_HOGDescriptor_getDefaultPeopleDetector( + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_DetectAndDecode( - self, - input, - points, - straight_qrcode, + return _cv_HOGDescriptor_getDefaultPeopleDetector( rval, + callback, ); } - late final _QRCodeDetector_DetectAndDecodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QRCodeDetector, - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer>)>>( - 'QRCodeDetector_DetectAndDecode'); - late final _QRCodeDetector_DetectAndDecode = - _QRCodeDetector_DetectAndDecodePtr.asFunction< + late final _cv_HOGDescriptor_getDefaultPeopleDetectorPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + imp1.CvCallback_0)>>('cv_HOGDescriptor_getDefaultPeopleDetector'); + late final _cv_HOGDescriptor_getDefaultPeopleDetector = + _cv_HOGDescriptor_getDefaultPeopleDetectorPtr.asFunction< ffi.Pointer Function( - QRCodeDetector, - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer>)>(); + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_DetectAndDecodeMulti( - QRCodeDetector self, - Mat input, - ffi.Pointer decoded, - ffi.Pointer points, - ffi.Pointer straight_code, - ffi.Pointer rval, + ffi.Pointer cv_HOGDescriptor_getDescriptorSize( + HOGDescriptor self, + ffi.Pointer rval, ) { - return _QRCodeDetector_DetectAndDecodeMulti( + return _cv_HOGDescriptor_getDescriptorSize( self, - input, - decoded, - points, - straight_code, rval, ); } - late final _QRCodeDetector_DetectAndDecodeMultiPtr = _lookup< + late final _cv_HOGDescriptor_getDescriptorSizePtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(HOGDescriptor, + ffi.Pointer)>>('cv_HOGDescriptor_getDescriptorSize'); + late final _cv_HOGDescriptor_getDescriptorSize = + _cv_HOGDescriptor_getDescriptorSizePtr.asFunction< ffi.Pointer Function( - QRCodeDetector, - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('QRCodeDetector_DetectAndDecodeMulti'); - late final _QRCodeDetector_DetectAndDecodeMulti = - _QRCodeDetector_DetectAndDecodeMultiPtr.asFunction< - ffi.Pointer Function( - QRCodeDetector, - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>(); + HOGDescriptor, ffi.Pointer)>(); - ffi.Pointer QRCodeDetector_DetectAndDecodeMulti_Async( - QRCodeDetector self, - Mat input, - imp1.CvCallback_4 callback, + ffi.Pointer cv_HOGDescriptor_getWinSigma( + HOGDescriptor self, + ffi.Pointer rval, ) { - return _QRCodeDetector_DetectAndDecodeMulti_Async( + return _cv_HOGDescriptor_getWinSigma( self, - input, - callback, + rval, ); } - late final _QRCodeDetector_DetectAndDecodeMulti_AsyncPtr = _lookup< + late final _cv_HOGDescriptor_getWinSigmaPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, Mat, - imp1.CvCallback_4)>>('QRCodeDetector_DetectAndDecodeMulti_Async'); - late final _QRCodeDetector_DetectAndDecodeMulti_Async = - _QRCodeDetector_DetectAndDecodeMulti_AsyncPtr.asFunction< + ffi.Pointer Function(HOGDescriptor, + ffi.Pointer)>>('cv_HOGDescriptor_getWinSigma'); + late final _cv_HOGDescriptor_getWinSigma = + _cv_HOGDescriptor_getWinSigmaPtr.asFunction< ffi.Pointer Function( - QRCodeDetector, Mat, imp1.CvCallback_4)>(); + HOGDescriptor, ffi.Pointer)>(); - ffi.Pointer QRCodeDetector_DetectAndDecode_Async( - QRCodeDetector self, - Mat input, - imp1.CvCallback_3 callback, + ffi.Pointer cv_HOGDescriptor_groupRectangles( + HOGDescriptor self, + ffi.Pointer rectList, + ffi.Pointer weights, + int groupThreshold, + double eps, + imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_DetectAndDecode_Async( + return _cv_HOGDescriptor_groupRectangles( self, - input, + rectList, + weights, + groupThreshold, + eps, callback, ); } - late final _QRCodeDetector_DetectAndDecode_AsyncPtr = _lookup< + late final _cv_HOGDescriptor_groupRectanglesPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, Mat, - imp1.CvCallback_3)>>('QRCodeDetector_DetectAndDecode_Async'); - late final _QRCodeDetector_DetectAndDecode_Async = - _QRCodeDetector_DetectAndDecode_AsyncPtr.asFunction< ffi.Pointer Function( - QRCodeDetector, Mat, imp1.CvCallback_3)>(); + HOGDescriptor, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Double, + imp1.CvCallback_0)>>('cv_HOGDescriptor_groupRectangles'); + late final _cv_HOGDescriptor_groupRectangles = + _cv_HOGDescriptor_groupRectanglesPtr.asFunction< + ffi.Pointer Function(HOGDescriptor, ffi.Pointer, + ffi.Pointer, int, double, imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_DetectMulti( - QRCodeDetector self, - Mat input, - ffi.Pointer points, + ffi.Pointer cv_HOGDescriptor_load( + HOGDescriptor self, + ffi.Pointer name, ffi.Pointer rval, ) { - return _QRCodeDetector_DetectMulti( + return _cv_HOGDescriptor_load( self, - input, - points, + name, rval, ); } - late final _QRCodeDetector_DetectMultiPtr = _lookup< + late final _cv_HOGDescriptor_loadPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - QRCodeDetector, - Mat, - ffi.Pointer, - ffi.Pointer)>>('QRCodeDetector_DetectMulti'); - late final _QRCodeDetector_DetectMulti = - _QRCodeDetector_DetectMultiPtr.asFunction< - ffi.Pointer Function(QRCodeDetector, Mat, - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer Function(HOGDescriptor, ffi.Pointer, + ffi.Pointer)>>('cv_HOGDescriptor_load'); + late final _cv_HOGDescriptor_load = _cv_HOGDescriptor_loadPtr.asFunction< + ffi.Pointer Function( + HOGDescriptor, ffi.Pointer, ffi.Pointer)>(); - ffi.Pointer QRCodeDetector_DetectMulti_Async( - QRCodeDetector self, - Mat input, - imp1.CvCallback_2 callback, + ffi.Pointer cv_HOGDescriptor_setSVMDetector( + HOGDescriptor self, + VecF32 det, ) { - return _QRCodeDetector_DetectMulti_Async( + return _cv_HOGDescriptor_setSVMDetector( self, - input, - callback, + det, ); } - late final _QRCodeDetector_DetectMulti_AsyncPtr = _lookup< + late final _cv_HOGDescriptor_setSVMDetectorPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, Mat, - imp1.CvCallback_2)>>('QRCodeDetector_DetectMulti_Async'); - late final _QRCodeDetector_DetectMulti_Async = - _QRCodeDetector_DetectMulti_AsyncPtr.asFunction< ffi.Pointer Function( - QRCodeDetector, Mat, imp1.CvCallback_2)>(); + HOGDescriptor, VecF32)>>('cv_HOGDescriptor_setSVMDetector'); + late final _cv_HOGDescriptor_setSVMDetector = + _cv_HOGDescriptor_setSVMDetectorPtr + .asFunction Function(HOGDescriptor, VecF32)>(); - ffi.Pointer QRCodeDetector_Detect_Async( - QRCodeDetector self, - Mat input, - imp1.CvCallback_2 callback, + void cv_QRCodeDetector_close( + QRCodeDetectorPtr self, ) { - return _QRCodeDetector_Detect_Async( + return _cv_QRCodeDetector_close( self, - input, - callback, ); } - late final _QRCodeDetector_Detect_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, Mat, - imp1.CvCallback_2)>>('QRCodeDetector_Detect_Async'); - late final _QRCodeDetector_Detect_Async = - _QRCodeDetector_Detect_AsyncPtr.asFunction< - ffi.Pointer Function( - QRCodeDetector, Mat, imp1.CvCallback_2)>(); + late final _cv_QRCodeDetector_closePtr = + _lookup>( + 'cv_QRCodeDetector_close'); + late final _cv_QRCodeDetector_close = _cv_QRCodeDetector_closePtr + .asFunction(); - ffi.Pointer QRCodeDetector_New( + ffi.Pointer cv_QRCodeDetector_create( ffi.Pointer rval, ) { - return _QRCodeDetector_New( + return _cv_QRCodeDetector_create( rval, ); } - late final _QRCodeDetector_NewPtr = _lookup< + late final _cv_QRCodeDetector_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('QRCodeDetector_New'); - late final _QRCodeDetector_New = _QRCodeDetector_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + ffi.Pointer)>>('cv_QRCodeDetector_create'); + late final _cv_QRCodeDetector_create = + _cv_QRCodeDetector_createPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); - ffi.Pointer QRCodeDetector_New_Async( - imp1.CvCallback_1 callback, + ffi.Pointer cv_QRCodeDetector_decode( + QRCodeDetector self, + Mat input, + ffi.Pointer points, + Mat straight_qrcode, + ffi.Pointer> rval, + imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_New_Async( + return _cv_QRCodeDetector_decode( + self, + input, + points, + straight_qrcode, + rval, callback, ); } - late final _QRCodeDetector_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'QRCodeDetector_New_Async'); - late final _QRCodeDetector_New_Async = _QRCodeDetector_New_AsyncPtr - .asFunction Function(imp1.CvCallback_1)>(); + late final _cv_QRCodeDetector_decodePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + ffi.Pointer, + Mat, + ffi.Pointer>, + imp1.CvCallback_0)>>('cv_QRCodeDetector_decode'); + late final _cv_QRCodeDetector_decode = + _cv_QRCodeDetector_decodePtr.asFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + ffi.Pointer, + Mat, + ffi.Pointer>, + imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_decodeCurved( + ffi.Pointer cv_QRCodeDetector_decodeCurved( QRCodeDetector self, Mat img, VecPoint points, ffi.Pointer straight_qrcode, ffi.Pointer> rval, + imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_decodeCurved( + return _cv_QRCodeDetector_decodeCurved( self, img, points, straight_qrcode, rval, + callback, ); } - late final _QRCodeDetector_decodeCurvedPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, Mat, VecPoint, - ffi.Pointer, ffi.Pointer>)>>( - 'QRCodeDetector_decodeCurved'); - late final _QRCodeDetector_decodeCurved = - _QRCodeDetector_decodeCurvedPtr.asFunction< - ffi.Pointer Function(QRCodeDetector, Mat, VecPoint, - ffi.Pointer, ffi.Pointer>)>(); - - ffi.Pointer QRCodeDetector_decodeCurved_Async( + late final _cv_QRCodeDetector_decodeCurvedPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + VecPoint, + ffi.Pointer, + ffi.Pointer>, + imp1.CvCallback_0)>>('cv_QRCodeDetector_decodeCurved'); + late final _cv_QRCodeDetector_decodeCurved = + _cv_QRCodeDetector_decodeCurvedPtr.asFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + VecPoint, + ffi.Pointer, + ffi.Pointer>, + imp1.CvCallback_0)>(); + + ffi.Pointer cv_QRCodeDetector_detect( QRCodeDetector self, - Mat img, - VecPoint points, - imp1.CvCallback_2 callback, + Mat input, + ffi.Pointer points, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_decodeCurved_Async( + return _cv_QRCodeDetector_detect( self, - img, + input, points, + rval, callback, ); } - late final _QRCodeDetector_decodeCurved_AsyncPtr = _lookup< + late final _cv_QRCodeDetector_detectPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, Mat, VecPoint, - imp1.CvCallback_2)>>('QRCodeDetector_decodeCurved_Async'); - late final _QRCodeDetector_decodeCurved_Async = - _QRCodeDetector_decodeCurved_AsyncPtr.asFunction< ffi.Pointer Function( - QRCodeDetector, Mat, VecPoint, imp1.CvCallback_2)>(); + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_QRCodeDetector_detect'); + late final _cv_QRCodeDetector_detect = + _cv_QRCodeDetector_detectPtr.asFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_detectAndDecodeCurved( + ffi.Pointer cv_QRCodeDetector_detectAndDecode( QRCodeDetector self, - Mat img, + Mat input, ffi.Pointer points, ffi.Pointer straight_qrcode, ffi.Pointer> rval, + imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_detectAndDecodeCurved( + return _cv_QRCodeDetector_detectAndDecode( self, - img, + input, points, straight_qrcode, rval, + callback, ); } - late final _QRCodeDetector_detectAndDecodeCurvedPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QRCodeDetector, - Mat, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer>)>>( - 'QRCodeDetector_detectAndDecodeCurved'); - late final _QRCodeDetector_detectAndDecodeCurved = - _QRCodeDetector_detectAndDecodeCurvedPtr.asFunction< + late final _cv_QRCodeDetector_detectAndDecodePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + imp1.CvCallback_0)>>('cv_QRCodeDetector_detectAndDecode'); + late final _cv_QRCodeDetector_detectAndDecode = + _cv_QRCodeDetector_detectAndDecodePtr.asFunction< ffi.Pointer Function( QRCodeDetector, Mat, ffi.Pointer, ffi.Pointer, - ffi.Pointer>)>(); + ffi.Pointer>, + imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_detectAndDecodeCurved_Async( + ffi.Pointer cv_QRCodeDetector_detectAndDecodeCurved( QRCodeDetector self, Mat img, - imp1.CvCallback_3 callback, + ffi.Pointer points, + ffi.Pointer straight_qrcode, + ffi.Pointer> rval, + imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_detectAndDecodeCurved_Async( + return _cv_QRCodeDetector_detectAndDecodeCurved( self, img, + points, + straight_qrcode, + rval, callback, ); } - late final _QRCodeDetector_detectAndDecodeCurved_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QRCodeDetector, Mat, imp1.CvCallback_3)>>( - 'QRCodeDetector_detectAndDecodeCurved_Async'); - late final _QRCodeDetector_detectAndDecodeCurved_Async = - _QRCodeDetector_detectAndDecodeCurved_AsyncPtr.asFunction< + late final _cv_QRCodeDetector_detectAndDecodeCurvedPtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - QRCodeDetector, Mat, imp1.CvCallback_3)>(); + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + imp1.CvCallback_0)>>('cv_QRCodeDetector_detectAndDecodeCurved'); + late final _cv_QRCodeDetector_detectAndDecodeCurved = + _cv_QRCodeDetector_detectAndDecodeCurvedPtr.asFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_setEpsX( + ffi.Pointer cv_QRCodeDetector_detectAndDecodeMulti( QRCodeDetector self, - double epsX, + Mat input, + ffi.Pointer decoded, + ffi.Pointer points, + ffi.Pointer straight_code, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_setEpsX( + return _cv_QRCodeDetector_detectAndDecodeMulti( self, - epsX, + input, + decoded, + points, + straight_code, + rval, + callback, ); } - late final _QRCodeDetector_setEpsXPtr = _lookup< + late final _cv_QRCodeDetector_detectAndDecodeMultiPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - QRCodeDetector, ffi.Double)>>('QRCodeDetector_setEpsX'); - late final _QRCodeDetector_setEpsX = _QRCodeDetector_setEpsXPtr.asFunction< - ffi.Pointer Function(QRCodeDetector, double)>(); + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_QRCodeDetector_detectAndDecodeMulti'); + late final _cv_QRCodeDetector_detectAndDecodeMulti = + _cv_QRCodeDetector_detectAndDecodeMultiPtr.asFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_setEpsX_Async( + ffi.Pointer cv_QRCodeDetector_detectMulti( QRCodeDetector self, - double epsX, + Mat input, + ffi.Pointer points, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_setEpsX_Async( + return _cv_QRCodeDetector_detectMulti( self, - epsX, + input, + points, + rval, callback, ); } - late final _QRCodeDetector_setEpsX_AsyncPtr = _lookup< + late final _cv_QRCodeDetector_detectMultiPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, ffi.Double, - imp1.CvCallback_0)>>('QRCodeDetector_setEpsX_Async'); - late final _QRCodeDetector_setEpsX_Async = - _QRCodeDetector_setEpsX_AsyncPtr.asFunction< ffi.Pointer Function( - QRCodeDetector, double, imp1.CvCallback_0)>(); + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_QRCodeDetector_detectMulti'); + late final _cv_QRCodeDetector_detectMulti = + _cv_QRCodeDetector_detectMultiPtr.asFunction< + ffi.Pointer Function( + QRCodeDetector, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer QRCodeDetector_setEpsY( + ffi.Pointer cv_QRCodeDetector_setEpsX( QRCodeDetector self, - double epsY, + double epsX, ) { - return _QRCodeDetector_setEpsY( + return _cv_QRCodeDetector_setEpsX( self, - epsY, + epsX, ); } - late final _QRCodeDetector_setEpsYPtr = _lookup< + late final _cv_QRCodeDetector_setEpsXPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - QRCodeDetector, ffi.Double)>>('QRCodeDetector_setEpsY'); - late final _QRCodeDetector_setEpsY = _QRCodeDetector_setEpsYPtr.asFunction< - ffi.Pointer Function(QRCodeDetector, double)>(); + QRCodeDetector, ffi.Double)>>('cv_QRCodeDetector_setEpsX'); + late final _cv_QRCodeDetector_setEpsX = _cv_QRCodeDetector_setEpsXPtr + .asFunction Function(QRCodeDetector, double)>(); - ffi.Pointer QRCodeDetector_setEpsY_Async( + ffi.Pointer cv_QRCodeDetector_setEpsY( QRCodeDetector self, double epsY, - imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_setEpsY_Async( + return _cv_QRCodeDetector_setEpsY( self, epsY, - callback, ); } - late final _QRCodeDetector_setEpsY_AsyncPtr = _lookup< + late final _cv_QRCodeDetector_setEpsYPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, ffi.Double, - imp1.CvCallback_0)>>('QRCodeDetector_setEpsY_Async'); - late final _QRCodeDetector_setEpsY_Async = - _QRCodeDetector_setEpsY_AsyncPtr.asFunction< ffi.Pointer Function( - QRCodeDetector, double, imp1.CvCallback_0)>(); + QRCodeDetector, ffi.Double)>>('cv_QRCodeDetector_setEpsY'); + late final _cv_QRCodeDetector_setEpsY = _cv_QRCodeDetector_setEpsYPtr + .asFunction Function(QRCodeDetector, double)>(); - ffi.Pointer QRCodeDetector_setUseAlignmentMarkers( + ffi.Pointer cv_QRCodeDetector_setUseAlignmentMarkers( QRCodeDetector self, bool useAlignmentMarkers, ) { - return _QRCodeDetector_setUseAlignmentMarkers( + return _cv_QRCodeDetector_setUseAlignmentMarkers( self, useAlignmentMarkers, ); } - late final _QRCodeDetector_setUseAlignmentMarkersPtr = _lookup< + late final _cv_QRCodeDetector_setUseAlignmentMarkersPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(QRCodeDetector, - ffi.Bool)>>('QRCodeDetector_setUseAlignmentMarkers'); - late final _QRCodeDetector_setUseAlignmentMarkers = - _QRCodeDetector_setUseAlignmentMarkersPtr.asFunction< - ffi.Pointer Function(QRCodeDetector, bool)>(); + ffi.Bool)>>('cv_QRCodeDetector_setUseAlignmentMarkers'); + late final _cv_QRCodeDetector_setUseAlignmentMarkers = + _cv_QRCodeDetector_setUseAlignmentMarkersPtr + .asFunction Function(QRCodeDetector, bool)>(); - ffi.Pointer QRCodeDetector_setUseAlignmentMarkers_Async( - QRCodeDetector self, - bool useAlignmentMarkers, + ffi.Pointer cv_groupRectangles( + ffi.Pointer rects, + int groupThreshold, + double eps, imp1.CvCallback_0 callback, ) { - return _QRCodeDetector_setUseAlignmentMarkers_Async( - self, - useAlignmentMarkers, + return _cv_groupRectangles( + rects, + groupThreshold, + eps, callback, ); } - late final _QRCodeDetector_setUseAlignmentMarkers_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QRCodeDetector, ffi.Bool, imp1.CvCallback_0)>>( - 'QRCodeDetector_setUseAlignmentMarkers_Async'); - late final _QRCodeDetector_setUseAlignmentMarkers_Async = - _QRCodeDetector_setUseAlignmentMarkers_AsyncPtr.asFunction< - ffi.Pointer Function( - QRCodeDetector, bool, imp1.CvCallback_0)>(); + late final _cv_groupRectanglesPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, ffi.Int, + ffi.Double, imp1.CvCallback_0)>>('cv_groupRectangles'); + late final _cv_groupRectangles = _cv_groupRectanglesPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, int, double, imp1.CvCallback_0)>(); late final addresses = _SymbolAddresses(this); } @@ -2680,15 +1595,15 @@ class _SymbolAddresses { final CvNativeObjdetect _library; _SymbolAddresses(this._library); ffi.Pointer> - get CascadeClassifier_Close => _library._CascadeClassifier_ClosePtr; + get cv_CascadeClassifier_close => _library._cv_CascadeClassifier_closePtr; ffi.Pointer> - get FaceDetectorYN_Close => _library._FaceDetectorYN_ClosePtr; + get cv_FaceDetectorYN_close => _library._cv_FaceDetectorYN_closePtr; ffi.Pointer> - get FaceRecognizerSF_Close => _library._FaceRecognizerSF_ClosePtr; + get cv_FaceRecognizerSF_close => _library._cv_FaceRecognizerSF_closePtr; ffi.Pointer> - get HOGDescriptor_Close => _library._HOGDescriptor_ClosePtr; + get cv_HOGDescriptor_close => _library._cv_HOGDescriptor_closePtr; ffi.Pointer> - get QRCodeDetector_Close => _library._QRCodeDetector_ClosePtr; + get cv_QRCodeDetector_close => _library._cv_QRCodeDetector_closePtr; } final class CascadeClassifier extends ffi.Struct { diff --git a/packages/dartcv/lib/src/g/objdetect.yaml b/packages/dartcv/lib/src/g/objdetect.yaml index cda3be3a..49dc73ee 100644 --- a/packages/dartcv/lib/src/g/objdetect.yaml +++ b/packages/dartcv/lib/src/g/objdetect.yaml @@ -1,231 +1,125 @@ format_version: 1.0.0 files: - package:dartcv/src/g/objdetect.g.dart: + package:dartcv4/src/g/objdetect.g.dart: used-config: ffi-native: false symbols: - c:@F@CascadeClassifier_Close: - name: CascadeClassifier_Close - c:@F@CascadeClassifier_DetectMultiScale: - name: CascadeClassifier_DetectMultiScale - c:@F@CascadeClassifier_DetectMultiScale2: - name: CascadeClassifier_DetectMultiScale2 - c:@F@CascadeClassifier_DetectMultiScale2_Async: - name: CascadeClassifier_DetectMultiScale2_Async - c:@F@CascadeClassifier_DetectMultiScale3: - name: CascadeClassifier_DetectMultiScale3 - c:@F@CascadeClassifier_DetectMultiScale3_Async: - name: CascadeClassifier_DetectMultiScale3_Async - c:@F@CascadeClassifier_DetectMultiScaleWithParams: - name: CascadeClassifier_DetectMultiScaleWithParams - c:@F@CascadeClassifier_DetectMultiScaleWithParams_Async: - name: CascadeClassifier_DetectMultiScaleWithParams_Async - c:@F@CascadeClassifier_DetectMultiScale_Async: - name: CascadeClassifier_DetectMultiScale_Async - c:@F@CascadeClassifier_Empty: - name: CascadeClassifier_Empty - c:@F@CascadeClassifier_Empty_Async: - name: CascadeClassifier_Empty_Async - c:@F@CascadeClassifier_Load: - name: CascadeClassifier_Load - c:@F@CascadeClassifier_Load_Async: - name: CascadeClassifier_Load_Async - c:@F@CascadeClassifier_New: - name: CascadeClassifier_New - c:@F@CascadeClassifier_NewFromFile: - name: CascadeClassifier_NewFromFile - c:@F@CascadeClassifier_NewFromFile_Async: - name: CascadeClassifier_NewFromFile_Async - c:@F@CascadeClassifier_New_Async: - name: CascadeClassifier_New_Async - c:@F@CascadeClassifier_getFeatureType: - name: CascadeClassifier_getFeatureType - c:@F@CascadeClassifier_getFeatureType_Async: - name: CascadeClassifier_getFeatureType_Async - c:@F@CascadeClassifier_getOriginalWindowSize: - name: CascadeClassifier_getOriginalWindowSize - c:@F@CascadeClassifier_getOriginalWindowSize_Async: - name: CascadeClassifier_getOriginalWindowSize_Async - c:@F@CascadeClassifier_isOldFormatCascade: - name: CascadeClassifier_isOldFormatCascade - c:@F@CascadeClassifier_isOldFormatCascade_Async: - name: CascadeClassifier_isOldFormatCascade_Async - c:@F@FaceDetectorYN_Close: - name: FaceDetectorYN_Close - c:@F@FaceDetectorYN_Detect: - name: FaceDetectorYN_Detect - c:@F@FaceDetectorYN_Detect_Async: - name: FaceDetectorYN_Detect_Async - c:@F@FaceDetectorYN_GetInputSize: - name: FaceDetectorYN_GetInputSize - c:@F@FaceDetectorYN_GetInputSize_Async: - name: FaceDetectorYN_GetInputSize_Async - c:@F@FaceDetectorYN_GetNMSThreshold: - name: FaceDetectorYN_GetNMSThreshold - c:@F@FaceDetectorYN_GetNMSThreshold_Async: - name: FaceDetectorYN_GetNMSThreshold_Async - c:@F@FaceDetectorYN_GetScoreThreshold: - name: FaceDetectorYN_GetScoreThreshold - c:@F@FaceDetectorYN_GetScoreThreshold_Async: - name: FaceDetectorYN_GetScoreThreshold_Async - c:@F@FaceDetectorYN_GetTopK: - name: FaceDetectorYN_GetTopK - c:@F@FaceDetectorYN_GetTopK_Async: - name: FaceDetectorYN_GetTopK_Async - c:@F@FaceDetectorYN_New: - name: FaceDetectorYN_New - c:@F@FaceDetectorYN_NewFromBuffer: - name: FaceDetectorYN_NewFromBuffer - c:@F@FaceDetectorYN_NewFromBuffer_Async: - name: FaceDetectorYN_NewFromBuffer_Async - c:@F@FaceDetectorYN_New_Async: - name: FaceDetectorYN_New_Async - c:@F@FaceDetectorYN_SetInputSize: - name: FaceDetectorYN_SetInputSize - c:@F@FaceDetectorYN_SetInputSize_Async: - name: FaceDetectorYN_SetInputSize_Async - c:@F@FaceDetectorYN_SetNMSThreshold: - name: FaceDetectorYN_SetNMSThreshold - c:@F@FaceDetectorYN_SetNMSThreshold_Async: - name: FaceDetectorYN_SetNMSThreshold_Async - c:@F@FaceDetectorYN_SetScoreThreshold: - name: FaceDetectorYN_SetScoreThreshold - c:@F@FaceDetectorYN_SetScoreThreshold_Async: - name: FaceDetectorYN_SetScoreThreshold_Async - c:@F@FaceDetectorYN_SetTopK: - name: FaceDetectorYN_SetTopK - c:@F@FaceDetectorYN_SetTopK_Async: - name: FaceDetectorYN_SetTopK_Async - c:@F@FaceRecognizerSF_AlignCrop: - name: FaceRecognizerSF_AlignCrop - c:@F@FaceRecognizerSF_AlignCrop_Async: - name: FaceRecognizerSF_AlignCrop_Async - c:@F@FaceRecognizerSF_Close: - name: FaceRecognizerSF_Close - c:@F@FaceRecognizerSF_Feature: - name: FaceRecognizerSF_Feature - c:@F@FaceRecognizerSF_Feature_Async: - name: FaceRecognizerSF_Feature_Async - c:@F@FaceRecognizerSF_Match: - name: FaceRecognizerSF_Match - c:@F@FaceRecognizerSF_Match_Async: - name: FaceRecognizerSF_Match_Async - c:@F@FaceRecognizerSF_New: - name: FaceRecognizerSF_New - c:@F@FaceRecognizerSF_New_Async: - name: FaceRecognizerSF_New_Async - c:@F@GroupRectangles: - name: GroupRectangles - c:@F@GroupRectangles_Async: - name: GroupRectangles_Async - c:@F@HOGDescriptor_Close: - name: HOGDescriptor_Close - c:@F@HOGDescriptor_Compute: - name: HOGDescriptor_Compute - c:@F@HOGDescriptor_Compute_Async: - name: HOGDescriptor_Compute_Async - c:@F@HOGDescriptor_Detect: - name: HOGDescriptor_Detect - c:@F@HOGDescriptor_Detect2: - name: HOGDescriptor_Detect2 - c:@F@HOGDescriptor_Detect2_Async: - name: HOGDescriptor_Detect2_Async - c:@F@HOGDescriptor_DetectMultiScale: - name: HOGDescriptor_DetectMultiScale - c:@F@HOGDescriptor_DetectMultiScaleWithParams: - name: HOGDescriptor_DetectMultiScaleWithParams - c:@F@HOGDescriptor_DetectMultiScaleWithParams_Async: - name: HOGDescriptor_DetectMultiScaleWithParams_Async - c:@F@HOGDescriptor_DetectMultiScale_Async: - name: HOGDescriptor_DetectMultiScale_Async - c:@F@HOGDescriptor_Detect_Async: - name: HOGDescriptor_Detect_Async - c:@F@HOGDescriptor_Load: - name: HOGDescriptor_Load - c:@F@HOGDescriptor_Load_Async: - name: HOGDescriptor_Load_Async - c:@F@HOGDescriptor_New: - name: HOGDescriptor_New - c:@F@HOGDescriptor_NewFromFile: - name: HOGDescriptor_NewFromFile - c:@F@HOGDescriptor_NewFromFile_Async: - name: HOGDescriptor_NewFromFile_Async - c:@F@HOGDescriptor_New_Async: - name: HOGDescriptor_New_Async - c:@F@HOGDescriptor_SetSVMDetector: - name: HOGDescriptor_SetSVMDetector - c:@F@HOGDescriptor_SetSVMDetector_Async: - name: HOGDescriptor_SetSVMDetector_Async - c:@F@HOGDescriptor_computeGradient: - name: HOGDescriptor_computeGradient - c:@F@HOGDescriptor_computeGradient_Async: - name: HOGDescriptor_computeGradient_Async - c:@F@HOGDescriptor_getDaimlerPeopleDetector: - name: HOGDescriptor_getDaimlerPeopleDetector - c:@F@HOGDescriptor_getDaimlerPeopleDetector_Async: - name: HOGDescriptor_getDaimlerPeopleDetector_Async - c:@F@HOGDescriptor_getDescriptorSize: - name: HOGDescriptor_getDescriptorSize - c:@F@HOGDescriptor_getDescriptorSize_Async: - name: HOGDescriptor_getDescriptorSize_Async - c:@F@HOGDescriptor_getWinSigma: - name: HOGDescriptor_getWinSigma - c:@F@HOGDescriptor_getWinSigma_Async: - name: HOGDescriptor_getWinSigma_Async - c:@F@HOGDescriptor_groupRectangles: - name: HOGDescriptor_groupRectangles - c:@F@HOGDescriptor_groupRectangles_Async: - name: HOGDescriptor_groupRectangles_Async - c:@F@HOG_GetDefaultPeopleDetector: - name: HOG_GetDefaultPeopleDetector - c:@F@HOG_GetDefaultPeopleDetector_Async: - name: HOG_GetDefaultPeopleDetector_Async - c:@F@QRCodeDetector_Close: - name: QRCodeDetector_Close - c:@F@QRCodeDetector_Decode: - name: QRCodeDetector_Decode - c:@F@QRCodeDetector_Decode_Async: - name: QRCodeDetector_Decode_Async - c:@F@QRCodeDetector_Detect: - name: QRCodeDetector_Detect - c:@F@QRCodeDetector_DetectAndDecode: - name: QRCodeDetector_DetectAndDecode - c:@F@QRCodeDetector_DetectAndDecodeMulti: - name: QRCodeDetector_DetectAndDecodeMulti - c:@F@QRCodeDetector_DetectAndDecodeMulti_Async: - name: QRCodeDetector_DetectAndDecodeMulti_Async - c:@F@QRCodeDetector_DetectAndDecode_Async: - name: QRCodeDetector_DetectAndDecode_Async - c:@F@QRCodeDetector_DetectMulti: - name: QRCodeDetector_DetectMulti - c:@F@QRCodeDetector_DetectMulti_Async: - name: QRCodeDetector_DetectMulti_Async - c:@F@QRCodeDetector_Detect_Async: - name: QRCodeDetector_Detect_Async - c:@F@QRCodeDetector_New: - name: QRCodeDetector_New - c:@F@QRCodeDetector_New_Async: - name: QRCodeDetector_New_Async - c:@F@QRCodeDetector_decodeCurved: - name: QRCodeDetector_decodeCurved - c:@F@QRCodeDetector_decodeCurved_Async: - name: QRCodeDetector_decodeCurved_Async - c:@F@QRCodeDetector_detectAndDecodeCurved: - name: QRCodeDetector_detectAndDecodeCurved - c:@F@QRCodeDetector_detectAndDecodeCurved_Async: - name: QRCodeDetector_detectAndDecodeCurved_Async - c:@F@QRCodeDetector_setEpsX: - name: QRCodeDetector_setEpsX - c:@F@QRCodeDetector_setEpsX_Async: - name: QRCodeDetector_setEpsX_Async - c:@F@QRCodeDetector_setEpsY: - name: QRCodeDetector_setEpsY - c:@F@QRCodeDetector_setEpsY_Async: - name: QRCodeDetector_setEpsY_Async - c:@F@QRCodeDetector_setUseAlignmentMarkers: - name: QRCodeDetector_setUseAlignmentMarkers - c:@F@QRCodeDetector_setUseAlignmentMarkers_Async: - name: QRCodeDetector_setUseAlignmentMarkers_Async + c:@F@cv_CascadeClassifier_close: + name: cv_CascadeClassifier_close + c:@F@cv_CascadeClassifier_create: + name: cv_CascadeClassifier_create + c:@F@cv_CascadeClassifier_create_1: + name: cv_CascadeClassifier_create_1 + c:@F@cv_CascadeClassifier_detectMultiScale: + name: cv_CascadeClassifier_detectMultiScale + c:@F@cv_CascadeClassifier_detectMultiScale_1: + name: cv_CascadeClassifier_detectMultiScale_1 + c:@F@cv_CascadeClassifier_detectMultiScale_2: + name: cv_CascadeClassifier_detectMultiScale_2 + c:@F@cv_CascadeClassifier_detectMultiScale_3: + name: cv_CascadeClassifier_detectMultiScale_3 + c:@F@cv_CascadeClassifier_empty: + name: cv_CascadeClassifier_empty + c:@F@cv_CascadeClassifier_getFeatureType: + name: cv_CascadeClassifier_getFeatureType + c:@F@cv_CascadeClassifier_getOriginalWindowSize: + name: cv_CascadeClassifier_getOriginalWindowSize + c:@F@cv_CascadeClassifier_isOldFormatCascade: + name: cv_CascadeClassifier_isOldFormatCascade + c:@F@cv_CascadeClassifier_load: + name: cv_CascadeClassifier_load + c:@F@cv_FaceDetectorYN_close: + name: cv_FaceDetectorYN_close + c:@F@cv_FaceDetectorYN_create: + name: cv_FaceDetectorYN_create + c:@F@cv_FaceDetectorYN_create_1: + name: cv_FaceDetectorYN_create_1 + c:@F@cv_FaceDetectorYN_detect: + name: cv_FaceDetectorYN_detect + c:@F@cv_FaceDetectorYN_getInputSize: + name: cv_FaceDetectorYN_getInputSize + c:@F@cv_FaceDetectorYN_getNMSThreshold: + name: cv_FaceDetectorYN_getNMSThreshold + c:@F@cv_FaceDetectorYN_getScoreThreshold: + name: cv_FaceDetectorYN_getScoreThreshold + c:@F@cv_FaceDetectorYN_getTopK: + name: cv_FaceDetectorYN_getTopK + c:@F@cv_FaceDetectorYN_setInputSize: + name: cv_FaceDetectorYN_setInputSize + c:@F@cv_FaceDetectorYN_setNMSThreshold: + name: cv_FaceDetectorYN_setNMSThreshold + c:@F@cv_FaceDetectorYN_setScoreThreshold: + name: cv_FaceDetectorYN_setScoreThreshold + c:@F@cv_FaceDetectorYN_setTopK: + name: cv_FaceDetectorYN_setTopK + c:@F@cv_FaceRecognizerSF_alignCrop: + name: cv_FaceRecognizerSF_alignCrop + c:@F@cv_FaceRecognizerSF_close: + name: cv_FaceRecognizerSF_close + c:@F@cv_FaceRecognizerSF_create: + name: cv_FaceRecognizerSF_create + c:@F@cv_FaceRecognizerSF_feature: + name: cv_FaceRecognizerSF_feature + c:@F@cv_FaceRecognizerSF_match: + name: cv_FaceRecognizerSF_match + c:@F@cv_HOGDescriptor_close: + name: cv_HOGDescriptor_close + c:@F@cv_HOGDescriptor_compute: + name: cv_HOGDescriptor_compute + c:@F@cv_HOGDescriptor_computeGradient: + name: cv_HOGDescriptor_computeGradient + c:@F@cv_HOGDescriptor_create: + name: cv_HOGDescriptor_create + c:@F@cv_HOGDescriptor_create_1: + name: cv_HOGDescriptor_create_1 + c:@F@cv_HOGDescriptor_detect: + name: cv_HOGDescriptor_detect + c:@F@cv_HOGDescriptor_detect2: + name: cv_HOGDescriptor_detect2 + c:@F@cv_HOGDescriptor_detectMultiScale: + name: cv_HOGDescriptor_detectMultiScale + c:@F@cv_HOGDescriptor_detectMultiScale_1: + name: cv_HOGDescriptor_detectMultiScale_1 + c:@F@cv_HOGDescriptor_getDaimlerPeopleDetector: + name: cv_HOGDescriptor_getDaimlerPeopleDetector + c:@F@cv_HOGDescriptor_getDefaultPeopleDetector: + name: cv_HOGDescriptor_getDefaultPeopleDetector + c:@F@cv_HOGDescriptor_getDescriptorSize: + name: cv_HOGDescriptor_getDescriptorSize + c:@F@cv_HOGDescriptor_getWinSigma: + name: cv_HOGDescriptor_getWinSigma + c:@F@cv_HOGDescriptor_groupRectangles: + name: cv_HOGDescriptor_groupRectangles + c:@F@cv_HOGDescriptor_load: + name: cv_HOGDescriptor_load + c:@F@cv_HOGDescriptor_setSVMDetector: + name: cv_HOGDescriptor_setSVMDetector + c:@F@cv_QRCodeDetector_close: + name: cv_QRCodeDetector_close + c:@F@cv_QRCodeDetector_create: + name: cv_QRCodeDetector_create + c:@F@cv_QRCodeDetector_decode: + name: cv_QRCodeDetector_decode + c:@F@cv_QRCodeDetector_decodeCurved: + name: cv_QRCodeDetector_decodeCurved + c:@F@cv_QRCodeDetector_detect: + name: cv_QRCodeDetector_detect + c:@F@cv_QRCodeDetector_detectAndDecode: + name: cv_QRCodeDetector_detectAndDecode + c:@F@cv_QRCodeDetector_detectAndDecodeCurved: + name: cv_QRCodeDetector_detectAndDecodeCurved + c:@F@cv_QRCodeDetector_detectAndDecodeMulti: + name: cv_QRCodeDetector_detectAndDecodeMulti + c:@F@cv_QRCodeDetector_detectMulti: + name: cv_QRCodeDetector_detectMulti + c:@F@cv_QRCodeDetector_setEpsX: + name: cv_QRCodeDetector_setEpsX + c:@F@cv_QRCodeDetector_setEpsY: + name: cv_QRCodeDetector_setEpsY + c:@F@cv_QRCodeDetector_setUseAlignmentMarkers: + name: cv_QRCodeDetector_setUseAlignmentMarkers + c:@F@cv_groupRectangles: + name: cv_groupRectangles c:@S@CascadeClassifier: name: CascadeClassifier c:@S@FaceDetectorYN: diff --git a/packages/dartcv/lib/src/g/photo.g.dart b/packages/dartcv/lib/src/g/photo.g.dart index 84323490..af030a65 100644 --- a/packages/dartcv/lib/src/g/photo.g.dart +++ b/packages/dartcv/lib/src/g/photo.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Photo /// @@ -30,258 +30,214 @@ class CvNativePhoto { lookup) : _lookup = lookup; - void AlignMTB_Close( + void cv_AlignMTB_close( AlignMTBPtr b, ) { - return _AlignMTB_Close( + return _cv_AlignMTB_close( b, ); } - late final _AlignMTB_ClosePtr = + late final _cv_AlignMTB_closePtr = _lookup>( - 'AlignMTB_Close'); - late final _AlignMTB_Close = - _AlignMTB_ClosePtr.asFunction(); + 'cv_AlignMTB_close'); + late final _cv_AlignMTB_close = + _cv_AlignMTB_closePtr.asFunction(); - ffi.Pointer AlignMTB_Create( - ffi.Pointer rval, - ) { - return _AlignMTB_Create( - rval, - ); - } - - late final _AlignMTB_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('AlignMTB_Create'); - late final _AlignMTB_Create = _AlignMTB_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer AlignMTB_CreateWithParams( - int max_bits, - int exclude_range, - bool cut, - ffi.Pointer rval, - ) { - return _AlignMTB_CreateWithParams( - max_bits, - exclude_range, - cut, - rval, - ); - } - - late final _AlignMTB_CreateWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Bool, - ffi.Pointer)>>('AlignMTB_CreateWithParams'); - late final _AlignMTB_CreateWithParams = - _AlignMTB_CreateWithParamsPtr.asFunction< - ffi.Pointer Function( - int, int, bool, ffi.Pointer)>(); - - ffi.Pointer AlignMTB_CreateWithParams_Async( - int max_bits, - int exclude_range, - bool cut, - imp1.CvCallback_1 callback, + ffi.Pointer cv_AlignMTB_process( + AlignMTB b, + VecMat src, + ffi.Pointer dst, + imp1.CvCallback_0 callback, ) { - return _AlignMTB_CreateWithParams_Async( - max_bits, - exclude_range, - cut, + return _cv_AlignMTB_process( + b, + src, + dst, callback, ); } - late final _AlignMTB_CreateWithParams_AsyncPtr = _lookup< + late final _cv_AlignMTB_processPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Bool, - imp1.CvCallback_1)>>('AlignMTB_CreateWithParams_Async'); - late final _AlignMTB_CreateWithParams_Async = - _AlignMTB_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, bool, imp1.CvCallback_1)>(); - - ffi.Pointer AlignMTB_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _AlignMTB_Create_Async( - callback, - ); - } - - late final _AlignMTB_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'AlignMTB_Create_Async'); - late final _AlignMTB_Create_Async = _AlignMTB_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + ffi.Pointer Function(AlignMTB, VecMat, ffi.Pointer, + imp1.CvCallback_0)>>('cv_AlignMTB_process'); + late final _cv_AlignMTB_process = _cv_AlignMTB_processPtr.asFunction< + ffi.Pointer Function( + AlignMTB, VecMat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer AlignMTB_Process( - AlignMTB b, - VecMat src, - ffi.Pointer dst, + void cv_MergeMertens_close( + MergeMertensPtr b, ) { - return _AlignMTB_Process( + return _cv_MergeMertens_close( b, - src, - dst, ); } - late final _AlignMTB_ProcessPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - AlignMTB, VecMat, ffi.Pointer)>>('AlignMTB_Process'); - late final _AlignMTB_Process = _AlignMTB_ProcessPtr.asFunction< - ffi.Pointer Function(AlignMTB, VecMat, ffi.Pointer)>(); + late final _cv_MergeMertens_closePtr = + _lookup>( + 'cv_MergeMertens_close'); + late final _cv_MergeMertens_close = + _cv_MergeMertens_closePtr.asFunction(); - ffi.Pointer AlignMTB_Process_Async( - AlignMTB b, + ffi.Pointer cv_MergeMertens_process( + MergeMertens b, VecMat src, - imp1.CvCallback_1 callback, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _AlignMTB_Process_Async( + return _cv_MergeMertens_process( b, src, + dst, callback, ); } - late final _AlignMTB_Process_AsyncPtr = _lookup< + late final _cv_MergeMertens_processPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - AlignMTB, VecMat, imp1.CvCallback_1)>>('AlignMTB_Process_Async'); - late final _AlignMTB_Process_Async = _AlignMTB_Process_AsyncPtr.asFunction< - ffi.Pointer Function(AlignMTB, VecMat, imp1.CvCallback_1)>(); + ffi.Pointer Function(MergeMertens, VecMat, Mat, + imp1.CvCallback_0)>>('cv_MergeMertens_process'); + late final _cv_MergeMertens_process = _cv_MergeMertens_processPtr.asFunction< + ffi.Pointer Function( + MergeMertens, VecMat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer ColorChange( + ffi.Pointer cv_colorChange( Mat src, Mat mask, Mat dst, double red_mul, double green_mul, double blue_mul, + imp1.CvCallback_0 callback, ) { - return _ColorChange( + return _cv_colorChange( src, mask, dst, red_mul, green_mul, blue_mul, + callback, ); } - late final _ColorChangePtr = _lookup< + late final _cv_colorChangePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Float, ffi.Float, + ffi.Float, imp1.CvCallback_0)>>('cv_colorChange'); + late final _cv_colorChange = _cv_colorChangePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, double, double, double, imp1.CvCallback_0)>(); + + ffi.Pointer cv_createAlignMTB( + ffi.Pointer rval, + ) { + return _cv_createAlignMTB( + rval, + ); + } + + late final _cv_createAlignMTBPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, ffi.Float, ffi.Float, ffi.Float)>>('ColorChange'); - late final _ColorChange = _ColorChangePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, double, double, double)>(); + ffi.Pointer)>>('cv_createAlignMTB'); + late final _cv_createAlignMTB = _cv_createAlignMTBPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer ColorChange_Async( - Mat src, - Mat mask, - double red_mul, - double green_mul, - double blue_mul, - imp1.CvCallback_1 callback, + ffi.Pointer cv_createAlignMTB_1( + int max_bits, + int exclude_range, + bool cut, + ffi.Pointer rval, ) { - return _ColorChange_Async( - src, - mask, - red_mul, - green_mul, - blue_mul, - callback, + return _cv_createAlignMTB_1( + max_bits, + exclude_range, + cut, + rval, ); } - late final _ColorChange_AsyncPtr = _lookup< + late final _cv_createAlignMTB_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, - ffi.Float, imp1.CvCallback_1)>>('ColorChange_Async'); - late final _ColorChange_Async = _ColorChange_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, double, double, imp1.CvCallback_1)>(); + ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Bool, + ffi.Pointer)>>('cv_createAlignMTB_1'); + late final _cv_createAlignMTB_1 = _cv_createAlignMTB_1Ptr.asFunction< + ffi.Pointer Function(int, int, bool, ffi.Pointer)>(); - ffi.Pointer DetailEnhance( - Mat src, - Mat dst, - double sigma_s, - double sigma_r, + ffi.Pointer cv_createMergeMertens( + ffi.Pointer rval, ) { - return _DetailEnhance( - src, - dst, - sigma_s, - sigma_r, + return _cv_createMergeMertens( + rval, ); } - late final _DetailEnhancePtr = _lookup< + late final _cv_createMergeMertensPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, ffi.Float, ffi.Float)>>('DetailEnhance'); - late final _DetailEnhance = _DetailEnhancePtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, double)>(); + ffi.Pointer)>>('cv_createMergeMertens'); + late final _cv_createMergeMertens = _cv_createMergeMertensPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer DetailEnhance_Async( - Mat src, - double sigma_s, - double sigma_r, - imp1.CvCallback_1 callback, + ffi.Pointer cv_createMergeMertens_1( + double contrast_weight, + double saturation_weight, + double exposure_weight, + ffi.Pointer rval, ) { - return _DetailEnhance_Async( - src, - sigma_s, - sigma_r, - callback, + return _cv_createMergeMertens_1( + contrast_weight, + saturation_weight, + exposure_weight, + rval, ); } - late final _DetailEnhance_AsyncPtr = _lookup< + late final _cv_createMergeMertens_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('DetailEnhance_Async'); - late final _DetailEnhance_Async = _DetailEnhance_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, double, double, imp1.CvCallback_1)>(); + ffi.Pointer Function(ffi.Float, ffi.Float, ffi.Float, + ffi.Pointer)>>('cv_createMergeMertens_1'); + late final _cv_createMergeMertens_1 = _cv_createMergeMertens_1Ptr.asFunction< + ffi.Pointer Function( + double, double, double, ffi.Pointer)>(); - ffi.Pointer EdgePreservingFilter( + ffi.Pointer cv_detailEnhance( Mat src, Mat dst, - int filter, double sigma_s, double sigma_r, + imp1.CvCallback_0 callback, ) { - return _EdgePreservingFilter( + return _cv_detailEnhance( src, dst, - filter, sigma_s, sigma_r, + callback, ); } - late final _EdgePreservingFilterPtr = _lookup< + late final _cv_detailEnhancePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Float, - ffi.Float)>>('EdgePreservingFilter'); - late final _EdgePreservingFilter = _EdgePreservingFilterPtr.asFunction< - ffi.Pointer Function(Mat, Mat, int, double, double)>(); + ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, + imp1.CvCallback_0)>>('cv_detailEnhance'); + late final _cv_detailEnhance = _cv_detailEnhancePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, double, imp1.CvCallback_0)>(); - ffi.Pointer EdgePreservingFilter_Async( + ffi.Pointer cv_edgePreservingFilter( Mat src, + Mat dst, int filter, double sigma_s, double sigma_r, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _EdgePreservingFilter_Async( + return _cv_edgePreservingFilter( src, + dst, filter, sigma_s, sigma_r, @@ -289,70 +245,79 @@ class CvNativePhoto { ); } - late final _EdgePreservingFilter_AsyncPtr = _lookup< + late final _cv_edgePreservingFilterPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('EdgePreservingFilter_Async'); - late final _EdgePreservingFilter_Async = - _EdgePreservingFilter_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, int, double, double, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Int, ffi.Float, + ffi.Float, imp1.CvCallback_0)>>('cv_edgePreservingFilter'); + late final _cv_edgePreservingFilter = _cv_edgePreservingFilterPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, int, double, double, imp1.CvCallback_0)>(); - ffi.Pointer FastNlMeansDenoising( + ffi.Pointer cv_fastNlMeansDenoising( Mat src, Mat dst, + imp1.CvCallback_0 callback, ) { - return _FastNlMeansDenoising( + return _cv_fastNlMeansDenoising( src, dst, + callback, ); } - late final _FastNlMeansDenoisingPtr = - _lookup Function(Mat, Mat)>>( - 'FastNlMeansDenoising'); - late final _FastNlMeansDenoising = _FastNlMeansDenoisingPtr.asFunction< - ffi.Pointer Function(Mat, Mat)>(); + late final _cv_fastNlMeansDenoisingPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, imp1.CvCallback_0)>>('cv_fastNlMeansDenoising'); + late final _cv_fastNlMeansDenoising = _cv_fastNlMeansDenoisingPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer FastNlMeansDenoisingColored( + ffi.Pointer cv_fastNlMeansDenoisingColored( Mat src, Mat dst, + imp1.CvCallback_0 callback, ) { - return _FastNlMeansDenoisingColored( + return _cv_fastNlMeansDenoisingColored( src, dst, + callback, ); } - late final _FastNlMeansDenoisingColoredPtr = - _lookup Function(Mat, Mat)>>( - 'FastNlMeansDenoisingColored'); - late final _FastNlMeansDenoisingColored = _FastNlMeansDenoisingColoredPtr - .asFunction Function(Mat, Mat)>(); + late final _cv_fastNlMeansDenoisingColoredPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, imp1.CvCallback_0)>>('cv_fastNlMeansDenoisingColored'); + late final _cv_fastNlMeansDenoisingColored = + _cv_fastNlMeansDenoisingColoredPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer FastNlMeansDenoisingColoredMulti( + ffi.Pointer cv_fastNlMeansDenoisingColoredMulti( VecMat src, Mat dst, int imgToDenoiseIndex, int temporalWindowSize, + imp1.CvCallback_0 callback, ) { - return _FastNlMeansDenoisingColoredMulti( + return _cv_fastNlMeansDenoisingColoredMulti( src, dst, imgToDenoiseIndex, temporalWindowSize, + callback, ); } - late final _FastNlMeansDenoisingColoredMultiPtr = _lookup< + late final _cv_fastNlMeansDenoisingColoredMultiPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecMat, Mat, ffi.Int, - ffi.Int)>>('FastNlMeansDenoisingColoredMulti'); - late final _FastNlMeansDenoisingColoredMulti = - _FastNlMeansDenoisingColoredMultiPtr.asFunction< - ffi.Pointer Function(VecMat, Mat, int, int)>(); + ffi.Pointer Function(VecMat, Mat, ffi.Int, ffi.Int, + imp1.CvCallback_0)>>('cv_fastNlMeansDenoisingColoredMulti'); + late final _cv_fastNlMeansDenoisingColoredMulti = + _cv_fastNlMeansDenoisingColoredMultiPtr.asFunction< + ffi.Pointer Function( + VecMat, Mat, int, int, imp1.CvCallback_0)>(); - ffi.Pointer FastNlMeansDenoisingColoredMultiWithParams( + ffi.Pointer cv_fastNlMeansDenoisingColoredMulti_1( VecMat src, Mat dst, int imgToDenoiseIndex, @@ -361,8 +326,9 @@ class CvNativePhoto { double hColor, int templateWindowSize, int searchWindowSize, + imp1.CvCallback_0 callback, ) { - return _FastNlMeansDenoisingColoredMultiWithParams( + return _cv_fastNlMeansDenoisingColoredMulti_1( src, dst, imgToDenoiseIndex, @@ -371,10 +337,11 @@ class CvNativePhoto { hColor, templateWindowSize, searchWindowSize, + callback, ); } - late final _FastNlMeansDenoisingColoredMultiWithParamsPtr = _lookup< + late final _cv_fastNlMeansDenoisingColoredMulti_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VecMat, @@ -384,622 +351,234 @@ class CvNativePhoto { ffi.Float, ffi.Float, ffi.Int, - ffi.Int)>>('FastNlMeansDenoisingColoredMultiWithParams'); - late final _FastNlMeansDenoisingColoredMultiWithParams = - _FastNlMeansDenoisingColoredMultiWithParamsPtr.asFunction< - ffi.Pointer Function( - VecMat, Mat, int, int, double, double, int, int)>(); - - ffi.Pointer FastNlMeansDenoisingColoredMultiWithParams_Async( - VecMat src, - int imgToDenoiseIndex, - int temporalWindowSize, - double h, - double hColor, - int templateWindowSize, - int searchWindowSize, - imp1.CvCallback_1 callback, - ) { - return _FastNlMeansDenoisingColoredMultiWithParams_Async( - src, - imgToDenoiseIndex, - temporalWindowSize, - h, - hColor, - templateWindowSize, - searchWindowSize, - callback, - ); - } - - late final _FastNlMeansDenoisingColoredMultiWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecMat, ffi.Int, ffi.Int, - ffi.Float, ffi.Float, ffi.Int, ffi.Int, imp1.CvCallback_1)>>( - 'FastNlMeansDenoisingColoredMultiWithParams_Async'); - late final _FastNlMeansDenoisingColoredMultiWithParams_Async = - _FastNlMeansDenoisingColoredMultiWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - VecMat, int, int, double, double, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer FastNlMeansDenoisingColoredMulti_Async( - VecMat src, - int imgToDenoiseIndex, - int temporalWindowSize, - imp1.CvCallback_1 callback, - ) { - return _FastNlMeansDenoisingColoredMulti_Async( - src, - imgToDenoiseIndex, - temporalWindowSize, - callback, - ); - } - - late final _FastNlMeansDenoisingColoredMulti_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VecMat, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('FastNlMeansDenoisingColoredMulti_Async'); - late final _FastNlMeansDenoisingColoredMulti_Async = - _FastNlMeansDenoisingColoredMulti_AsyncPtr.asFunction< - ffi.Pointer Function( - VecMat, int, int, imp1.CvCallback_1)>(); + ffi.Int, + imp1.CvCallback_0)>>('cv_fastNlMeansDenoisingColoredMulti_1'); + late final _cv_fastNlMeansDenoisingColoredMulti_1 = + _cv_fastNlMeansDenoisingColoredMulti_1Ptr.asFunction< + ffi.Pointer Function(VecMat, Mat, int, int, double, double, + int, int, imp1.CvCallback_0)>(); - ffi.Pointer FastNlMeansDenoisingColoredWithParams( + ffi.Pointer cv_fastNlMeansDenoisingColored_1( Mat src, Mat dst, double h, double hColor, int templateWindowSize, int searchWindowSize, + imp1.CvCallback_0 callback, ) { - return _FastNlMeansDenoisingColoredWithParams( + return _cv_fastNlMeansDenoisingColored_1( src, dst, h, hColor, templateWindowSize, searchWindowSize, - ); - } - - late final _FastNlMeansDenoisingColoredWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, - ffi.Int, ffi.Int)>>('FastNlMeansDenoisingColoredWithParams'); - late final _FastNlMeansDenoisingColoredWithParams = - _FastNlMeansDenoisingColoredWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, double, int, int)>(); - - ffi.Pointer FastNlMeansDenoisingColoredWithParams_Async( - Mat src, - double h, - double hColor, - int templateWindowSize, - int searchWindowSize, - imp1.CvCallback_1 callback, - ) { - return _FastNlMeansDenoisingColoredWithParams_Async( - src, - h, - hColor, - templateWindowSize, - searchWindowSize, - callback, - ); - } - - late final _FastNlMeansDenoisingColoredWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Float, ffi.Float, ffi.Int, - ffi.Int, imp1.CvCallback_1)>>( - 'FastNlMeansDenoisingColoredWithParams_Async'); - late final _FastNlMeansDenoisingColoredWithParams_Async = - _FastNlMeansDenoisingColoredWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, double, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer FastNlMeansDenoisingColored_Async( - Mat src, - imp1.CvCallback_1 callback, - ) { - return _FastNlMeansDenoisingColored_Async( - src, callback, ); } - late final _FastNlMeansDenoisingColored_AsyncPtr = _lookup< + late final _cv_fastNlMeansDenoisingColored_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('FastNlMeansDenoisingColored_Async'); - late final _FastNlMeansDenoisingColored_Async = - _FastNlMeansDenoisingColored_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, imp1.CvCallback_1)>(); + Mat, + Mat, + ffi.Float, + ffi.Float, + ffi.Int, + ffi.Int, + imp1.CvCallback_0)>>('cv_fastNlMeansDenoisingColored_1'); + late final _cv_fastNlMeansDenoisingColored_1 = + _cv_fastNlMeansDenoisingColored_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, double, int, int, imp1.CvCallback_0)>(); - ffi.Pointer FastNlMeansDenoisingWithParams( + ffi.Pointer cv_fastNlMeansDenoising_1( Mat src, Mat dst, double h, int templateWindowSize, int searchWindowSize, + imp1.CvCallback_0 callback, ) { - return _FastNlMeansDenoisingWithParams( + return _cv_fastNlMeansDenoising_1( src, dst, h, templateWindowSize, searchWindowSize, - ); - } - - late final _FastNlMeansDenoisingWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Int, - ffi.Int)>>('FastNlMeansDenoisingWithParams'); - late final _FastNlMeansDenoisingWithParams = - _FastNlMeansDenoisingWithParamsPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, int, int)>(); - - ffi.Pointer FastNlMeansDenoisingWithParams_Async( - Mat src, - double h, - int templateWindowSize, - int searchWindowSize, - imp1.CvCallback_1 callback, - ) { - return _FastNlMeansDenoisingWithParams_Async( - src, - h, - templateWindowSize, - searchWindowSize, callback, ); } - late final _FastNlMeansDenoisingWithParams_AsyncPtr = _lookup< + late final _cv_fastNlMeansDenoising_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Float, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('FastNlMeansDenoisingWithParams_Async'); - late final _FastNlMeansDenoisingWithParams_Async = - _FastNlMeansDenoisingWithParams_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Int, ffi.Int, + imp1.CvCallback_0)>>('cv_fastNlMeansDenoising_1'); + late final _cv_fastNlMeansDenoising_1 = + _cv_fastNlMeansDenoising_1Ptr.asFunction< ffi.Pointer Function( - Mat, double, int, int, imp1.CvCallback_1)>(); + Mat, Mat, double, int, int, imp1.CvCallback_0)>(); - ffi.Pointer FastNlMeansDenoising_Async( - Mat src, - imp1.CvCallback_1 callback, - ) { - return _FastNlMeansDenoising_Async( - src, - callback, - ); - } - - late final _FastNlMeansDenoising_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, imp1.CvCallback_1)>>('FastNlMeansDenoising_Async'); - late final _FastNlMeansDenoising_Async = _FastNlMeansDenoising_AsyncPtr - .asFunction Function(Mat, imp1.CvCallback_1)>(); - - ffi.Pointer IlluminationChange( + ffi.Pointer cv_illuminationChange( Mat src, Mat mask, Mat dst, double alpha, double beta, + imp1.CvCallback_0 callback, ) { - return _IlluminationChange( + return _cv_illuminationChange( src, mask, dst, alpha, beta, + callback, ); } - late final _IlluminationChangePtr = _lookup< + late final _cv_illuminationChangePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Float, ffi.Float)>>('IlluminationChange'); - late final _IlluminationChange = _IlluminationChangePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, double, double)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Float, ffi.Float, + imp1.CvCallback_0)>>('cv_illuminationChange'); + late final _cv_illuminationChange = _cv_illuminationChangePtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, double, double, imp1.CvCallback_0)>(); - ffi.Pointer IlluminationChange_Async( + ffi.Pointer cv_inpaint( Mat src, Mat mask, - double alpha, - double beta, - imp1.CvCallback_1 callback, - ) { - return _IlluminationChange_Async( - src, - mask, - alpha, - beta, - callback, - ); - } - - late final _IlluminationChange_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('IlluminationChange_Async'); - late final _IlluminationChange_Async = - _IlluminationChange_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, double, double, imp1.CvCallback_1)>(); - - void MergeMertens_Close( - MergeMertensPtr b, - ) { - return _MergeMertens_Close( - b, - ); - } - - late final _MergeMertens_ClosePtr = - _lookup>( - 'MergeMertens_Close'); - late final _MergeMertens_Close = - _MergeMertens_ClosePtr.asFunction(); - - ffi.Pointer MergeMertens_Create( - ffi.Pointer rval, - ) { - return _MergeMertens_Create( - rval, - ); - } - - late final _MergeMertens_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('MergeMertens_Create'); - late final _MergeMertens_Create = _MergeMertens_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer MergeMertens_CreateWithParams( - double contrast_weight, - double saturation_weight, - double exposure_weight, - ffi.Pointer rval, - ) { - return _MergeMertens_CreateWithParams( - contrast_weight, - saturation_weight, - exposure_weight, - rval, - ); - } - - late final _MergeMertens_CreateWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Float, ffi.Float, ffi.Float, - ffi.Pointer)>>('MergeMertens_CreateWithParams'); - late final _MergeMertens_CreateWithParams = - _MergeMertens_CreateWithParamsPtr.asFunction< - ffi.Pointer Function( - double, double, double, ffi.Pointer)>(); - - ffi.Pointer MergeMertens_CreateWithParams_Async( - double contrast_weight, - double saturation_weight, - double exposure_weight, - imp1.CvCallback_1 callback, - ) { - return _MergeMertens_CreateWithParams_Async( - contrast_weight, - saturation_weight, - exposure_weight, - callback, - ); - } - - late final _MergeMertens_CreateWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Float, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('MergeMertens_CreateWithParams_Async'); - late final _MergeMertens_CreateWithParams_Async = - _MergeMertens_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - double, double, double, imp1.CvCallback_1)>(); - - ffi.Pointer MergeMertens_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _MergeMertens_Create_Async( - callback, - ); - } - - late final _MergeMertens_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'MergeMertens_Create_Async'); - late final _MergeMertens_Create_Async = _MergeMertens_Create_AsyncPtr - .asFunction Function(imp1.CvCallback_1)>(); - - ffi.Pointer MergeMertens_Process( - MergeMertens b, - VecMat src, Mat dst, + double inpaint_radius, + int algorithm_type, + imp1.CvCallback_0 callback, ) { - return _MergeMertens_Process( - b, + return _cv_inpaint( src, + mask, dst, - ); - } - - late final _MergeMertens_ProcessPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - MergeMertens, VecMat, Mat)>>('MergeMertens_Process'); - late final _MergeMertens_Process = _MergeMertens_ProcessPtr.asFunction< - ffi.Pointer Function(MergeMertens, VecMat, Mat)>(); - - ffi.Pointer MergeMertens_Process_Async( - MergeMertens b, - VecMat src, - imp1.CvCallback_1 callback, - ) { - return _MergeMertens_Process_Async( - b, - src, + inpaint_radius, + algorithm_type, callback, ); } - late final _MergeMertens_Process_AsyncPtr = _lookup< + late final _cv_inpaintPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(MergeMertens, VecMat, - imp1.CvCallback_1)>>('MergeMertens_Process_Async'); - late final _MergeMertens_Process_Async = - _MergeMertens_Process_AsyncPtr.asFunction< - ffi.Pointer Function( - MergeMertens, VecMat, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, Mat, ffi.Float, ffi.Int, + imp1.CvCallback_0)>>('cv_inpaint'); + late final _cv_inpaint = _cv_inpaintPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, double, int, imp1.CvCallback_0)>(); - ffi.Pointer PencilSketch( + ffi.Pointer cv_pencilSketch( Mat src, Mat dst1, Mat dst2, double sigma_s, double sigma_r, double shade_factor, + imp1.CvCallback_0 callback, ) { - return _PencilSketch( + return _cv_pencilSketch( src, dst1, dst2, sigma_s, sigma_r, shade_factor, - ); - } - - late final _PencilSketchPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Float, ffi.Float, ffi.Float)>>('PencilSketch'); - late final _PencilSketch = _PencilSketchPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, double, double, double)>(); - - ffi.Pointer PencilSketch_Async( - Mat src, - double sigma_s, - double sigma_r, - double shade_factor, - imp1.CvCallback_2 callback, - ) { - return _PencilSketch_Async( - src, - sigma_s, - sigma_r, - shade_factor, callback, ); } - late final _PencilSketch_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Float, ffi.Float, ffi.Float, - imp1.CvCallback_2)>>('PencilSketch_Async'); - late final _PencilSketch_Async = _PencilSketch_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, double, double, double, imp1.CvCallback_2)>(); - - ffi.Pointer PhotoInpaint( - Mat src, - Mat mask, - Mat dst, - double inpaint_radius, - int algorithm_type, - ) { - return _PhotoInpaint( - src, - mask, - dst, - inpaint_radius, - algorithm_type, - ); - } - - late final _PhotoInpaintPtr = _lookup< + late final _cv_pencilSketchPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, ffi.Float, ffi.Int)>>('PhotoInpaint'); - late final _PhotoInpaint = _PhotoInpaintPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, double, int)>(); - - ffi.Pointer PhotoInpaint_Async( - Mat src, - Mat mask, - double inpaint_radius, - int algorithm_type, - imp1.CvCallback_1 callback, - ) { - return _PhotoInpaint_Async( - src, - mask, - inpaint_radius, - algorithm_type, - callback, - ); - } - - late final _PhotoInpaint_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Int, - imp1.CvCallback_1)>>('PhotoInpaint_Async'); - late final _PhotoInpaint_Async = _PhotoInpaint_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Float, ffi.Float, + ffi.Float, imp1.CvCallback_0)>>('cv_pencilSketch'); + late final _cv_pencilSketch = _cv_pencilSketchPtr.asFunction< ffi.Pointer Function( - Mat, Mat, double, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, double, double, double, imp1.CvCallback_0)>(); - ffi.Pointer SeamlessClone( + ffi.Pointer cv_seamlessClone( Mat src, Mat dst, Mat mask, CvPoint p, Mat blend, int flags, + imp1.CvCallback_0 callback, ) { - return _SeamlessClone( + return _cv_seamlessClone( src, dst, mask, p, blend, flags, - ); - } - - late final _SeamlessClonePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, Mat, CvPoint, Mat, ffi.Int)>>('SeamlessClone'); - late final _SeamlessClone = _SeamlessClonePtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, CvPoint, Mat, int)>(); - - ffi.Pointer SeamlessClone_Async( - Mat src, - Mat dst, - Mat mask, - CvPoint p, - int flags, - imp1.CvCallback_1 callback, - ) { - return _SeamlessClone_Async( - src, - dst, - mask, - p, - flags, callback, ); } - late final _SeamlessClone_AsyncPtr = _lookup< + late final _cv_seamlessClonePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, CvPoint, ffi.Int, - imp1.CvCallback_1)>>('SeamlessClone_Async'); - late final _SeamlessClone_Async = _SeamlessClone_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, CvPoint, Mat, ffi.Int, + imp1.CvCallback_0)>>('cv_seamlessClone'); + late final _cv_seamlessClone = _cv_seamlessClonePtr.asFunction< ffi.Pointer Function( - Mat, Mat, Mat, CvPoint, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, CvPoint, Mat, int, imp1.CvCallback_0)>(); - ffi.Pointer Stylization( + ffi.Pointer cv_stylization( Mat src, Mat dst, double sigma_s, double sigma_r, + imp1.CvCallback_0 callback, ) { - return _Stylization( + return _cv_stylization( src, dst, sigma_s, sigma_r, - ); - } - - late final _StylizationPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, Mat, ffi.Float, ffi.Float)>>('Stylization'); - late final _Stylization = _StylizationPtr.asFunction< - ffi.Pointer Function(Mat, Mat, double, double)>(); - - ffi.Pointer Stylization_Async( - Mat src, - double sigma_s, - double sigma_r, - imp1.CvCallback_1 callback, - ) { - return _Stylization_Async( - src, - sigma_s, - sigma_r, callback, ); } - late final _Stylization_AsyncPtr = _lookup< + late final _cv_stylizationPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Float, ffi.Float, - imp1.CvCallback_1)>>('Stylization_Async'); - late final _Stylization_Async = _Stylization_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, double, double, imp1.CvCallback_1)>(); + ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, + imp1.CvCallback_0)>>('cv_stylization'); + late final _cv_stylization = _cv_stylizationPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, double, imp1.CvCallback_0)>(); - ffi.Pointer TextureFlattening( + ffi.Pointer cv_textureFlattening( Mat src, Mat mask, Mat dst, double low_threshold, double high_threshold, int kernel_size, + imp1.CvCallback_0 callback, ) { - return _TextureFlattening( + return _cv_textureFlattening( src, mask, dst, low_threshold, high_threshold, kernel_size, - ); - } - - late final _TextureFlatteningPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Float, ffi.Float, - ffi.Int)>>('TextureFlattening'); - late final _TextureFlattening = _TextureFlatteningPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, double, double, int)>(); - - ffi.Pointer TextureFlattening_Async( - Mat src, - Mat mask, - double low_threshold, - double high_threshold, - int kernel_size, - imp1.CvCallback_1 callback, - ) { - return _TextureFlattening_Async( - src, - mask, - low_threshold, - high_threshold, - kernel_size, callback, ); } - late final _TextureFlattening_AsyncPtr = _lookup< + late final _cv_textureFlatteningPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, ffi.Float, ffi.Float, - ffi.Int, imp1.CvCallback_1)>>('TextureFlattening_Async'); - late final _TextureFlattening_Async = _TextureFlattening_AsyncPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, ffi.Float, ffi.Float, + ffi.Int, imp1.CvCallback_0)>>('cv_textureFlattening'); + late final _cv_textureFlattening = _cv_textureFlatteningPtr.asFunction< ffi.Pointer Function( - Mat, Mat, double, double, int, imp1.CvCallback_1)>(); + Mat, Mat, Mat, double, double, int, imp1.CvCallback_0)>(); late final addresses = _SymbolAddresses(this); } @@ -1008,9 +587,9 @@ class _SymbolAddresses { final CvNativePhoto _library; _SymbolAddresses(this._library); ffi.Pointer> - get AlignMTB_Close => _library._AlignMTB_ClosePtr; + get cv_AlignMTB_close => _library._cv_AlignMTB_closePtr; ffi.Pointer> - get MergeMertens_Close => _library._MergeMertens_ClosePtr; + get cv_MergeMertens_close => _library._cv_MergeMertens_closePtr; } final class AlignMTB extends ffi.Struct { diff --git a/packages/dartcv/lib/src/g/photo.yaml b/packages/dartcv/lib/src/g/photo.yaml index 31042e3e..1b400b02 100644 --- a/packages/dartcv/lib/src/g/photo.yaml +++ b/packages/dartcv/lib/src/g/photo.yaml @@ -1,97 +1,55 @@ format_version: 1.0.0 files: - package:dartcv/src/g/photo.g.dart: + package:dartcv4/src/g/photo.g.dart: used-config: ffi-native: false symbols: - c:@F@AlignMTB_Close: - name: AlignMTB_Close - c:@F@AlignMTB_Create: - name: AlignMTB_Create - c:@F@AlignMTB_CreateWithParams: - name: AlignMTB_CreateWithParams - c:@F@AlignMTB_CreateWithParams_Async: - name: AlignMTB_CreateWithParams_Async - c:@F@AlignMTB_Create_Async: - name: AlignMTB_Create_Async - c:@F@AlignMTB_Process: - name: AlignMTB_Process - c:@F@AlignMTB_Process_Async: - name: AlignMTB_Process_Async - c:@F@ColorChange: - name: ColorChange - c:@F@ColorChange_Async: - name: ColorChange_Async - c:@F@DetailEnhance: - name: DetailEnhance - c:@F@DetailEnhance_Async: - name: DetailEnhance_Async - c:@F@EdgePreservingFilter: - name: EdgePreservingFilter - c:@F@EdgePreservingFilter_Async: - name: EdgePreservingFilter_Async - c:@F@FastNlMeansDenoising: - name: FastNlMeansDenoising - c:@F@FastNlMeansDenoisingColored: - name: FastNlMeansDenoisingColored - c:@F@FastNlMeansDenoisingColoredMulti: - name: FastNlMeansDenoisingColoredMulti - c:@F@FastNlMeansDenoisingColoredMultiWithParams: - name: FastNlMeansDenoisingColoredMultiWithParams - c:@F@FastNlMeansDenoisingColoredMultiWithParams_Async: - name: FastNlMeansDenoisingColoredMultiWithParams_Async - c:@F@FastNlMeansDenoisingColoredMulti_Async: - name: FastNlMeansDenoisingColoredMulti_Async - c:@F@FastNlMeansDenoisingColoredWithParams: - name: FastNlMeansDenoisingColoredWithParams - c:@F@FastNlMeansDenoisingColoredWithParams_Async: - name: FastNlMeansDenoisingColoredWithParams_Async - c:@F@FastNlMeansDenoisingColored_Async: - name: FastNlMeansDenoisingColored_Async - c:@F@FastNlMeansDenoisingWithParams: - name: FastNlMeansDenoisingWithParams - c:@F@FastNlMeansDenoisingWithParams_Async: - name: FastNlMeansDenoisingWithParams_Async - c:@F@FastNlMeansDenoising_Async: - name: FastNlMeansDenoising_Async - c:@F@IlluminationChange: - name: IlluminationChange - c:@F@IlluminationChange_Async: - name: IlluminationChange_Async - c:@F@MergeMertens_Close: - name: MergeMertens_Close - c:@F@MergeMertens_Create: - name: MergeMertens_Create - c:@F@MergeMertens_CreateWithParams: - name: MergeMertens_CreateWithParams - c:@F@MergeMertens_CreateWithParams_Async: - name: MergeMertens_CreateWithParams_Async - c:@F@MergeMertens_Create_Async: - name: MergeMertens_Create_Async - c:@F@MergeMertens_Process: - name: MergeMertens_Process - c:@F@MergeMertens_Process_Async: - name: MergeMertens_Process_Async - c:@F@PencilSketch: - name: PencilSketch - c:@F@PencilSketch_Async: - name: PencilSketch_Async - c:@F@PhotoInpaint: - name: PhotoInpaint - c:@F@PhotoInpaint_Async: - name: PhotoInpaint_Async - c:@F@SeamlessClone: - name: SeamlessClone - c:@F@SeamlessClone_Async: - name: SeamlessClone_Async - c:@F@Stylization: - name: Stylization - c:@F@Stylization_Async: - name: Stylization_Async - c:@F@TextureFlattening: - name: TextureFlattening - c:@F@TextureFlattening_Async: - name: TextureFlattening_Async + c:@F@cv_AlignMTB_close: + name: cv_AlignMTB_close + c:@F@cv_AlignMTB_process: + name: cv_AlignMTB_process + c:@F@cv_MergeMertens_close: + name: cv_MergeMertens_close + c:@F@cv_MergeMertens_process: + name: cv_MergeMertens_process + c:@F@cv_colorChange: + name: cv_colorChange + c:@F@cv_createAlignMTB: + name: cv_createAlignMTB + c:@F@cv_createAlignMTB_1: + name: cv_createAlignMTB_1 + c:@F@cv_createMergeMertens: + name: cv_createMergeMertens + c:@F@cv_createMergeMertens_1: + name: cv_createMergeMertens_1 + c:@F@cv_detailEnhance: + name: cv_detailEnhance + c:@F@cv_edgePreservingFilter: + name: cv_edgePreservingFilter + c:@F@cv_fastNlMeansDenoising: + name: cv_fastNlMeansDenoising + c:@F@cv_fastNlMeansDenoisingColored: + name: cv_fastNlMeansDenoisingColored + c:@F@cv_fastNlMeansDenoisingColoredMulti: + name: cv_fastNlMeansDenoisingColoredMulti + c:@F@cv_fastNlMeansDenoisingColoredMulti_1: + name: cv_fastNlMeansDenoisingColoredMulti_1 + c:@F@cv_fastNlMeansDenoisingColored_1: + name: cv_fastNlMeansDenoisingColored_1 + c:@F@cv_fastNlMeansDenoising_1: + name: cv_fastNlMeansDenoising_1 + c:@F@cv_illuminationChange: + name: cv_illuminationChange + c:@F@cv_inpaint: + name: cv_inpaint + c:@F@cv_pencilSketch: + name: cv_pencilSketch + c:@F@cv_seamlessClone: + name: cv_seamlessClone + c:@F@cv_stylization: + name: cv_stylization + c:@F@cv_textureFlattening: + name: cv_textureFlattening c:@S@AlignMTB: name: AlignMTB c:@S@MergeMertens: diff --git a/packages/dartcv/lib/src/g/stitching.g.dart b/packages/dartcv/lib/src/g/stitching.g.dart index 43346733..035df999 100644 --- a/packages/dartcv/lib/src/g/stitching.g.dart +++ b/packages/dartcv/lib/src/g/stitching.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Stitching /// @@ -30,856 +30,409 @@ class CvNativeStitching { lookup) : _lookup = lookup; - void Stitcher_Close( - StitcherPtr stitcher, - ) { - return _Stitcher_Close( - stitcher, - ); - } - - late final _Stitcher_ClosePtr = - _lookup>( - 'Stitcher_Close'); - late final _Stitcher_Close = - _Stitcher_ClosePtr.asFunction(); - - void Stitcher_Close_Async( - StitcherPtr stitcher, - imp1.CvCallback_0 callback, - ) { - return _Stitcher_Close_Async( - stitcher, - callback, - ); - } - - late final _Stitcher_Close_AsyncPtr = _lookup< - ffi - .NativeFunction>( - 'Stitcher_Close_Async'); - late final _Stitcher_Close_Async = _Stitcher_Close_AsyncPtr.asFunction< - void Function(StitcherPtr, imp1.CvCallback_0)>(); - ffi.Pointer Stitcher_Component( Stitcher self, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { return _Stitcher_Component( self, rval, + callback, ); } late final _Stitcher_ComponentPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, ffi.Pointer)>>('Stitcher_Component'); + ffi.Pointer Function(Stitcher, ffi.Pointer, + imp1.CvCallback_0)>>('Stitcher_Component'); late final _Stitcher_Component = _Stitcher_ComponentPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); - - ffi.Pointer Stitcher_Component_Async( - Stitcher self, - imp1.CvCallback_1 callback, - ) { - return _Stitcher_Component_Async( - self, - callback, - ); - } - - late final _Stitcher_Component_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, imp1.CvCallback_1)>>('Stitcher_Component_Async'); - late final _Stitcher_Component_Async = - _Stitcher_Component_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_1)>(); + ffi.Pointer Function( + Stitcher, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer Stitcher_ComposePanorama( Stitcher self, Mat rpano, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { return _Stitcher_ComposePanorama( self, rpano, rval, + callback, ); } late final _Stitcher_ComposePanoramaPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Stitcher, Mat, - ffi.Pointer)>>('Stitcher_ComposePanorama'); + ffi.Pointer Function(Stitcher, Mat, ffi.Pointer, + imp1.CvCallback_0)>>('Stitcher_ComposePanorama'); late final _Stitcher_ComposePanorama = _Stitcher_ComposePanoramaPtr.asFunction< ffi.Pointer Function( - Stitcher, Mat, ffi.Pointer)>(); + Stitcher, Mat, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer Stitcher_ComposePanorama_1( Stitcher self, VecMat mats, Mat rpano, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { return _Stitcher_ComposePanorama_1( self, mats, rpano, rval, + callback, ); } late final _Stitcher_ComposePanorama_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Stitcher, VecMat, Mat, - ffi.Pointer)>>('Stitcher_ComposePanorama_1'); + ffi.Pointer Function( + Stitcher, + VecMat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('Stitcher_ComposePanorama_1'); late final _Stitcher_ComposePanorama_1 = _Stitcher_ComposePanorama_1Ptr.asFunction< - ffi.Pointer Function( - Stitcher, VecMat, Mat, ffi.Pointer)>(); - - ffi.Pointer Stitcher_ComposePanorama_1_Async( - Stitcher self, - VecMat mats, - imp1.CvCallback_2 callback, - ) { - return _Stitcher_ComposePanorama_1_Async( - self, - mats, - callback, - ); - } - - late final _Stitcher_ComposePanorama_1_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, VecMat, - imp1.CvCallback_2)>>('Stitcher_ComposePanorama_1_Async'); - late final _Stitcher_ComposePanorama_1_Async = - _Stitcher_ComposePanorama_1_AsyncPtr.asFunction< - ffi.Pointer Function( - Stitcher, VecMat, imp1.CvCallback_2)>(); - - ffi.Pointer Stitcher_ComposePanorama_Async( - Stitcher self, - imp1.CvCallback_2 callback, - ) { - return _Stitcher_ComposePanorama_Async( - self, - callback, - ); - } - - late final _Stitcher_ComposePanorama_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, imp1.CvCallback_2)>>('Stitcher_ComposePanorama_Async'); - late final _Stitcher_ComposePanorama_Async = - _Stitcher_ComposePanorama_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_2)>(); - - ffi.Pointer Stitcher_Create( - int mode, - ffi.Pointer rval, - ) { - return _Stitcher_Create( - mode, - rval, - ); - } - - late final _Stitcher_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Pointer)>>('Stitcher_Create'); - late final _Stitcher_Create = _Stitcher_CreatePtr.asFunction< - ffi.Pointer Function(int, ffi.Pointer)>(); - - ffi.Pointer Stitcher_Create_Async( - int mode, - imp1.CvCallback_1 callback, - ) { - return _Stitcher_Create_Async( - mode, - callback, - ); - } - - late final _Stitcher_Create_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, imp1.CvCallback_1)>>('Stitcher_Create_Async'); - late final _Stitcher_Create_Async = _Stitcher_Create_AsyncPtr.asFunction< - ffi.Pointer Function(int, imp1.CvCallback_1)>(); + ffi.Pointer Function(Stitcher, VecMat, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer Stitcher_EstimateTransform( Stitcher self, VecMat mats, VecMat masks, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { return _Stitcher_EstimateTransform( self, mats, masks, rval, + callback, ); } late final _Stitcher_EstimateTransformPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Stitcher, VecMat, VecMat, - ffi.Pointer)>>('Stitcher_EstimateTransform'); + ffi.Pointer Function( + Stitcher, + VecMat, + VecMat, + ffi.Pointer, + imp1.CvCallback_0)>>('Stitcher_EstimateTransform'); late final _Stitcher_EstimateTransform = _Stitcher_EstimateTransformPtr.asFunction< - ffi.Pointer Function( - Stitcher, VecMat, VecMat, ffi.Pointer)>(); + ffi.Pointer Function(Stitcher, VecMat, VecMat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Stitcher_EstimateTransform_Async( + ffi.Pointer Stitcher_Stitch( Stitcher self, VecMat mats, - VecMat masks, - imp1.CvCallback_1 callback, + Mat rpano, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Stitcher_EstimateTransform_Async( + return _Stitcher_Stitch( self, mats, - masks, - callback, - ); - } - - late final _Stitcher_EstimateTransform_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, VecMat, VecMat, - imp1.CvCallback_1)>>('Stitcher_EstimateTransform_Async'); - late final _Stitcher_EstimateTransform_Async = - _Stitcher_EstimateTransform_AsyncPtr.asFunction< - ffi.Pointer Function( - Stitcher, VecMat, VecMat, imp1.CvCallback_1)>(); - - ffi.Pointer Stitcher_Get( - Stitcher self, - ffi.Pointer rval, - ) { - return _Stitcher_Get( - self, - rval, - ); - } - - late final _Stitcher_GetPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, ffi.Pointer)>>('Stitcher_Get'); - late final _Stitcher_Get = _Stitcher_GetPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); - - ffi.Pointer Stitcher_GetCompositingResol( - Stitcher self, - ffi.Pointer rval, - ) { - return _Stitcher_GetCompositingResol( - self, + rpano, rval, - ); - } - - late final _Stitcher_GetCompositingResolPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - ffi.Pointer)>>('Stitcher_GetCompositingResol'); - late final _Stitcher_GetCompositingResol = - _Stitcher_GetCompositingResolPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); - - ffi.Pointer Stitcher_GetCompositingResol_Async( - Stitcher self, - imp1.CvCallback_1 callback, - ) { - return _Stitcher_GetCompositingResol_Async( - self, callback, ); } - late final _Stitcher_GetCompositingResol_AsyncPtr = _lookup< + late final _Stitcher_StitchPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - imp1.CvCallback_1)>>('Stitcher_GetCompositingResol_Async'); - late final _Stitcher_GetCompositingResol_Async = - _Stitcher_GetCompositingResol_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_1)>(); + ffi.Pointer Function(Stitcher, VecMat, Mat, + ffi.Pointer, imp1.CvCallback_0)>>('Stitcher_Stitch'); + late final _Stitcher_Stitch = _Stitcher_StitchPtr.asFunction< + ffi.Pointer Function( + Stitcher, VecMat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Stitcher_GetInterpolationFlags( + ffi.Pointer Stitcher_Stitch_1( Stitcher self, + VecMat mats, + VecMat masks, + Mat rpano, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _Stitcher_GetInterpolationFlags( - self, - rval, - ); - } - - late final _Stitcher_GetInterpolationFlagsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - ffi.Pointer)>>('Stitcher_GetInterpolationFlags'); - late final _Stitcher_GetInterpolationFlags = - _Stitcher_GetInterpolationFlagsPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); - - ffi.Pointer Stitcher_GetInterpolationFlags_Async( - Stitcher self, - imp1.CvCallback_1 callback, - ) { - return _Stitcher_GetInterpolationFlags_Async( - self, - callback, - ); - } - - late final _Stitcher_GetInterpolationFlags_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - imp1.CvCallback_1)>>('Stitcher_GetInterpolationFlags_Async'); - late final _Stitcher_GetInterpolationFlags_Async = - _Stitcher_GetInterpolationFlags_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_1)>(); - - ffi.Pointer Stitcher_GetPanoConfidenceThresh( - Stitcher self, - ffi.Pointer rval, - ) { - return _Stitcher_GetPanoConfidenceThresh( - self, - rval, - ); - } - - late final _Stitcher_GetPanoConfidenceThreshPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - ffi.Pointer)>>('Stitcher_GetPanoConfidenceThresh'); - late final _Stitcher_GetPanoConfidenceThresh = - _Stitcher_GetPanoConfidenceThreshPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); - - ffi.Pointer Stitcher_GetPanoConfidenceThresh_Async( - Stitcher self, - imp1.CvCallback_1 callback, - ) { - return _Stitcher_GetPanoConfidenceThresh_Async( - self, - callback, - ); - } - - late final _Stitcher_GetPanoConfidenceThresh_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - imp1.CvCallback_1)>>('Stitcher_GetPanoConfidenceThresh_Async'); - late final _Stitcher_GetPanoConfidenceThresh_Async = - _Stitcher_GetPanoConfidenceThresh_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_1)>(); - - ffi.Pointer Stitcher_GetRegistrationResol( - Stitcher self, - ffi.Pointer rval, - ) { - return _Stitcher_GetRegistrationResol( + return _Stitcher_Stitch_1( self, + mats, + masks, + rpano, rval, - ); - } - - late final _Stitcher_GetRegistrationResolPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - ffi.Pointer)>>('Stitcher_GetRegistrationResol'); - late final _Stitcher_GetRegistrationResol = - _Stitcher_GetRegistrationResolPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); - - ffi.Pointer Stitcher_GetRegistrationResol_Async( - Stitcher self, - imp1.CvCallback_1 callback, - ) { - return _Stitcher_GetRegistrationResol_Async( - self, callback, ); } - late final _Stitcher_GetRegistrationResol_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - imp1.CvCallback_1)>>('Stitcher_GetRegistrationResol_Async'); - late final _Stitcher_GetRegistrationResol_Async = - _Stitcher_GetRegistrationResol_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_1)>(); - - ffi.Pointer Stitcher_GetSeamEstimationResol( - Stitcher self, - ffi.Pointer rval, - ) { - return _Stitcher_GetSeamEstimationResol( - self, - rval, - ); - } - - late final _Stitcher_GetSeamEstimationResolPtr = _lookup< + late final _Stitcher_Stitch_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - ffi.Pointer)>>('Stitcher_GetSeamEstimationResol'); - late final _Stitcher_GetSeamEstimationResol = - _Stitcher_GetSeamEstimationResolPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); + ffi.Pointer Function(Stitcher, VecMat, VecMat, Mat, + ffi.Pointer, imp1.CvCallback_0)>>('Stitcher_Stitch_1'); + late final _Stitcher_Stitch_1 = _Stitcher_Stitch_1Ptr.asFunction< + ffi.Pointer Function(Stitcher, VecMat, VecMat, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Stitcher_GetSeamEstimationResol_Async( - Stitcher self, - imp1.CvCallback_1 callback, + void cv_Stitcher_close( + StitcherPtr stitcher, ) { - return _Stitcher_GetSeamEstimationResol_Async( - self, - callback, + return _cv_Stitcher_close( + stitcher, ); } - late final _Stitcher_GetSeamEstimationResol_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - imp1.CvCallback_1)>>('Stitcher_GetSeamEstimationResol_Async'); - late final _Stitcher_GetSeamEstimationResol_Async = - _Stitcher_GetSeamEstimationResol_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_1)>(); + late final _cv_Stitcher_closePtr = + _lookup>( + 'cv_Stitcher_close'); + late final _cv_Stitcher_close = + _cv_Stitcher_closePtr.asFunction(); - ffi.Pointer Stitcher_GetWaveCorrectKind( - Stitcher self, - ffi.Pointer rval, + ffi.Pointer cv_Stitcher_create( + int mode, + ffi.Pointer rval, ) { - return _Stitcher_GetWaveCorrectKind( - self, + return _cv_Stitcher_create( + mode, rval, ); } - late final _Stitcher_GetWaveCorrectKindPtr = _lookup< + late final _cv_Stitcher_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Stitcher, ffi.Pointer)>>('Stitcher_GetWaveCorrectKind'); - late final _Stitcher_GetWaveCorrectKind = - _Stitcher_GetWaveCorrectKindPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); + ffi.Int, ffi.Pointer)>>('cv_Stitcher_create'); + late final _cv_Stitcher_create = _cv_Stitcher_createPtr + .asFunction Function(int, ffi.Pointer)>(); - ffi.Pointer Stitcher_GetWaveCorrectKind_Async( + double cv_Stitcher_get_compositingResol( Stitcher self, - imp1.CvCallback_1 callback, ) { - return _Stitcher_GetWaveCorrectKind_Async( + return _cv_Stitcher_get_compositingResol( self, - callback, ); } - late final _Stitcher_GetWaveCorrectKind_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - imp1.CvCallback_1)>>('Stitcher_GetWaveCorrectKind_Async'); - late final _Stitcher_GetWaveCorrectKind_Async = - _Stitcher_GetWaveCorrectKind_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_1)>(); + late final _cv_Stitcher_get_compositingResolPtr = + _lookup>( + 'cv_Stitcher_get_compositingResol'); + late final _cv_Stitcher_get_compositingResol = + _cv_Stitcher_get_compositingResolPtr + .asFunction(); - ffi.Pointer Stitcher_GetWaveCorrection( + int cv_Stitcher_get_interpolationFlags( Stitcher self, - ffi.Pointer rval, ) { - return _Stitcher_GetWaveCorrection( + return _cv_Stitcher_get_interpolationFlags( self, - rval, ); } - late final _Stitcher_GetWaveCorrectionPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, ffi.Pointer)>>('Stitcher_GetWaveCorrection'); - late final _Stitcher_GetWaveCorrection = - _Stitcher_GetWaveCorrectionPtr.asFunction< - ffi.Pointer Function(Stitcher, ffi.Pointer)>(); + late final _cv_Stitcher_get_interpolationFlagsPtr = + _lookup>( + 'cv_Stitcher_get_interpolationFlags'); + late final _cv_Stitcher_get_interpolationFlags = + _cv_Stitcher_get_interpolationFlagsPtr + .asFunction(); - ffi.Pointer Stitcher_GetWaveCorrection_Async( + double cv_Stitcher_get_panoConfidenceThresh( Stitcher self, - imp1.CvCallback_1 callback, ) { - return _Stitcher_GetWaveCorrection_Async( + return _cv_Stitcher_get_panoConfidenceThresh( self, - callback, ); } - late final _Stitcher_GetWaveCorrection_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, - imp1.CvCallback_1)>>('Stitcher_GetWaveCorrection_Async'); - late final _Stitcher_GetWaveCorrection_Async = - _Stitcher_GetWaveCorrection_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, imp1.CvCallback_1)>(); + late final _cv_Stitcher_get_panoConfidenceThreshPtr = + _lookup>( + 'cv_Stitcher_get_panoConfidenceThresh'); + late final _cv_Stitcher_get_panoConfidenceThresh = + _cv_Stitcher_get_panoConfidenceThreshPtr + .asFunction(); - ffi.Pointer Stitcher_SetCompositingResol( + double cv_Stitcher_get_registrationResol( Stitcher self, - double inval, ) { - return _Stitcher_SetCompositingResol( + return _cv_Stitcher_get_registrationResol( self, - inval, ); } - late final _Stitcher_SetCompositingResolPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, ffi.Double)>>('Stitcher_SetCompositingResol'); - late final _Stitcher_SetCompositingResol = _Stitcher_SetCompositingResolPtr - .asFunction Function(Stitcher, double)>(); + late final _cv_Stitcher_get_registrationResolPtr = + _lookup>( + 'cv_Stitcher_get_registrationResol'); + late final _cv_Stitcher_get_registrationResol = + _cv_Stitcher_get_registrationResolPtr + .asFunction(); - ffi.Pointer Stitcher_SetCompositingResol_Async( + double cv_Stitcher_get_seamEstimationResol( Stitcher self, - double inval, - imp1.CvCallback_0 callback, ) { - return _Stitcher_SetCompositingResol_Async( + return _cv_Stitcher_get_seamEstimationResol( self, - inval, - callback, ); } - late final _Stitcher_SetCompositingResol_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, ffi.Double, - imp1.CvCallback_0)>>('Stitcher_SetCompositingResol_Async'); - late final _Stitcher_SetCompositingResol_Async = - _Stitcher_SetCompositingResol_AsyncPtr.asFunction< - ffi.Pointer Function( - Stitcher, double, imp1.CvCallback_0)>(); + late final _cv_Stitcher_get_seamEstimationResolPtr = + _lookup>( + 'cv_Stitcher_get_seamEstimationResol'); + late final _cv_Stitcher_get_seamEstimationResol = + _cv_Stitcher_get_seamEstimationResolPtr + .asFunction(); - ffi.Pointer Stitcher_SetInterpolationFlags( + int cv_Stitcher_get_waveCorrectKind( Stitcher self, - int inval, ) { - return _Stitcher_SetInterpolationFlags( + return _cv_Stitcher_get_waveCorrectKind( self, - inval, ); } - late final _Stitcher_SetInterpolationFlagsPtr = _lookup< - ffi - .NativeFunction Function(Stitcher, ffi.Int)>>( - 'Stitcher_SetInterpolationFlags'); - late final _Stitcher_SetInterpolationFlags = - _Stitcher_SetInterpolationFlagsPtr.asFunction< - ffi.Pointer Function(Stitcher, int)>(); + late final _cv_Stitcher_get_waveCorrectKindPtr = + _lookup>( + 'cv_Stitcher_get_waveCorrectKind'); + late final _cv_Stitcher_get_waveCorrectKind = + _cv_Stitcher_get_waveCorrectKindPtr.asFunction(); - ffi.Pointer Stitcher_SetInterpolationFlags_Async( + bool cv_Stitcher_get_waveCorrection( Stitcher self, - int inval, - imp1.CvCallback_0 callback, ) { - return _Stitcher_SetInterpolationFlags_Async( + return _cv_Stitcher_get_waveCorrection( self, - inval, - callback, ); } - late final _Stitcher_SetInterpolationFlags_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, ffi.Int, - imp1.CvCallback_0)>>('Stitcher_SetInterpolationFlags_Async'); - late final _Stitcher_SetInterpolationFlags_Async = - _Stitcher_SetInterpolationFlags_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, int, imp1.CvCallback_0)>(); - - ffi.Pointer Stitcher_SetPanoConfidenceThresh( - Stitcher self, - double inval, - ) { - return _Stitcher_SetPanoConfidenceThresh( - self, - inval, - ); - } - - late final _Stitcher_SetPanoConfidenceThreshPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, ffi.Double)>>('Stitcher_SetPanoConfidenceThresh'); - late final _Stitcher_SetPanoConfidenceThresh = - _Stitcher_SetPanoConfidenceThreshPtr.asFunction< - ffi.Pointer Function(Stitcher, double)>(); + late final _cv_Stitcher_get_waveCorrectionPtr = + _lookup>( + 'cv_Stitcher_get_waveCorrection'); + late final _cv_Stitcher_get_waveCorrection = + _cv_Stitcher_get_waveCorrectionPtr.asFunction(); - ffi.Pointer Stitcher_SetPanoConfidenceThresh_Async( + void cv_Stitcher_set_compositingResol( Stitcher self, - double inval, - imp1.CvCallback_0 callback, + double val, ) { - return _Stitcher_SetPanoConfidenceThresh_Async( + return _cv_Stitcher_set_compositingResol( self, - inval, - callback, + val, ); } - late final _Stitcher_SetPanoConfidenceThresh_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, ffi.Double, - imp1.CvCallback_0)>>('Stitcher_SetPanoConfidenceThresh_Async'); - late final _Stitcher_SetPanoConfidenceThresh_Async = - _Stitcher_SetPanoConfidenceThresh_AsyncPtr.asFunction< - ffi.Pointer Function( - Stitcher, double, imp1.CvCallback_0)>(); + late final _cv_Stitcher_set_compositingResolPtr = + _lookup>( + 'cv_Stitcher_set_compositingResol'); + late final _cv_Stitcher_set_compositingResol = + _cv_Stitcher_set_compositingResolPtr + .asFunction(); - ffi.Pointer Stitcher_SetRegistrationResol( + void cv_Stitcher_set_interpolationFlags( Stitcher self, - double inval, + int val, ) { - return _Stitcher_SetRegistrationResol( + return _cv_Stitcher_set_interpolationFlags( self, - inval, + val, ); } - late final _Stitcher_SetRegistrationResolPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, ffi.Double)>>('Stitcher_SetRegistrationResol'); - late final _Stitcher_SetRegistrationResol = _Stitcher_SetRegistrationResolPtr - .asFunction Function(Stitcher, double)>(); + late final _cv_Stitcher_set_interpolationFlagsPtr = + _lookup>( + 'cv_Stitcher_set_interpolationFlags'); + late final _cv_Stitcher_set_interpolationFlags = + _cv_Stitcher_set_interpolationFlagsPtr + .asFunction(); - ffi.Pointer Stitcher_SetRegistrationResol_Async( + void cv_Stitcher_set_panoConfidenceThresh( Stitcher self, - double inval, - imp1.CvCallback_0 callback, + double val, ) { - return _Stitcher_SetRegistrationResol_Async( + return _cv_Stitcher_set_panoConfidenceThresh( self, - inval, - callback, + val, ); } - late final _Stitcher_SetRegistrationResol_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, ffi.Double, - imp1.CvCallback_0)>>('Stitcher_SetRegistrationResol_Async'); - late final _Stitcher_SetRegistrationResol_Async = - _Stitcher_SetRegistrationResol_AsyncPtr.asFunction< - ffi.Pointer Function( - Stitcher, double, imp1.CvCallback_0)>(); + late final _cv_Stitcher_set_panoConfidenceThreshPtr = + _lookup>( + 'cv_Stitcher_set_panoConfidenceThresh'); + late final _cv_Stitcher_set_panoConfidenceThresh = + _cv_Stitcher_set_panoConfidenceThreshPtr + .asFunction(); - ffi.Pointer Stitcher_SetSeamEstimationResol( + void cv_Stitcher_set_registrationResol( Stitcher self, - double inval, + double val, ) { - return _Stitcher_SetSeamEstimationResol( + return _cv_Stitcher_set_registrationResol( self, - inval, + val, ); } - late final _Stitcher_SetSeamEstimationResolPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, ffi.Double)>>('Stitcher_SetSeamEstimationResol'); - late final _Stitcher_SetSeamEstimationResol = - _Stitcher_SetSeamEstimationResolPtr.asFunction< - ffi.Pointer Function(Stitcher, double)>(); + late final _cv_Stitcher_set_registrationResolPtr = + _lookup>( + 'cv_Stitcher_set_registrationResol'); + late final _cv_Stitcher_set_registrationResol = + _cv_Stitcher_set_registrationResolPtr + .asFunction(); - ffi.Pointer Stitcher_SetSeamEstimationResol_Async( + void cv_Stitcher_set_seamEstimationResol( Stitcher self, - double inval, - imp1.CvCallback_0 callback, + double val, ) { - return _Stitcher_SetSeamEstimationResol_Async( + return _cv_Stitcher_set_seamEstimationResol( self, - inval, - callback, + val, ); } - late final _Stitcher_SetSeamEstimationResol_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, ffi.Double, - imp1.CvCallback_0)>>('Stitcher_SetSeamEstimationResol_Async'); - late final _Stitcher_SetSeamEstimationResol_Async = - _Stitcher_SetSeamEstimationResol_AsyncPtr.asFunction< - ffi.Pointer Function( - Stitcher, double, imp1.CvCallback_0)>(); + late final _cv_Stitcher_set_seamEstimationResolPtr = + _lookup>( + 'cv_Stitcher_set_seamEstimationResol'); + late final _cv_Stitcher_set_seamEstimationResol = + _cv_Stitcher_set_seamEstimationResolPtr + .asFunction(); - ffi.Pointer Stitcher_SetWaveCorrectKind( + void cv_Stitcher_set_waveCorrectKind( Stitcher self, - int inval, + int val, ) { - return _Stitcher_SetWaveCorrectKind( + return _cv_Stitcher_set_waveCorrectKind( self, - inval, + val, ); } - late final _Stitcher_SetWaveCorrectKindPtr = _lookup< - ffi - .NativeFunction Function(Stitcher, ffi.Int)>>( - 'Stitcher_SetWaveCorrectKind'); - late final _Stitcher_SetWaveCorrectKind = _Stitcher_SetWaveCorrectKindPtr - .asFunction Function(Stitcher, int)>(); + late final _cv_Stitcher_set_waveCorrectKindPtr = + _lookup>( + 'cv_Stitcher_set_waveCorrectKind'); + late final _cv_Stitcher_set_waveCorrectKind = + _cv_Stitcher_set_waveCorrectKindPtr + .asFunction(); - ffi.Pointer Stitcher_SetWaveCorrectKind_Async( + void cv_Stitcher_set_waveCorrection( Stitcher self, - int inval, - imp1.CvCallback_0 callback, + bool val, ) { - return _Stitcher_SetWaveCorrectKind_Async( + return _cv_Stitcher_set_waveCorrection( self, - inval, - callback, + val, ); } - late final _Stitcher_SetWaveCorrectKind_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, ffi.Int, - imp1.CvCallback_0)>>('Stitcher_SetWaveCorrectKind_Async'); - late final _Stitcher_SetWaveCorrectKind_Async = - _Stitcher_SetWaveCorrectKind_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, int, imp1.CvCallback_0)>(); - - ffi.Pointer Stitcher_SetWaveCorrection( - Stitcher self, - bool inval, - ) { - return _Stitcher_SetWaveCorrection( - self, - inval, - ); - } - - late final _Stitcher_SetWaveCorrectionPtr = _lookup< - ffi - .NativeFunction Function(Stitcher, ffi.Bool)>>( - 'Stitcher_SetWaveCorrection'); - late final _Stitcher_SetWaveCorrection = _Stitcher_SetWaveCorrectionPtr - .asFunction Function(Stitcher, bool)>(); - - ffi.Pointer Stitcher_SetWaveCorrection_Async( - Stitcher self, - bool inval, - imp1.CvCallback_0 callback, - ) { - return _Stitcher_SetWaveCorrection_Async( - self, - inval, - callback, - ); - } - - late final _Stitcher_SetWaveCorrection_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, ffi.Bool, - imp1.CvCallback_0)>>('Stitcher_SetWaveCorrection_Async'); - late final _Stitcher_SetWaveCorrection_Async = - _Stitcher_SetWaveCorrection_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, bool, imp1.CvCallback_0)>(); - - ffi.Pointer Stitcher_Stitch( - Stitcher self, - VecMat mats, - Mat rpano, - ffi.Pointer rval, - ) { - return _Stitcher_Stitch( - self, - mats, - rpano, - rval, - ); - } - - late final _Stitcher_StitchPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, VecMat, Mat, ffi.Pointer)>>('Stitcher_Stitch'); - late final _Stitcher_Stitch = _Stitcher_StitchPtr.asFunction< - ffi.Pointer Function( - Stitcher, VecMat, Mat, ffi.Pointer)>(); - - ffi.Pointer Stitcher_Stitch_1( - Stitcher self, - VecMat mats, - VecMat masks, - Mat rpano, - ffi.Pointer rval, - ) { - return _Stitcher_Stitch_1( - self, - mats, - masks, - rpano, - rval, - ); - } - - late final _Stitcher_Stitch_1Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, VecMat, VecMat, Mat, - ffi.Pointer)>>('Stitcher_Stitch_1'); - late final _Stitcher_Stitch_1 = _Stitcher_Stitch_1Ptr.asFunction< - ffi.Pointer Function( - Stitcher, VecMat, VecMat, Mat, ffi.Pointer)>(); - - ffi.Pointer Stitcher_Stitch_1_Async( - Stitcher self, - VecMat mats, - VecMat masks, - imp1.CvCallback_2 callback, - ) { - return _Stitcher_Stitch_1_Async( - self, - mats, - masks, - callback, - ); - } - - late final _Stitcher_Stitch_1_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, VecMat, VecMat, - imp1.CvCallback_2)>>('Stitcher_Stitch_1_Async'); - late final _Stitcher_Stitch_1_Async = _Stitcher_Stitch_1_AsyncPtr.asFunction< - ffi.Pointer Function( - Stitcher, VecMat, VecMat, imp1.CvCallback_2)>(); - - ffi.Pointer Stitcher_Stitch_Async( - Stitcher self, - VecMat mats, - imp1.CvCallback_2 callback, - ) { - return _Stitcher_Stitch_Async( - self, - mats, - callback, - ); - } - - late final _Stitcher_Stitch_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Stitcher, VecMat, imp1.CvCallback_2)>>('Stitcher_Stitch_Async'); - late final _Stitcher_Stitch_Async = _Stitcher_Stitch_AsyncPtr.asFunction< - ffi.Pointer Function(Stitcher, VecMat, imp1.CvCallback_2)>(); + late final _cv_Stitcher_set_waveCorrectionPtr = + _lookup>( + 'cv_Stitcher_set_waveCorrection'); + late final _cv_Stitcher_set_waveCorrection = + _cv_Stitcher_set_waveCorrectionPtr + .asFunction(); late final addresses = _SymbolAddresses(this); } @@ -888,10 +441,7 @@ class _SymbolAddresses { final CvNativeStitching _library; _SymbolAddresses(this._library); ffi.Pointer> - get Stitcher_Close => _library._Stitcher_ClosePtr; - ffi.Pointer< - ffi.NativeFunction> - get Stitcher_Close_Async => _library._Stitcher_Close_AsyncPtr; + get cv_Stitcher_close => _library._cv_Stitcher_closePtr; } typedef CvStatus = imp1.CvStatus; diff --git a/packages/dartcv/lib/src/g/stitching.yaml b/packages/dartcv/lib/src/g/stitching.yaml index e7da7f17..74f0584b 100644 --- a/packages/dartcv/lib/src/g/stitching.yaml +++ b/packages/dartcv/lib/src/g/stitching.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:dartcv/src/g/stitching.g.dart: + package:dartcv4/src/g/stitching.g.dart: used-config: ffi-native: false symbols: @@ -16,96 +16,50 @@ files: name: STITCHING_PANORAMA c:@Ea@STITCHING_PANORAMA@STITCHING_SCANS: name: STITCHING_SCANS - c:@F@Stitcher_Close: - name: Stitcher_Close - c:@F@Stitcher_Close_Async: - name: Stitcher_Close_Async c:@F@Stitcher_Component: name: Stitcher_Component - c:@F@Stitcher_Component_Async: - name: Stitcher_Component_Async c:@F@Stitcher_ComposePanorama: name: Stitcher_ComposePanorama c:@F@Stitcher_ComposePanorama_1: name: Stitcher_ComposePanorama_1 - c:@F@Stitcher_ComposePanorama_1_Async: - name: Stitcher_ComposePanorama_1_Async - c:@F@Stitcher_ComposePanorama_Async: - name: Stitcher_ComposePanorama_Async - c:@F@Stitcher_Create: - name: Stitcher_Create - c:@F@Stitcher_Create_Async: - name: Stitcher_Create_Async c:@F@Stitcher_EstimateTransform: name: Stitcher_EstimateTransform - c:@F@Stitcher_EstimateTransform_Async: - name: Stitcher_EstimateTransform_Async - c:@F@Stitcher_Get: - name: Stitcher_Get - c:@F@Stitcher_GetCompositingResol: - name: Stitcher_GetCompositingResol - c:@F@Stitcher_GetCompositingResol_Async: - name: Stitcher_GetCompositingResol_Async - c:@F@Stitcher_GetInterpolationFlags: - name: Stitcher_GetInterpolationFlags - c:@F@Stitcher_GetInterpolationFlags_Async: - name: Stitcher_GetInterpolationFlags_Async - c:@F@Stitcher_GetPanoConfidenceThresh: - name: Stitcher_GetPanoConfidenceThresh - c:@F@Stitcher_GetPanoConfidenceThresh_Async: - name: Stitcher_GetPanoConfidenceThresh_Async - c:@F@Stitcher_GetRegistrationResol: - name: Stitcher_GetRegistrationResol - c:@F@Stitcher_GetRegistrationResol_Async: - name: Stitcher_GetRegistrationResol_Async - c:@F@Stitcher_GetSeamEstimationResol: - name: Stitcher_GetSeamEstimationResol - c:@F@Stitcher_GetSeamEstimationResol_Async: - name: Stitcher_GetSeamEstimationResol_Async - c:@F@Stitcher_GetWaveCorrectKind: - name: Stitcher_GetWaveCorrectKind - c:@F@Stitcher_GetWaveCorrectKind_Async: - name: Stitcher_GetWaveCorrectKind_Async - c:@F@Stitcher_GetWaveCorrection: - name: Stitcher_GetWaveCorrection - c:@F@Stitcher_GetWaveCorrection_Async: - name: Stitcher_GetWaveCorrection_Async - c:@F@Stitcher_SetCompositingResol: - name: Stitcher_SetCompositingResol - c:@F@Stitcher_SetCompositingResol_Async: - name: Stitcher_SetCompositingResol_Async - c:@F@Stitcher_SetInterpolationFlags: - name: Stitcher_SetInterpolationFlags - c:@F@Stitcher_SetInterpolationFlags_Async: - name: Stitcher_SetInterpolationFlags_Async - c:@F@Stitcher_SetPanoConfidenceThresh: - name: Stitcher_SetPanoConfidenceThresh - c:@F@Stitcher_SetPanoConfidenceThresh_Async: - name: Stitcher_SetPanoConfidenceThresh_Async - c:@F@Stitcher_SetRegistrationResol: - name: Stitcher_SetRegistrationResol - c:@F@Stitcher_SetRegistrationResol_Async: - name: Stitcher_SetRegistrationResol_Async - c:@F@Stitcher_SetSeamEstimationResol: - name: Stitcher_SetSeamEstimationResol - c:@F@Stitcher_SetSeamEstimationResol_Async: - name: Stitcher_SetSeamEstimationResol_Async - c:@F@Stitcher_SetWaveCorrectKind: - name: Stitcher_SetWaveCorrectKind - c:@F@Stitcher_SetWaveCorrectKind_Async: - name: Stitcher_SetWaveCorrectKind_Async - c:@F@Stitcher_SetWaveCorrection: - name: Stitcher_SetWaveCorrection - c:@F@Stitcher_SetWaveCorrection_Async: - name: Stitcher_SetWaveCorrection_Async c:@F@Stitcher_Stitch: name: Stitcher_Stitch c:@F@Stitcher_Stitch_1: name: Stitcher_Stitch_1 - c:@F@Stitcher_Stitch_1_Async: - name: Stitcher_Stitch_1_Async - c:@F@Stitcher_Stitch_Async: - name: Stitcher_Stitch_Async + c:@F@cv_Stitcher_close: + name: cv_Stitcher_close + c:@F@cv_Stitcher_create: + name: cv_Stitcher_create + c:@F@cv_Stitcher_get_compositingResol: + name: cv_Stitcher_get_compositingResol + c:@F@cv_Stitcher_get_interpolationFlags: + name: cv_Stitcher_get_interpolationFlags + c:@F@cv_Stitcher_get_panoConfidenceThresh: + name: cv_Stitcher_get_panoConfidenceThresh + c:@F@cv_Stitcher_get_registrationResol: + name: cv_Stitcher_get_registrationResol + c:@F@cv_Stitcher_get_seamEstimationResol: + name: cv_Stitcher_get_seamEstimationResol + c:@F@cv_Stitcher_get_waveCorrectKind: + name: cv_Stitcher_get_waveCorrectKind + c:@F@cv_Stitcher_get_waveCorrection: + name: cv_Stitcher_get_waveCorrection + c:@F@cv_Stitcher_set_compositingResol: + name: cv_Stitcher_set_compositingResol + c:@F@cv_Stitcher_set_interpolationFlags: + name: cv_Stitcher_set_interpolationFlags + c:@F@cv_Stitcher_set_panoConfidenceThresh: + name: cv_Stitcher_set_panoConfidenceThresh + c:@F@cv_Stitcher_set_registrationResol: + name: cv_Stitcher_set_registrationResol + c:@F@cv_Stitcher_set_seamEstimationResol: + name: cv_Stitcher_set_seamEstimationResol + c:@F@cv_Stitcher_set_waveCorrectKind: + name: cv_Stitcher_set_waveCorrectKind + c:@F@cv_Stitcher_set_waveCorrection: + name: cv_Stitcher_set_waveCorrection c:@S@Stitcher: name: Stitcher c:stitching.h@T@StitcherPtr: diff --git a/packages/dartcv/lib/src/g/types.yaml b/packages/dartcv/lib/src/g/types.yaml index dd713e00..7046157e 100644 --- a/packages/dartcv/lib/src/g/types.yaml +++ b/packages/dartcv/lib/src/g/types.yaml @@ -1,6 +1,6 @@ format_version: 1.0.0 files: - package:dartcv/src/g/types.g.dart: + package:dartcv4/src/g/types.g.dart: used-config: ffi-native: false symbols: diff --git a/packages/dartcv/lib/src/g/video.g.dart b/packages/dartcv/lib/src/g/video.g.dart index b4eec0bb..ef5fa92c 100644 --- a/packages/dartcv/lib/src/g/video.g.dart +++ b/packages/dartcv/lib/src/g/video.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - Video /// @@ -30,1841 +30,791 @@ class CvNativeVideo { lookup) : _lookup = lookup; - ffi.Pointer BackgroundSubtractorKNN_Apply( + ffi.Pointer cv_BackgroundSubtractorKNN_apply( BackgroundSubtractorKNN self, Mat src, Mat dst, + imp1.CvCallback_0 callback, ) { - return _BackgroundSubtractorKNN_Apply( + return _cv_BackgroundSubtractorKNN_apply( self, src, dst, - ); - } - - late final _BackgroundSubtractorKNN_ApplyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BackgroundSubtractorKNN, Mat, - Mat)>>('BackgroundSubtractorKNN_Apply'); - late final _BackgroundSubtractorKNN_Apply = - _BackgroundSubtractorKNN_ApplyPtr.asFunction< - ffi.Pointer Function(BackgroundSubtractorKNN, Mat, Mat)>(); - - ffi.Pointer BackgroundSubtractorKNN_Apply_Async( - BackgroundSubtractorKNN self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _BackgroundSubtractorKNN_Apply_Async( - self, - src, callback, ); } - late final _BackgroundSubtractorKNN_Apply_AsyncPtr = _lookup< + late final _cv_BackgroundSubtractorKNN_applyPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(BackgroundSubtractorKNN, Mat, - imp1.CvCallback_1)>>('BackgroundSubtractorKNN_Apply_Async'); - late final _BackgroundSubtractorKNN_Apply_Async = - _BackgroundSubtractorKNN_Apply_AsyncPtr.asFunction< + ffi.Pointer Function(BackgroundSubtractorKNN, Mat, Mat, + imp1.CvCallback_0)>>('cv_BackgroundSubtractorKNN_apply'); + late final _cv_BackgroundSubtractorKNN_apply = + _cv_BackgroundSubtractorKNN_applyPtr.asFunction< ffi.Pointer Function( - BackgroundSubtractorKNN, Mat, imp1.CvCallback_1)>(); + BackgroundSubtractorKNN, Mat, Mat, imp1.CvCallback_0)>(); - void BackgroundSubtractorKNN_Close( + void cv_BackgroundSubtractorKNN_close( BackgroundSubtractorKNNPtr self, ) { - return _BackgroundSubtractorKNN_Close( - self, - ); - } - - late final _BackgroundSubtractorKNN_ClosePtr = _lookup< - ffi.NativeFunction>( - 'BackgroundSubtractorKNN_Close'); - late final _BackgroundSubtractorKNN_Close = _BackgroundSubtractorKNN_ClosePtr - .asFunction(); - - ffi.Pointer BackgroundSubtractorKNN_Create( - ffi.Pointer rval, - ) { - return _BackgroundSubtractorKNN_Create( - rval, - ); - } - - late final _BackgroundSubtractorKNN_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>( - 'BackgroundSubtractorKNN_Create'); - late final _BackgroundSubtractorKNN_Create = - _BackgroundSubtractorKNN_CreatePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer)>(); - - ffi.Pointer BackgroundSubtractorKNN_CreateWithParams( - int history, - double dist2Threshold, - bool detectShadows, - ffi.Pointer rval, - ) { - return _BackgroundSubtractorKNN_CreateWithParams( - history, - dist2Threshold, - detectShadows, - rval, - ); - } - - late final _BackgroundSubtractorKNN_CreateWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Bool, - ffi.Pointer)>>( - 'BackgroundSubtractorKNN_CreateWithParams'); - late final _BackgroundSubtractorKNN_CreateWithParams = - _BackgroundSubtractorKNN_CreateWithParamsPtr.asFunction< - ffi.Pointer Function( - int, double, bool, ffi.Pointer)>(); - - ffi.Pointer BackgroundSubtractorKNN_CreateWithParams_Async( - int history, - double dist2Threshold, - bool detectShadows, - imp1.CvCallback_1 callback, - ) { - return _BackgroundSubtractorKNN_CreateWithParams_Async( - history, - dist2Threshold, - detectShadows, - callback, - ); - } - - late final _BackgroundSubtractorKNN_CreateWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Double, ffi.Bool, imp1.CvCallback_1)>>( - 'BackgroundSubtractorKNN_CreateWithParams_Async'); - late final _BackgroundSubtractorKNN_CreateWithParams_Async = - _BackgroundSubtractorKNN_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - int, double, bool, imp1.CvCallback_1)>(); - - ffi.Pointer BackgroundSubtractorKNN_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _BackgroundSubtractorKNN_Create_Async( - callback, - ); - } - - late final _BackgroundSubtractorKNN_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'BackgroundSubtractorKNN_Create_Async'); - late final _BackgroundSubtractorKNN_Create_Async = - _BackgroundSubtractorKNN_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer BackgroundSubtractorMOG2_Apply( - BackgroundSubtractorMOG2 self, - Mat src, - Mat dst, - ) { - return _BackgroundSubtractorMOG2_Apply( - self, - src, - dst, - ); - } - - late final _BackgroundSubtractorMOG2_ApplyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BackgroundSubtractorMOG2, Mat, - Mat)>>('BackgroundSubtractorMOG2_Apply'); - late final _BackgroundSubtractorMOG2_Apply = - _BackgroundSubtractorMOG2_ApplyPtr.asFunction< - ffi.Pointer Function(BackgroundSubtractorMOG2, Mat, Mat)>(); - - ffi.Pointer BackgroundSubtractorMOG2_Apply_Async( - BackgroundSubtractorMOG2 self, - Mat src, - imp1.CvCallback_1 callback, - ) { - return _BackgroundSubtractorMOG2_Apply_Async( - self, - src, - callback, - ); - } - - late final _BackgroundSubtractorMOG2_Apply_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(BackgroundSubtractorMOG2, Mat, - imp1.CvCallback_1)>>('BackgroundSubtractorMOG2_Apply_Async'); - late final _BackgroundSubtractorMOG2_Apply_Async = - _BackgroundSubtractorMOG2_Apply_AsyncPtr.asFunction< - ffi.Pointer Function( - BackgroundSubtractorMOG2, Mat, imp1.CvCallback_1)>(); - - void BackgroundSubtractorMOG2_Close( - BackgroundSubtractorMOG2Ptr self, - ) { - return _BackgroundSubtractorMOG2_Close( + return _cv_BackgroundSubtractorKNN_close( self, ); } - late final _BackgroundSubtractorMOG2_ClosePtr = _lookup< - ffi.NativeFunction>( - 'BackgroundSubtractorMOG2_Close'); - late final _BackgroundSubtractorMOG2_Close = - _BackgroundSubtractorMOG2_ClosePtr.asFunction< - void Function(BackgroundSubtractorMOG2Ptr)>(); - - ffi.Pointer BackgroundSubtractorMOG2_Create( - ffi.Pointer rval, - ) { - return _BackgroundSubtractorMOG2_Create( - rval, - ); - } - - late final _BackgroundSubtractorMOG2_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>( - 'BackgroundSubtractorMOG2_Create'); - late final _BackgroundSubtractorMOG2_Create = - _BackgroundSubtractorMOG2_CreatePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer)>(); - - ffi.Pointer BackgroundSubtractorMOG2_CreateWithParams( - int history, - double varThreshold, - bool detectShadows, - ffi.Pointer rval, - ) { - return _BackgroundSubtractorMOG2_CreateWithParams( - history, - varThreshold, - detectShadows, - rval, - ); - } - - late final _BackgroundSubtractorMOG2_CreateWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Bool, - ffi.Pointer)>>( - 'BackgroundSubtractorMOG2_CreateWithParams'); - late final _BackgroundSubtractorMOG2_CreateWithParams = - _BackgroundSubtractorMOG2_CreateWithParamsPtr.asFunction< - ffi.Pointer Function( - int, double, bool, ffi.Pointer)>(); - - ffi.Pointer BackgroundSubtractorMOG2_CreateWithParams_Async( - int history, - double varThreshold, - bool detectShadows, - imp1.CvCallback_1 callback, - ) { - return _BackgroundSubtractorMOG2_CreateWithParams_Async( - history, - varThreshold, - detectShadows, - callback, - ); - } - - late final _BackgroundSubtractorMOG2_CreateWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int, ffi.Double, ffi.Bool, imp1.CvCallback_1)>>( - 'BackgroundSubtractorMOG2_CreateWithParams_Async'); - late final _BackgroundSubtractorMOG2_CreateWithParams_Async = - _BackgroundSubtractorMOG2_CreateWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - int, double, bool, imp1.CvCallback_1)>(); - - ffi.Pointer BackgroundSubtractorMOG2_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _BackgroundSubtractorMOG2_Create_Async( - callback, - ); - } - - late final _BackgroundSubtractorMOG2_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'BackgroundSubtractorMOG2_Create_Async'); - late final _BackgroundSubtractorMOG2_Create_Async = - _BackgroundSubtractorMOG2_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer CalcOpticalFlowFarneback( - Mat prevImg, - Mat nextImg, - Mat flow, - double pyrScale, - int levels, - int winsize, - int iterations, - int polyN, - double polySigma, - int flags, - ) { - return _CalcOpticalFlowFarneback( - prevImg, - nextImg, - flow, - pyrScale, - levels, - winsize, - iterations, - polyN, - polySigma, - flags, - ); - } - - late final _CalcOpticalFlowFarnebackPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - Mat, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Double, - ffi.Int)>>('CalcOpticalFlowFarneback'); - late final _CalcOpticalFlowFarneback = - _CalcOpticalFlowFarnebackPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, double, int, int, int, int, double, int)>(); - - ffi.Pointer CalcOpticalFlowFarneback_Async( - Mat prevImg, - Mat nextImg, - Mat flow, - double pyrScale, - int levels, - int winsize, - int iterations, - int polyN, - double polySigma, - int flags, - imp1.CvCallback_0 callback, - ) { - return _CalcOpticalFlowFarneback_Async( - prevImg, - nextImg, - flow, - pyrScale, - levels, - winsize, - iterations, - polyN, - polySigma, - flags, - callback, - ); - } - - late final _CalcOpticalFlowFarneback_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - Mat, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Double, - ffi.Int, - imp1.CvCallback_0)>>('CalcOpticalFlowFarneback_Async'); - late final _CalcOpticalFlowFarneback_Async = - _CalcOpticalFlowFarneback_AsyncPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, double, int, int, int, - int, double, int, imp1.CvCallback_0)>(); - - ffi.Pointer CalcOpticalFlowPyrLK( - Mat prevImg, - Mat nextImg, - VecPoint2f prevPts, - ffi.Pointer nextPts, - ffi.Pointer status, - ffi.Pointer err, - ) { - return _CalcOpticalFlowPyrLK( - prevImg, - nextImg, - prevPts, - nextPts, - status, - err, - ); - } - - late final _CalcOpticalFlowPyrLKPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - VecPoint2f, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>>('CalcOpticalFlowPyrLK'); - late final _CalcOpticalFlowPyrLK = _CalcOpticalFlowPyrLKPtr.asFunction< - ffi.Pointer Function( - Mat, - Mat, - VecPoint2f, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>(); - - ffi.Pointer CalcOpticalFlowPyrLKWithParams( - Mat prevImg, - Mat nextImg, - VecPoint2f prevPts, - ffi.Pointer nextPts, - ffi.Pointer status, - ffi.Pointer err, - CvSize winSize, - int maxLevel, - TermCriteria criteria, - int flags, - double minEigThreshold, - ) { - return _CalcOpticalFlowPyrLKWithParams( - prevImg, - nextImg, - prevPts, - nextPts, - status, - err, - winSize, - maxLevel, - criteria, - flags, - minEigThreshold, - ); - } - - late final _CalcOpticalFlowPyrLKWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - VecPoint2f, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - CvSize, - ffi.Int, - TermCriteria, - ffi.Int, - ffi.Double)>>('CalcOpticalFlowPyrLKWithParams'); - late final _CalcOpticalFlowPyrLKWithParams = - _CalcOpticalFlowPyrLKWithParamsPtr.asFunction< - ffi.Pointer Function( - Mat, - Mat, - VecPoint2f, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - CvSize, - int, - TermCriteria, - int, - double)>(); - - ffi.Pointer CalcOpticalFlowPyrLK_Async( - Mat prevImg, - Mat nextImg, - VecPoint2f prevPts, - ffi.Pointer nextPts, - CvSize winSize, - int maxLevel, - TermCriteria criteria, - int flags, - double minEigThreshold, - imp1.CvCallback_2 callback, - ) { - return _CalcOpticalFlowPyrLK_Async( - prevImg, - nextImg, - prevPts, - nextPts, - winSize, - maxLevel, - criteria, - flags, - minEigThreshold, - callback, - ); - } - - late final _CalcOpticalFlowPyrLK_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - Mat, - VecPoint2f, - ffi.Pointer, - CvSize, - ffi.Int, - TermCriteria, - ffi.Int, - ffi.Double, - imp1.CvCallback_2)>>('CalcOpticalFlowPyrLK_Async'); - late final _CalcOpticalFlowPyrLK_Async = - _CalcOpticalFlowPyrLK_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, - Mat, - VecPoint2f, - ffi.Pointer, - CvSize, - int, - TermCriteria, - int, - double, - imp1.CvCallback_2)>(); - - ffi.Pointer FindTransformECC( - Mat templateImage, - Mat inputImage, - Mat warpMatrix, - int motionType, - TermCriteria criteria, - Mat inputMask, - int gaussFiltSize, - ffi.Pointer rval, - ) { - return _FindTransformECC( - templateImage, - inputImage, - warpMatrix, - motionType, - criteria, - inputMask, - gaussFiltSize, - rval, - ); - } - - late final _FindTransformECCPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, TermCriteria, - Mat, ffi.Int, ffi.Pointer)>>('FindTransformECC'); - late final _FindTransformECC = _FindTransformECCPtr.asFunction< - ffi.Pointer Function(Mat, Mat, Mat, int, TermCriteria, Mat, int, - ffi.Pointer)>(); - - ffi.Pointer FindTransformECC_Async( - Mat templateImage, - Mat inputImage, - Mat warpMatrix, - int motionType, - TermCriteria criteria, - Mat inputMask, - int gaussFiltSize, - imp1.CvCallback_1 callback, - ) { - return _FindTransformECC_Async( - templateImage, - inputImage, - warpMatrix, - motionType, - criteria, - inputMask, - gaussFiltSize, - callback, - ); - } - - late final _FindTransformECC_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Mat, Mat, Mat, ffi.Int, TermCriteria, - Mat, ffi.Int, imp1.CvCallback_1)>>('FindTransformECC_Async'); - late final _FindTransformECC_Async = _FindTransformECC_AsyncPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, Mat, int, TermCriteria, Mat, int, imp1.CvCallback_1)>(); - - void KalmanFilter_Close( - KalmanFilterPtr self, - ) { - return _KalmanFilter_Close( - self, - ); - } - - late final _KalmanFilter_ClosePtr = - _lookup>( - 'KalmanFilter_Close'); - late final _KalmanFilter_Close = - _KalmanFilter_ClosePtr.asFunction(); - - ffi.Pointer KalmanFilter_Correct( - KalmanFilter self, - Mat measurement, - ffi.Pointer rval, - ) { - return _KalmanFilter_Correct( - self, - measurement, - rval, - ); - } - - late final _KalmanFilter_CorrectPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, Mat, ffi.Pointer)>>('KalmanFilter_Correct'); - late final _KalmanFilter_Correct = _KalmanFilter_CorrectPtr.asFunction< - ffi.Pointer Function(KalmanFilter, Mat, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_Correct_Async( - KalmanFilter self, - Mat measurement, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_Correct_Async( - self, - measurement, - callback, - ); - } - - late final _KalmanFilter_Correct_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_1)>>('KalmanFilter_Correct_Async'); - late final _KalmanFilter_Correct_Async = - _KalmanFilter_Correct_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetControlMatrix( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetControlMatrix( - self, - rval, - ); - } - - late final _KalmanFilter_GetControlMatrixPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - ffi.Pointer)>>('KalmanFilter_GetControlMatrix'); - late final _KalmanFilter_GetControlMatrix = - _KalmanFilter_GetControlMatrixPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetControlMatrix_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetControlMatrix_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetControlMatrix_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetControlMatrix_Async'); - late final _KalmanFilter_GetControlMatrix_Async = - _KalmanFilter_GetControlMatrix_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetErrorCovPost( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetErrorCovPost( - self, - rval, - ); - } - - late final _KalmanFilter_GetErrorCovPostPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetErrorCovPost'); - late final _KalmanFilter_GetErrorCovPost = - _KalmanFilter_GetErrorCovPostPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetErrorCovPost_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetErrorCovPost_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetErrorCovPost_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetErrorCovPost_Async'); - late final _KalmanFilter_GetErrorCovPost_Async = - _KalmanFilter_GetErrorCovPost_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetErrorCovPre( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetErrorCovPre( - self, - rval, - ); - } - - late final _KalmanFilter_GetErrorCovPrePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetErrorCovPre'); - late final _KalmanFilter_GetErrorCovPre = - _KalmanFilter_GetErrorCovPrePtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetErrorCovPre_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetErrorCovPre_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetErrorCovPre_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetErrorCovPre_Async'); - late final _KalmanFilter_GetErrorCovPre_Async = - _KalmanFilter_GetErrorCovPre_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetGain( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetGain( - self, - rval, - ); - } - - late final _KalmanFilter_GetGainPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetGain'); - late final _KalmanFilter_GetGain = _KalmanFilter_GetGainPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetGain_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetGain_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetGain_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, imp1.CvCallback_1)>>('KalmanFilter_GetGain_Async'); - late final _KalmanFilter_GetGain_Async = - _KalmanFilter_GetGain_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetMeasurementMatrix( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetMeasurementMatrix( - self, - rval, - ); - } - - late final _KalmanFilter_GetMeasurementMatrixPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - ffi.Pointer)>>('KalmanFilter_GetMeasurementMatrix'); - late final _KalmanFilter_GetMeasurementMatrix = - _KalmanFilter_GetMeasurementMatrixPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetMeasurementMatrix_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetMeasurementMatrix_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetMeasurementMatrix_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetMeasurementMatrix_Async'); - late final _KalmanFilter_GetMeasurementMatrix_Async = - _KalmanFilter_GetMeasurementMatrix_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetMeasurementNoiseCov( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetMeasurementNoiseCov( - self, - rval, - ); - } - - late final _KalmanFilter_GetMeasurementNoiseCovPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - ffi.Pointer)>>('KalmanFilter_GetMeasurementNoiseCov'); - late final _KalmanFilter_GetMeasurementNoiseCov = - _KalmanFilter_GetMeasurementNoiseCovPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetMeasurementNoiseCov_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetMeasurementNoiseCov_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetMeasurementNoiseCov_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetMeasurementNoiseCov_Async'); - late final _KalmanFilter_GetMeasurementNoiseCov_Async = - _KalmanFilter_GetMeasurementNoiseCov_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetProcessNoiseCov( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetProcessNoiseCov( - self, - rval, - ); - } - - late final _KalmanFilter_GetProcessNoiseCovPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - ffi.Pointer)>>('KalmanFilter_GetProcessNoiseCov'); - late final _KalmanFilter_GetProcessNoiseCov = - _KalmanFilter_GetProcessNoiseCovPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetProcessNoiseCov_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetProcessNoiseCov_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetProcessNoiseCov_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetProcessNoiseCov_Async'); - late final _KalmanFilter_GetProcessNoiseCov_Async = - _KalmanFilter_GetProcessNoiseCov_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetStatePost( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetStatePost( - self, - rval, - ); - } - - late final _KalmanFilter_GetStatePostPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetStatePost'); - late final _KalmanFilter_GetStatePost = - _KalmanFilter_GetStatePostPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetStatePost_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetStatePost_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetStatePost_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetStatePost_Async'); - late final _KalmanFilter_GetStatePost_Async = - _KalmanFilter_GetStatePost_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetStatePre( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetStatePre( - self, - rval, - ); - } - - late final _KalmanFilter_GetStatePrePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetStatePre'); - late final _KalmanFilter_GetStatePre = - _KalmanFilter_GetStatePrePtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetStatePre_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetStatePre_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetStatePre_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetStatePre_Async'); - late final _KalmanFilter_GetStatePre_Async = - _KalmanFilter_GetStatePre_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetTemp1( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetTemp1( - self, - rval, - ); - } - - late final _KalmanFilter_GetTemp1Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetTemp1'); - late final _KalmanFilter_GetTemp1 = _KalmanFilter_GetTemp1Ptr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetTemp1_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetTemp1_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetTemp1_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, imp1.CvCallback_1)>>('KalmanFilter_GetTemp1_Async'); - late final _KalmanFilter_GetTemp1_Async = - _KalmanFilter_GetTemp1_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetTemp2( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetTemp2( - self, - rval, - ); - } - - late final _KalmanFilter_GetTemp2Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetTemp2'); - late final _KalmanFilter_GetTemp2 = _KalmanFilter_GetTemp2Ptr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetTemp2_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, - ) { - return _KalmanFilter_GetTemp2_Async( - self, - callback, - ); - } - - late final _KalmanFilter_GetTemp2_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, imp1.CvCallback_1)>>('KalmanFilter_GetTemp2_Async'); - late final _KalmanFilter_GetTemp2_Async = - _KalmanFilter_GetTemp2_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); - - ffi.Pointer KalmanFilter_GetTemp3( - KalmanFilter self, - ffi.Pointer rval, - ) { - return _KalmanFilter_GetTemp3( - self, - rval, - ); - } - - late final _KalmanFilter_GetTemp3Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetTemp3'); - late final _KalmanFilter_GetTemp3 = _KalmanFilter_GetTemp3Ptr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); - - ffi.Pointer KalmanFilter_GetTemp3_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, + late final _cv_BackgroundSubtractorKNN_closePtr = _lookup< + ffi.NativeFunction>( + 'cv_BackgroundSubtractorKNN_close'); + late final _cv_BackgroundSubtractorKNN_close = + _cv_BackgroundSubtractorKNN_closePtr + .asFunction(); + + ffi.Pointer cv_BackgroundSubtractorKNN_create( + ffi.Pointer rval, ) { - return _KalmanFilter_GetTemp3_Async( - self, - callback, + return _cv_BackgroundSubtractorKNN_create( + rval, ); } - late final _KalmanFilter_GetTemp3_AsyncPtr = _lookup< - ffi.NativeFunction< + late final _cv_BackgroundSubtractorKNN_createPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>( + 'cv_BackgroundSubtractorKNN_create'); + late final _cv_BackgroundSubtractorKNN_create = + _cv_BackgroundSubtractorKNN_createPtr.asFunction< ffi.Pointer Function( - KalmanFilter, imp1.CvCallback_1)>>('KalmanFilter_GetTemp3_Async'); - late final _KalmanFilter_GetTemp3_Async = - _KalmanFilter_GetTemp3_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); + ffi.Pointer)>(); - ffi.Pointer KalmanFilter_GetTemp4( - KalmanFilter self, - ffi.Pointer rval, + ffi.Pointer cv_BackgroundSubtractorKNN_create_1( + int history, + double dist2Threshold, + bool detectShadows, + ffi.Pointer rval, ) { - return _KalmanFilter_GetTemp4( - self, + return _cv_BackgroundSubtractorKNN_create_1( + history, + dist2Threshold, + detectShadows, rval, ); } - late final _KalmanFilter_GetTemp4Ptr = _lookup< - ffi.NativeFunction< + late final _cv_BackgroundSubtractorKNN_create_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Bool, + ffi.Pointer)>>( + 'cv_BackgroundSubtractorKNN_create_1'); + late final _cv_BackgroundSubtractorKNN_create_1 = + _cv_BackgroundSubtractorKNN_create_1Ptr.asFunction< ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetTemp4'); - late final _KalmanFilter_GetTemp4 = _KalmanFilter_GetTemp4Ptr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); + int, double, bool, ffi.Pointer)>(); - ffi.Pointer KalmanFilter_GetTemp4_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_BackgroundSubtractorMOG2_apply( + BackgroundSubtractorMOG2 self, + Mat src, + Mat dst, + imp1.CvCallback_0 callback, ) { - return _KalmanFilter_GetTemp4_Async( + return _cv_BackgroundSubtractorMOG2_apply( self, + src, + dst, callback, ); } - late final _KalmanFilter_GetTemp4_AsyncPtr = _lookup< + late final _cv_BackgroundSubtractorMOG2_applyPtr = _lookup< ffi.NativeFunction< + ffi.Pointer Function(BackgroundSubtractorMOG2, Mat, Mat, + imp1.CvCallback_0)>>('cv_BackgroundSubtractorMOG2_apply'); + late final _cv_BackgroundSubtractorMOG2_apply = + _cv_BackgroundSubtractorMOG2_applyPtr.asFunction< ffi.Pointer Function( - KalmanFilter, imp1.CvCallback_1)>>('KalmanFilter_GetTemp4_Async'); - late final _KalmanFilter_GetTemp4_Async = - _KalmanFilter_GetTemp4_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); + BackgroundSubtractorMOG2, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer KalmanFilter_GetTemp5( - KalmanFilter self, - ffi.Pointer rval, + void cv_BackgroundSubtractorMOG2_close( + BackgroundSubtractorMOG2Ptr self, ) { - return _KalmanFilter_GetTemp5( + return _cv_BackgroundSubtractorMOG2_close( self, - rval, ); } - late final _KalmanFilter_GetTemp5Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_GetTemp5'); - late final _KalmanFilter_GetTemp5 = _KalmanFilter_GetTemp5Ptr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); + late final _cv_BackgroundSubtractorMOG2_closePtr = _lookup< + ffi.NativeFunction>( + 'cv_BackgroundSubtractorMOG2_close'); + late final _cv_BackgroundSubtractorMOG2_close = + _cv_BackgroundSubtractorMOG2_closePtr + .asFunction(); - ffi.Pointer KalmanFilter_GetTemp5_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, + ffi.Pointer cv_BackgroundSubtractorMOG2_create( + ffi.Pointer rval, ) { - return _KalmanFilter_GetTemp5_Async( - self, - callback, + return _cv_BackgroundSubtractorMOG2_create( + rval, ); } - late final _KalmanFilter_GetTemp5_AsyncPtr = _lookup< - ffi.NativeFunction< + late final _cv_BackgroundSubtractorMOG2_createPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>( + 'cv_BackgroundSubtractorMOG2_create'); + late final _cv_BackgroundSubtractorMOG2_create = + _cv_BackgroundSubtractorMOG2_createPtr.asFunction< ffi.Pointer Function( - KalmanFilter, imp1.CvCallback_1)>>('KalmanFilter_GetTemp5_Async'); - late final _KalmanFilter_GetTemp5_Async = - _KalmanFilter_GetTemp5_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); + ffi.Pointer)>(); - ffi.Pointer KalmanFilter_GetTransitionMatrix( - KalmanFilter self, - ffi.Pointer rval, + ffi.Pointer cv_BackgroundSubtractorMOG2_create_1( + int history, + double varThreshold, + bool detectShadows, + ffi.Pointer rval, ) { - return _KalmanFilter_GetTransitionMatrix( - self, + return _cv_BackgroundSubtractorMOG2_create_1( + history, + varThreshold, + detectShadows, rval, ); } - late final _KalmanFilter_GetTransitionMatrixPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - ffi.Pointer)>>('KalmanFilter_GetTransitionMatrix'); - late final _KalmanFilter_GetTransitionMatrix = - _KalmanFilter_GetTransitionMatrixPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); + late final _cv_BackgroundSubtractorMOG2_create_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Bool, + ffi.Pointer)>>( + 'cv_BackgroundSubtractorMOG2_create_1'); + late final _cv_BackgroundSubtractorMOG2_create_1 = + _cv_BackgroundSubtractorMOG2_create_1Ptr.asFunction< + ffi.Pointer Function( + int, double, bool, ffi.Pointer)>(); - ffi.Pointer KalmanFilter_GetTransitionMatrix_Async( - KalmanFilter self, - imp1.CvCallback_1 callback, + void cv_KalmanFilter_close( + KalmanFilterPtr self, ) { - return _KalmanFilter_GetTransitionMatrix_Async( + return _cv_KalmanFilter_close( self, - callback, ); } - late final _KalmanFilter_GetTransitionMatrix_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, - imp1.CvCallback_1)>>('KalmanFilter_GetTransitionMatrix_Async'); - late final _KalmanFilter_GetTransitionMatrix_Async = - _KalmanFilter_GetTransitionMatrix_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); + late final _cv_KalmanFilter_closePtr = + _lookup>( + 'cv_KalmanFilter_close'); + late final _cv_KalmanFilter_close = + _cv_KalmanFilter_closePtr.asFunction(); - ffi.Pointer KalmanFilter_Init( + ffi.Pointer cv_KalmanFilter_correct( KalmanFilter self, - int dynamParams, - int measureParams, + Mat measurement, + Mat rval, + imp1.CvCallback_0 callback, ) { - return _KalmanFilter_Init( + return _cv_KalmanFilter_correct( self, - dynamParams, - measureParams, + measurement, + rval, + callback, ); } - late final _KalmanFilter_InitPtr = _lookup< + late final _cv_KalmanFilter_correctPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Int, ffi.Int)>>('KalmanFilter_Init'); - late final _KalmanFilter_Init = _KalmanFilter_InitPtr.asFunction< - ffi.Pointer Function(KalmanFilter, int, int)>(); + ffi.Pointer Function(KalmanFilter, Mat, Mat, + imp1.CvCallback_0)>>('cv_KalmanFilter_correct'); + late final _cv_KalmanFilter_correct = _cv_KalmanFilter_correctPtr.asFunction< + ffi.Pointer Function( + KalmanFilter, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer KalmanFilter_InitWithParams( - KalmanFilter self, + ffi.Pointer cv_KalmanFilter_create( int dynamParams, int measureParams, int controlParams, int type, + ffi.Pointer rval, ) { - return _KalmanFilter_InitWithParams( - self, + return _cv_KalmanFilter_create( dynamParams, measureParams, controlParams, type, + rval, ); } - late final _KalmanFilter_InitWithParamsPtr = _lookup< + late final _cv_KalmanFilter_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, ffi.Int, ffi.Int, - ffi.Int, ffi.Int)>>('KalmanFilter_InitWithParams'); - late final _KalmanFilter_InitWithParams = - _KalmanFilter_InitWithParamsPtr.asFunction< - ffi.Pointer Function(KalmanFilter, int, int, int, int)>(); + ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, ffi.Int, + ffi.Pointer)>>('cv_KalmanFilter_create'); + late final _cv_KalmanFilter_create = _cv_KalmanFilter_createPtr.asFunction< + ffi.Pointer Function( + int, int, int, int, ffi.Pointer)>(); - ffi.Pointer KalmanFilter_InitWithParams_Async( + ffi.Pointer cv_KalmanFilter_get_controlMatrix( KalmanFilter self, - int dynamParams, - int measureParams, - int controlParams, - int type, - imp1.CvCallback_0 callback, + Mat rval, ) { - return _KalmanFilter_InitWithParams_Async( + return _cv_KalmanFilter_get_controlMatrix( self, - dynamParams, - measureParams, - controlParams, - type, - callback, + rval, ); } - late final _KalmanFilter_InitWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, - ffi.Int, - ffi.Int, - ffi.Int, - ffi.Int, - imp1.CvCallback_0)>>('KalmanFilter_InitWithParams_Async'); - late final _KalmanFilter_InitWithParams_Async = - _KalmanFilter_InitWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, int, int, int, int, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_get_controlMatrixPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_controlMatrix'); + late final _cv_KalmanFilter_get_controlMatrix = + _cv_KalmanFilter_get_controlMatrixPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_Init_Async( + ffi.Pointer cv_KalmanFilter_get_errorCovPost( KalmanFilter self, - int dynamParams, - int measureParams, - imp1.CvCallback_0 callback, + Mat rval, ) { - return _KalmanFilter_Init_Async( + return _cv_KalmanFilter_get_errorCovPost( self, - dynamParams, - measureParams, - callback, + rval, ); } - late final _KalmanFilter_Init_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, ffi.Int, ffi.Int, - imp1.CvCallback_0)>>('KalmanFilter_Init_Async'); - late final _KalmanFilter_Init_Async = _KalmanFilter_Init_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, int, int, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_get_errorCovPostPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_errorCovPost'); + late final _cv_KalmanFilter_get_errorCovPost = + _cv_KalmanFilter_get_errorCovPostPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_New( - int dynamParams, - int measureParams, - int controlParams, - int type, - ffi.Pointer rval, + ffi.Pointer cv_KalmanFilter_get_errorCovPre( + KalmanFilter self, + Mat rval, ) { - return _KalmanFilter_New( - dynamParams, - measureParams, - controlParams, - type, + return _cv_KalmanFilter_get_errorCovPre( + self, rval, ); } - late final _KalmanFilter_NewPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, ffi.Int, - ffi.Pointer)>>('KalmanFilter_New'); - late final _KalmanFilter_New = _KalmanFilter_NewPtr.asFunction< - ffi.Pointer Function( - int, int, int, int, ffi.Pointer)>(); + late final _cv_KalmanFilter_get_errorCovPrePtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_errorCovPre'); + late final _cv_KalmanFilter_get_errorCovPre = + _cv_KalmanFilter_get_errorCovPrePtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_New_Async( - int dynamParams, - int measureParams, - int controlParams, - int type, - imp1.CvCallback_1 callback, + ffi.Pointer cv_KalmanFilter_get_gain( + KalmanFilter self, + Mat rval, ) { - return _KalmanFilter_New_Async( - dynamParams, - measureParams, - controlParams, - type, - callback, + return _cv_KalmanFilter_get_gain( + self, + rval, ); } - late final _KalmanFilter_New_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('KalmanFilter_New_Async'); - late final _KalmanFilter_New_Async = _KalmanFilter_New_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, int, int, imp1.CvCallback_1)>(); + late final _cv_KalmanFilter_get_gainPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_gain'); + late final _cv_KalmanFilter_get_gain = _cv_KalmanFilter_get_gainPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_Predict( + ffi.Pointer cv_KalmanFilter_get_measurementMatrix( KalmanFilter self, - ffi.Pointer rval, + Mat rval, ) { - return _KalmanFilter_Predict( + return _cv_KalmanFilter_get_measurementMatrix( self, rval, ); } - late final _KalmanFilter_PredictPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, ffi.Pointer)>>('KalmanFilter_Predict'); - late final _KalmanFilter_Predict = _KalmanFilter_PredictPtr.asFunction< - ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); + late final _cv_KalmanFilter_get_measurementMatrixPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_measurementMatrix'); + late final _cv_KalmanFilter_get_measurementMatrix = + _cv_KalmanFilter_get_measurementMatrixPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_PredictWithParams( + ffi.Pointer cv_KalmanFilter_get_measurementNoiseCov( KalmanFilter self, - Mat control, - ffi.Pointer rval, + Mat rval, ) { - return _KalmanFilter_PredictWithParams( + return _cv_KalmanFilter_get_measurementNoiseCov( self, - control, rval, ); } - late final _KalmanFilter_PredictWithParamsPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - ffi.Pointer)>>('KalmanFilter_PredictWithParams'); - late final _KalmanFilter_PredictWithParams = - _KalmanFilter_PredictWithParamsPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, ffi.Pointer)>(); + late final _cv_KalmanFilter_get_measurementNoiseCovPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_measurementNoiseCov'); + late final _cv_KalmanFilter_get_measurementNoiseCov = + _cv_KalmanFilter_get_measurementNoiseCovPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_PredictWithParams_Async( + ffi.Pointer cv_KalmanFilter_get_processNoiseCov( KalmanFilter self, - Mat control, - imp1.CvCallback_1 callback, + Mat rval, ) { - return _KalmanFilter_PredictWithParams_Async( + return _cv_KalmanFilter_get_processNoiseCov( self, - control, - callback, + rval, ); } - late final _KalmanFilter_PredictWithParams_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_1)>>('KalmanFilter_PredictWithParams_Async'); - late final _KalmanFilter_PredictWithParams_Async = - _KalmanFilter_PredictWithParams_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_1)>(); + late final _cv_KalmanFilter_get_processNoiseCovPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_processNoiseCov'); + late final _cv_KalmanFilter_get_processNoiseCov = + _cv_KalmanFilter_get_processNoiseCovPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_Predict_Async( + ffi.Pointer cv_KalmanFilter_get_statePost( KalmanFilter self, - imp1.CvCallback_1 callback, + Mat rval, ) { - return _KalmanFilter_Predict_Async( + return _cv_KalmanFilter_get_statePost( self, - callback, + rval, ); } - late final _KalmanFilter_Predict_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - KalmanFilter, imp1.CvCallback_1)>>('KalmanFilter_Predict_Async'); - late final _KalmanFilter_Predict_Async = - _KalmanFilter_Predict_AsyncPtr.asFunction< - ffi.Pointer Function(KalmanFilter, imp1.CvCallback_1)>(); + late final _cv_KalmanFilter_get_statePostPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_statePost'); + late final _cv_KalmanFilter_get_statePost = _cv_KalmanFilter_get_statePostPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetControlMatrix( + ffi.Pointer cv_KalmanFilter_get_statePre( KalmanFilter self, - Mat controlMatrix, + Mat rval, ) { - return _KalmanFilter_SetControlMatrix( + return _cv_KalmanFilter_get_statePre( self, - controlMatrix, + rval, ); } - late final _KalmanFilter_SetControlMatrixPtr = _lookup< + late final _cv_KalmanFilter_get_statePrePtr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetControlMatrix'); - late final _KalmanFilter_SetControlMatrix = _KalmanFilter_SetControlMatrixPtr + 'cv_KalmanFilter_get_statePre'); + late final _cv_KalmanFilter_get_statePre = _cv_KalmanFilter_get_statePrePtr .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetControlMatrix_Async( + ffi.Pointer cv_KalmanFilter_get_temp1( KalmanFilter self, - Mat value, - imp1.CvCallback_0 callback, + Mat rval, ) { - return _KalmanFilter_SetControlMatrix_Async( + return _cv_KalmanFilter_get_temp1( self, - value, - callback, + rval, ); } - late final _KalmanFilter_SetControlMatrix_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetControlMatrix_Async'); - late final _KalmanFilter_SetControlMatrix_Async = - _KalmanFilter_SetControlMatrix_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_get_temp1Ptr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_temp1'); + late final _cv_KalmanFilter_get_temp1 = _cv_KalmanFilter_get_temp1Ptr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetErrorCovPost( + ffi.Pointer cv_KalmanFilter_get_temp2( KalmanFilter self, - Mat errorCovPost, + Mat rval, ) { - return _KalmanFilter_SetErrorCovPost( + return _cv_KalmanFilter_get_temp2( self, - errorCovPost, + rval, ); } - late final _KalmanFilter_SetErrorCovPostPtr = _lookup< + late final _cv_KalmanFilter_get_temp2Ptr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetErrorCovPost'); - late final _KalmanFilter_SetErrorCovPost = _KalmanFilter_SetErrorCovPostPtr + 'cv_KalmanFilter_get_temp2'); + late final _cv_KalmanFilter_get_temp2 = _cv_KalmanFilter_get_temp2Ptr .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetErrorCovPost_Async( + ffi.Pointer cv_KalmanFilter_get_temp3( KalmanFilter self, - Mat value, - imp1.CvCallback_0 callback, + Mat rval, ) { - return _KalmanFilter_SetErrorCovPost_Async( + return _cv_KalmanFilter_get_temp3( self, - value, - callback, + rval, ); } - late final _KalmanFilter_SetErrorCovPost_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetErrorCovPost_Async'); - late final _KalmanFilter_SetErrorCovPost_Async = - _KalmanFilter_SetErrorCovPost_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_get_temp3Ptr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_temp3'); + late final _cv_KalmanFilter_get_temp3 = _cv_KalmanFilter_get_temp3Ptr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetErrorCovPre( + ffi.Pointer cv_KalmanFilter_get_temp4( KalmanFilter self, - Mat errorCovPre, + Mat rval, ) { - return _KalmanFilter_SetErrorCovPre( + return _cv_KalmanFilter_get_temp4( self, - errorCovPre, + rval, ); } - late final _KalmanFilter_SetErrorCovPrePtr = _lookup< + late final _cv_KalmanFilter_get_temp4Ptr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetErrorCovPre'); - late final _KalmanFilter_SetErrorCovPre = _KalmanFilter_SetErrorCovPrePtr + 'cv_KalmanFilter_get_temp4'); + late final _cv_KalmanFilter_get_temp4 = _cv_KalmanFilter_get_temp4Ptr .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetErrorCovPre_Async( + ffi.Pointer cv_KalmanFilter_get_temp5( KalmanFilter self, - Mat value, - imp1.CvCallback_0 callback, + Mat rval, ) { - return _KalmanFilter_SetErrorCovPre_Async( + return _cv_KalmanFilter_get_temp5( self, - value, - callback, + rval, ); } - late final _KalmanFilter_SetErrorCovPre_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetErrorCovPre_Async'); - late final _KalmanFilter_SetErrorCovPre_Async = - _KalmanFilter_SetErrorCovPre_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_get_temp5Ptr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_get_temp5'); + late final _cv_KalmanFilter_get_temp5 = _cv_KalmanFilter_get_temp5Ptr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetGain( + ffi.Pointer cv_KalmanFilter_get_transitionMatrix( KalmanFilter self, - Mat gain, + Mat rval, ) { - return _KalmanFilter_SetGain( + return _cv_KalmanFilter_get_transitionMatrix( self, - gain, + rval, ); } - late final _KalmanFilter_SetGainPtr = _lookup< + late final _cv_KalmanFilter_get_transitionMatrixPtr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetGain'); - late final _KalmanFilter_SetGain = _KalmanFilter_SetGainPtr.asFunction< - ffi.Pointer Function(KalmanFilter, Mat)>(); + 'cv_KalmanFilter_get_transitionMatrix'); + late final _cv_KalmanFilter_get_transitionMatrix = + _cv_KalmanFilter_get_transitionMatrixPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetGain_Async( + ffi.Pointer cv_KalmanFilter_init( KalmanFilter self, - Mat value, + int dynamParams, + int measureParams, imp1.CvCallback_0 callback, ) { - return _KalmanFilter_SetGain_Async( + return _cv_KalmanFilter_init( self, - value, + dynamParams, + measureParams, callback, ); } - late final _KalmanFilter_SetGain_AsyncPtr = _lookup< + late final _cv_KalmanFilter_initPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetGain_Async'); - late final _KalmanFilter_SetGain_Async = - _KalmanFilter_SetGain_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function(KalmanFilter, ffi.Int, ffi.Int, + imp1.CvCallback_0)>>('cv_KalmanFilter_init'); + late final _cv_KalmanFilter_init = _cv_KalmanFilter_initPtr.asFunction< + ffi.Pointer Function( + KalmanFilter, int, int, imp1.CvCallback_0)>(); - ffi.Pointer KalmanFilter_SetMeasurementMatrix( + ffi.Pointer cv_KalmanFilter_init_1( KalmanFilter self, - Mat measurementMatrix, + int dynamParams, + int measureParams, + int controlParams, + int type, + imp1.CvCallback_0 callback, ) { - return _KalmanFilter_SetMeasurementMatrix( + return _cv_KalmanFilter_init_1( self, - measurementMatrix, + dynamParams, + measureParams, + controlParams, + type, + callback, ); } - late final _KalmanFilter_SetMeasurementMatrixPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetMeasurementMatrix'); - late final _KalmanFilter_SetMeasurementMatrix = - _KalmanFilter_SetMeasurementMatrixPtr.asFunction< - ffi.Pointer Function(KalmanFilter, Mat)>(); + late final _cv_KalmanFilter_init_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, ffi.Int, ffi.Int, + ffi.Int, ffi.Int, imp1.CvCallback_0)>>('cv_KalmanFilter_init_1'); + late final _cv_KalmanFilter_init_1 = _cv_KalmanFilter_init_1Ptr.asFunction< + ffi.Pointer Function( + KalmanFilter, int, int, int, int, imp1.CvCallback_0)>(); + + ffi.Pointer cv_KalmanFilter_predict( + KalmanFilter self, + Mat rval, + imp1.CvCallback_0 callback, + ) { + return _cv_KalmanFilter_predict( + self, + rval, + callback, + ); + } - ffi.Pointer KalmanFilter_SetMeasurementMatrix_Async( + late final _cv_KalmanFilter_predictPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, Mat, + imp1.CvCallback_0)>>('cv_KalmanFilter_predict'); + late final _cv_KalmanFilter_predict = _cv_KalmanFilter_predictPtr.asFunction< + ffi.Pointer Function(KalmanFilter, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_KalmanFilter_predict_1( KalmanFilter self, - Mat value, + Mat control, + Mat rval, imp1.CvCallback_0 callback, ) { - return _KalmanFilter_SetMeasurementMatrix_Async( + return _cv_KalmanFilter_predict_1( self, - value, + control, + rval, callback, ); } - late final _KalmanFilter_SetMeasurementMatrix_AsyncPtr = _lookup< + late final _cv_KalmanFilter_predict_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetMeasurementMatrix_Async'); - late final _KalmanFilter_SetMeasurementMatrix_Async = - _KalmanFilter_SetMeasurementMatrix_AsyncPtr.asFunction< + ffi.Pointer Function(KalmanFilter, Mat, Mat, + imp1.CvCallback_0)>>('cv_KalmanFilter_predict_1'); + late final _cv_KalmanFilter_predict_1 = + _cv_KalmanFilter_predict_1Ptr.asFunction< ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + KalmanFilter, Mat, Mat, imp1.CvCallback_0)>(); - ffi.Pointer KalmanFilter_SetMeasurementNoiseCov( + ffi.Pointer cv_KalmanFilter_set_controlMatrix( KalmanFilter self, - Mat measurementNoiseCov, + Mat controlMatrix, ) { - return _KalmanFilter_SetMeasurementNoiseCov( + return _cv_KalmanFilter_set_controlMatrix( self, - measurementNoiseCov, + controlMatrix, ); } - late final _KalmanFilter_SetMeasurementNoiseCovPtr = _lookup< + late final _cv_KalmanFilter_set_controlMatrixPtr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetMeasurementNoiseCov'); - late final _KalmanFilter_SetMeasurementNoiseCov = - _KalmanFilter_SetMeasurementNoiseCovPtr.asFunction< - ffi.Pointer Function(KalmanFilter, Mat)>(); + 'cv_KalmanFilter_set_controlMatrix'); + late final _cv_KalmanFilter_set_controlMatrix = + _cv_KalmanFilter_set_controlMatrixPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetMeasurementNoiseCov_Async( + ffi.Pointer cv_KalmanFilter_set_errorCovPost( KalmanFilter self, - Mat value, - imp1.CvCallback_0 callback, + Mat errorCovPost, ) { - return _KalmanFilter_SetMeasurementNoiseCov_Async( + return _cv_KalmanFilter_set_errorCovPost( self, - value, - callback, + errorCovPost, ); } - late final _KalmanFilter_SetMeasurementNoiseCov_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetMeasurementNoiseCov_Async'); - late final _KalmanFilter_SetMeasurementNoiseCov_Async = - _KalmanFilter_SetMeasurementNoiseCov_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_set_errorCovPostPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_set_errorCovPost'); + late final _cv_KalmanFilter_set_errorCovPost = + _cv_KalmanFilter_set_errorCovPostPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetProcessNoiseCov( + ffi.Pointer cv_KalmanFilter_set_errorCovPre( KalmanFilter self, - Mat processNoiseCov, + Mat errorCovPre, ) { - return _KalmanFilter_SetProcessNoiseCov( + return _cv_KalmanFilter_set_errorCovPre( self, - processNoiseCov, + errorCovPre, ); } - late final _KalmanFilter_SetProcessNoiseCovPtr = _lookup< + late final _cv_KalmanFilter_set_errorCovPrePtr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetProcessNoiseCov'); - late final _KalmanFilter_SetProcessNoiseCov = - _KalmanFilter_SetProcessNoiseCovPtr.asFunction< - ffi.Pointer Function(KalmanFilter, Mat)>(); + 'cv_KalmanFilter_set_errorCovPre'); + late final _cv_KalmanFilter_set_errorCovPre = + _cv_KalmanFilter_set_errorCovPrePtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetProcessNoiseCov_Async( + ffi.Pointer cv_KalmanFilter_set_gain( KalmanFilter self, - Mat value, - imp1.CvCallback_0 callback, + Mat gain, ) { - return _KalmanFilter_SetProcessNoiseCov_Async( + return _cv_KalmanFilter_set_gain( self, - value, - callback, + gain, ); } - late final _KalmanFilter_SetProcessNoiseCov_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetProcessNoiseCov_Async'); - late final _KalmanFilter_SetProcessNoiseCov_Async = - _KalmanFilter_SetProcessNoiseCov_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_set_gainPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_set_gain'); + late final _cv_KalmanFilter_set_gain = _cv_KalmanFilter_set_gainPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetStatePost( + ffi.Pointer cv_KalmanFilter_set_measurementMatrix( KalmanFilter self, - Mat statePost, + Mat measurementMatrix, ) { - return _KalmanFilter_SetStatePost( + return _cv_KalmanFilter_set_measurementMatrix( self, - statePost, + measurementMatrix, ); } - late final _KalmanFilter_SetStatePostPtr = _lookup< + late final _cv_KalmanFilter_set_measurementMatrixPtr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetStatePost'); - late final _KalmanFilter_SetStatePost = _KalmanFilter_SetStatePostPtr - .asFunction Function(KalmanFilter, Mat)>(); + 'cv_KalmanFilter_set_measurementMatrix'); + late final _cv_KalmanFilter_set_measurementMatrix = + _cv_KalmanFilter_set_measurementMatrixPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetStatePost_Async( + ffi.Pointer cv_KalmanFilter_set_measurementNoiseCov( KalmanFilter self, - Mat value, - imp1.CvCallback_0 callback, + Mat measurementNoiseCov, ) { - return _KalmanFilter_SetStatePost_Async( + return _cv_KalmanFilter_set_measurementNoiseCov( self, - value, - callback, + measurementNoiseCov, ); } - late final _KalmanFilter_SetStatePost_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetStatePost_Async'); - late final _KalmanFilter_SetStatePost_Async = - _KalmanFilter_SetStatePost_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_set_measurementNoiseCovPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_set_measurementNoiseCov'); + late final _cv_KalmanFilter_set_measurementNoiseCov = + _cv_KalmanFilter_set_measurementNoiseCovPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetStatePre( + ffi.Pointer cv_KalmanFilter_set_processNoiseCov( KalmanFilter self, - Mat statePre, + Mat processNoiseCov, ) { - return _KalmanFilter_SetStatePre( + return _cv_KalmanFilter_set_processNoiseCov( self, - statePre, + processNoiseCov, ); } - late final _KalmanFilter_SetStatePrePtr = _lookup< + late final _cv_KalmanFilter_set_processNoiseCovPtr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetStatePre'); - late final _KalmanFilter_SetStatePre = _KalmanFilter_SetStatePrePtr - .asFunction Function(KalmanFilter, Mat)>(); + 'cv_KalmanFilter_set_processNoiseCov'); + late final _cv_KalmanFilter_set_processNoiseCov = + _cv_KalmanFilter_set_processNoiseCovPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetStatePre_Async( + ffi.Pointer cv_KalmanFilter_set_statePost( KalmanFilter self, - Mat value, - imp1.CvCallback_0 callback, + Mat statePost, ) { - return _KalmanFilter_SetStatePre_Async( + return _cv_KalmanFilter_set_statePost( self, - value, - callback, + statePost, ); } - late final _KalmanFilter_SetStatePre_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetStatePre_Async'); - late final _KalmanFilter_SetStatePre_Async = - _KalmanFilter_SetStatePre_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_set_statePostPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_set_statePost'); + late final _cv_KalmanFilter_set_statePost = _cv_KalmanFilter_set_statePostPtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetTransitionMatrix( + ffi.Pointer cv_KalmanFilter_set_statePre( KalmanFilter self, - Mat transitionMatrix, + Mat statePre, ) { - return _KalmanFilter_SetTransitionMatrix( + return _cv_KalmanFilter_set_statePre( self, - transitionMatrix, + statePre, ); } - late final _KalmanFilter_SetTransitionMatrixPtr = _lookup< + late final _cv_KalmanFilter_set_statePrePtr = _lookup< ffi .NativeFunction Function(KalmanFilter, Mat)>>( - 'KalmanFilter_SetTransitionMatrix'); - late final _KalmanFilter_SetTransitionMatrix = - _KalmanFilter_SetTransitionMatrixPtr.asFunction< - ffi.Pointer Function(KalmanFilter, Mat)>(); + 'cv_KalmanFilter_set_statePre'); + late final _cv_KalmanFilter_set_statePre = _cv_KalmanFilter_set_statePrePtr + .asFunction Function(KalmanFilter, Mat)>(); - ffi.Pointer KalmanFilter_SetTransitionMatrix_Async( + ffi.Pointer cv_KalmanFilter_set_transitionMatrix( KalmanFilter self, - Mat value, - imp1.CvCallback_0 callback, + Mat transitionMatrix, ) { - return _KalmanFilter_SetTransitionMatrix_Async( + return _cv_KalmanFilter_set_transitionMatrix( self, - value, - callback, + transitionMatrix, ); } - late final _KalmanFilter_SetTransitionMatrix_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, - imp1.CvCallback_0)>>('KalmanFilter_SetTransitionMatrix_Async'); - late final _KalmanFilter_SetTransitionMatrix_Async = - _KalmanFilter_SetTransitionMatrix_AsyncPtr.asFunction< - ffi.Pointer Function( - KalmanFilter, Mat, imp1.CvCallback_0)>(); + late final _cv_KalmanFilter_set_transitionMatrixPtr = _lookup< + ffi + .NativeFunction Function(KalmanFilter, Mat)>>( + 'cv_KalmanFilter_set_transitionMatrix'); + late final _cv_KalmanFilter_set_transitionMatrix = + _cv_KalmanFilter_set_transitionMatrixPtr + .asFunction Function(KalmanFilter, Mat)>(); - void TrackerMIL_Close( + void cv_TrackerMIL_close( TrackerMILPtr self, ) { - return _TrackerMIL_Close( + return _cv_TrackerMIL_close( self, ); } - late final _TrackerMIL_ClosePtr = + late final _cv_TrackerMIL_closePtr = _lookup>( - 'TrackerMIL_Close'); - late final _TrackerMIL_Close = - _TrackerMIL_ClosePtr.asFunction(); + 'cv_TrackerMIL_close'); + late final _cv_TrackerMIL_close = + _cv_TrackerMIL_closePtr.asFunction(); - ffi.Pointer TrackerMIL_Create( + ffi.Pointer cv_TrackerMIL_create( ffi.Pointer rval, ) { - return _TrackerMIL_Create( + return _cv_TrackerMIL_create( rval, ); } - late final _TrackerMIL_CreatePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer)>>('TrackerMIL_Create'); - late final _TrackerMIL_Create = _TrackerMIL_CreatePtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); - - ffi.Pointer TrackerMIL_Create_Async( - imp1.CvCallback_1 callback, - ) { - return _TrackerMIL_Create_Async( - callback, - ); - } - - late final _TrackerMIL_Create_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'TrackerMIL_Create_Async'); - late final _TrackerMIL_Create_Async = _TrackerMIL_Create_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); - - ffi.Pointer TrackerMIL_Init( - TrackerMIL self, - Mat image, - CvRect bbox, - ) { - return _TrackerMIL_Init( - self, - image, - bbox, - ); - } - - late final _TrackerMIL_InitPtr = _lookup< + late final _cv_TrackerMIL_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - TrackerMIL, Mat, CvRect)>>('TrackerMIL_Init'); - late final _TrackerMIL_Init = _TrackerMIL_InitPtr.asFunction< - ffi.Pointer Function(TrackerMIL, Mat, CvRect)>(); + ffi.Pointer)>>('cv_TrackerMIL_create'); + late final _cv_TrackerMIL_create = _cv_TrackerMIL_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer TrackerMIL_Init_Async( + ffi.Pointer cv_TrackerMIL_init( TrackerMIL self, Mat image, CvRect bbox, imp1.CvCallback_0 callback, ) { - return _TrackerMIL_Init_Async( + return _cv_TrackerMIL_init( self, image, bbox, @@ -1872,54 +822,229 @@ class CvNativeVideo { ); } - late final _TrackerMIL_Init_AsyncPtr = _lookup< + late final _cv_TrackerMIL_initPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(TrackerMIL, Mat, CvRect, - imp1.CvCallback_0)>>('TrackerMIL_Init_Async'); - late final _TrackerMIL_Init_Async = _TrackerMIL_Init_AsyncPtr.asFunction< + imp1.CvCallback_0)>>('cv_TrackerMIL_init'); + late final _cv_TrackerMIL_init = _cv_TrackerMIL_initPtr.asFunction< ffi.Pointer Function( TrackerMIL, Mat, CvRect, imp1.CvCallback_0)>(); - ffi.Pointer TrackerMIL_Update( + ffi.Pointer cv_TrackerMIL_update( TrackerMIL self, Mat image, ffi.Pointer boundingBox, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _TrackerMIL_Update( + return _cv_TrackerMIL_update( self, image, boundingBox, rval, + callback, + ); + } + + late final _cv_TrackerMIL_updatePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + TrackerMIL, + Mat, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_TrackerMIL_update'); + late final _cv_TrackerMIL_update = _cv_TrackerMIL_updatePtr.asFunction< + ffi.Pointer Function(TrackerMIL, Mat, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_calcOpticalFlowFarneback( + Mat prevImg, + Mat nextImg, + Mat flow, + double pyrScale, + int levels, + int winsize, + int iterations, + int polyN, + double polySigma, + int flags, + imp1.CvCallback_0 callback, + ) { + return _cv_calcOpticalFlowFarneback( + prevImg, + nextImg, + flow, + pyrScale, + levels, + winsize, + iterations, + polyN, + polySigma, + flags, + callback, ); } - late final _TrackerMIL_UpdatePtr = _lookup< + late final _cv_calcOpticalFlowFarnebackPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(TrackerMIL, Mat, ffi.Pointer, - ffi.Pointer)>>('TrackerMIL_Update'); - late final _TrackerMIL_Update = _TrackerMIL_UpdatePtr.asFunction< + ffi.Pointer Function( + Mat, + Mat, + Mat, + ffi.Double, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Double, + ffi.Int, + imp1.CvCallback_0)>>('cv_calcOpticalFlowFarneback'); + late final _cv_calcOpticalFlowFarneback = + _cv_calcOpticalFlowFarnebackPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, double, int, int, int, + int, double, int, imp1.CvCallback_0)>(); + + ffi.Pointer cv_calcOpticalFlowPyrLK( + Mat prevImg, + Mat nextImg, + VecPoint2f prevPts, + ffi.Pointer nextPts, + ffi.Pointer status, + ffi.Pointer err, + imp1.CvCallback_0 callback, + ) { + return _cv_calcOpticalFlowPyrLK( + prevImg, + nextImg, + prevPts, + nextPts, + status, + err, + callback, + ); + } + + late final _cv_calcOpticalFlowPyrLKPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, + Mat, + VecPoint2f, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_calcOpticalFlowPyrLK'); + late final _cv_calcOpticalFlowPyrLK = _cv_calcOpticalFlowPyrLKPtr.asFunction< ffi.Pointer Function( - TrackerMIL, Mat, ffi.Pointer, ffi.Pointer)>(); + Mat, + Mat, + VecPoint2f, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>(); - ffi.Pointer TrackerMIL_Update_Async( - TrackerMIL self, - Mat image, - imp1.CvCallback_2 callback, + ffi.Pointer cv_calcOpticalFlowPyrLK_1( + Mat prevImg, + Mat nextImg, + VecPoint2f prevPts, + ffi.Pointer nextPts, + ffi.Pointer status, + ffi.Pointer err, + CvSize winSize, + int maxLevel, + TermCriteria criteria, + int flags, + double minEigThreshold, + imp1.CvCallback_0 callback, ) { - return _TrackerMIL_Update_Async( - self, - image, + return _cv_calcOpticalFlowPyrLK_1( + prevImg, + nextImg, + prevPts, + nextPts, + status, + err, + winSize, + maxLevel, + criteria, + flags, + minEigThreshold, + callback, + ); + } + + late final _cv_calcOpticalFlowPyrLK_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, + Mat, + VecPoint2f, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + CvSize, + ffi.Int, + TermCriteria, + ffi.Int, + ffi.Double, + imp1.CvCallback_0)>>('cv_calcOpticalFlowPyrLK_1'); + late final _cv_calcOpticalFlowPyrLK_1 = + _cv_calcOpticalFlowPyrLK_1Ptr.asFunction< + ffi.Pointer Function( + Mat, + Mat, + VecPoint2f, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + CvSize, + int, + TermCriteria, + int, + double, + imp1.CvCallback_0)>(); + + ffi.Pointer cv_findTransformECC( + Mat templateImage, + Mat inputImage, + Mat warpMatrix, + int motionType, + TermCriteria criteria, + Mat inputMask, + int gaussFiltSize, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_findTransformECC( + templateImage, + inputImage, + warpMatrix, + motionType, + criteria, + inputMask, + gaussFiltSize, + rval, callback, ); } - late final _TrackerMIL_Update_AsyncPtr = _lookup< + late final _cv_findTransformECCPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - TrackerMIL, Mat, imp1.CvCallback_2)>>('TrackerMIL_Update_Async'); - late final _TrackerMIL_Update_Async = _TrackerMIL_Update_AsyncPtr.asFunction< - ffi.Pointer Function(TrackerMIL, Mat, imp1.CvCallback_2)>(); + Mat, + Mat, + Mat, + ffi.Int, + TermCriteria, + Mat, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_findTransformECC'); + late final _cv_findTransformECC = _cv_findTransformECCPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, int, TermCriteria, Mat, int, + ffi.Pointer, imp1.CvCallback_0)>(); late final addresses = _SymbolAddresses(this); } @@ -1928,16 +1053,16 @@ class _SymbolAddresses { final CvNativeVideo _library; _SymbolAddresses(this._library); ffi.Pointer> - get BackgroundSubtractorKNN_Close => - _library._BackgroundSubtractorKNN_ClosePtr; + get cv_BackgroundSubtractorKNN_close => + _library._cv_BackgroundSubtractorKNN_closePtr; ffi.Pointer< ffi.NativeFunction> - get BackgroundSubtractorMOG2_Close => - _library._BackgroundSubtractorMOG2_ClosePtr; + get cv_BackgroundSubtractorMOG2_close => + _library._cv_BackgroundSubtractorMOG2_closePtr; ffi.Pointer> - get KalmanFilter_Close => _library._KalmanFilter_ClosePtr; + get cv_KalmanFilter_close => _library._cv_KalmanFilter_closePtr; ffi.Pointer> - get TrackerMIL_Close => _library._TrackerMIL_ClosePtr; + get cv_TrackerMIL_close => _library._cv_TrackerMIL_closePtr; } final class BackgroundSubtractorKNN extends ffi.Struct { diff --git a/packages/dartcv/lib/src/g/video.yaml b/packages/dartcv/lib/src/g/video.yaml index 43061d98..aad83f12 100644 --- a/packages/dartcv/lib/src/g/video.yaml +++ b/packages/dartcv/lib/src/g/video.yaml @@ -1,191 +1,105 @@ format_version: 1.0.0 files: - package:dartcv/src/g/video.g.dart: + package:dartcv4/src/g/video.g.dart: used-config: ffi-native: false symbols: - c:@F@BackgroundSubtractorKNN_Apply: - name: BackgroundSubtractorKNN_Apply - c:@F@BackgroundSubtractorKNN_Apply_Async: - name: BackgroundSubtractorKNN_Apply_Async - c:@F@BackgroundSubtractorKNN_Close: - name: BackgroundSubtractorKNN_Close - c:@F@BackgroundSubtractorKNN_Create: - name: BackgroundSubtractorKNN_Create - c:@F@BackgroundSubtractorKNN_CreateWithParams: - name: BackgroundSubtractorKNN_CreateWithParams - c:@F@BackgroundSubtractorKNN_CreateWithParams_Async: - name: BackgroundSubtractorKNN_CreateWithParams_Async - c:@F@BackgroundSubtractorKNN_Create_Async: - name: BackgroundSubtractorKNN_Create_Async - c:@F@BackgroundSubtractorMOG2_Apply: - name: BackgroundSubtractorMOG2_Apply - c:@F@BackgroundSubtractorMOG2_Apply_Async: - name: BackgroundSubtractorMOG2_Apply_Async - c:@F@BackgroundSubtractorMOG2_Close: - name: BackgroundSubtractorMOG2_Close - c:@F@BackgroundSubtractorMOG2_Create: - name: BackgroundSubtractorMOG2_Create - c:@F@BackgroundSubtractorMOG2_CreateWithParams: - name: BackgroundSubtractorMOG2_CreateWithParams - c:@F@BackgroundSubtractorMOG2_CreateWithParams_Async: - name: BackgroundSubtractorMOG2_CreateWithParams_Async - c:@F@BackgroundSubtractorMOG2_Create_Async: - name: BackgroundSubtractorMOG2_Create_Async - c:@F@CalcOpticalFlowFarneback: - name: CalcOpticalFlowFarneback - c:@F@CalcOpticalFlowFarneback_Async: - name: CalcOpticalFlowFarneback_Async - c:@F@CalcOpticalFlowPyrLK: - name: CalcOpticalFlowPyrLK - c:@F@CalcOpticalFlowPyrLKWithParams: - name: CalcOpticalFlowPyrLKWithParams - c:@F@CalcOpticalFlowPyrLK_Async: - name: CalcOpticalFlowPyrLK_Async - c:@F@FindTransformECC: - name: FindTransformECC - c:@F@FindTransformECC_Async: - name: FindTransformECC_Async - c:@F@KalmanFilter_Close: - name: KalmanFilter_Close - c:@F@KalmanFilter_Correct: - name: KalmanFilter_Correct - c:@F@KalmanFilter_Correct_Async: - name: KalmanFilter_Correct_Async - c:@F@KalmanFilter_GetControlMatrix: - name: KalmanFilter_GetControlMatrix - c:@F@KalmanFilter_GetControlMatrix_Async: - name: KalmanFilter_GetControlMatrix_Async - c:@F@KalmanFilter_GetErrorCovPost: - name: KalmanFilter_GetErrorCovPost - c:@F@KalmanFilter_GetErrorCovPost_Async: - name: KalmanFilter_GetErrorCovPost_Async - c:@F@KalmanFilter_GetErrorCovPre: - name: KalmanFilter_GetErrorCovPre - c:@F@KalmanFilter_GetErrorCovPre_Async: - name: KalmanFilter_GetErrorCovPre_Async - c:@F@KalmanFilter_GetGain: - name: KalmanFilter_GetGain - c:@F@KalmanFilter_GetGain_Async: - name: KalmanFilter_GetGain_Async - c:@F@KalmanFilter_GetMeasurementMatrix: - name: KalmanFilter_GetMeasurementMatrix - c:@F@KalmanFilter_GetMeasurementMatrix_Async: - name: KalmanFilter_GetMeasurementMatrix_Async - c:@F@KalmanFilter_GetMeasurementNoiseCov: - name: KalmanFilter_GetMeasurementNoiseCov - c:@F@KalmanFilter_GetMeasurementNoiseCov_Async: - name: KalmanFilter_GetMeasurementNoiseCov_Async - c:@F@KalmanFilter_GetProcessNoiseCov: - name: KalmanFilter_GetProcessNoiseCov - c:@F@KalmanFilter_GetProcessNoiseCov_Async: - name: KalmanFilter_GetProcessNoiseCov_Async - c:@F@KalmanFilter_GetStatePost: - name: KalmanFilter_GetStatePost - c:@F@KalmanFilter_GetStatePost_Async: - name: KalmanFilter_GetStatePost_Async - c:@F@KalmanFilter_GetStatePre: - name: KalmanFilter_GetStatePre - c:@F@KalmanFilter_GetStatePre_Async: - name: KalmanFilter_GetStatePre_Async - c:@F@KalmanFilter_GetTemp1: - name: KalmanFilter_GetTemp1 - c:@F@KalmanFilter_GetTemp1_Async: - name: KalmanFilter_GetTemp1_Async - c:@F@KalmanFilter_GetTemp2: - name: KalmanFilter_GetTemp2 - c:@F@KalmanFilter_GetTemp2_Async: - name: KalmanFilter_GetTemp2_Async - c:@F@KalmanFilter_GetTemp3: - name: KalmanFilter_GetTemp3 - c:@F@KalmanFilter_GetTemp3_Async: - name: KalmanFilter_GetTemp3_Async - c:@F@KalmanFilter_GetTemp4: - name: KalmanFilter_GetTemp4 - c:@F@KalmanFilter_GetTemp4_Async: - name: KalmanFilter_GetTemp4_Async - c:@F@KalmanFilter_GetTemp5: - name: KalmanFilter_GetTemp5 - c:@F@KalmanFilter_GetTemp5_Async: - name: KalmanFilter_GetTemp5_Async - c:@F@KalmanFilter_GetTransitionMatrix: - name: KalmanFilter_GetTransitionMatrix - c:@F@KalmanFilter_GetTransitionMatrix_Async: - name: KalmanFilter_GetTransitionMatrix_Async - c:@F@KalmanFilter_Init: - name: KalmanFilter_Init - c:@F@KalmanFilter_InitWithParams: - name: KalmanFilter_InitWithParams - c:@F@KalmanFilter_InitWithParams_Async: - name: KalmanFilter_InitWithParams_Async - c:@F@KalmanFilter_Init_Async: - name: KalmanFilter_Init_Async - c:@F@KalmanFilter_New: - name: KalmanFilter_New - c:@F@KalmanFilter_New_Async: - name: KalmanFilter_New_Async - c:@F@KalmanFilter_Predict: - name: KalmanFilter_Predict - c:@F@KalmanFilter_PredictWithParams: - name: KalmanFilter_PredictWithParams - c:@F@KalmanFilter_PredictWithParams_Async: - name: KalmanFilter_PredictWithParams_Async - c:@F@KalmanFilter_Predict_Async: - name: KalmanFilter_Predict_Async - c:@F@KalmanFilter_SetControlMatrix: - name: KalmanFilter_SetControlMatrix - c:@F@KalmanFilter_SetControlMatrix_Async: - name: KalmanFilter_SetControlMatrix_Async - c:@F@KalmanFilter_SetErrorCovPost: - name: KalmanFilter_SetErrorCovPost - c:@F@KalmanFilter_SetErrorCovPost_Async: - name: KalmanFilter_SetErrorCovPost_Async - c:@F@KalmanFilter_SetErrorCovPre: - name: KalmanFilter_SetErrorCovPre - c:@F@KalmanFilter_SetErrorCovPre_Async: - name: KalmanFilter_SetErrorCovPre_Async - c:@F@KalmanFilter_SetGain: - name: KalmanFilter_SetGain - c:@F@KalmanFilter_SetGain_Async: - name: KalmanFilter_SetGain_Async - c:@F@KalmanFilter_SetMeasurementMatrix: - name: KalmanFilter_SetMeasurementMatrix - c:@F@KalmanFilter_SetMeasurementMatrix_Async: - name: KalmanFilter_SetMeasurementMatrix_Async - c:@F@KalmanFilter_SetMeasurementNoiseCov: - name: KalmanFilter_SetMeasurementNoiseCov - c:@F@KalmanFilter_SetMeasurementNoiseCov_Async: - name: KalmanFilter_SetMeasurementNoiseCov_Async - c:@F@KalmanFilter_SetProcessNoiseCov: - name: KalmanFilter_SetProcessNoiseCov - c:@F@KalmanFilter_SetProcessNoiseCov_Async: - name: KalmanFilter_SetProcessNoiseCov_Async - c:@F@KalmanFilter_SetStatePost: - name: KalmanFilter_SetStatePost - c:@F@KalmanFilter_SetStatePost_Async: - name: KalmanFilter_SetStatePost_Async - c:@F@KalmanFilter_SetStatePre: - name: KalmanFilter_SetStatePre - c:@F@KalmanFilter_SetStatePre_Async: - name: KalmanFilter_SetStatePre_Async - c:@F@KalmanFilter_SetTransitionMatrix: - name: KalmanFilter_SetTransitionMatrix - c:@F@KalmanFilter_SetTransitionMatrix_Async: - name: KalmanFilter_SetTransitionMatrix_Async - c:@F@TrackerMIL_Close: - name: TrackerMIL_Close - c:@F@TrackerMIL_Create: - name: TrackerMIL_Create - c:@F@TrackerMIL_Create_Async: - name: TrackerMIL_Create_Async - c:@F@TrackerMIL_Init: - name: TrackerMIL_Init - c:@F@TrackerMIL_Init_Async: - name: TrackerMIL_Init_Async - c:@F@TrackerMIL_Update: - name: TrackerMIL_Update - c:@F@TrackerMIL_Update_Async: - name: TrackerMIL_Update_Async + c:@F@cv_BackgroundSubtractorKNN_apply: + name: cv_BackgroundSubtractorKNN_apply + c:@F@cv_BackgroundSubtractorKNN_close: + name: cv_BackgroundSubtractorKNN_close + c:@F@cv_BackgroundSubtractorKNN_create: + name: cv_BackgroundSubtractorKNN_create + c:@F@cv_BackgroundSubtractorKNN_create_1: + name: cv_BackgroundSubtractorKNN_create_1 + c:@F@cv_BackgroundSubtractorMOG2_apply: + name: cv_BackgroundSubtractorMOG2_apply + c:@F@cv_BackgroundSubtractorMOG2_close: + name: cv_BackgroundSubtractorMOG2_close + c:@F@cv_BackgroundSubtractorMOG2_create: + name: cv_BackgroundSubtractorMOG2_create + c:@F@cv_BackgroundSubtractorMOG2_create_1: + name: cv_BackgroundSubtractorMOG2_create_1 + c:@F@cv_KalmanFilter_close: + name: cv_KalmanFilter_close + c:@F@cv_KalmanFilter_correct: + name: cv_KalmanFilter_correct + c:@F@cv_KalmanFilter_create: + name: cv_KalmanFilter_create + c:@F@cv_KalmanFilter_get_controlMatrix: + name: cv_KalmanFilter_get_controlMatrix + c:@F@cv_KalmanFilter_get_errorCovPost: + name: cv_KalmanFilter_get_errorCovPost + c:@F@cv_KalmanFilter_get_errorCovPre: + name: cv_KalmanFilter_get_errorCovPre + c:@F@cv_KalmanFilter_get_gain: + name: cv_KalmanFilter_get_gain + c:@F@cv_KalmanFilter_get_measurementMatrix: + name: cv_KalmanFilter_get_measurementMatrix + c:@F@cv_KalmanFilter_get_measurementNoiseCov: + name: cv_KalmanFilter_get_measurementNoiseCov + c:@F@cv_KalmanFilter_get_processNoiseCov: + name: cv_KalmanFilter_get_processNoiseCov + c:@F@cv_KalmanFilter_get_statePost: + name: cv_KalmanFilter_get_statePost + c:@F@cv_KalmanFilter_get_statePre: + name: cv_KalmanFilter_get_statePre + c:@F@cv_KalmanFilter_get_temp1: + name: cv_KalmanFilter_get_temp1 + c:@F@cv_KalmanFilter_get_temp2: + name: cv_KalmanFilter_get_temp2 + c:@F@cv_KalmanFilter_get_temp3: + name: cv_KalmanFilter_get_temp3 + c:@F@cv_KalmanFilter_get_temp4: + name: cv_KalmanFilter_get_temp4 + c:@F@cv_KalmanFilter_get_temp5: + name: cv_KalmanFilter_get_temp5 + c:@F@cv_KalmanFilter_get_transitionMatrix: + name: cv_KalmanFilter_get_transitionMatrix + c:@F@cv_KalmanFilter_init: + name: cv_KalmanFilter_init + c:@F@cv_KalmanFilter_init_1: + name: cv_KalmanFilter_init_1 + c:@F@cv_KalmanFilter_predict: + name: cv_KalmanFilter_predict + c:@F@cv_KalmanFilter_predict_1: + name: cv_KalmanFilter_predict_1 + c:@F@cv_KalmanFilter_set_controlMatrix: + name: cv_KalmanFilter_set_controlMatrix + c:@F@cv_KalmanFilter_set_errorCovPost: + name: cv_KalmanFilter_set_errorCovPost + c:@F@cv_KalmanFilter_set_errorCovPre: + name: cv_KalmanFilter_set_errorCovPre + c:@F@cv_KalmanFilter_set_gain: + name: cv_KalmanFilter_set_gain + c:@F@cv_KalmanFilter_set_measurementMatrix: + name: cv_KalmanFilter_set_measurementMatrix + c:@F@cv_KalmanFilter_set_measurementNoiseCov: + name: cv_KalmanFilter_set_measurementNoiseCov + c:@F@cv_KalmanFilter_set_processNoiseCov: + name: cv_KalmanFilter_set_processNoiseCov + c:@F@cv_KalmanFilter_set_statePost: + name: cv_KalmanFilter_set_statePost + c:@F@cv_KalmanFilter_set_statePre: + name: cv_KalmanFilter_set_statePre + c:@F@cv_KalmanFilter_set_transitionMatrix: + name: cv_KalmanFilter_set_transitionMatrix + c:@F@cv_TrackerMIL_close: + name: cv_TrackerMIL_close + c:@F@cv_TrackerMIL_create: + name: cv_TrackerMIL_create + c:@F@cv_TrackerMIL_init: + name: cv_TrackerMIL_init + c:@F@cv_TrackerMIL_update: + name: cv_TrackerMIL_update + c:@F@cv_calcOpticalFlowFarneback: + name: cv_calcOpticalFlowFarneback + c:@F@cv_calcOpticalFlowPyrLK: + name: cv_calcOpticalFlowPyrLK + c:@F@cv_calcOpticalFlowPyrLK_1: + name: cv_calcOpticalFlowPyrLK_1 + c:@F@cv_findTransformECC: + name: cv_findTransformECC c:@S@BackgroundSubtractorKNN: name: BackgroundSubtractorKNN c:@S@BackgroundSubtractorMOG2: diff --git a/packages/dartcv/lib/src/g/videoio.g.dart b/packages/dartcv/lib/src/g/videoio.g.dart index cf88c81c..83a1cba5 100644 --- a/packages/dartcv/lib/src/g/videoio.g.dart +++ b/packages/dartcv/lib/src/g/videoio.g.dart @@ -11,7 +11,7 @@ // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; -import 'package:dartcv/src/g/types.g.dart' as imp1; +import 'package:dartcv4/src/g/types.g.dart' as imp1; /// Native bindings for OpenCV - VideoIO /// @@ -30,658 +30,372 @@ class CvNativeVideoIO { lookup) : _lookup = lookup; - void VideoCapture_Close( + void cv_VideoCapture_close( VideoCapturePtr self, ) { - return _VideoCapture_Close( + return _cv_VideoCapture_close( self, ); } - late final _VideoCapture_ClosePtr = + late final _cv_VideoCapture_closePtr = _lookup>( - 'VideoCapture_Close'); - late final _VideoCapture_Close = - _VideoCapture_ClosePtr.asFunction(); + 'cv_VideoCapture_close'); + late final _cv_VideoCapture_close = + _cv_VideoCapture_closePtr.asFunction(); - ffi.Pointer VideoCapture_Get( - VideoCapture self, - int prop, - ffi.Pointer rval, - ) { - return _VideoCapture_Get( - self, - prop, - rval, - ); - } - - late final _VideoCapture_GetPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, - ffi.Pointer)>>('VideoCapture_Get'); - late final _VideoCapture_Get = _VideoCapture_GetPtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_Get_Async( - VideoCapture self, - int prop, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_Get_Async( - self, - prop, - callback, - ); - } - - late final _VideoCapture_Get_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_Get_Async'); - late final _VideoCapture_Get_Async = _VideoCapture_Get_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_Grab( - VideoCapture self, - int skip, - ) { - return _VideoCapture_Grab( - self, - skip, - ); - } - - late final _VideoCapture_GrabPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, ffi.Int)>>('VideoCapture_Grab'); - late final _VideoCapture_Grab = _VideoCapture_GrabPtr.asFunction< - ffi.Pointer Function(VideoCapture, int)>(); - - ffi.Pointer VideoCapture_Grab_Async( - VideoCapture self, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_Grab_Async( - self, - callback, - ); - } - - late final _VideoCapture_Grab_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, imp1.CvCallback_1)>>('VideoCapture_Grab_Async'); - late final _VideoCapture_Grab_Async = _VideoCapture_Grab_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_IsOpened( - VideoCapture self, - ffi.Pointer rval, - ) { - return _VideoCapture_IsOpened( - self, - rval, - ); - } - - late final _VideoCapture_IsOpenedPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer)>>('VideoCapture_IsOpened'); - late final _VideoCapture_IsOpened = _VideoCapture_IsOpenedPtr.asFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_IsOpened_Async( - VideoCapture self, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_IsOpened_Async( - self, - callback, - ); - } - - late final _VideoCapture_IsOpened_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, imp1.CvCallback_1)>>('VideoCapture_IsOpened_Async'); - late final _VideoCapture_IsOpened_Async = - _VideoCapture_IsOpened_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_New( + ffi.Pointer cv_VideoCapture_create( ffi.Pointer rval, ) { - return _VideoCapture_New( + return _cv_VideoCapture_create( rval, ); } - late final _VideoCapture_NewPtr = _lookup< + late final _cv_VideoCapture_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('VideoCapture_New'); - late final _VideoCapture_New = _VideoCapture_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + ffi.Pointer)>>('cv_VideoCapture_create'); + late final _cv_VideoCapture_create = _cv_VideoCapture_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer VideoCapture_NewFromFile( + ffi.Pointer cv_VideoCapture_create_1( ffi.Pointer filename, int apiPreference, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoCapture_NewFromFile( + return _cv_VideoCapture_create_1( filename, apiPreference, rval, - ); - } - - late final _VideoCapture_NewFromFilePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, - ffi.Pointer)>>('VideoCapture_NewFromFile'); - late final _VideoCapture_NewFromFile = - _VideoCapture_NewFromFilePtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_NewFromFile_Async( - ffi.Pointer filename, - int apiPreference, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_NewFromFile_Async( - filename, - apiPreference, callback, ); } - late final _VideoCapture_NewFromFile_AsyncPtr = _lookup< + late final _cv_VideoCapture_create_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_NewFromFile_Async'); - late final _VideoCapture_NewFromFile_Async = - _VideoCapture_NewFromFile_AsyncPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_NewFromIndex( + ffi.Pointer, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoCapture_create_1'); + late final _cv_VideoCapture_create_1 = + _cv_VideoCapture_create_1Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, int, + ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_VideoCapture_create_2( int index, int apiPreference, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoCapture_NewFromIndex( + return _cv_VideoCapture_create_2( index, apiPreference, rval, + callback, ); } - late final _VideoCapture_NewFromIndexPtr = _lookup< + late final _cv_VideoCapture_create_2Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, - ffi.Pointer)>>('VideoCapture_NewFromIndex'); - late final _VideoCapture_NewFromIndex = - _VideoCapture_NewFromIndexPtr.asFunction< ffi.Pointer Function( - int, int, ffi.Pointer)>(); + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoCapture_create_2'); + late final _cv_VideoCapture_create_2 = + _cv_VideoCapture_create_2Ptr.asFunction< + ffi.Pointer Function( + int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer VideoCapture_NewFromIndex_Async( - int index, - int apiPreference, - imp1.CvCallback_1 callback, + double cv_VideoCapture_get( + VideoCapture self, + int prop, ) { - return _VideoCapture_NewFromIndex_Async( - index, - apiPreference, - callback, + return _cv_VideoCapture_get( + self, + prop, ); } - late final _VideoCapture_NewFromIndex_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_NewFromIndex_Async'); - late final _VideoCapture_NewFromIndex_Async = - _VideoCapture_NewFromIndex_AsyncPtr.asFunction< - ffi.Pointer Function(int, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_New_Async( - imp1.CvCallback_1 callback, + late final _cv_VideoCapture_getPtr = + _lookup>( + 'cv_VideoCapture_get'); + late final _cv_VideoCapture_get = + _cv_VideoCapture_getPtr.asFunction(); + + ffi.Pointer cv_VideoCapture_getBackendName( + VideoCapture self, ) { - return _VideoCapture_New_Async( - callback, + return _cv_VideoCapture_getBackendName( + self, ); } - late final _VideoCapture_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'VideoCapture_New_Async'); - late final _VideoCapture_New_Async = _VideoCapture_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + late final _cv_VideoCapture_getBackendNamePtr = + _lookup Function(VideoCapture)>>( + 'cv_VideoCapture_getBackendName'); + late final _cv_VideoCapture_getBackendName = + _cv_VideoCapture_getBackendNamePtr + .asFunction Function(VideoCapture)>(); - ffi.Pointer VideoCapture_Open( + ffi.Pointer cv_VideoCapture_grab( VideoCapture self, - ffi.Pointer uri, - ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoCapture_Open( + return _cv_VideoCapture_grab( self, - uri, - rval, + callback, ); } - late final _VideoCapture_OpenPtr = _lookup< + late final _cv_VideoCapture_grabPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - ffi.Pointer)>>('VideoCapture_Open'); - late final _VideoCapture_Open = _VideoCapture_OpenPtr.asFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer Function( + VideoCapture, imp1.CvCallback_0)>>('cv_VideoCapture_grab'); + late final _cv_VideoCapture_grab = _cv_VideoCapture_grabPtr.asFunction< + ffi.Pointer Function(VideoCapture, imp1.CvCallback_0)>(); - ffi.Pointer VideoCapture_OpenDevice( + bool cv_VideoCapture_isOpened( VideoCapture self, - int device, - ffi.Pointer rval, ) { - return _VideoCapture_OpenDevice( + return _cv_VideoCapture_isOpened( self, - device, - rval, ); } - late final _VideoCapture_OpenDevicePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, - ffi.Pointer)>>('VideoCapture_OpenDevice'); - late final _VideoCapture_OpenDevice = _VideoCapture_OpenDevicePtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, ffi.Pointer)>(); + late final _cv_VideoCapture_isOpenedPtr = + _lookup>( + 'cv_VideoCapture_isOpened'); + late final _cv_VideoCapture_isOpened = + _cv_VideoCapture_isOpenedPtr.asFunction(); - ffi.Pointer VideoCapture_OpenDeviceWithAPI( + ffi.Pointer cv_VideoCapture_open( VideoCapture self, - int device, - int apiPreference, + ffi.Pointer uri, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoCapture_OpenDeviceWithAPI( + return _cv_VideoCapture_open( self, - device, - apiPreference, + uri, rval, + callback, ); } - late final _VideoCapture_OpenDeviceWithAPIPtr = _lookup< + late final _cv_VideoCapture_openPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Int, - ffi.Pointer)>>('VideoCapture_OpenDeviceWithAPI'); - late final _VideoCapture_OpenDeviceWithAPI = - _VideoCapture_OpenDeviceWithAPIPtr.asFunction< ffi.Pointer Function( - VideoCapture, int, int, ffi.Pointer)>(); + VideoCapture, + ffi.Pointer, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoCapture_open'); + late final _cv_VideoCapture_open = _cv_VideoCapture_openPtr.asFunction< + ffi.Pointer Function(VideoCapture, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer VideoCapture_OpenDeviceWithAPI_Async( + ffi.Pointer cv_VideoCapture_open_1( VideoCapture self, - int device, + ffi.Pointer uri, int apiPreference, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoCapture_OpenDeviceWithAPI_Async( + return _cv_VideoCapture_open_1( self, - device, + uri, apiPreference, + rval, callback, ); } - late final _VideoCapture_OpenDeviceWithAPI_AsyncPtr = _lookup< + late final _cv_VideoCapture_open_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_OpenDeviceWithAPI_Async'); - late final _VideoCapture_OpenDeviceWithAPI_Async = - _VideoCapture_OpenDeviceWithAPI_AsyncPtr.asFunction< ffi.Pointer Function( - VideoCapture, int, int, imp1.CvCallback_1)>(); + VideoCapture, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoCapture_open_1'); + late final _cv_VideoCapture_open_1 = _cv_VideoCapture_open_1Ptr.asFunction< + ffi.Pointer Function(VideoCapture, ffi.Pointer, int, + ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer VideoCapture_OpenDevice_Async( + ffi.Pointer cv_VideoCapture_open_2( VideoCapture self, int device, - imp1.CvCallback_1 callback, + ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoCapture_OpenDevice_Async( + return _cv_VideoCapture_open_2( self, device, + rval, callback, ); } - late final _VideoCapture_OpenDevice_AsyncPtr = _lookup< + late final _cv_VideoCapture_open_2Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, - imp1.CvCallback_1)>>('VideoCapture_OpenDevice_Async'); - late final _VideoCapture_OpenDevice_Async = - _VideoCapture_OpenDevice_AsyncPtr.asFunction< ffi.Pointer Function( - VideoCapture, int, imp1.CvCallback_1)>(); + VideoCapture, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoCapture_open_2'); + late final _cv_VideoCapture_open_2 = _cv_VideoCapture_open_2Ptr.asFunction< + ffi.Pointer Function( + VideoCapture, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer VideoCapture_OpenWithAPI( + ffi.Pointer cv_VideoCapture_open_3( VideoCapture self, - ffi.Pointer uri, + int device, int apiPreference, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoCapture_OpenWithAPI( + return _cv_VideoCapture_open_3( self, - uri, + device, apiPreference, rval, - ); - } - - late final _VideoCapture_OpenWithAPIPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - ffi.Int, ffi.Pointer)>>('VideoCapture_OpenWithAPI'); - late final _VideoCapture_OpenWithAPI = - _VideoCapture_OpenWithAPIPtr.asFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - int, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_OpenWithAPI_Async( - VideoCapture self, - ffi.Pointer uri, - int apiPreference, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_OpenWithAPI_Async( - self, - uri, - apiPreference, callback, ); } - late final _VideoCapture_OpenWithAPI_AsyncPtr = _lookup< + late final _cv_VideoCapture_open_3Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - ffi.Int, imp1.CvCallback_1)>>('VideoCapture_OpenWithAPI_Async'); - late final _VideoCapture_OpenWithAPI_Async = - _VideoCapture_OpenWithAPI_AsyncPtr.asFunction< ffi.Pointer Function( - VideoCapture, ffi.Pointer, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoCapture_Open_Async( - VideoCapture self, - ffi.Pointer uri, - imp1.CvCallback_1 callback, - ) { - return _VideoCapture_Open_Async( - self, - uri, - callback, - ); - } - - late final _VideoCapture_Open_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Pointer, - imp1.CvCallback_1)>>('VideoCapture_Open_Async'); - late final _VideoCapture_Open_Async = _VideoCapture_Open_AsyncPtr.asFunction< + VideoCapture, + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoCapture_open_3'); + late final _cv_VideoCapture_open_3 = _cv_VideoCapture_open_3Ptr.asFunction< ffi.Pointer Function( - VideoCapture, ffi.Pointer, imp1.CvCallback_1)>(); + VideoCapture, int, int, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer VideoCapture_Read( + ffi.Pointer cv_VideoCapture_read( VideoCapture self, Mat buf, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoCapture_Read( + return _cv_VideoCapture_read( self, buf, rval, - ); - } - - late final _VideoCapture_ReadPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, Mat, ffi.Pointer)>>('VideoCapture_Read'); - late final _VideoCapture_Read = _VideoCapture_ReadPtr.asFunction< - ffi.Pointer Function( - VideoCapture, Mat, ffi.Pointer)>(); - - ffi.Pointer VideoCapture_Read_Async( - VideoCapture self, - imp1.CvCallback_2 callback, - ) { - return _VideoCapture_Read_Async( - self, callback, ); } - late final _VideoCapture_Read_AsyncPtr = _lookup< + late final _cv_VideoCapture_readPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VideoCapture, imp1.CvCallback_2)>>('VideoCapture_Read_Async'); - late final _VideoCapture_Read_Async = _VideoCapture_Read_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, imp1.CvCallback_2)>(); + VideoCapture, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoCapture_read'); + late final _cv_VideoCapture_read = _cv_VideoCapture_readPtr.asFunction< + ffi.Pointer Function( + VideoCapture, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer VideoCapture_Release( + ffi.Pointer cv_VideoCapture_release( VideoCapture self, ) { - return _VideoCapture_Release( + return _cv_VideoCapture_release( self, ); } - late final _VideoCapture_ReleasePtr = + late final _cv_VideoCapture_releasePtr = _lookup Function(VideoCapture)>>( - 'VideoCapture_Release'); - late final _VideoCapture_Release = _VideoCapture_ReleasePtr.asFunction< - ffi.Pointer Function(VideoCapture)>(); + 'cv_VideoCapture_release'); + late final _cv_VideoCapture_release = _cv_VideoCapture_releasePtr + .asFunction Function(VideoCapture)>(); - ffi.Pointer VideoCapture_Release_Async( + ffi.Pointer cv_VideoCapture_retrieve( VideoCapture self, + Mat image, + int flag, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _VideoCapture_Release_Async( + return _cv_VideoCapture_retrieve( self, + image, + flag, + rval, callback, ); } - late final _VideoCapture_Release_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, imp1.CvCallback_0)>>('VideoCapture_Release_Async'); - late final _VideoCapture_Release_Async = - _VideoCapture_Release_AsyncPtr.asFunction< - ffi.Pointer Function(VideoCapture, imp1.CvCallback_0)>(); - - ffi.Pointer VideoCapture_Set( - VideoCapture self, - int prop, - double param, - ) { - return _VideoCapture_Set( - self, - prop, - param, - ); - } - - late final _VideoCapture_SetPtr = _lookup< + late final _cv_VideoCapture_retrievePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VideoCapture, ffi.Int, ffi.Double)>>('VideoCapture_Set'); - late final _VideoCapture_Set = _VideoCapture_SetPtr.asFunction< - ffi.Pointer Function(VideoCapture, int, double)>(); - - ffi.Pointer VideoCapture_Set_Async( + VideoCapture, + Mat, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoCapture_retrieve'); + late final _cv_VideoCapture_retrieve = + _cv_VideoCapture_retrievePtr.asFunction< + ffi.Pointer Function(VideoCapture, Mat, int, + ffi.Pointer, imp1.CvCallback_0)>(); + + void cv_VideoCapture_set( VideoCapture self, int prop, - double param, - imp1.CvCallback_1 callback, + double val, ) { - return _VideoCapture_Set_Async( + return _cv_VideoCapture_set( self, prop, - param, - callback, + val, ); } - late final _VideoCapture_Set_AsyncPtr = _lookup< + late final _cv_VideoCapture_setPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VideoCapture, ffi.Int, ffi.Double, - imp1.CvCallback_1)>>('VideoCapture_Set_Async'); - late final _VideoCapture_Set_Async = _VideoCapture_Set_AsyncPtr.asFunction< - ffi.Pointer Function( - VideoCapture, int, double, imp1.CvCallback_1)>(); + ffi.Void Function( + VideoCapture, ffi.Int, ffi.Double)>>('cv_VideoCapture_set'); + late final _cv_VideoCapture_set = _cv_VideoCapture_setPtr + .asFunction(); - ffi.Pointer VideoCapture_getBackendName( - VideoCapture self, - ffi.Pointer> rval, - ) { - return _VideoCapture_getBackendName( - self, - rval, - ); - } - - late final _VideoCapture_getBackendNamePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer>)>>( - 'VideoCapture_getBackendName'); - late final _VideoCapture_getBackendName = - _VideoCapture_getBackendNamePtr.asFunction< - ffi.Pointer Function( - VideoCapture, ffi.Pointer>)>(); - - void VideoWriter_Close( + void cv_VideoWriter_close( VideoWriterPtr self, ) { - return _VideoWriter_Close( + return _cv_VideoWriter_close( self, ); } - late final _VideoWriter_ClosePtr = + late final _cv_VideoWriter_closePtr = _lookup>( - 'VideoWriter_Close'); - late final _VideoWriter_Close = - _VideoWriter_ClosePtr.asFunction(); - - ffi.Pointer VideoWriter_Fourcc( - int c1, - int c2, - int c3, - int c4, - ffi.Pointer rval, - ) { - return _VideoWriter_Fourcc( - c1, - c2, - c3, - c4, - rval, - ); - } - - late final _VideoWriter_FourccPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Char, ffi.Char, ffi.Char, ffi.Char, - ffi.Pointer)>>('VideoWriter_Fourcc'); - late final _VideoWriter_Fourcc = _VideoWriter_FourccPtr.asFunction< - ffi.Pointer Function( - int, int, int, int, ffi.Pointer)>(); - - ffi.Pointer VideoWriter_Fourcc_Async( - int c1, - int c2, - int c3, - int c4, - imp1.CvCallback_1 callback, - ) { - return _VideoWriter_Fourcc_Async( - c1, - c2, - c3, - c4, - callback, - ); - } + 'cv_VideoWriter_close'); + late final _cv_VideoWriter_close = + _cv_VideoWriter_closePtr.asFunction(); - late final _VideoWriter_Fourcc_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Char, ffi.Char, ffi.Char, ffi.Char, - imp1.CvCallback_1)>>('VideoWriter_Fourcc_Async'); - late final _VideoWriter_Fourcc_Async = - _VideoWriter_Fourcc_AsyncPtr.asFunction< - ffi.Pointer Function( - int, int, int, int, imp1.CvCallback_1)>(); - - ffi.Pointer VideoWriter_IsOpened( - VideoWriter self, - ffi.Pointer rval, - ) { - return _VideoWriter_IsOpened( - self, - rval, - ); - } - - late final _VideoWriter_IsOpenedPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, ffi.Pointer)>>('VideoWriter_IsOpened'); - late final _VideoWriter_IsOpened = _VideoWriter_IsOpenedPtr.asFunction< - ffi.Pointer Function(VideoWriter, ffi.Pointer)>(); - - ffi.Pointer VideoWriter_IsOpened_Async( - VideoWriter self, - imp1.CvCallback_1 callback, - ) { - return _VideoWriter_IsOpened_Async( - self, - callback, - ); - } - - late final _VideoWriter_IsOpened_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, imp1.CvCallback_1)>>('VideoWriter_IsOpened_Async'); - late final _VideoWriter_IsOpened_Async = - _VideoWriter_IsOpened_AsyncPtr.asFunction< - ffi.Pointer Function(VideoWriter, imp1.CvCallback_1)>(); - - ffi.Pointer VideoWriter_New( + ffi.Pointer cv_VideoWriter_create( ffi.Pointer rval, ) { - return _VideoWriter_New( + return _cv_VideoWriter_create( rval, ); } - late final _VideoWriter_NewPtr = _lookup< + late final _cv_VideoWriter_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer)>>('VideoWriter_New'); - late final _VideoWriter_New = _VideoWriter_NewPtr.asFunction< - ffi.Pointer Function(ffi.Pointer)>(); + ffi.Pointer)>>('cv_VideoWriter_create'); + late final _cv_VideoWriter_create = _cv_VideoWriter_createPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer VideoWriter_NewFromFile( + ffi.Pointer cv_VideoWriter_create_1( ffi.Pointer name, int fourcc, double fps, @@ -689,8 +403,9 @@ class CvNativeVideoIO { int height, bool isColor, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoWriter_NewFromFile( + return _cv_VideoWriter_create_1( name, fourcc, fps, @@ -698,10 +413,11 @@ class CvNativeVideoIO { height, isColor, rval, + callback, ); } - late final _VideoWriter_NewFromFilePtr = _lookup< + late final _cv_VideoWriter_create_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer, @@ -710,12 +426,13 @@ class CvNativeVideoIO { ffi.Int, ffi.Int, ffi.Bool, - ffi.Pointer)>>('VideoWriter_NewFromFile'); - late final _VideoWriter_NewFromFile = _VideoWriter_NewFromFilePtr.asFunction< + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoWriter_create_1'); + late final _cv_VideoWriter_create_1 = _cv_VideoWriter_create_1Ptr.asFunction< ffi.Pointer Function(ffi.Pointer, int, double, int, - int, bool, ffi.Pointer)>(); + int, bool, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer VideoWriter_NewFromFile_1( + ffi.Pointer cv_VideoWriter_create_2( ffi.Pointer name, int apiPreference, int fourcc, @@ -724,8 +441,9 @@ class CvNativeVideoIO { int height, bool isColor, ffi.Pointer rval, + imp1.CvCallback_0 callback, ) { - return _VideoWriter_NewFromFile_1( + return _cv_VideoWriter_create_2( name, apiPreference, fourcc, @@ -734,10 +452,11 @@ class CvNativeVideoIO { height, isColor, rval, + callback, ); } - late final _VideoWriter_NewFromFile_1Ptr = _lookup< + late final _cv_VideoWriter_create_2Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( ffi.Pointer, @@ -747,112 +466,114 @@ class CvNativeVideoIO { ffi.Int, ffi.Int, ffi.Bool, - ffi.Pointer)>>('VideoWriter_NewFromFile_1'); - late final _VideoWriter_NewFromFile_1 = - _VideoWriter_NewFromFile_1Ptr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, int, - double, int, int, bool, ffi.Pointer)>(); - - ffi.Pointer VideoWriter_New_Async( - imp1.CvCallback_1 callback, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_VideoWriter_create_2'); + late final _cv_VideoWriter_create_2 = _cv_VideoWriter_create_2Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, int, int, double, + int, int, bool, ffi.Pointer, imp1.CvCallback_0)>(); + + int cv_VideoWriter_fourcc( + int c1, + int c2, + int c3, + int c4, ) { - return _VideoWriter_New_Async( - callback, + return _cv_VideoWriter_fourcc( + c1, + c2, + c3, + c4, ); } - late final _VideoWriter_New_AsyncPtr = _lookup< - ffi - .NativeFunction Function(imp1.CvCallback_1)>>( - 'VideoWriter_New_Async'); - late final _VideoWriter_New_Async = _VideoWriter_New_AsyncPtr.asFunction< - ffi.Pointer Function(imp1.CvCallback_1)>(); + late final _cv_VideoWriter_fourccPtr = _lookup< + ffi.NativeFunction< + ffi.Int Function(ffi.Char, ffi.Char, ffi.Char, + ffi.Char)>>('cv_VideoWriter_fourcc'); + late final _cv_VideoWriter_fourcc = + _cv_VideoWriter_fourccPtr.asFunction(); - ffi.Pointer VideoWriter_Open( + ffi.Pointer cv_VideoWriter_getBackendName( VideoWriter self, - ffi.Pointer name, - int fourcc, - double fps, - int width, - int height, - bool isColor, ) { - return _VideoWriter_Open( + return _cv_VideoWriter_getBackendName( self, - name, - fourcc, - fps, - width, - height, - isColor, ); } - late final _VideoWriter_OpenPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, - ffi.Pointer, - ffi.Int, - ffi.Double, - ffi.Int, - ffi.Int, - ffi.Bool)>>('VideoWriter_Open'); - late final _VideoWriter_Open = _VideoWriter_OpenPtr.asFunction< - ffi.Pointer Function( - VideoWriter, ffi.Pointer, int, double, int, int, bool)>(); + late final _cv_VideoWriter_getBackendNamePtr = + _lookup Function(VideoWriter)>>( + 'cv_VideoWriter_getBackendName'); + late final _cv_VideoWriter_getBackendName = _cv_VideoWriter_getBackendNamePtr + .asFunction Function(VideoWriter)>(); + + bool cv_VideoWriter_isOpened( + VideoWriter self, + ) { + return _cv_VideoWriter_isOpened( + self, + ); + } + + late final _cv_VideoWriter_isOpenedPtr = + _lookup>( + 'cv_VideoWriter_isOpened'); + late final _cv_VideoWriter_isOpened = + _cv_VideoWriter_isOpenedPtr.asFunction(); - ffi.Pointer VideoWriter_Open_1( + ffi.Pointer cv_VideoWriter_open( VideoWriter self, ffi.Pointer name, - int apiPreference, int fourcc, double fps, int width, int height, bool isColor, + imp1.CvCallback_0 callback, ) { - return _VideoWriter_Open_1( + return _cv_VideoWriter_open( self, name, - apiPreference, fourcc, fps, width, height, isColor, + callback, ); } - late final _VideoWriter_Open_1Ptr = _lookup< + late final _cv_VideoWriter_openPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VideoWriter, ffi.Pointer, ffi.Int, - ffi.Int, ffi.Double, ffi.Int, ffi.Int, - ffi.Bool)>>('VideoWriter_Open_1'); - late final _VideoWriter_Open_1 = _VideoWriter_Open_1Ptr.asFunction< + ffi.Bool, + imp1.CvCallback_0)>>('cv_VideoWriter_open'); + late final _cv_VideoWriter_open = _cv_VideoWriter_openPtr.asFunction< ffi.Pointer Function(VideoWriter, ffi.Pointer, int, - int, double, int, int, bool)>(); + double, int, int, bool, imp1.CvCallback_0)>(); - ffi.Pointer VideoWriter_Open_Async( + ffi.Pointer cv_VideoWriter_open_1( VideoWriter self, ffi.Pointer name, - ffi.Pointer codec, + int apiPreference, + int fourcc, double fps, int width, int height, bool isColor, - imp1.CvCallback_1 callback, + imp1.CvCallback_0 callback, ) { - return _VideoWriter_Open_Async( + return _cv_VideoWriter_open_1( self, name, - codec, + apiPreference, + fourcc, fps, width, height, @@ -861,108 +582,55 @@ class CvNativeVideoIO { ); } - late final _VideoWriter_Open_AsyncPtr = _lookup< + late final _cv_VideoWriter_open_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( VideoWriter, ffi.Pointer, - ffi.Pointer, + ffi.Int, + ffi.Int, ffi.Double, ffi.Int, ffi.Int, ffi.Bool, - imp1.CvCallback_1)>>('VideoWriter_Open_Async'); - late final _VideoWriter_Open_Async = _VideoWriter_Open_AsyncPtr.asFunction< - ffi.Pointer Function(VideoWriter, ffi.Pointer, - ffi.Pointer, double, int, int, bool, imp1.CvCallback_1)>(); + imp1.CvCallback_0)>>('cv_VideoWriter_open_1'); + late final _cv_VideoWriter_open_1 = _cv_VideoWriter_open_1Ptr.asFunction< + ffi.Pointer Function(VideoWriter, ffi.Pointer, int, + int, double, int, int, bool, imp1.CvCallback_0)>(); - ffi.Pointer VideoWriter_Release( + ffi.Pointer cv_VideoWriter_release( VideoWriter self, ) { - return _VideoWriter_Release( + return _cv_VideoWriter_release( self, ); } - late final _VideoWriter_ReleasePtr = + late final _cv_VideoWriter_releasePtr = _lookup Function(VideoWriter)>>( - 'VideoWriter_Release'); - late final _VideoWriter_Release = _VideoWriter_ReleasePtr.asFunction< - ffi.Pointer Function(VideoWriter)>(); - - ffi.Pointer VideoWriter_Release_Async( - VideoWriter self, - imp1.CvCallback_0 callback, - ) { - return _VideoWriter_Release_Async( - self, - callback, - ); - } + 'cv_VideoWriter_release'); + late final _cv_VideoWriter_release = _cv_VideoWriter_releasePtr + .asFunction Function(VideoWriter)>(); - late final _VideoWriter_Release_AsyncPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, imp1.CvCallback_0)>>('VideoWriter_Release_Async'); - late final _VideoWriter_Release_Async = - _VideoWriter_Release_AsyncPtr.asFunction< - ffi.Pointer Function(VideoWriter, imp1.CvCallback_0)>(); - - ffi.Pointer VideoWriter_Write( - VideoWriter self, - Mat img, - ) { - return _VideoWriter_Write( - self, - img, - ); - } - - late final _VideoWriter_WritePtr = _lookup< - ffi.NativeFunction Function(VideoWriter, Mat)>>( - 'VideoWriter_Write'); - late final _VideoWriter_Write = _VideoWriter_WritePtr.asFunction< - ffi.Pointer Function(VideoWriter, Mat)>(); - - ffi.Pointer VideoWriter_Write_Async( + ffi.Pointer cv_VideoWriter_write( VideoWriter self, Mat img, imp1.CvCallback_0 callback, ) { - return _VideoWriter_Write_Async( + return _cv_VideoWriter_write( self, img, callback, ); } - late final _VideoWriter_Write_AsyncPtr = _lookup< + late final _cv_VideoWriter_writePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - VideoWriter, Mat, imp1.CvCallback_0)>>('VideoWriter_Write_Async'); - late final _VideoWriter_Write_Async = _VideoWriter_Write_AsyncPtr.asFunction< + VideoWriter, Mat, imp1.CvCallback_0)>>('cv_VideoWriter_write'); + late final _cv_VideoWriter_write = _cv_VideoWriter_writePtr.asFunction< ffi.Pointer Function(VideoWriter, Mat, imp1.CvCallback_0)>(); - ffi.Pointer VideoWriter_getBackendName( - VideoWriter self, - ffi.Pointer> rval, - ) { - return _VideoWriter_getBackendName( - self, - rval, - ); - } - - late final _VideoWriter_getBackendNamePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - VideoWriter, ffi.Pointer>)>>( - 'VideoWriter_getBackendName'); - late final _VideoWriter_getBackendName = - _VideoWriter_getBackendNamePtr.asFunction< - ffi.Pointer Function( - VideoWriter, ffi.Pointer>)>(); - late final addresses = _SymbolAddresses(this); } @@ -970,9 +638,9 @@ class _SymbolAddresses { final CvNativeVideoIO _library; _SymbolAddresses(this._library); ffi.Pointer> - get VideoCapture_Close => _library._VideoCapture_ClosePtr; + get cv_VideoCapture_close => _library._cv_VideoCapture_closePtr; ffi.Pointer> - get VideoWriter_Close => _library._VideoWriter_ClosePtr; + get cv_VideoWriter_close => _library._cv_VideoWriter_closePtr; } typedef CvStatus = imp1.CvStatus; diff --git a/packages/dartcv/lib/src/g/videoio.yaml b/packages/dartcv/lib/src/g/videoio.yaml index 5bb5f4f1..b1906b51 100644 --- a/packages/dartcv/lib/src/g/videoio.yaml +++ b/packages/dartcv/lib/src/g/videoio.yaml @@ -1,99 +1,63 @@ format_version: 1.0.0 files: - package:dartcv/src/g/videoio.g.dart: + package:dartcv4/src/g/videoio.g.dart: used-config: ffi-native: false symbols: - c:@F@VideoCapture_Close: - name: VideoCapture_Close - c:@F@VideoCapture_Get: - name: VideoCapture_Get - c:@F@VideoCapture_Get_Async: - name: VideoCapture_Get_Async - c:@F@VideoCapture_Grab: - name: VideoCapture_Grab - c:@F@VideoCapture_Grab_Async: - name: VideoCapture_Grab_Async - c:@F@VideoCapture_IsOpened: - name: VideoCapture_IsOpened - c:@F@VideoCapture_IsOpened_Async: - name: VideoCapture_IsOpened_Async - c:@F@VideoCapture_New: - name: VideoCapture_New - c:@F@VideoCapture_NewFromFile: - name: VideoCapture_NewFromFile - c:@F@VideoCapture_NewFromFile_Async: - name: VideoCapture_NewFromFile_Async - c:@F@VideoCapture_NewFromIndex: - name: VideoCapture_NewFromIndex - c:@F@VideoCapture_NewFromIndex_Async: - name: VideoCapture_NewFromIndex_Async - c:@F@VideoCapture_New_Async: - name: VideoCapture_New_Async - c:@F@VideoCapture_Open: - name: VideoCapture_Open - c:@F@VideoCapture_OpenDevice: - name: VideoCapture_OpenDevice - c:@F@VideoCapture_OpenDeviceWithAPI: - name: VideoCapture_OpenDeviceWithAPI - c:@F@VideoCapture_OpenDeviceWithAPI_Async: - name: VideoCapture_OpenDeviceWithAPI_Async - c:@F@VideoCapture_OpenDevice_Async: - name: VideoCapture_OpenDevice_Async - c:@F@VideoCapture_OpenWithAPI: - name: VideoCapture_OpenWithAPI - c:@F@VideoCapture_OpenWithAPI_Async: - name: VideoCapture_OpenWithAPI_Async - c:@F@VideoCapture_Open_Async: - name: VideoCapture_Open_Async - c:@F@VideoCapture_Read: - name: VideoCapture_Read - c:@F@VideoCapture_Read_Async: - name: VideoCapture_Read_Async - c:@F@VideoCapture_Release: - name: VideoCapture_Release - c:@F@VideoCapture_Release_Async: - name: VideoCapture_Release_Async - c:@F@VideoCapture_Set: - name: VideoCapture_Set - c:@F@VideoCapture_Set_Async: - name: VideoCapture_Set_Async - c:@F@VideoCapture_getBackendName: - name: VideoCapture_getBackendName - c:@F@VideoWriter_Close: - name: VideoWriter_Close - c:@F@VideoWriter_Fourcc: - name: VideoWriter_Fourcc - c:@F@VideoWriter_Fourcc_Async: - name: VideoWriter_Fourcc_Async - c:@F@VideoWriter_IsOpened: - name: VideoWriter_IsOpened - c:@F@VideoWriter_IsOpened_Async: - name: VideoWriter_IsOpened_Async - c:@F@VideoWriter_New: - name: VideoWriter_New - c:@F@VideoWriter_NewFromFile: - name: VideoWriter_NewFromFile - c:@F@VideoWriter_NewFromFile_1: - name: VideoWriter_NewFromFile_1 - c:@F@VideoWriter_New_Async: - name: VideoWriter_New_Async - c:@F@VideoWriter_Open: - name: VideoWriter_Open - c:@F@VideoWriter_Open_1: - name: VideoWriter_Open_1 - c:@F@VideoWriter_Open_Async: - name: VideoWriter_Open_Async - c:@F@VideoWriter_Release: - name: VideoWriter_Release - c:@F@VideoWriter_Release_Async: - name: VideoWriter_Release_Async - c:@F@VideoWriter_Write: - name: VideoWriter_Write - c:@F@VideoWriter_Write_Async: - name: VideoWriter_Write_Async - c:@F@VideoWriter_getBackendName: - name: VideoWriter_getBackendName + c:@F@cv_VideoCapture_close: + name: cv_VideoCapture_close + c:@F@cv_VideoCapture_create: + name: cv_VideoCapture_create + c:@F@cv_VideoCapture_create_1: + name: cv_VideoCapture_create_1 + c:@F@cv_VideoCapture_create_2: + name: cv_VideoCapture_create_2 + c:@F@cv_VideoCapture_get: + name: cv_VideoCapture_get + c:@F@cv_VideoCapture_getBackendName: + name: cv_VideoCapture_getBackendName + c:@F@cv_VideoCapture_grab: + name: cv_VideoCapture_grab + c:@F@cv_VideoCapture_isOpened: + name: cv_VideoCapture_isOpened + c:@F@cv_VideoCapture_open: + name: cv_VideoCapture_open + c:@F@cv_VideoCapture_open_1: + name: cv_VideoCapture_open_1 + c:@F@cv_VideoCapture_open_2: + name: cv_VideoCapture_open_2 + c:@F@cv_VideoCapture_open_3: + name: cv_VideoCapture_open_3 + c:@F@cv_VideoCapture_read: + name: cv_VideoCapture_read + c:@F@cv_VideoCapture_release: + name: cv_VideoCapture_release + c:@F@cv_VideoCapture_retrieve: + name: cv_VideoCapture_retrieve + c:@F@cv_VideoCapture_set: + name: cv_VideoCapture_set + c:@F@cv_VideoWriter_close: + name: cv_VideoWriter_close + c:@F@cv_VideoWriter_create: + name: cv_VideoWriter_create + c:@F@cv_VideoWriter_create_1: + name: cv_VideoWriter_create_1 + c:@F@cv_VideoWriter_create_2: + name: cv_VideoWriter_create_2 + c:@F@cv_VideoWriter_fourcc: + name: cv_VideoWriter_fourcc + c:@F@cv_VideoWriter_getBackendName: + name: cv_VideoWriter_getBackendName + c:@F@cv_VideoWriter_isOpened: + name: cv_VideoWriter_isOpened + c:@F@cv_VideoWriter_open: + name: cv_VideoWriter_open + c:@F@cv_VideoWriter_open_1: + name: cv_VideoWriter_open_1 + c:@F@cv_VideoWriter_release: + name: cv_VideoWriter_release + c:@F@cv_VideoWriter_write: + name: cv_VideoWriter_write c:@S@VideoCapture: name: VideoCapture c:@S@VideoWriter: diff --git a/packages/dartcv/pubspec.yaml b/packages/dartcv/pubspec.yaml index 2275f2dc..70c5e160 100644 --- a/packages/dartcv/pubspec.yaml +++ b/packages/dartcv/pubspec.yaml @@ -1,4 +1,4 @@ -name: dartcv +name: dartcv4 description: | OpenCV bindings for Dart language. dartcv is for pure dart only, diff --git a/packages/dartcv/test/calib3d_test.dart b/packages/dartcv/test/calib3d_test.dart index 2b694d5c..6f89e2a4 100644 --- a/packages/dartcv/test/calib3d_test.dart +++ b/packages/dartcv/test/calib3d_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/contrib/aruco_async_test.dart b/packages/dartcv/test/contrib/aruco_async_test.dart index b4d9902e..0dcad450 100644 --- a/packages/dartcv/test/contrib/aruco_async_test.dart +++ b/packages/dartcv/test/contrib/aruco_async_test.dart @@ -1,5 +1,5 @@ // ignore_for_file: constant_identifier_names -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; const arucoImage6x6_250 = "test/images/aruco_6X6_250_6.png"; diff --git a/packages/dartcv/test/contrib/aruco_test.dart b/packages/dartcv/test/contrib/aruco_test.dart index ecd8454b..12ed030a 100644 --- a/packages/dartcv/test/contrib/aruco_test.dart +++ b/packages/dartcv/test/contrib/aruco_test.dart @@ -1,5 +1,5 @@ // ignore_for_file: constant_identifier_names -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; const arucoImage6x6_250 = "test/images/aruco_6X6_250_6.png"; diff --git a/packages/dartcv/test/contrib/img_hash_async_test.dart b/packages/dartcv/test/contrib/img_hash_async_test.dart index 27bade4d..d204bbdd 100644 --- a/packages/dartcv/test/contrib/img_hash_async_test.dart +++ b/packages/dartcv/test/contrib/img_hash_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; const testImage = "test/images/space_shuttle.jpg"; diff --git a/packages/dartcv/test/contrib/img_hash_test.dart b/packages/dartcv/test/contrib/img_hash_test.dart index 9ae36dd1..b24301e1 100644 --- a/packages/dartcv/test/contrib/img_hash_test.dart +++ b/packages/dartcv/test/contrib/img_hash_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; const testImage = "test/images/space_shuttle.jpg"; diff --git a/packages/dartcv/test/contrib/quality_test.dart b/packages/dartcv/test/contrib/quality_test.dart index cd244a78..5f15a3f7 100644 --- a/packages/dartcv/test/contrib/quality_test.dart +++ b/packages/dartcv/test/contrib/quality_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void checkResult(cv.Scalar value, List values, {double eps = 1e-3, cv.Mat? qualityMap}) { diff --git a/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart b/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart index ee88ac95..f7c0544c 100644 --- a/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart +++ b/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/contrib/wechat_qrcode_test.dart b/packages/dartcv/test/contrib/wechat_qrcode_test.dart index 91634d36..7d3c7333 100644 --- a/packages/dartcv/test/contrib/wechat_qrcode_test.dart +++ b/packages/dartcv/test/contrib/wechat_qrcode_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/contrib/ximgproc_test.dart b/packages/dartcv/test/contrib/ximgproc_test.dart index 9901abce..7ed0c695 100644 --- a/packages/dartcv/test/contrib/ximgproc_test.dart +++ b/packages/dartcv/test/contrib/ximgproc_test.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/core/core_async_test.dart b/packages/dartcv/test/core/core_async_test.dart index a67c5c7f..3b4c6121 100644 --- a/packages/dartcv/test/core/core_async_test.dart +++ b/packages/dartcv/test/core/core_async_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: avoid_print -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/core/core_test.dart b/packages/dartcv/test/core/core_test.dart index 2b8a012c..449777f0 100644 --- a/packages/dartcv/test/core/core_test.dart +++ b/packages/dartcv/test/core/core_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: avoid_print -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/core/mat_async_test.dart b/packages/dartcv/test/core/mat_async_test.dart index 4021bb09..53d31bc4 100644 --- a/packages/dartcv/test/core/mat_async_test.dart +++ b/packages/dartcv/test/core/mat_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/core/mat_test.dart b/packages/dartcv/test/core/mat_test.dart index 3ee7ead5..deca987b 100644 --- a/packages/dartcv/test/core/mat_test.dart +++ b/packages/dartcv/test/core/mat_test.dart @@ -2,7 +2,7 @@ import 'dart:ffi' as ffi; -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/core/others_test.dart b/packages/dartcv/test/core/others_test.dart index f71d3268..7afd95ea 100644 --- a/packages/dartcv/test/core/others_test.dart +++ b/packages/dartcv/test/core/others_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; import 'vec_matcher.dart'; diff --git a/packages/dartcv/test/core/point_test.dart b/packages/dartcv/test/core/point_test.dart index 7aa09805..3b80bd79 100644 --- a/packages/dartcv/test/core/point_test.dart +++ b/packages/dartcv/test/core/point_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/core/rng_test.dart b/packages/dartcv/test/core/rng_test.dart index 39bad42a..0057d31f 100644 --- a/packages/dartcv/test/core/rng_test.dart +++ b/packages/dartcv/test/core/rng_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/core/vec_matcher.dart b/packages/dartcv/test/core/vec_matcher.dart index 776bb1bb..ac2c03e9 100644 --- a/packages/dartcv/test/core/vec_matcher.dart +++ b/packages/dartcv/test/core/vec_matcher.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; VecElementEquals vecElementEquals(cv.Vec expectedValues) => VecElementEquals(expectedValues); diff --git a/packages/dartcv/test/core/vec_test.dart b/packages/dartcv/test/core/vec_test.dart index 97734d4a..59601ad5 100644 --- a/packages/dartcv/test/core/vec_test.dart +++ b/packages/dartcv/test/core/vec_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; import 'vec_matcher.dart'; diff --git a/packages/dartcv/test/dnn/dnn_async_test.dart b/packages/dartcv/test/dnn/dnn_async_test.dart index 1215be78..0a6a21a8 100644 --- a/packages/dartcv/test/dnn/dnn_async_test.dart +++ b/packages/dartcv/test/dnn/dnn_async_test.dart @@ -1,7 +1,7 @@ @Tags(["no-local-files"]) import 'dart:io'; -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; Future checkCaffeNetAsync(cv.Net net) async { diff --git a/packages/dartcv/test/dnn/dnn_test.dart b/packages/dartcv/test/dnn/dnn_test.dart index c7ecc12b..67263c25 100644 --- a/packages/dartcv/test/dnn/dnn_test.dart +++ b/packages/dartcv/test/dnn/dnn_test.dart @@ -1,7 +1,7 @@ @Tags(["no-local-files"]) import 'dart:io'; -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; bool checkCaffeNet(cv.Net net) { diff --git a/packages/dartcv/test/features2d/features2d_async_test.dart b/packages/dartcv/test/features2d/features2d_async_test.dart index 0fdd1e00..212e4b1f 100644 --- a/packages/dartcv/test/features2d/features2d_async_test.dart +++ b/packages/dartcv/test/features2d/features2d_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/features2d/features2d_test.dart b/packages/dartcv/test/features2d/features2d_test.dart index 93e82af9..f25d02cd 100644 --- a/packages/dartcv/test/features2d/features2d_test.dart +++ b/packages/dartcv/test/features2d/features2d_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/gapi/structs_test.dart b/packages/dartcv/test/gapi/structs_test.dart index 12538754..34d53b16 100644 --- a/packages/dartcv/test/gapi/structs_test.dart +++ b/packages/dartcv/test/gapi/structs_test.dart @@ -1,7 +1,7 @@ @Skip('GAPI not finished') -import 'package:dartcv/dartcv.dart' as cv; -import 'package:dartcv/gapi.dart' as cv_gapi; +import 'package:dartcv4/dartcv.dart' as cv; +import 'package:dartcv4/gapi.dart' as cv_gapi; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/highgui_test.dart b/packages/dartcv/test/highgui_test.dart index 16722a65..bcf9b774 100644 --- a/packages/dartcv/test/highgui_test.dart +++ b/packages/dartcv/test/highgui_test.dart @@ -1,5 +1,5 @@ @Tags(['skip-workflow']) -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/imgcodecs_test.dart b/packages/dartcv/test/imgcodecs_test.dart index 8caffaa4..2afd0085 100644 --- a/packages/dartcv/test/imgcodecs_test.dart +++ b/packages/dartcv/test/imgcodecs_test.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/imgproc/clahe_test.dart b/packages/dartcv/test/imgproc/clahe_test.dart index 9ee1554b..e3383319 100644 --- a/packages/dartcv/test/imgproc/clahe_test.dart +++ b/packages/dartcv/test/imgproc/clahe_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/imgproc/imgproc_async_test.dart b/packages/dartcv/test/imgproc/imgproc_async_test.dart index 543dab62..85cefb75 100644 --- a/packages/dartcv/test/imgproc/imgproc_async_test.dart +++ b/packages/dartcv/test/imgproc/imgproc_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/imgproc/imgproc_test.dart b/packages/dartcv/test/imgproc/imgproc_test.dart index bab67fc5..0a9308b2 100644 --- a/packages/dartcv/test/imgproc/imgproc_test.dart +++ b/packages/dartcv/test/imgproc/imgproc_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/imgproc/subdiv2d_test.dart b/packages/dartcv/test/imgproc/subdiv2d_test.dart index a44a9e05..29ae5b09 100644 --- a/packages/dartcv/test/imgproc/subdiv2d_test.dart +++ b/packages/dartcv/test/imgproc/subdiv2d_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/objdetect/objdetect_async_test.dart b/packages/dartcv/test/objdetect/objdetect_async_test.dart index 36a001d2..7d240ef6 100644 --- a/packages/dartcv/test/objdetect/objdetect_async_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_async_test.dart @@ -1,8 +1,8 @@ import 'dart:io'; import 'dart:typed_data'; -import 'package:dartcv/dartcv.dart' as cv; -import 'package:dartcv/src/core/mat_type.dart'; +import 'package:dartcv4/dartcv.dart' as cv; +import 'package:dartcv4/src/core/mat_type.dart'; import 'package:test/test.dart'; cv.Mat visualizeFaceDetect(cv.Mat img, cv.Mat faces) { diff --git a/packages/dartcv/test/objdetect/objdetect_test.dart b/packages/dartcv/test/objdetect/objdetect_test.dart index 5b053fd3..3fd626c0 100644 --- a/packages/dartcv/test/objdetect/objdetect_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_test.dart @@ -1,8 +1,8 @@ import 'dart:io'; import 'dart:typed_data'; -import 'package:dartcv/dartcv.dart' as cv; -import 'package:dartcv/src/core/mat_type.dart'; +import 'package:dartcv4/dartcv.dart' as cv; +import 'package:dartcv4/src/core/mat_type.dart'; import 'package:test/test.dart'; cv.Mat visualizeFaceDetect(cv.Mat img, cv.Mat faces) { diff --git a/packages/dartcv/test/perf_mat.dart b/packages/dartcv/test/perf_mat.dart index 6649d1c8..e94b67f8 100644 --- a/packages/dartcv/test/perf_mat.dart +++ b/packages/dartcv/test/perf_mat.dart @@ -1,6 +1,6 @@ // ignore_for_file: unused_local_variable, avoid_print -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; const counts = 10000; diff --git a/packages/dartcv/test/photo/photo_async_test.dart b/packages/dartcv/test/photo/photo_async_test.dart index 0d070bfa..3ebf0eb7 100644 --- a/packages/dartcv/test/photo/photo_async_test.dart +++ b/packages/dartcv/test/photo/photo_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/photo/photo_test.dart b/packages/dartcv/test/photo/photo_test.dart index 1446adbb..b69fa48a 100644 --- a/packages/dartcv/test/photo/photo_test.dart +++ b/packages/dartcv/test/photo/photo_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/stitching/stitching_async_test.dart b/packages/dartcv/test/stitching/stitching_async_test.dart index 8659d0ac..93cbf45a 100644 --- a/packages/dartcv/test/stitching/stitching_async_test.dart +++ b/packages/dartcv/test/stitching/stitching_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/stitching/stitching_test.dart b/packages/dartcv/test/stitching/stitching_test.dart index 0b6e988f..1627602b 100644 --- a/packages/dartcv/test/stitching/stitching_test.dart +++ b/packages/dartcv/test/stitching/stitching_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() { diff --git a/packages/dartcv/test/svd_test.dart b/packages/dartcv/test/svd_test.dart index 5eb0ec0e..329e0d58 100644 --- a/packages/dartcv/test/svd_test.dart +++ b/packages/dartcv/test/svd_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; final resultW = [6.410056, 3.4595323]; diff --git a/packages/dartcv/test/video/video_async_test.dart b/packages/dartcv/test/video/video_async_test.dart index 53a9c077..97270b57 100644 --- a/packages/dartcv/test/video/video_async_test.dart +++ b/packages/dartcv/test/video/video_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/video/video_test.dart b/packages/dartcv/test/video/video_test.dart index e696d5a9..ba574dc1 100644 --- a/packages/dartcv/test/video/video_test.dart +++ b/packages/dartcv/test/video/video_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/videoio/videoio_async_test.dart b/packages/dartcv/test/videoio/videoio_async_test.dart index 16a5d623..967f2fb5 100644 --- a/packages/dartcv/test/videoio/videoio_async_test.dart +++ b/packages/dartcv/test/videoio/videoio_async_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { diff --git a/packages/dartcv/test/videoio/videoio_test.dart b/packages/dartcv/test/videoio/videoio_test.dart index 2b10da6c..e78d977d 100644 --- a/packages/dartcv/test/videoio/videoio_test.dart +++ b/packages/dartcv/test/videoio/videoio_test.dart @@ -1,4 +1,4 @@ -import 'package:dartcv/dartcv.dart' as cv; +import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; void main() async { From 81cfc18377ff4a711cc05264741dcd9c757defd8 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sat, 19 Oct 2024 11:50:16 +0800 Subject: [PATCH 12/30] finish core --- packages/dartcv/lib/src/core/core.dart | 959 ++++++------ packages/dartcv/lib/src/core/core_async.dart | 1423 ++++++++++++------ packages/dartcv/lib/src/g/core.g.dart | 331 +++- packages/dartcv/lib/src/g/core.yaml | 28 + 4 files changed, 1893 insertions(+), 848 deletions(-) diff --git a/packages/dartcv/lib/src/core/core.dart b/packages/dartcv/lib/src/core/core.dart index 4a1a560a..558ed22e 100644 --- a/packages/dartcv/lib/src/core/core.dart +++ b/packages/dartcv/lib/src/core/core.dart @@ -46,33 +46,21 @@ int getLogLevel() { } /// get version -String openCvVersion() { - final p = calloc>(); - cvRun(() => ccore.openCVVersion(p)); - final s = p.value.toDartString(); - calloc.free(p); - return s; -} +String openCvVersion() => ccore.getCvVersion().toDartString(); /// Returns full configuration time cmake output. /// /// Returned value is raw cmake output including version control system revision, compiler version, compiler flags, enabled modules and third party libraries, etc. Output format depends on target architecture. -String getBuildInformation() { - final p = calloc>(); - cvRun(() => ccore.getBuildInfo(p)); - final s = p.value.toDartString(); - calloc.free(p); - return s; -} +String getBuildInformation() => ccore.getBuildInfo().toDartString(); /// AbsDiff calculates the per-element absolute difference between two arrays /// or between an array and a scalar. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6fef31bc8c4071cbc114a758a2b79c14 -Mat absDiff(Mat src1, Mat src2, [Mat? dst]) { +Mat absDiff(Mat src1, Mat src2, {Mat? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_AbsDiff(src1.ref, src2.ref, dst!.ref)); + cvRun(() => ccore.cv_absdiff(src1.ref, src2.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -83,7 +71,7 @@ Mat absDiff(Mat src1, Mat src2, [Mat? dst]) { Mat add(Mat src1, Mat src2, {Mat? dst, int dtype = -1, Mat? mask}) { dst ??= Mat.empty(); mask ??= Mat.empty(); - cvRun(() => ccore.Mat_Add(src1.ref, src2.ref, dst!.ref, mask!.ref, dtype)); + cvRun(() => ccore.cv_add(src1.ref, src2.ref, dst!.ref, mask!.ref, dtype, ffi.nullptr)); return dst; } @@ -101,10 +89,47 @@ Mat addWeighted( int dtype = -1, }) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_AddWeighted(src1.ref, alpha, src2.ref, beta, gamma, dst!.ref, dtype)); + cvRun(() => ccore.cv_addWeighted(src1.ref, alpha, src2.ref, beta, gamma, dst!.ref, dtype, ffi.nullptr)); return dst; } +/// BatchDistance is a naive nearest neighbor finder. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4ba778a1c57f83233b1d851c83f5a622 +(Mat dist, Mat nidx) batchDistance( + InputArray src1, + InputArray src2, + int dtype, { + OutputArray? dist, + OutputArray? nidx, + int normType = NORM_L2, + int K = 0, + InputArray? mask, + int update = 0, + bool crosscheck = false, +}) { + dist ??= Mat.empty(); + nidx ??= Mat.empty(); + mask ??= Mat.empty(); + cvRun( + () => ccore.cv_batchDistance( + src1.ref, + src2.ref, + dist!.ref, + dtype, + nidx!.ref, + normType, + K, + mask!.ref, + update, + crosscheck, + ffi.nullptr, + ), + ); + return (dist, nidx); +} + /// BitwiseAnd computes bitwise conjunction of the two arrays (dst = src1 & src2). /// Calculates the per-element bit-wise conjunction of two arrays /// or an array and a scalar. @@ -119,8 +144,8 @@ Mat bitwiseAND( }) { dst ??= Mat.empty(); mask == null - ? cvRun(() => ccore.Mat_BitwiseAnd(src1.ref, src2.ref, dst!.ref)) - : cvRun(() => ccore.Mat_BitwiseAndWithMask(src1.ref, src2.ref, dst!.ref, mask.ref)); + ? cvRun(() => ccore.cv_bitwise_and(src1.ref, src2.ref, dst!.ref, ffi.nullptr)) + : cvRun(() => ccore.cv_bitwise_and_1(src1.ref, src2.ref, dst!.ref, mask.ref, ffi.nullptr)); return dst; } @@ -131,8 +156,8 @@ Mat bitwiseAND( Mat bitwiseNOT(InputArray src, {OutputArray? dst, InputArray? mask}) { dst ??= Mat.empty(); mask == null - ? cvRun(() => ccore.Mat_BitwiseNot(src.ref, dst!.ref)) - : cvRun(() => ccore.Mat_BitwiseNotWithMask(src.ref, dst!.ref, mask.ref)); + ? cvRun(() => ccore.cv_bitwise_not(src.ref, dst!.ref, ffi.nullptr)) + : cvRun(() => ccore.cv_bitwise_not_1(src.ref, dst!.ref, mask.ref, ffi.nullptr)); return dst; } @@ -149,8 +174,8 @@ Mat bitwiseOR( }) { dst ??= Mat.empty(); mask == null - ? cvRun(() => ccore.Mat_BitwiseOr(src1.ref, src2.ref, dst!.ref)) - : cvRun(() => ccore.Mat_BitwiseOrWithMask(src1.ref, src2.ref, dst!.ref, mask.ref)); + ? cvRun(() => ccore.cv_bitwise_or(src1.ref, src2.ref, dst!.ref, ffi.nullptr)) + : cvRun(() => ccore.cv_bitwise_or_1(src1.ref, src2.ref, dst!.ref, mask.ref, ffi.nullptr)); return dst; } @@ -167,54 +192,18 @@ Mat bitwiseXOR( }) { dst ??= Mat.empty(); mask == null - ? cvRun(() => ccore.Mat_BitwiseXor(src1.ref, src2.ref, dst!.ref)) - : cvRun(() => ccore.Mat_BitwiseXorWithMask(src1.ref, src2.ref, dst!.ref, mask.ref)); + ? cvRun(() => ccore.cv_bitwise_xor(src1.ref, src2.ref, dst!.ref, ffi.nullptr)) + : cvRun(() => ccore.cv_bitwise_xor_1(src1.ref, src2.ref, dst!.ref, mask.ref, ffi.nullptr)); return dst; } -/// BatchDistance is a naive nearest neighbor finder. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4ba778a1c57f83233b1d851c83f5a622 -(Mat dist, Mat nidx) batchDistance( - InputArray src1, - InputArray src2, - int dtype, { - OutputArray? dist, - OutputArray? nidx, - int normType = NORM_L2, - int K = 0, - InputArray? mask, - int update = 0, - bool crosscheck = false, -}) { - dist ??= Mat.empty(); - nidx ??= Mat.empty(); - mask ??= Mat.empty(); - cvRun( - () => ccore.Mat_BatchDistance( - src1.ref, - src2.ref, - dist!.ref, - dtype, - nidx!.ref, - normType, - K, - mask!.ref, - update, - crosscheck, - ), - ); - return (dist, nidx); -} - /// BorderInterpolate computes the source location of an extrapolated pixel. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga247f571aa6244827d3d798f13892da58 int borderInterpolate(int p, int len, int borderType) { final ptr = calloc(); - cvRun(() => ccore.Mat_BorderInterpolate(p, len, borderType, ptr)); + cvRun(() => ccore.cv_borderInterpolate(p, len, borderType, ptr, ffi.nullptr)); final v = ptr.value; calloc.free(ptr); return v; @@ -233,12 +222,13 @@ int borderInterpolate(int p, int len, int borderType) { }) { covar ??= Mat.empty(); cvRun( - () => ccore.Mat_CalcCovarMatrix( + () => ccore.cv_calcCovarMatrix( samples.ref, covar!.ref, mean.ref, flags, ctype, + ffi.nullptr, ), ); return (covar, mean); @@ -257,7 +247,7 @@ int borderInterpolate(int p, int len, int borderType) { }) { magnitude ??= Mat.empty(); angle ??= Mat.empty(); - cvRun(() => ccore.Mat_CartToPolar(x.ref, y.ref, magnitude!.ref, angle!.ref, angleInDegrees)); + cvRun(() => ccore.cv_cartToPolar(x.ref, y.ref, magnitude!.ref, angle!.ref, angleInDegrees, ffi.nullptr)); return (magnitude, angle); } @@ -271,12 +261,12 @@ int borderInterpolate(int p, int len, int borderType) { double minVal = -CV_F64_MAX, double maxVal = CV_F64_MAX, }) { - return cvRunArena<(bool, Point)>((arena) { - final pos = calloc(); - final rval = arena(); - cvRun(() => ccore.Mat_CheckRange(a.ref, quiet, pos, minVal, maxVal, rval)); - return (rval.value, Point.fromPointer(pos)); - }); + final pos = calloc(); + final pRval = calloc(); + cvRun(() => ccore.cv_checkRange(a.ref, quiet, pos, minVal, maxVal, pRval, ffi.nullptr)); + final rval = pRval.value; + calloc.free(pRval); + return (rval, Point.fromPointer(pos)); } /// Compare performs the per-element comparison of two arrays @@ -286,22 +276,16 @@ int borderInterpolate(int p, int len, int borderType) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga303cfb72acf8cbb36d884650c09a3a97 Mat compare(InputArray src1, InputArray src2, int cmpop, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Compare(src1.ref, src2.ref, dst!.ref, cmpop)); + cvRun(() => ccore.cv_compare(src1.ref, src2.ref, dst!.ref, cmpop, ffi.nullptr)); return dst; } -/// CountNonZero counts non-zero array elements. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa4b89393263bb4d604e0fe5986723914 -int countNonZero(Mat src) => ccore.Mat_CountNonZero(src.ref); - /// CompleteSymm copies the lower or the upper half of a square matrix to its another half. /// /// For further details, please see: /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga6847337c0c55769e115a70e0f011b5ca Mat completeSymm(InputOutputArray m, {bool lowerToUpper = false}) { - cvRun(() => ccore.Mat_CompleteSymm(m.ref, lowerToUpper)); + cvRun(() => ccore.cv_completeSymm(m.ref, lowerToUpper, ffi.nullptr)); return m; } @@ -316,7 +300,7 @@ Mat convertScaleAbs( double beta = 0, }) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_ConvertScaleAbs(src.ref, dst!.ref, alpha, beta)); + cvRun(() => ccore.cv_convertScaleAbs(src.ref, dst!.ref, alpha, beta, ffi.nullptr)); return dst; } @@ -337,7 +321,7 @@ Mat copyMakeBorder( dst ??= Mat.empty(); value ??= Scalar(); cvRun( - () => ccore.Mat_CopyMakeBorder( + () => ccore.cv_copyMakeBorder( src.ref, dst!.ref, top, @@ -346,18 +330,38 @@ Mat copyMakeBorder( right, borderType, value!.ref, + ffi.nullptr, ), ); return dst; } +/// CopyTo +/// +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga931a49489330f998452fc53e96e1719a +Mat copyTo( + InputArray src, + InputArray dst, { + InputArray? mask, +}) { + mask ??= Mat.empty(); + cvRun(() => ccore.cv_copyTo(src.ref, dst.ref, mask!.ref, ffi.nullptr)); + return dst; +} + +/// CountNonZero counts non-zero array elements. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa4b89393263bb4d604e0fe5986723914 +int countNonZero(Mat src) => ccore.cv_countNonZero(src.ref); + /// DCT performs a forward or inverse discrete Cosine transform of 1D or 2D array. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga85aad4d668c01fbd64825f589e3696d4 Mat dct(InputArray src, {OutputArray? dst, int flags = 0}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_DCT(src.ref, dst!.ref, flags)); + cvRun(() => ccore.cv_dct(src.ref, dst!.ref, flags, ffi.nullptr)); return dst; } @@ -366,11 +370,11 @@ Mat dct(InputArray src, {OutputArray? dst, int flags = 0}) { /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf802bd9ca3e07b8b6170645ef0611d0c double determinant(InputArray mtx) { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.Mat_Determinant(mtx.ref, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => ccore.cv_determinant(mtx.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// DFT performs a forward or inverse Discrete Fourier Transform (DFT) @@ -380,7 +384,7 @@ double determinant(InputArray mtx) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gadd6cf9baf2b8b704a11b5f04aaf4f39d Mat dft(InputArray src, {OutputArray? dst, int flags = 0, int nonzeroRows = 0}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_DFT(src.ref, dst!.ref, flags, nonzeroRows)); + cvRun(() => ccore.cv_dft(src.ref, dst!.ref, flags, nonzeroRows, ffi.nullptr)); return dst; } @@ -391,7 +395,7 @@ Mat dft(InputArray src, {OutputArray? dst, int flags = 0, int nonzeroRows = 0}) /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6db555d30115642fedae0cda05604874 Mat divide(InputArray src1, InputArray src2, {OutputArray? dst, double scale = 1, int dtype = -1}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Divide(src1.ref, src2.ref, dst!.ref, scale, dtype)); + cvRun(() => ccore.cv_divide(src1.ref, src2.ref, dst!.ref, scale, dtype, ffi.nullptr)); return dst; } @@ -406,11 +410,10 @@ Mat divide(InputArray src1, InputArray src2, {OutputArray? dst, double scale = 1 }) { eigenvalues ??= Mat.empty(); eigenvectors ??= Mat.empty(); - final ret = cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.Mat_Eigen(src.ref, eigenvalues!.ref, eigenvectors!.ref, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => ccore.cv_eigen(src.ref, eigenvalues!.ref, eigenvectors!.ref, p, ffi.nullptr)); + final ret = p.value; + calloc.free(p); return (ret, eigenvalues, eigenvectors); } @@ -425,39 +428,17 @@ Mat divide(InputArray src1, InputArray src2, {OutputArray? dst, double scale = 1 }) { eigenvalues ??= Mat.empty(); eigenvectors ??= Mat.empty(); - cvRun(() => ccore.Mat_EigenNonSymmetric(src.ref, eigenvalues!.ref, eigenvectors!.ref)); + cvRun(() => ccore.cv_eigenNonSymmetric(src.ref, eigenvalues!.ref, eigenvectors!.ref, ffi.nullptr)); return (eigenvalues, eigenvectors); } -/// PCACompute performs PCA. -/// -/// The computed eigenvalues are sorted from the largest to the smallest and the corresponding -/// eigenvectors are stored as eigenvectors rows. -/// -/// Note: Calling with maxComponents == 0 (opencv default) will cause all components to be retained. -/// -/// For further details, please see: -/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga27a565b31d820b05dcbcd47112176b6e -(Mat mean, Mat eigenvalues, Mat eigenvectors) PCACompute( - InputArray data, - InputOutputArray mean, { - OutputArray? eigenvectors, - OutputArray? eigenvalues, - int maxComponents = 0, -}) { - eigenvalues ??= Mat.empty(); - eigenvectors ??= Mat.empty(); - ccore.Mat_PCACompute(data.ref, mean.ref, eigenvectors.ref, eigenvalues.ref, maxComponents); - return (mean, eigenvalues, eigenvectors); -} - /// Exp calculates the exponent of every array element. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3e10108e2162c338f1b848af619f39e5 Mat exp(InputArray src, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Exp(src.ref, dst!.ref)); + cvRun(() => ccore.cv_exp(src.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -467,7 +448,7 @@ Mat exp(InputArray src, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacc6158574aa1f0281878c955bcf35642 Mat extractChannel(InputArray src, int coi, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_ExtractChannel(src.ref, dst!.ref, coi)); + cvRun(() => ccore.cv_extractChannel(src.ref, dst!.ref, coi, ffi.nullptr)); return dst; } @@ -477,7 +458,7 @@ Mat extractChannel(InputArray src, int coi, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaed7df59a3539b4cc0fe5c9c8d7586190 Mat findNonZero(InputArray src, {OutputArray? idx}) { idx ??= Mat.empty(); - cvRun(() => ccore.Mat_FindNonZero(src.ref, idx!.ref)); + cvRun(() => ccore.cv_findNonZero(src.ref, idx!.ref, ffi.nullptr)); return idx; } @@ -487,7 +468,13 @@ Mat findNonZero(InputArray src, {OutputArray? idx}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaca7be533e3dac7feb70fc60635adf441 Mat flip(InputArray src, int flipCode, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Flip(src.ref, dst!.ref, flipCode)); + cvRun(() => ccore.cv_flip(src.ref, dst!.ref, flipCode, ffi.nullptr)); + return dst; +} + +Mat flipND(InputArray src, int axis, {OutputArray? dst}) { + dst ??= Mat.empty(); + cvRun(() => ccore.cv_flipND(src.ref, dst!.ref, axis, ffi.nullptr)); return dst; } @@ -505,7 +492,7 @@ Mat gemm( int flags = 0, }) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Gemm(src1.ref, src2.ref, alpha, src3.ref, beta, dst!.ref, flags)); + cvRun(() => ccore.cv_gemm(src1.ref, src2.ref, alpha, src3.ref, beta, dst!.ref, flags, ffi.nullptr)); return dst; } @@ -515,40 +502,23 @@ Mat gemm( /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6577a2e59968936ae02eb2edde5de299 int getOptimalDFTSize(int vecsize) { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.Mat_GetOptimalDFTSize(vecsize, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => ccore.cv_getOptimalDFTSize(vecsize, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } +/// has non zero +bool hasNonZero(InputArray src) => ccore.cv_hasNonZero(src.ref); + /// Hconcat applies horizontal concatenation to given matrices. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaab5ceee39e0580f879df645a872c6bf7 Mat hconcat(InputArray src1, InputArray src2, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Hconcat(src1.ref, src2.ref, dst!.ref)); - return dst; -} - -/// Vconcat applies vertical concatenation to given matrices. -/// -/// For further details, please see: -/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gaad07cede730cdde64b90e987aad179b8 -Mat vconcat(InputArray src1, InputArray src2, {OutputArray? dst}) { - dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Vconcat(src1.ref, src2.ref, dst!.ref)); - return dst; -} - -/// Rotate rotates a 2D array in multiples of 90 degrees -/// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4ad01c0978b0ce64baa246811deeac24 -Mat rotate(InputArray src, int rotateCode, {OutputArray? dst}) { - dst ??= Mat.empty(); - cvRun(() => ccore.Rotate(src.ref, dst!.ref, rotateCode)); + cvRun(() => ccore.cv_hconcat(src1.ref, src2.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -562,7 +532,7 @@ Mat idct( int flags = 0, }) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Idct(src.ref, dst!.ref, flags)); + cvRun(() => ccore.cv_idct(src.ref, dst!.ref, flags, ffi.nullptr)); return dst; } @@ -577,7 +547,7 @@ Mat idft( int nonzeroRows = 0, }) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Idft(src.ref, dst!.ref, flags, nonzeroRows)); + cvRun(() => ccore.cv_idft(src.ref, dst!.ref, flags, nonzeroRows, ffi.nullptr)); return dst; } @@ -592,7 +562,7 @@ Mat inRange( OutputArray? dst, }) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_InRange(src.ref, lowerb.ref, upperb.ref, dst!.ref)); + cvRun(() => ccore.cv_inRange(src.ref, lowerb.ref, upperb.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -607,7 +577,7 @@ Mat inRangebyScalar( OutputArray? dst, }) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_InRangeWithScalar(src.ref, lowerb.ref, upperb.ref, dst!.ref)); + cvRun(() => ccore.cv_inRange_1(src.ref, lowerb.ref, upperb.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -617,7 +587,7 @@ Mat inRangebyScalar( /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1d4bd886d35b00ec0b764cb4ce6eb515 Mat insertChannel(InputArray src, InputOutputArray dst, int coi) { - cvRun(() => ccore.Mat_InsertChannel(src.ref, dst.ref, coi)); + cvRun(() => ccore.cv_insertChannel(src.ref, dst.ref, coi, ffi.nullptr)); return dst; } @@ -631,87 +601,20 @@ Mat insertChannel(InputArray src, InputOutputArray dst, int coi) { int flags = DECOMP_LU, }) { dst ??= Mat.empty(); - final rval = cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.Mat_Invert(src.ref, dst!.ref, flags, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => ccore.cv_invert(src.ref, dst!.ref, flags, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); return (rval, dst); } -/// KMeans finds centers of clusters and groups input samples around the clusters. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/d5/d38/group__core__cluster.html#ga9a34dc06c6ec9460e90860f15bcd2f88 -(double rval, Mat bestLabels, Mat centers) kmeans( - InputArray data, - int K, - InputOutputArray bestLabels, - (int, int, double) criteria, - int attempts, - int flags, { - OutputArray? centers, -}) { - centers ??= Mat.empty(); - final rval = cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccore.KMeans( - data.ref, - K, - bestLabels.ref, - TermCriteria.fromRecord(criteria).ref, - attempts, - flags, - centers!.ref, - p, - ), - ); - return p.value; - }); - return (rval, bestLabels, centers); -} - -/// KMeansPoints finds centers of clusters and groups input samples around the clusters. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/d5/d38/group__core__cluster.html#ga9a34dc06c6ec9460e90860f15bcd2f88 -(double rval, Mat bestLabels, Mat centers) kmeansByPoints( - VecPoint2f pts, - int K, - InputOutputArray bestLabels, - (int, int, double) criteria, - int attempts, - int flags, { - OutputArray? centers, -}) { - centers ??= Mat.empty(); - final rval = cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccore.KMeansPoints( - pts.ref, - K, - bestLabels.ref, - TermCriteria.fromRecord(criteria).ref, - attempts, - flags, - centers!.ref, - p, - ), - ); - return p.value; - }); - return (rval, bestLabels, centers); -} - /// Log calculates the natural logarithm of every array element. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga937ecdce4679a77168730830a955bea7 Mat log(InputArray src, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Log(src.ref, dst!.ref)); + cvRun(() => ccore.cv_log(src.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -738,7 +641,7 @@ Mat log(InputArray src, {OutputArray? dst}) { /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gab55b8d062b7f5587720ede032d34156f Mat LUT(InputArray src, InputArray lut, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.LUT(src.ref, lut.ref, dst!.ref)); + cvRun(() => ccore.cv_LUT(src.ref, lut.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -748,7 +651,7 @@ Mat LUT(InputArray src, InputArray lut, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6d3b097586bca4409873d64a90fe64c3 Mat magnitude(InputArray x, InputArray y, {OutputArray? magnitude}) { magnitude ??= Mat.empty(); - cvRun(() => ccore.Mat_Magnitude(x.ref, y.ref, magnitude!.ref)); + cvRun(() => ccore.cv_magnitude(x.ref, y.ref, magnitude!.ref, ffi.nullptr)); return magnitude; } @@ -758,10 +661,19 @@ Mat magnitude(InputArray x, InputArray y, {OutputArray? magnitude}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacc40fa15eac0fb83f8ca70b7cc0b588d Mat max(InputArray src1, InputArray src2, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Max(src1.ref, src2.ref, dst!.ref)); + cvRun(() => ccore.cv_max(src1.ref, src2.ref, dst!.ref, ffi.nullptr)); return dst; } +/// mean +Scalar mean(InputArray src, {InputArray? mask}) { + final p = calloc(); + mask == null + ? cvRun(() => ccore.cv_mean(src.ref, p, ffi.nullptr)) + : cvRun(() => ccore.cv_mean_1(src.ref, mask.ref, p, ffi.nullptr)); + return Scalar.fromPointer(p); +} + /// MeanStdDev calculates a mean and standard deviation of array elements. /// /// For further details, please see: @@ -770,8 +682,8 @@ Mat max(InputArray src1, InputArray src2, {OutputArray? dst}) { final mean = calloc(); final stddev = calloc(); mask == null - ? cvRun(() => ccore.Mat_MeanStdDev(src.ref, mean, stddev)) - : cvRun(() => ccore.Mat_MeanStdDevWithMask(src.ref, mean, stddev, mask.ref)); + ? cvRun(() => ccore.cv_meanStdDev(src.ref, mean, stddev, ffi.nullptr)) + : cvRun(() => ccore.cv_meanStdDev_1(src.ref, mean, stddev, mask.ref, ffi.nullptr)); return (Scalar.fromPointer(mean), Scalar.fromPointer(stddev)); } @@ -780,9 +692,9 @@ Mat max(InputArray src1, InputArray src2, {OutputArray? dst}) { /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga7d7b4d6c6ee504b30a20b1680029c7b4 Mat merge(VecMat mv, {OutputArray? dst}) { - final p = calloc(); - cvRun(() => ccore.Mat_Merge(mv.ref, p)); - return Mat.fromPointer(p); + dst ??= Mat.empty(); + cvRun(() => ccore.cv_merge(mv.ref, dst!.ref, ffi.nullptr)); + return dst; } /// Min calculates per-element minimum of two arrays or an array and a scalar. @@ -791,7 +703,7 @@ Mat merge(VecMat mv, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9af368f182ee76d0463d0d8d5330b764 Mat min(InputArray src1, InputArray src2, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Min(src1.ref, src2.ref, dst!.ref)); + cvRun(() => ccore.cv_min(src1.ref, src2.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -803,14 +715,18 @@ Mat min(InputArray src1, InputArray src2, {OutputArray? dst}) { InputArray src, { InputArray? mask, }) { - return using<(double, double, int, int)>((arena) { - final minValP = arena(); - final maxValP = arena(); - final minIdxP = arena(); - final maxIdxP = arena(); - cvRun(() => ccore.Mat_MinMaxIdx(src.ref, minValP, maxValP, minIdxP, maxIdxP)); - return (minValP.value, maxValP.value, minIdxP.value, maxIdxP.value); - }); + mask ??= Mat.empty(); + final minValP = calloc(); + final maxValP = calloc(); + final minIdxP = calloc(); + final maxIdxP = calloc(); + cvRun(() => ccore.cv_minMaxIdx(src.ref, minValP, maxValP, minIdxP, maxIdxP, mask!.ref, ffi.nullptr)); + final rval = (minValP.value, maxValP.value, minIdxP.value, maxIdxP.value); + calloc.free(minValP); + calloc.free(maxValP); + calloc.free(minIdxP); + calloc.free(maxIdxP); + return rval; } /// MinMaxLoc finds the global minimum and maximum in an array. @@ -818,14 +734,16 @@ Mat min(InputArray src1, InputArray src2, {OutputArray? dst}) { /// For further details, please see: /// https://docs.opencv.org/trunk/d2/de8/group__core__array.html#gab473bf2eb6d14ff97e89b355dac20707 (double minVal, double maxVal, Point minLoc, Point maxLoc) minMaxLoc(InputArray src, {InputArray? mask}) { - return using<(double, double, Point, Point)>((arena) { - final minValP = arena(); - final maxValP = arena(); - final minLocP = calloc(); - final maxLocP = calloc(); - cvRun(() => ccore.Mat_MinMaxLoc(src.ref, minValP, maxValP, minLocP, maxLocP)); - return (minValP.value, maxValP.value, Point.fromPointer(minLocP), Point.fromPointer(maxLocP)); - }); + mask ??= Mat.empty(); + final minValP = calloc(); + final maxValP = calloc(); + final minLocP = calloc(); + final maxLocP = calloc(); + cvRun(() => ccore.cv_minMaxLoc(src.ref, minValP, maxValP, minLocP, maxLocP, mask!.ref, ffi.nullptr)); + final rval = (minValP.value, maxValP.value, Point.fromPointer(minLocP), Point.fromPointer(maxLocP)); + calloc.free(minValP); + calloc.free(maxValP); + return rval; } /// Copies specified channels from input arrays to the specified channels of output arrays. @@ -833,7 +751,7 @@ Mat min(InputArray src1, InputArray src2, {OutputArray? dst}) { /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga51d768c270a1cdd3497255017c4504be VecMat mixChannels(VecMat src, VecMat dst, VecI32 fromTo) { - cvRun(() => ccore.Mat_MixChannels(src.ref, dst.ref, fromTo.ref)); + cvRun(() => ccore.cv_mixChannels(src.ref, dst.ref, fromTo.ref, ffi.nullptr)); return dst; } @@ -849,7 +767,7 @@ Mat mulSpectrums( bool conjB = false, }) { c ??= Mat.empty(); - cvRun(() => ccore.Mat_MulSpectrums(a.ref, b.ref, c!.ref, flags, conjB)); + cvRun(() => ccore.cv_mulSpectrums(a.ref, b.ref, c!.ref, flags, conjB, ffi.nullptr)); return c; } @@ -866,25 +784,23 @@ Mat multiply( int dtype = -1, }) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Multiply(src1.ref, src2.ref, dst!.ref, scale, dtype)); + cvRun(() => ccore.cv_multiply(src1.ref, src2.ref, dst!.ref, scale, dtype, ffi.nullptr)); return dst; } -/// Normalize normalizes the norm or value range of an array. +/// mulTransposed /// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga87eef7ee3970f86906d69a92cbf064bd -Mat normalize( +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gadc4e49f8f7a155044e3be1b9e3b270ab +Mat mulTransposed( InputArray src, - InputOutputArray dst, { - double alpha = 1, - double beta = 0, - int normType = NORM_L2, + OutputArray dst, + bool aTa, { + InputArray? delta, + double scale = 1, int dtype = -1, - InputArray? mask, }) { - mask ??= Mat.empty(); - cvRun(() => ccore.Mat_Normalize(src.ref, dst.ref, alpha, beta, normType, dtype, mask!.ref)); + delta ??= Mat.empty(); + cvRun(() => ccore.cv_mulTransposed(src.ref, dst.ref, aTa, delta!.ref, scale, dtype, ffi.nullptr)); return dst; } @@ -899,7 +815,7 @@ double norm( }) { mask ??= Mat.empty(); final p = calloc(); - cvRun(() => ccore.Norm(src1.ref, normType, mask!.ref, p)); + cvRun(() => ccore.cv_norm(src1.ref, normType, mask!.ref, p, ffi.nullptr)); final rval = p.value; calloc.free(p); return rval; @@ -915,73 +831,203 @@ double norm1( int normType = NORM_L2, InputArray? mask, }) { - return cvRunArena((arena) { - final p = arena(); - mask ??= Mat.empty(); - cvRun(() => ccore.NormWithMats(src1.ref, src2.ref, normType, mask!.ref, p)); - return p.value; - }); + final p = calloc(); + mask ??= Mat.empty(); + cvRun(() => ccore.cv_norm_1(src1.ref, src2.ref, normType, mask!.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } -/// PerspectiveTransform performs the perspective matrix transformation of vectors. +/// Normalize normalizes the norm or value range of an array. /// /// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gad327659ac03e5fd6894b90025e6900a7 -Mat perspectiveTransform(InputArray src, InputArray m, {OutputArray? dst}) { - dst ??= Mat.empty(); - cvRun(() => ccore.Mat_PerspectiveTransform(src.ref, dst!.ref, m.ref)); +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga87eef7ee3970f86906d69a92cbf064bd +Mat normalize( + InputArray src, + InputOutputArray dst, { + double alpha = 1, + double beta = 0, + int normType = NORM_L2, + int dtype = -1, + InputArray? mask, +}) { + mask ??= Mat.empty(); + cvRun(() => ccore.cv_normalize(src.ref, dst.ref, alpha, beta, normType, dtype, mask!.ref, ffi.nullptr)); return dst; } -/// Solve solves one or more linear systems or least-squares problems. +/// patchNaNs /// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga12b43690dbd31fed96f213eefead2373 -(bool ret, Mat dst) solve( - InputArray src1, - InputArray src2, { +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga62286befb7cde3568ff8c7d14d5079da +Mat patchNaNs(InputArray a, double val) { + cvRun(() => ccore.cv_patchNaNs(a.ref, val, ffi.nullptr)); + return a; +} + +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gab26049f30ee8e94f7d69d82c124faafc +Mat PCABackProject( + InputArray data, + InputArray mean, + InputArray eigenvectors, { OutputArray? dst, - int flags = DECOMP_LU, }) { dst ??= Mat.empty(); - final rval = cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.Mat_Solve(src1.ref, src2.ref, dst!.ref, flags, p)); - return p.value; - }); - return (rval, dst); + cvRun(() => ccore.cv_PCABackProject(data.ref, mean.ref, eigenvectors.ref, dst!.ref, ffi.nullptr)); + return dst; } -/// SolveCubic finds the real roots of a cubic equation. +/// PCACompute performs PCA. /// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1c3b0b925b085b6e96931ee309e6a1da -(int rval, Mat roots) solveCubic(InputArray coeffs, {OutputArray? roots}) { - roots ??= Mat.empty(); - final rval = cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.Mat_SolveCubic(coeffs.ref, roots!.ref, p)); - return p.value; - }); - return (rval, roots); -} - -/// SolvePoly finds the real or complex roots of a polynomial equation. +/// The computed eigenvalues are sorted from the largest to the smallest and the corresponding +/// eigenvectors are stored as eigenvectors rows. +/// +/// Note: Calling with maxComponents == 0 (opencv default) will cause all components to be retained. /// /// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gac2f5e953016fabcdf793d762f4ec5dce -(double rval, Mat roots) solvePoly( - InputArray coeffs, { - OutputArray? roots, - int maxIters = 300, +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga27a565b31d820b05dcbcd47112176b6e +(Mat mean, Mat eigenvalues, Mat eigenvectors) PCACompute( + InputArray data, + InputOutputArray mean, { + OutputArray? eigenvectors, + OutputArray? eigenvalues, + int maxComponents = 0, }) { - roots ??= Mat.empty(); - final rval = cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.Mat_SolvePoly(coeffs.ref, roots!.ref, maxIters, p)); - return p.value; - }); - return (rval, roots); + eigenvalues ??= Mat.empty(); + eigenvectors ??= Mat.empty(); + cvRun( + () => ccore.cv_PCACompute( + data.ref, + mean.ref, + eigenvectors!.ref, + eigenvalues!.ref, + maxComponents, + ffi.nullptr, + ), + ); + return (mean, eigenvalues, eigenvectors); +} + +(Mat mean, Mat eigenvalues, Mat eigenvectors) PCACompute1( + InputArray data, + InputOutputArray mean, + double retainedVariance, { + OutputArray? eigenvectors, + OutputArray? eigenvalues, +}) { + eigenvectors ??= Mat.empty(); + eigenvalues ??= Mat.empty(); + cvRun( + () => ccore.cv_PCACompute_1( + data.ref, + mean.ref, + eigenvectors!.ref, + eigenvalues!.ref, + retainedVariance, + ffi.nullptr, + ), + ); + return (mean, eigenvalues, eigenvectors); +} + +(Mat mean, Mat result) PCAProject(Mat data, Mat mean, Mat eigenvectors, {OutputArray? result}) { + result ??= Mat.empty(); + cvRun(() => ccore.cv_PCAProject(data.ref, mean.ref, eigenvectors.ref, result!.ref, ffi.nullptr)); + return (mean, result); +} + +/// PerspectiveTransform performs the perspective matrix transformation of vectors. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gad327659ac03e5fd6894b90025e6900a7 +Mat perspectiveTransform(InputArray src, InputArray m, {OutputArray? dst}) { + dst ??= Mat.empty(); + cvRun(() => ccore.cv_perspectiveTransform(src.ref, dst!.ref, m.ref, ffi.nullptr)); + return dst; +} + +/// Phase calculates the rotation angle of 2D vectors. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9db9ca9b4d81c3bde5677b8f64dc0137 +Mat phase(InputArray x, InputArray y, {OutputArray? angle, bool angleInDegrees = false}) { + angle ??= Mat.empty(); + cvRun(() => ccore.cv_phase(x.ref, y.ref, angle!.ref, angleInDegrees, ffi.nullptr)); + return angle; +} + +/// PolatToCart calculates x and y coordinates of 2D vectors from their magnitude and angle. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga581ff9d44201de2dd1b40a50db93d665 +(Mat x, Mat y) polarToCart( + InputArray magnitude, + InputArray angle, { + OutputArray? x, + OutputArray? y, + bool angleInDegrees = false, +}) { + x ??= Mat.empty(); + y ??= Mat.empty(); + cvRun(() => ccore.cv_polarToCart(magnitude.ref, angle.ref, x!.ref, y!.ref, angleInDegrees, ffi.nullptr)); + return (x, y); +} + +/// Pow raises every array element to a power. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf0d056b5bd1dc92500d6f6cf6bac41ef +Mat pow(InputArray src, double power, {OutputArray? dst}) { + dst ??= Mat.empty(); + cvRun(() => ccore.cv_pow(src.ref, power, dst!.ref, ffi.nullptr)); + return dst; +} + +/// Computes the Peak Signal-to-Noise Ratio (PSNR) image quality metric. +/// +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga3119e3ea73010a6f810bb05aa36ac8d6 +double PSNR(InputArray src1, InputArray src2, {double R = 255.0}) { + final p = calloc(); + cvRun(() => ccore.cv_PSNR(src1.ref, src2.ref, R, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; +} + +/// RandN Fills the array with normally distributed random numbers. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeff1f61e972d133a04ce3a5f81cf6808 +Mat randn(InputOutputArray dst, Scalar mean, Scalar stddev) { + cvRun(() => ccore.cv_randn(dst.ref, mean.ref, stddev.ref, ffi.nullptr)); + return dst; +} + +/// RandShuffle Shuffles the array elements randomly. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6a789c8a5cb56c6dd62506179808f763 +Mat randShuffle( + InputOutputArray dst, { + double iterFactor = 1, + Rng? rng, +}) { + if (rng == null) { + cvRun(() => ccore.cv_randShuffle(dst.ref, ffi.nullptr)); + } else { + cvRun(() => ccore.cv_randShuffle_1(dst.ref, iterFactor, rng.ref, ffi.nullptr)); + } + return dst; +} + +/// RandU Generates a single uniformly-distributed random +/// number or an array of random numbers. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1ba1026dca0807b27057ba6a49d258c0 +Mat randu(InputOutputArray dst, Scalar low, Scalar high) { + cvRun(() => ccore.cv_randu(dst.ref, low.ref, high.ref, ffi.nullptr)); + return dst; } /// Reduce reduces a matrix to a vector. @@ -990,7 +1036,7 @@ Mat perspectiveTransform(InputArray src, InputArray m, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4b78072a303f29d9031d56e5638da78e Mat reduce(InputArray src, int dim, int rtype, {OutputArray? dst, int dtype = -1}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Reduce(src.ref, dst!.ref, dim, rtype, dtype)); + cvRun(() => ccore.cv_reduce(src.ref, dst!.ref, dim, rtype, dtype, ffi.nullptr)); return dst; } @@ -1000,7 +1046,7 @@ Mat reduce(InputArray src, int dim, int rtype, {OutputArray? dst, int dtype = -1 /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa87ea34d99bcc5bf9695048355163da0 Mat reduceArgMax(InputArray src, int axis, {OutputArray? dst, bool lastIndex = false}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_ReduceArgMax(src.ref, dst!.ref, axis, lastIndex)); + cvRun(() => ccore.cv_reduceArgMax(src.ref, dst!.ref, axis, lastIndex, ffi.nullptr)); return dst; } @@ -1010,7 +1056,7 @@ Mat reduceArgMax(InputArray src, int axis, {OutputArray? dst, bool lastIndex = f /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeecd548276bfb91b938989e66b722088 Mat reduceArgMin(InputArray src, int axis, {OutputArray? dst, bool lastIndex = false}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_ReduceArgMin(src.ref, dst!.ref, axis, lastIndex)); + cvRun(() => ccore.cv_reduceArgMin(src.ref, dst!.ref, axis, lastIndex, ffi.nullptr)); return dst; } @@ -1020,7 +1066,17 @@ Mat reduceArgMin(InputArray src, int axis, {OutputArray? dst, bool lastIndex = f /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga496c3860f3ac44c40b48811333cfda2d Mat repeat(InputArray src, int ny, int nx, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Repeat(src.ref, ny, nx, dst!.ref)); + cvRun(() => ccore.cv_repeat(src.ref, ny, nx, dst!.ref, ffi.nullptr)); + return dst; +} + +/// Rotate rotates a 2D array in multiples of 90 degrees +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4ad01c0978b0ce64baa246811deeac24 +Mat rotate(InputArray src, int rotateCode, {OutputArray? dst}) { + dst ??= Mat.empty(); + cvRun(() => ccore.cv_rotate(src.ref, dst!.ref, rotateCode, ffi.nullptr)); return dst; } @@ -1030,7 +1086,7 @@ Mat repeat(InputArray src, int ny, int nx, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9e0845db4135f55dcf20227402f00d98 Mat scaleAdd(InputArray src1, double alpha, InputArray src2, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_ScaleAdd(src1.ref, alpha, src2.ref, dst!.ref)); + cvRun(() => ccore.cv_scaleAdd(src1.ref, alpha, src2.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -1039,17 +1095,64 @@ Mat scaleAdd(InputArray src1, double alpha, InputArray src2, {OutputArray? dst}) /// /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga388d7575224a4a277ceb98ccaa327c99 Mat setIdentity(InputOutputArray mtx, {double s = 1}) { - cvRun(() => ccore.Mat_SetIdentity(mtx.ref, s)); + cvRun(() => ccore.cv_setIdentity(mtx.ref, s, ffi.nullptr)); return mtx; } +/// Solve solves one or more linear systems or least-squares problems. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga12b43690dbd31fed96f213eefead2373 +(bool ret, Mat dst) solve( + InputArray src1, + InputArray src2, { + OutputArray? dst, + int flags = DECOMP_LU, +}) { + dst ??= Mat.empty(); + final p = calloc(); + cvRun(() => ccore.cv_solve(src1.ref, src2.ref, dst!.ref, flags, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return (rval, dst); +} + +/// SolveCubic finds the real roots of a cubic equation. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1c3b0b925b085b6e96931ee309e6a1da +(int rval, Mat roots) solveCubic(InputArray coeffs, {OutputArray? roots}) { + roots ??= Mat.empty(); + final p = calloc(); + cvRun(() => ccore.cv_solveCubic(coeffs.ref, roots!.ref, p, ffi.nullptr)); + final rval = p.value; + return (rval, roots); +} + +/// SolvePoly finds the real or complex roots of a polynomial equation. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gac2f5e953016fabcdf793d762f4ec5dce +(double rval, Mat roots) solvePoly( + InputArray coeffs, { + OutputArray? roots, + int maxIters = 300, +}) { + roots ??= Mat.empty(); + final p = calloc(); + cvRun(() => ccore.cv_solvePoly(coeffs.ref, roots!.ref, maxIters, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return (rval, roots); +} + /// Sort sorts each row or each column of a matrix. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga45dd56da289494ce874be2324856898f Mat sort(InputArray src, int flags, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Sort(src.ref, dst!.ref, flags)); + cvRun(() => ccore.cv_sort(src.ref, dst!.ref, flags, ffi.nullptr)); return dst; } @@ -1060,7 +1163,7 @@ Mat sort(InputArray src, int flags, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gadf35157cbf97f3cb85a545380e383506 Mat sortIdx(InputArray src, int flags, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_SortIdx(src.ref, dst!.ref, flags)); + cvRun(() => ccore.cv_sortIdx(src.ref, dst!.ref, flags, ffi.nullptr)); return dst; } @@ -1071,7 +1174,7 @@ Mat sortIdx(InputArray src, int flags, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga0547c7fed86152d7e9d0096029c8518a VecMat split(InputArray m) { final vec = calloc(); - cvRun(() => ccore.Mat_Split(m.ref, vec)); + cvRun(() => ccore.cv_split(m.ref, vec, ffi.nullptr)); return VecMat.fromPointer(vec); } @@ -1083,9 +1186,9 @@ VecMat split(InputArray m) { /// /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga186222c3919657890f88df5a1f64a7d7 Mat sqrt(Mat src, {Mat? dst}) { - final p = dst?.ptr ?? calloc(); - cvRun(() => ccore.Mat_Sqrt(src.ref, p)); - return dst ?? Mat.fromPointer(p); + dst ??= Mat.empty(); + cvRun(() => ccore.cv_sqrt(src.ref, dst!.ref, ffi.nullptr)); + return dst; } /// Subtract calculates the per-element subtraction of two arrays or an array and a scalar. @@ -1101,7 +1204,7 @@ Mat subtract( }) { dst ??= Mat.empty(); mask ??= Mat.empty(); - cvRun(() => ccore.Mat_Subtract(src1.ref, src2.ref, dst!.ref, mask!.ref, dtype)); + cvRun(() => ccore.cv_subtract(src1.ref, src2.ref, dst!.ref, mask!.ref, dtype, ffi.nullptr)); return dst; } @@ -1113,17 +1216,39 @@ Mat subtract( /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga716e10a2dd9e228e4d3c95818f106722 Scalar sum(Mat src) { final p = calloc(); - cvRun(() => ccore.Mat_Sum(src.ref, p)); + cvRun(() => ccore.cv_sum(src.ref, p, ffi.nullptr)); return Scalar.fromPointer(p); } +/// SVBackSubst +Mat SVBackSubst(InputArray w, InputArray u, InputArray vh, InputArray rhs, {OutputArray? dst}) { + dst ??= Mat.empty(); + cvRun(() => ccore.cv_SVBackSubst(w.ref, u.ref, vh.ref, rhs.ref, dst!.ref, ffi.nullptr)); + return dst; +} + +/// SVDecomp +(Mat w, Mat u, Mat vh) SVDecomp( + InputArray src, { + OutputArray? w, + OutputArray? u, + OutputArray? vt, + int flags = 0, +}) { + w ??= Mat.empty(); + u ??= Mat.empty(); + vt ??= Mat.empty(); + cvRun(() => ccore.cv_SVDecomp(src.ref, w!.ref, u!.ref, vt!.ref, flags, ffi.nullptr)); + return (w, u, vt); +} + /// Trace returns the trace of a matrix. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3419ac19c7dcd2be4bd552a23e147dd8 Scalar trace(InputArray mtx) { final ptr = calloc(); - cvRun(() => ccore.Mat_Trace(mtx.ref, ptr)); + cvRun(() => ccore.cv_trace(mtx.ref, ptr, ffi.nullptr)); return Scalar.fromPointer(ptr); } @@ -1133,7 +1258,7 @@ Scalar trace(InputArray mtx) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga393164aa54bb9169ce0a8cc44e08ff22 Mat transform(InputArray src, InputArray m, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Transform(src.ref, dst!.ref, m.ref)); + cvRun(() => ccore.cv_transform(src.ref, dst!.ref, m.ref, ffi.nullptr)); return dst; } @@ -1143,71 +1268,22 @@ Mat transform(InputArray src, InputArray m, {OutputArray? dst}) { /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga46630ed6c0ea6254a35f447289bd7404 Mat transpose(InputArray src, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Transpose(src.ref, dst!.ref)); + cvRun(() => ccore.cv_transpose(src.ref, dst!.ref, ffi.nullptr)); return dst; } -/// Pow raises every array element to a power. +/// Transpose for n-dimensional matrices. +/// +/// Input should be continuous single-channel matrix. /// /// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf0d056b5bd1dc92500d6f6cf6bac41ef -Mat pow(InputArray src, double power, {OutputArray? dst}) { +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga46630ed6c0ea6254a35f447289bd7404 +Mat transposeND(InputArray src, List order, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => ccore.Mat_Pow(src.ref, power, dst!.ref)); + cvRun(() => ccore.cv_transposeND(src.ref, dst!.ref, order.i32.ref, ffi.nullptr)); return dst; } -/// PolatToCart calculates x and y coordinates of 2D vectors from their magnitude and angle. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga581ff9d44201de2dd1b40a50db93d665 -(Mat x, Mat y) polarToCart( - InputArray magnitude, - InputArray angle, { - OutputArray? x, - OutputArray? y, - bool angleInDegrees = false, -}) { - x ??= Mat.empty(); - y ??= Mat.empty(); - cvRun(() => ccore.Mat_PolarToCart(magnitude.ref, angle.ref, x!.ref, y!.ref, angleInDegrees)); - return (x, y); -} - -/// Phase calculates the rotation angle of 2D vectors. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9db9ca9b4d81c3bde5677b8f64dc0137 -Mat phase(InputArray x, InputArray y, {OutputArray? angle, bool angleInDegrees = false}) { - angle ??= Mat.empty(); - cvRun(() => ccore.Mat_Phase(x.ref, y.ref, angle!.ref, angleInDegrees)); - return angle; -} - -/// GetTickCount returns the number of ticks. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/db/de0/group__core__utils.html#gae73f58000611a1af25dd36d496bf4487 -int getTickCount() { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.GetCVTickCount(p)); - return p.value; - }); -} - -/// GetTickFrequency returns the number of ticks per second. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/db/de0/group__core__utils.html#ga705441a9ef01f47acdc55d87fbe5090c -double getTickFrequency() { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.GetTickFrequency(p)); - return p.value; - }); -} - /// TheRNG Returns the default random number generator. /// /// For further details, please see: @@ -1215,56 +1291,99 @@ double getTickFrequency() { /// Disabled: double free Rng theRNG() { final p = calloc(); - cvRun(() => ccore.TheRNG(p)); + cvRun(() => ccore.cv_theRNG(p)); return Rng.fromTheRng(p); } -/// RandN Fills the array with normally distributed random numbers. +/// Vconcat applies vertical concatenation to given matrices. /// /// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeff1f61e972d133a04ce3a5f81cf6808 -Mat randn(InputOutputArray dst, Scalar mean, Scalar stddev) { - cvRun(() => ccore.RandN(dst.ref, mean.ref, stddev.ref)); +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gaad07cede730cdde64b90e987aad179b8 +Mat vconcat(InputArray src1, InputArray src2, {OutputArray? dst}) { + dst ??= Mat.empty(); + cvRun(() => ccore.cv_vconcat(src1.ref, src2.ref, dst!.ref, ffi.nullptr)); return dst; } -/// RandShuffle Shuffles the array elements randomly. +/// KMeans finds centers of clusters and groups input samples around the clusters. /// /// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6a789c8a5cb56c6dd62506179808f763 -Mat randShuffle( - InputOutputArray dst, { - double iterFactor = 1, - Rng? rng, +/// https://docs.opencv.org/master/d5/d38/group__core__cluster.html#ga9a34dc06c6ec9460e90860f15bcd2f88 +(double rval, Mat bestLabels, Mat centers) kmeans( + InputArray data, + int K, + InputOutputArray bestLabels, + (int, int, double) criteria, + int attempts, + int flags, { + OutputArray? centers, }) { - if (rng == null) { - cvRun(() => ccore.RandShuffle(dst.ref)); - } else { - cvRun(() => ccore.RandShuffleWithParams(dst.ref, iterFactor, rng.ref)); - } - return dst; + centers ??= Mat.empty(); + final p = calloc(); + cvRun( + () => ccore.cv_kmeans( + data.ref, + K, + bestLabels.ref, + TermCriteria.fromRecord(criteria).ref, + attempts, + flags, + centers!.ref, + p, + ffi.nullptr, + ), + ); + final rval = p.value; + calloc.free(p); + return (rval, bestLabels, centers); } -/// RandU Generates a single uniformly-distributed random -/// number or an array of random numbers. +/// KMeansPoints finds centers of clusters and groups input samples around the clusters. /// /// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1ba1026dca0807b27057ba6a49d258c0 -Mat randu(InputOutputArray dst, Scalar low, Scalar high) { - cvRun(() => ccore.RandU(dst.ref, low.ref, high.ref)); - return dst; +/// https://docs.opencv.org/master/d5/d38/group__core__cluster.html#ga9a34dc06c6ec9460e90860f15bcd2f88 +(double rval, Mat bestLabels, Mat centers) kmeansByPoints( + VecPoint2f pts, + int K, + InputOutputArray bestLabels, + (int, int, double) criteria, + int attempts, + int flags, { + OutputArray? centers, +}) { + centers ??= Mat.empty(); + final p = calloc(); + cvRun( + () => ccore.cv_kmeans_points( + pts.ref, + K, + bestLabels.ref, + TermCriteria.fromRecord(criteria).ref, + attempts, + flags, + centers!.ref, + p, + ffi.nullptr, + ), + ); + final rval = p.value; + return (rval, bestLabels, centers); } +/// GetTickCount returns the number of ticks. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/db/de0/group__core__utils.html#gae73f58000611a1af25dd36d496bf4487 +int getTickCount() => ccore.cv_getTickCount(); + +/// GetTickFrequency returns the number of ticks per second. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/db/de0/group__core__utils.html#ga705441a9ef01f47acdc55d87fbe5090c +double getTickFrequency() => ccore.cv_getTickFrequency(); + /// Set the number of threads for OpenCV. -void setNumThreads(int n) { - cvRun(() => ccore.SetNumThreads(n)); -} +void setNumThreads(int n) => ccore.cv_setNumThreads(n); /// Get the number of threads for OpenCV. -int getNumThreads() { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccore.GetNumThreads(p)); - return p.value; - }); -} +int getNumThreads() => ccore.cv_getNumThreads(); diff --git a/packages/dartcv/lib/src/core/core_async.dart b/packages/dartcv/lib/src/core/core_async.dart index 1470df8b..4a8f5f92 100644 --- a/packages/dartcv/lib/src/core/core_async.dart +++ b/packages/dartcv/lib/src/core/core_async.dart @@ -27,19 +27,28 @@ import 'vec.dart'; /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6fef31bc8c4071cbc114a758a2b79c14 -Future absDiffAsync(Mat src1, Mat src2) async => cvRunAsync( - (callback) => ccore.core_AbsDiff_Async(src1.ref, src2.ref, callback), - matCompleter, - ); +Future absDiffAsync(Mat src1, Mat src2, {Mat? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_absdiff(src1.ref, src2.ref, dst!.ref, callback), + (c) => c.complete(dst), + ); +} /// Add calculates the per-element sum of two arrays or an array and a scalar. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga10ac1bfb180e2cfda1701d06c24fdbd6 -Future addAsync(Mat src1, Mat src2, {Mat? mask, int dtype = -1}) async => cvRunAsync( - (callback) => ccore.core_Add_Async(src1.ref, src2.ref, mask?.ref ?? Mat.empty().ref, dtype, callback), - matCompleter, - ); +Future addAsync(Mat src1, Mat src2, {Mat? dst, int dtype = -1, Mat? mask}) { + dst ??= Mat.empty(); + mask ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_add(src1.ref, src2.ref, dst!.ref, mask!.ref, dtype, callback), + (c) { + return c.complete(dst); + }, + ); +} /// AddWeighted calculates the weighted sum of two arrays. /// @@ -51,12 +60,17 @@ Future addWeightedAsync( InputArray src2, double beta, double gamma, { + OutputArray? dst, int dtype = -1, -}) async => - cvRunAsync( - (callback) => ccore.core_AddWeighted_Async(src1.ref, alpha, src2.ref, beta, gamma, dtype, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_addWeighted(src1.ref, alpha, src2.ref, beta, gamma, dst!.ref, dtype, callback), + (c) { + return c.complete(dst); + }, + ); +} /// BitwiseAnd computes bitwise conjunction of the two arrays (dst = src1 & src2). /// Calculates the per-element bit-wise conjunction of two arrays @@ -67,49 +81,99 @@ Future addWeightedAsync( Future bitwiseANDAsync( InputArray src1, InputArray src2, { + OutputArray? dst, InputArray? mask, -}) async => - cvRunAsync( - (callback) => mask == null - ? ccore.core_BitwiseAnd_Async(src1.ref, src2.ref, callback) - : ccore.core_BitwiseAndWithMask_Async(src1.ref, src2.ref, mask.ref, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return mask == null + ? cvRunAsync0( + (callback) => ccore.cv_bitwise_and(src1.ref, src2.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ) + : cvRunAsync0( + (callback) => ccore.cv_bitwise_and_1(src1.ref, src2.ref, dst!.ref, mask.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// BitwiseNot inverts every bit of an array. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga0002cf8b418479f4cb49a75442baee2f -Future bitwiseNOTAsync(InputArray src, {InputArray? mask}) async => cvRunAsync( - (callback) => mask == null - ? ccore.core_BitwiseNot_Async(src.ref, callback) - : ccore.core_BitwiseNotWithMask_Async(src.ref, mask.ref, callback), - matCompleter, - ); +Future bitwiseNOTAsync(InputArray src, {OutputArray? dst, InputArray? mask}) { + dst ??= Mat.empty(); + return mask == null + ? cvRunAsync0( + (callback) => ccore.cv_bitwise_not(src.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ) + : cvRunAsync0( + (callback) => ccore.cv_bitwise_not_1(src.ref, dst!.ref, mask.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// BitwiseOr calculates the per-element bit-wise disjunction of two arrays /// or an array and a scalar. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gab85523db362a4e26ff0c703793a719b4 -Future bitwiseORAsync(InputArray src1, InputArray src2, {InputArray? mask}) async => cvRunAsync( - (callback) => mask == null - ? ccore.core_BitwiseOr_Async(src1.ref, src2.ref, callback) - : ccore.core_BitwiseOrWithMask_Async(src1.ref, src2.ref, mask.ref, callback), - matCompleter, - ); +Future bitwiseORAsync( + InputArray src1, + InputArray src2, { + OutputArray? dst, + InputArray? mask, +}) { + dst ??= Mat.empty(); + return mask == null + ? cvRunAsync0( + (callback) => ccore.cv_bitwise_or(src1.ref, src2.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ) + : cvRunAsync0( + (callback) => ccore.cv_bitwise_or_1(src1.ref, src2.ref, dst!.ref, mask.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// BitwiseXor calculates the per-element bit-wise "exclusive or" operation /// on two arrays or an array and a scalar. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga84b2d8188ce506593dcc3f8cd00e8e2c -Future bitwiseXORAsync(InputArray src1, InputArray src2, {InputArray? mask}) async => cvRunAsync( - (callback) => mask == null - ? ccore.core_BitwiseXor_Async(src1.ref, src2.ref, callback) - : ccore.core_BitwiseXorWithMask_Async(src1.ref, src2.ref, mask.ref, callback), - matCompleter, - ); +Future bitwiseXORAsync( + InputArray src1, + InputArray src2, { + OutputArray? dst, + InputArray? mask, +}) { + dst ??= Mat.empty(); + return mask == null + ? cvRunAsync0( + (callback) => ccore.cv_bitwise_xor(src1.ref, src2.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ) + : cvRunAsync0( + (callback) => ccore.cv_bitwise_xor_1(src1.ref, src2.ref, dst!.ref, mask.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// BatchDistance is a naive nearest neighbor finder. /// @@ -119,35 +183,52 @@ Future<(Mat dist, Mat nidx)> batchDistanceAsync( InputArray src1, InputArray src2, int dtype, { + OutputArray? dist, + OutputArray? nidx, int normType = NORM_L2, int K = 0, InputArray? mask, int update = 0, bool crosscheck = false, -}) async => - cvRunAsync2<(Mat, Mat)>( - (callback) => ccore.core_BatchDistance_Async( - src1.ref, - src2.ref, - dtype, - normType, - K, - mask?.ref ?? Mat.empty().ref, - update, - crosscheck, - callback, - ), - matCompleter2, - ); +}) { + dist ??= Mat.empty(); + nidx ??= Mat.empty(); + mask ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_batchDistance( + src1.ref, + src2.ref, + dist!.ref, + dtype, + nidx!.ref, + normType, + K, + mask!.ref, + update, + crosscheck, + callback, + ), + (c) { + return c.complete((dist!, nidx!)); + }, + ); +} /// BorderInterpolate computes the source location of an extrapolated pixel. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga247f571aa6244827d3d798f13892da58 -Future borderInterpolateAsync(int p, int len, int borderType) async => cvRunAsync( - (callback) => ccore.core_BorderInterpolate_Async(p, len, borderType, callback), - intCompleter, - ); +Future borderInterpolateAsync(int p, int len, int borderType) { + final ptr = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_borderInterpolate(p, len, borderType, ptr, callback), + (c) { + final v = ptr.value; + calloc.free(ptr); + return c.complete(v); + }, + ); +} /// CalcCovarMatrix calculates the covariance matrix of a set of vectors. /// @@ -157,18 +238,24 @@ Future<(Mat covar, Mat mean)> calcCovarMatrixAsync( InputArray samples, InputOutputArray mean, int flags, { + OutputArray? covar, int ctype = MatType.CV_64F, -}) async => - cvRunAsync<(Mat, Mat)>( - (callback) => ccore.core_CalcCovarMatrix_Async( - samples.ref, - mean.ref, - flags, - ctype, - callback, - ), - (c, p) => c.complete((Mat.fromPointer(p.cast()), mean)), - ); +}) { + covar ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_calcCovarMatrix( + samples.ref, + covar!.ref, + mean.ref, + flags, + ctype, + callback, + ), + (c) { + return c.complete((covar!, mean)); + }, + ); +} /// CartToPolar calculates the magnitude and angle of 2D vectors. /// @@ -177,17 +264,19 @@ Future<(Mat covar, Mat mean)> calcCovarMatrixAsync( Future<(Mat magnitude, Mat angle)> cartToPolarAsync( InputArray x, InputArray y, { + OutputArray? magnitude, + OutputArray? angle, bool angleInDegrees = false, -}) async => - cvRunAsync2<(Mat, Mat)>( - (callback) => ccore.core_CartToPolar_Async( - x.ref, - y.ref, - angleInDegrees, - callback, - ), - matCompleter2, - ); +}) { + magnitude ??= Mat.empty(); + angle ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_cartToPolar(x.ref, y.ref, magnitude!.ref, angle!.ref, angleInDegrees, callback), + (c) { + return c.complete((magnitude!, angle!)); + }, + ); +} /// CheckRange checks every element of an input array for invalid values. /// @@ -198,37 +287,46 @@ Future<(bool, Point)> checkRangeAsync( bool quiet = true, double minVal = -CV_F64_MAX, double maxVal = CV_F64_MAX, -}) async => - cvRunAsync2((callback) => ccore.core_CheckRange_Async(a.ref, quiet, minVal, maxVal, callback), - (completer, p, p1) { - final rval = p.cast().value; - calloc.free(p); - completer.complete((rval, Point.fromPointer(p1.cast()))); - }); +}) { + final pos = calloc(); + final pRval = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_checkRange(a.ref, quiet, pos, minVal, maxVal, pRval, callback), + (c) { + final rval = pRval.value; + calloc.free(pRval); + return c.complete((rval, Point.fromPointer(pos))); + }, + ); +} /// Compare performs the per-element comparison of two arrays /// or an array and scalar value. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga303cfb72acf8cbb36d884650c09a3a97 -Future compareAsync(InputArray src1, InputArray src2, int cmpop) async => - cvRunAsync((callback) => ccore.core_Compare_Async(src1.ref, src2.ref, cmpop, callback), matCompleter); - -/// CountNonZero counts non-zero array elements. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa4b89393263bb4d604e0fe5986723914 -Future countNonZeroAsync(Mat src) async => - cvRunAsync((callback) => ccore.core_CountNonZero_Async(src.ref, callback), intCompleter); +Future compareAsync(InputArray src1, InputArray src2, int cmpop, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_compare(src1.ref, src2.ref, dst!.ref, cmpop, callback), + (c) { + return c.complete(dst); + }, + ); +} /// CompleteSymm copies the lower or the upper half of a square matrix to its another half. /// /// For further details, please see: /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga6847337c0c55769e115a70e0f011b5ca -Future completeSymmAsync(InputOutputArray m, {bool lowerToUpper = false}) async => cvRunAsync0( - (callback) => ccore.core_CompleteSymm_Async(m.ref, lowerToUpper, callback), - (c) => c.complete(m), - ); +Future completeSymmAsync(InputOutputArray m, {bool lowerToUpper = false}) { + return cvRunAsync0( + (callback) => ccore.cv_completeSymm(m.ref, lowerToUpper, callback), + (c) { + return c.complete(m); + }, + ); +} /// ConvertScaleAbs scales, calculates absolute values, and converts the result to 8-bit. /// @@ -236,10 +334,18 @@ Future completeSymmAsync(InputOutputArray m, {bool lowerToUpper = false}) a /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3460e9c9f37b563ab9dd550c4d8c4e7d Future convertScaleAbsAsync( InputArray src, { + OutputArray? dst, double alpha = 1, double beta = 0, -}) async => - cvRunAsync((callback) => ccore.core_ConvertScaleAbs_Async(src.ref, alpha, beta, callback), matCompleter); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_convertScaleAbs(src.ref, dst!.ref, alpha, beta, callback), + (c) { + return c.complete(dst); + }, + ); +} /// CopyMakeBorder forms a border around an image (applies padding). /// @@ -252,47 +358,73 @@ Future copyMakeBorderAsync( int left, int right, int borderType, { + OutputArray? dst, Scalar? value, -}) async => - cvRunAsync( - (callback) => ccore.core_CopyMakeBorder_Async( - src.ref, - top, - bottom, - left, - right, - borderType, - value?.ref ?? Scalar().ref, - callback, - ), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + value ??= Scalar(); + return cvRunAsync0( + (callback) => ccore.cv_copyMakeBorder( + src.ref, + dst!.ref, + top, + bottom, + left, + right, + borderType, + value!.ref, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// DCT performs a forward or inverse discrete Cosine transform of 1D or 2D array. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga85aad4d668c01fbd64825f589e3696d4 -Future dctAsync(InputArray src, {int flags = 0}) async => - cvRunAsync((callback) => ccore.core_DCT_Async(src.ref, flags, callback), matCompleter); +Future dctAsync(InputArray src, {OutputArray? dst, int flags = 0}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_dct(src.ref, dst!.ref, flags, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Determinant returns the determinant of a square floating-point matrix. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf802bd9ca3e07b8b6170645ef0611d0c -Future determinantAsync(InputArray mtx) async => - cvRunAsync((callback) => ccore.core_Determinant_Async(mtx.ref, callback), doubleCompleter); +Future determinantAsync(InputArray mtx) { + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_determinant(mtx.ref, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// DFT performs a forward or inverse Discrete Fourier Transform (DFT) /// of a 1D or 2D floating-point array. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gadd6cf9baf2b8b704a11b5f04aaf4f39d -Future dftAsync( - InputArray src, { - int flags = 0, - int nonzeroRows = 0, -}) async => - cvRunAsync((callback) => ccore.core_DFT_Async(src.ref, flags, nonzeroRows, callback), matCompleter); +Future dftAsync(InputArray src, {OutputArray? dst, int flags = 0, int nonzeroRows = 0}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_dft(src.ref, dst!.ref, flags, nonzeroRows, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Divide performs the per-element division /// on two arrays or an array and a scalar. @@ -302,38 +434,74 @@ Future dftAsync( Future divideAsync( InputArray src1, InputArray src2, { + OutputArray? dst, double scale = 1, int dtype = -1, -}) async => - cvRunAsync( - (callback) => ccore.core_Divide_Async(src1.ref, src2.ref, scale, dtype, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_divide(src1.ref, src2.ref, dst!.ref, scale, dtype, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Eigen calculates eigenvalues and eigenvectors of a symmetric matrix. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9fa0d58657f60eaa6c71f6fbb40456e3 -Future<(bool ret, Mat eigenvalues, Mat eigenvectors)> eigenAsync(InputArray src) async => - cvRunAsync3((callback) => ccore.core_Eigen_Async(src.ref, callback), (completer, p, p1, p2) { - final rval = p.cast().value; +Future<(bool ret, Mat eigenvalues, Mat eigenvectors)> eigenAsync( + InputArray src, { + OutputArray? eigenvalues, + OutputArray? eigenvectors, +}) { + eigenvalues ??= Mat.empty(); + eigenvectors ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_eigen(src.ref, eigenvalues!.ref, eigenvectors!.ref, p, callback), + (c) { + final ret = p.value; calloc.free(p); - completer.complete((rval, Mat.fromPointer(p1.cast()), Mat.fromPointer(p2.cast()))); - }); + return c.complete((ret, eigenvalues!, eigenvectors!)); + }, + ); +} /// EigenNonSymmetric calculates eigenvalues and eigenvectors of a non-symmetric matrix (real eigenvalues only). /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf51987e03cac8d171fbd2b327cf966f6 -Future<(Mat eigenvalues, Mat eigenvectors)> eigenNonSymmetricAsync(InputArray src) async => cvRunAsync2( - (callback) => ccore.core_EigenNonSymmetric_Async(src.ref, callback), - matCompleter2, - ); - -Future<(Mat mean, Mat result)> PCABackProjectAsync(Mat src, Mat mean, Mat eigenVectors) async => cvRunAsync( - (callback) => ccore.core_PCABackProject_Async(src.ref, mean.ref, eigenVectors.ref, callback), - (completer, p) => completer.complete((mean, Mat.fromPointer(p.cast()))), - ); +Future<(Mat eigenvalues, Mat eigenvectors)> eigenNonSymmetricAsync( + InputArray src, { + OutputArray? eigenvalues, + OutputArray? eigenvectors, +}) { + eigenvalues ??= Mat.empty(); + eigenvectors ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_eigenNonSymmetric(src.ref, eigenvalues!.ref, eigenvectors!.ref, callback), + (c) { + return c.complete((eigenvalues!, eigenvectors!)); + }, + ); +} + +Future PCABackProjectAsync( + InputArray data, + InputArray mean, + InputArray eigenvectors, { + OutputArray? dst, +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_PCABackProject(data.ref, mean.ref, eigenvectors.ref, dst!.ref, callback), + (c) { + return c.complete(dst!); + }, + ); +} /// PCACompute performs PCA. /// @@ -347,83 +515,122 @@ Future<(Mat mean, Mat result)> PCABackProjectAsync(Mat src, Mat mean, Mat eigenV Future<(Mat mean, Mat eigenvalues, Mat eigenvectors)> PCAComputeAsync( InputArray data, InputOutputArray mean, { + OutputArray? eigenvectors, + OutputArray? eigenvalues, int maxComponents = 0, -}) async => - cvRunAsync2((callback) => ccore.core_PCACompute_Async(data.ref, mean.ref, maxComponents, callback), - (completer, p, p1) { - completer.complete( - ( - mean, - Mat.fromPointer(p.cast()), - Mat.fromPointer(p1.cast()), - ), - ); - }); - -Future<(Mat mean, Mat eigenvectors)> PCACompute1Async( - InputArray data, - InputOutputArray mean, { - int maxComponents = 0, -}) async => - cvRunAsync( - (callback) => ccore.core_PCACompute_1_Async(data.ref, mean.ref, maxComponents, callback), - (completer, p) => completer.complete((mean, Mat.fromPointer(p.cast()))), - ); - -Future<(Mat mean, Mat eigenvectors)> PCACompute2Async( +}) { + eigenvalues ??= Mat.empty(); + eigenvectors ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_PCACompute( + data.ref, + mean.ref, + eigenvectors!.ref, + eigenvalues!.ref, + maxComponents, + callback, + ), (c) { + return c.complete((mean, eigenvalues!, eigenvectors!)); + }); +} + +Future<(Mat mean, Mat eigenvalues, Mat eigenvectors)> PCACompute1Async( InputArray data, - InputOutputArray mean, { - double retainedVariance = 0, -}) async => - cvRunAsync( - (callback) => ccore.core_PCACompute_3_Async(data.ref, mean.ref, retainedVariance, callback), - (completer, p) => completer.complete((mean, Mat.fromPointer(p.cast()))), - ); - -Future<(Mat mean, Mat eigenvalues, Mat eigenvectors)> PCACompute3Async( - InputArray data, - InputOutputArray mean, { - double retainedVariance = 0, -}) async => - cvRunAsync2( - (callback) => ccore.core_PCACompute_2_Async(data.ref, mean.ref, retainedVariance, callback), - (completer, p, p1) => - completer.complete((mean, Mat.fromPointer(p.cast()), Mat.fromPointer(p1.cast()))), - ); - -Future<(Mat mean, Mat result)> PCAProjectAsync(InputArray src, InputArray mean, InputArray eigenVectors) => - cvRunAsync((callback) => ccore.core_PCAProject_Async(src.ref, mean.ref, eigenVectors.ref, callback), - (completer, p) { - completer.complete((mean, Mat.fromPointer(p.cast()))); - }); + InputOutputArray mean, + double retainedVariance, { + OutputArray? eigenvectors, + OutputArray? eigenvalues, +}) { + eigenvectors ??= Mat.empty(); + eigenvalues ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_PCACompute_1( + data.ref, + mean.ref, + eigenvectors!.ref, + eigenvalues!.ref, + retainedVariance, + callback, + ), (c) { + return c.complete((mean, eigenvalues!, eigenvectors!)); + }); +} + +Future<(Mat mean, Mat result)> PCAProjectAsync(Mat data, Mat mean, Mat eigenvectors, {OutputArray? result}) { + result ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_PCAProject(data.ref, mean.ref, eigenvectors.ref, result!.ref, callback), + (c) { + return c.complete((mean, result!)); + }, + ); +} /// Exp calculates the exponent of every array element. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3e10108e2162c338f1b848af619f39e5 -Future expAsync(InputArray src) async => - cvRunAsync((callback) => ccore.core_Exp_Async(src.ref, callback), matCompleter); +Future expAsync(InputArray src, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_exp(src.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// ExtractChannel extracts a single channel from src (coi is 0-based index). /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacc6158574aa1f0281878c955bcf35642 -Future extractChannelAsync(InputArray src, int coi) async => - cvRunAsync((callback) => ccore.core_ExtractChannel_Async(src.ref, coi, callback), matCompleter); +Future extractChannelAsync(InputArray src, int coi, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_extractChannel(src.ref, dst!.ref, coi, callback), + (c) { + return c.complete(dst); + }, + ); +} /// FindNonZero returns the list of locations of non-zero pixels. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaed7df59a3539b4cc0fe5c9c8d7586190 -Future findNonZeroAsync(InputArray src) async => - cvRunAsync((callback) => ccore.core_FindNonZero_Async(src.ref, callback), matCompleter); +Future findNonZeroAsync(InputArray src, {OutputArray? idx}) { + idx ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_findNonZero(src.ref, idx!.ref, callback), + (c) { + return c.complete(idx); + }, + ); +} /// Flip flips a 2D array around horizontal(0), vertical(1), or both axes(-1). /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaca7be533e3dac7feb70fc60635adf441 -Future flipAsync(InputArray src, int flipCode) async => - cvRunAsync((callback) => ccore.core_Flip_Async(src.ref, flipCode, callback), matCompleter); +Future flipAsync(InputArray src, int flipCode, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_flip(src.ref, dst!.ref, flipCode, callback), + (c) { + return c.complete(dst); + }, + ); +} + +Future flipND(InputArray src, int axis, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_flipND(src.ref, dst!.ref, axis, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Gemm performs generalized matrix multiplication. /// @@ -435,41 +642,76 @@ Future gemmAsync( double alpha, InputArray src3, double beta, { + OutputArray? dst, int flags = 0, -}) async => - cvRunAsync( - (callback) => ccore.core_Gemm_Async(src1.ref, src2.ref, alpha, src3.ref, beta, flags, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_gemm(src1.ref, src2.ref, alpha, src3.ref, beta, dst!.ref, flags, callback), + (c) { + return c.complete(dst); + }, + ); +} /// GetOptimalDFTSize returns the optimal Discrete Fourier Transform (DFT) size /// for a given vector size. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6577a2e59968936ae02eb2edde5de299 -Future getOptimalDFTSizeAsync(int vecsize) async => - cvRunAsync((callback) => ccore.core_GetOptimalDFTSize_Async(vecsize, callback), intCompleter); +Future getOptimalDFTSizeAsync(int vecsize) { + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_getOptimalDFTSize(vecsize, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// Hconcat applies horizontal concatenation to given matrices. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaab5ceee39e0580f879df645a872c6bf7 -Future hconcatAsync(InputArray src1, InputArray src2) async => - cvRunAsync((callback) => ccore.core_Hconcat_Async(src1.ref, src2.ref, callback), matCompleter); +Future hconcatAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_hconcat(src1.ref, src2.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Vconcat applies vertical concatenation to given matrices. /// /// For further details, please see: /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gaad07cede730cdde64b90e987aad179b8 -Future vconcatAsync(InputArray src1, InputArray src2) async => - cvRunAsync((callback) => ccore.core_Vconcat_Async(src1.ref, src2.ref, callback), matCompleter); +Future vconcatAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_vconcat(src1.ref, src2.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Rotate rotates a 2D array in multiples of 90 degrees /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4ad01c0978b0ce64baa246811deeac24 -Future rotateAsync(InputArray src, int rotateCode) async => - cvRunAsync((callback) => ccore.core_Rotate_Async(src.ref, rotateCode, callback), matCompleter); +Future rotateAsync(InputArray src, int rotateCode, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_rotate(src.ref, dst!.ref, rotateCode, callback), + (c) { + return c.complete(dst); + }, + ); +} /// IDCT calculates the inverse Discrete Cosine Transform of a 1D or 2D array. /// @@ -477,9 +719,17 @@ Future rotateAsync(InputArray src, int rotateCode) async => /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga77b168d84e564c50228b69730a227ef2 Future idctAsync( InputArray src, { + OutputArray? dst, int flags = 0, -}) async => - cvRunAsync((callback) => ccore.core_Idct_Async(src.ref, flags, callback), matCompleter); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_idct(src.ref, dst!.ref, flags, callback), + (c) { + return c.complete(dst); + }, + ); +} /// IDFT calculates the inverse Discrete Fourier Transform of a 1D or 2D array. /// @@ -487,10 +737,18 @@ Future idctAsync( /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa708aa2d2e57a508f968eb0f69aa5ff1 Future idftAsync( InputArray src, { + OutputArray? dst, int flags = 0, int nonzeroRows = 0, -}) async => - cvRunAsync((callback) => ccore.core_Idft_Async(src.ref, flags, nonzeroRows, callback), matCompleter); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_idft(src.ref, dst!.ref, flags, nonzeroRows, callback), + (c) { + return c.complete(dst); + }, + ); +} /// InRange checks if array elements lie between the elements of two Mat arrays. /// @@ -499,12 +757,17 @@ Future idftAsync( Future inRangeAsync( InputArray src, InputArray lowerb, - InputArray upperb, -) async => - cvRunAsync( - (callback) => ccore.core_InRange_Async(src.ref, lowerb.ref, upperb.ref, callback), - matCompleter, - ); + InputArray upperb, { + OutputArray? dst, +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_inRange(src.ref, lowerb.ref, upperb.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// InRangeWithScalar checks if array elements lie between the elements of two Scalars /// @@ -513,22 +776,31 @@ Future inRangeAsync( Future inRangebyScalarAsync( InputArray src, Scalar lowerb, - Scalar upperb, -) async => - cvRunAsync( - (callback) => ccore.core_InRangeWithScalar_Async(src.ref, lowerb.ref, upperb.ref, callback), - matCompleter, - ); + Scalar upperb, { + OutputArray? dst, +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_inRange_1(src.ref, lowerb.ref, upperb.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// InsertChannel inserts a single channel to dst (coi is 0-based index) /// (it replaces channel i with another in dst). /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1d4bd886d35b00ec0b764cb4ce6eb515 -Future insertChannelAsync(InputArray src, InputOutputArray dst, int coi) async => cvRunAsync0( - (callback) => ccore.core_InsertChannel_Async(src.ref, dst.ref, coi, callback), - (c) => c.complete(dst), - ); +Future insertChannelAsync(InputArray src, InputOutputArray dst, int coi) { + return cvRunAsync0( + (callback) => ccore.cv_insertChannel(src.ref, dst.ref, coi, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Invert finds the inverse or pseudo-inverse of a matrix. /// @@ -536,13 +808,20 @@ Future insertChannelAsync(InputArray src, InputOutputArray dst, int coi) as /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gad278044679d4ecf20f7622cc151aaaa2 Future<(double rval, Mat dst)> invertAsync( InputArray src, { + OutputArray? dst, int flags = DECOMP_LU, -}) async => - cvRunAsync2<(double, Mat)>((callback) => ccore.core_Invert_Async(src.ref, flags, callback), (c, p, p1) { - final rval = p.cast().value; +}) { + dst ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_invert(src.ref, dst!.ref, flags, p, callback), + (c) { + final rval = p.value; calloc.free(p); - c.complete((rval, Mat.fromPointer(p1.cast()))); - }); + return c.complete((rval, dst!)); + }, + ); +} /// KMeans finds centers of clusters and groups input samples around the clusters. /// @@ -554,16 +833,30 @@ Future<(double rval, Mat bestLabels, Mat centers)> kmeansAsync( InputOutputArray bestLabels, (int, int, double) criteria, int attempts, - int flags, -) async => - cvRunAsync2( - (callback) => - ccore.core_KMeans_Async(data.ref, K, bestLabels.ref, criteria.cvd.ref, attempts, flags, callback), - (completer, p, p1) { - final rval = p.cast().value; + int flags, { + OutputArray? centers, +}) { + centers ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_kmeans( + data.ref, + K, + bestLabels.ref, + TermCriteria.fromRecord(criteria).ref, + attempts, + flags, + centers!.ref, + p, + callback, + ), + (c) { + final rval = p.value; calloc.free(p); - completer.complete((rval, bestLabels, Mat.fromPointer(p1.cast()))); - }); + return c.complete((rval, bestLabels, centers!)); + }, + ); +} /// KMeansPoints finds centers of clusters and groups input samples around the clusters. /// @@ -575,29 +868,44 @@ Future<(double rval, Mat bestLabels, Mat centers)> kmeansByPointsAsync( InputOutputArray bestLabels, (int, int, double) criteria, int attempts, - int flags, -) async => - cvRunAsync2( - (callback) => ccore.core_KMeans_Points_Async( - pts.ref, - K, - bestLabels.ref, - criteria.cvd.ref, - attempts, - flags, - callback, - ), (completer, p, p1) { - final rval = p.cast().value; + int flags, { + OutputArray? centers, +}) { + centers ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_kmeans_points( + pts.ref, + K, + bestLabels.ref, + TermCriteria.fromRecord(criteria).ref, + attempts, + flags, + centers!.ref, + p, + callback, + ), + (c) { + final rval = p.value; calloc.free(p); - completer.complete((rval, bestLabels, Mat.fromPointer(p1.cast()))); - }); + return c.complete((rval, bestLabels, centers!)); + }, + ); +} /// Log calculates the natural logarithm of every array element. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga937ecdce4679a77168730830a955bea7 -Future logAsync(InputArray src) async => - cvRunAsync((callback) => ccore.core_Log_Async(src.ref, callback), matCompleter); +Future logAsync(InputArray src, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_log(src.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Performs a look-up table transform of an array. Support CV_8U, CV_8S, CV_16U, CV_16S /// @@ -616,48 +924,93 @@ Future logAsync(InputArray src) async => /// number of channels as in the input array. /// /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gab55b8d062b7f5587720ede032d34156f -Future LUTAsync(InputArray src, InputArray lut) async => - cvRunAsync((callback) => ccore.core_LUT_Async(src.ref, lut.ref, callback), matCompleter); +Future LUTAsync(InputArray src, InputArray lut, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_LUT(src.ref, lut.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Magnitude calculates the magnitude of 2D vectors. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6d3b097586bca4409873d64a90fe64c3 -Future magnitudeAsync(InputArray x, InputArray y) async => - cvRunAsync((callback) => ccore.core_Magnitude_Async(x.ref, y.ref, callback), matCompleter); +Future magnitudeAsync(InputArray x, InputArray y, {OutputArray? magnitude}) { + magnitude ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_magnitude(x.ref, y.ref, magnitude!.ref, callback), + (c) { + return c.complete(magnitude); + }, + ); +} /// Max calculates per-element maximum of two arrays or an array and a scalar. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacc40fa15eac0fb83f8ca70b7cc0b588d -Future maxAsync(InputArray src1, InputArray src2) async => - cvRunAsync((callback) => ccore.core_Max_Async(src1.ref, src2.ref, callback), matCompleter); +Future maxAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_max(src1.ref, src2.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// MeanStdDev calculates a mean and standard deviation of array elements. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga846c858f4004d59493d7c6a4354b301d -Future<(Scalar mean, Scalar stddev)> meanStdDevAsync(InputArray src, {InputArray? mask}) async => cvRunAsync2( - (callback) => mask == null - ? ccore.core_MeanStdDev_Async(src.ref, callback) - : ccore.core_MeanStdDevWithMask_Async(src.ref, mask.ref, callback), - (c, p, p1) => - c.complete((Scalar.fromPointer(p.cast()), Scalar.fromPointer(p1.cast()))), - ); +Future<(Scalar mean, Scalar stddev)> meanStdDevAsync(InputArray src, {InputArray? mask}) { + final mean = calloc(); + final stddev = calloc(); + return mask == null + ? cvRunAsync0( + (callback) => ccore.cv_meanStdDev(src.ref, mean, stddev, callback), + (c) { + return c.complete((Scalar.fromPointer(mean), Scalar.fromPointer(stddev))); + }, + ) + : cvRunAsync0( + (callback) => ccore.cv_meanStdDev_1(src.ref, mean, stddev, mask.ref, callback), + (c) { + return c.complete((Scalar.fromPointer(mean), Scalar.fromPointer(stddev))); + }, + ); +} /// Merge creates one multi-channel array out of several single-channel ones. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga7d7b4d6c6ee504b30a20b1680029c7b4 -Future mergeAsync(VecMat mv) async => - cvRunAsync((callback) => ccore.core_Merge_Async(mv.ref, callback), matCompleter); +Future mergeAsync(VecMat mv, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_merge(mv.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Min calculates per-element minimum of two arrays or an array and a scalar. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9af368f182ee76d0463d0d8d5330b764 -Future minAsync(InputArray src1, InputArray src2) async => - cvRunAsync((callback) => ccore.core_Min_Async(src1.ref, src2.ref, callback), matCompleter); +Future minAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_min(src1.ref, src2.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// MinMaxIdx finds the global minimum and maximum in an array. /// @@ -666,21 +1019,24 @@ Future minAsync(InputArray src1, InputArray src2) async => Future<(double minVal, double maxVal, int minIdx, int maxIdx)> minMaxIdxAsync( InputArray src, { InputArray? mask, -}) async => - cvRunAsync4( - (callback) => mask == null - ? ccore.core_MinMaxIdx_Async(src.ref, callback) - : ccore.core_MinMaxIdx_Mask_Async(src.ref, mask.ref, callback), (c, p, p1, p2, p3) { - final minv = p.cast().value; - calloc.free(p); - final maxv = p1.cast().value; - calloc.free(p1); - final mini = p2.cast().value; - calloc.free(p2); - final maxi = p3.cast().value; - calloc.free(p3); - c.complete((minv, maxv, mini, maxi)); - }); +}) { + mask ??= Mat.empty(); + final minValP = calloc(); + final maxValP = calloc(); + final minIdxP = calloc(); + final maxIdxP = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_minMaxIdx(src.ref, minValP, maxValP, minIdxP, maxIdxP, mask!.ref, callback), + (c) { + final rval = (minValP.value, maxValP.value, minIdxP.value, maxIdxP.value); + calloc.free(minValP); + calloc.free(maxValP); + calloc.free(minIdxP); + calloc.free(maxIdxP); + return c.complete(rval); + }, + ); +} /// MinMaxLoc finds the global minimum and maximum in an array. /// @@ -689,26 +1045,35 @@ Future<(double minVal, double maxVal, int minIdx, int maxIdx)> minMaxIdxAsync( Future<(double minVal, double maxVal, Point minLoc, Point maxLoc)> minMaxLocAsync( InputArray src, { InputArray? mask, -}) async => - cvRunAsync4( - (callback) => mask == null - ? ccore.core_MinMaxLoc_Async(src.ref, callback) - : ccore.core_MinMaxLoc_Mask_Async(src.ref, mask.ref, callback), (c, p, p1, p2, p3) { - final minv = p.cast().value; - calloc.free(p); - final maxv = p1.cast().value; - calloc.free(p1); - c.complete((minv, maxv, Point.fromPointer(p2.cast()), Point.fromPointer(p3.cast()))); - }); +}) { + mask ??= Mat.empty(); + final minValP = calloc(); + final maxValP = calloc(); + final minLocP = calloc(); + final maxLocP = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_minMaxLoc(src.ref, minValP, maxValP, minLocP, maxLocP, mask!.ref, callback), + (c) { + final rval = (minValP.value, maxValP.value, Point.fromPointer(minLocP), Point.fromPointer(maxLocP)); + calloc.free(minValP); + calloc.free(maxValP); + return c.complete(rval); + }, + ); +} /// Copies specified channels from input arrays to the specified channels of output arrays. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga51d768c270a1cdd3497255017c4504be -Future mixChannelsAsync(VecMat src, VecMat dst, VecI32 fromTo) async => cvRunAsync0( - (callback) => ccore.core_MixChannels_Async(src.ref, dst.ref, fromTo.ref, callback), - (c) => c.complete(dst), - ); +Future mixChannelsAsync(VecMat src, VecMat dst, VecI32 fromTo) { + return cvRunAsync0( + (callback) => ccore.cv_mixChannels(src.ref, dst.ref, fromTo.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Mulspectrums performs the per-element multiplication of two Fourier spectrums. /// @@ -718,12 +1083,17 @@ Future mulSpectrumsAsync( InputArray a, InputArray b, int flags, { + OutputArray? c, bool conjB = false, -}) async => - cvRunAsync( - (callback) => ccore.core_MulSpectrums_Async(a.ref, b.ref, flags, conjB, callback), - matCompleter, - ); +}) { + c ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_mulSpectrums(a.ref, b.ref, c!.ref, flags, conjB, callback), + (completer) { + return completer.complete(c); + }, + ); +} /// Multiply calculates the per-element scaled product of two arrays. /// Both input arrays must be of the same size and the same type. @@ -733,13 +1103,18 @@ Future mulSpectrumsAsync( Future multiplyAsync( InputArray src1, InputArray src2, { + OutputArray? dst, double scale = 1, int dtype = -1, -}) async => - cvRunAsync( - (callback) => ccore.core_MultiplyWithParams_Async(src1.ref, src2.ref, scale, dtype, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_multiply(src1.ref, src2.ref, dst!.ref, scale, dtype, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Normalize normalizes the norm or value range of an array. /// @@ -753,22 +1128,15 @@ Future normalizeAsync( int normType = NORM_L2, int dtype = -1, InputArray? mask, -}) async => - cvRunAsync0( - (callback) => mask == null - ? ccore.core_Normalize_Async(src.ref, dst.ref, alpha, beta, normType, dtype, callback) - : ccore.core_Normalize_Mask_Async( - src.ref, - dst.ref, - alpha, - beta, - normType, - dtype, - mask.ref, - callback, - ), - (c) => c.complete(dst), - ); +}) { + mask ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_normalize(src.ref, dst.ref, alpha, beta, normType, dtype, mask!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Norm calculates the absolute norm of an array. /// @@ -778,13 +1146,18 @@ Future normAsync( InputArray src1, { int normType = NORM_L2, InputArray? mask, -}) async => - cvRunAsync( - (callback) => mask == null - ? ccore.core_Norm_Async(src1.ref, normType, callback) - : ccore.core_Norm_Mask_Async(src1.ref, normType, mask.ref, callback), - doubleCompleter, - ); +}) { + mask ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_norm(src1.ref, normType, mask!.ref, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// Norm calculates the absolute difference/relative norm of two arrays. /// @@ -794,19 +1167,33 @@ Future norm1Async( InputArray src1, InputArray src2, { int normType = NORM_L2, - // InputArray? mask, -}) async => - cvRunAsync( - (callback) => ccore.core_NormWithMats_Async(src1.ref, src2.ref, normType, callback), - doubleCompleter, - ); + InputArray? mask, +}) { + final p = calloc(); + mask ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_norm_1(src1.ref, src2.ref, normType, mask!.ref, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// PerspectiveTransform performs the perspective matrix transformation of vectors. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gad327659ac03e5fd6894b90025e6900a7 -Future perspectiveTransformAsync(InputArray src, InputArray m) async => - cvRunAsync((callback) => ccore.core_PerspectiveTransform_Async(src.ref, m.ref, callback), matCompleter); +Future perspectiveTransformAsync(InputArray src, InputArray m, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_perspectiveTransform(src.ref, dst!.ref, m.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Solve solves one or more linear systems or least-squares problems. /// @@ -815,24 +1202,37 @@ Future perspectiveTransformAsync(InputArray src, InputArray m) async => Future<(bool ret, Mat dst)> solveAsync( InputArray src1, InputArray src2, { + OutputArray? dst, int flags = DECOMP_LU, -}) async => - cvRunAsync2((callback) => ccore.core_Solve_Async(src1.ref, src2.ref, flags, callback), (c, p, p1) { - final rval = p.cast().value; +}) { + dst ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_solve(src1.ref, src2.ref, dst!.ref, flags, p, callback), + (c) { + final rval = p.value; calloc.free(p); - c.complete((rval, Mat.fromPointer(p1.cast()))); - }); + return c.complete((rval, dst!)); + }, + ); +} /// SolveCubic finds the real roots of a cubic equation. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1c3b0b925b085b6e96931ee309e6a1da -Future<(int rval, Mat roots)> solveCubicAsync(InputArray coeffs) async => - cvRunAsync2((callback) => ccore.core_SolveCubic_Async(coeffs.ref, callback), (c, p, p1) { - final rval = p.cast().value; +Future<(int rval, Mat roots)> solveCubicAsync(InputArray coeffs, {OutputArray? roots}) { + roots ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_solveCubic(coeffs.ref, roots!.ref, p, callback), + (c) { + final rval = p.value; calloc.free(p); - c.complete((rval, Mat.fromPointer(p1.cast()))); - }); + return c.complete((rval, roots!)); + }, + ); +} /// SolvePoly finds the real or complex roots of a polynomial equation. /// @@ -840,82 +1240,164 @@ Future<(int rval, Mat roots)> solveCubicAsync(InputArray coeffs) async => /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gac2f5e953016fabcdf793d762f4ec5dce Future<(double rval, Mat roots)> solvePolyAsync( InputArray coeffs, { + OutputArray? roots, int maxIters = 300, -}) async => - cvRunAsync2((callback) => ccore.core_SolvePoly_Async(coeffs.ref, maxIters, callback), (c, p, p1) { - final rval = p.cast().value; +}) { + roots ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_solvePoly(coeffs.ref, roots!.ref, maxIters, p, callback), + (c) { + final rval = p.value; calloc.free(p); - c.complete((rval, Mat.fromPointer(p1.cast()))); - }); + return c.complete((rval, roots!)); + }, + ); +} /// Reduce reduces a matrix to a vector. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4b78072a303f29d9031d56e5638da78e -Future reduceAsync(InputArray src, int dim, int rtype, {int dtype = -1}) async => - cvRunAsync((callback) => ccore.core_Reduce_Async(src.ref, dim, rtype, dtype, callback), matCompleter); +Future reduceAsync(InputArray src, int dim, int rtype, {OutputArray? dst, int dtype = -1}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_reduce(src.ref, dst!.ref, dim, rtype, dtype, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Finds indices of max elements along provided axis. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa87ea34d99bcc5bf9695048355163da0 -Future reduceArgMaxAsync(InputArray src, int axis, {bool lastIndex = false}) async => - cvRunAsync((callback) => ccore.core_ReduceArgMax_Async(src.ref, axis, lastIndex, callback), matCompleter); +Future reduceArgMaxAsync(InputArray src, int axis, {OutputArray? dst, bool lastIndex = false}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_reduceArgMax(src.ref, dst!.ref, axis, lastIndex, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Finds indices of min elements along provided axis. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeecd548276bfb91b938989e66b722088 -Future reduceArgMinAsync(InputArray src, int axis, {bool lastIndex = false}) async => - cvRunAsync((callback) => ccore.core_ReduceArgMin_Async(src.ref, axis, lastIndex, callback), matCompleter); +Future reduceArgMinAsync(InputArray src, int axis, {OutputArray? dst, bool lastIndex = false}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_reduceArgMin(src.ref, dst!.ref, axis, lastIndex, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Repeat fills the output array with repeated copies of the input array. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga496c3860f3ac44c40b48811333cfda2d -Future repeatAsync(InputArray src, int ny, int nx) async => - cvRunAsync((callback) => ccore.core_Repeat_Async(src.ref, ny, nx, callback), matCompleter); +Future repeatAsync(InputArray src, int ny, int nx, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_repeat(src.ref, ny, nx, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Calculates the sum of a scaled array and another array. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9e0845db4135f55dcf20227402f00d98 -Future scaleAddAsync(InputArray src1, double alpha, InputArray src2) async => - cvRunAsync((callback) => ccore.core_ScaleAdd_Async(src1.ref, alpha, src2.ref, callback), matCompleter); +Future scaleAddAsync(InputArray src1, double alpha, InputArray src2, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_scaleAdd(src1.ref, alpha, src2.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// SetIdentity initializes a scaled identity matrix. /// For further details, please see: /// /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga388d7575224a4a277ceb98ccaa327c99 -Future setIdentityAsync(InputOutputArray mtx, {Scalar? s}) async => cvRunAsync0( - (callback) => ccore.core_SetIdentity_Async(mtx.ref, s?.ref ?? Scalar.all(1).ref, callback), - (c) => c.complete(mtx), - ); +Future setIdentityAsync(InputOutputArray mtx, {double s = 1}) { + return cvRunAsync0( + (callback) => ccore.cv_setIdentity(mtx.ref, s, callback), + (c) { + return c.complete(mtx); + }, + ); +} /// Sort sorts each row or each column of a matrix. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga45dd56da289494ce874be2324856898f -Future sortAsync(InputArray src, int flags) async => - cvRunAsync((callback) => ccore.core_Sort_Async(src.ref, flags, callback), matCompleter); +Future sortAsync(InputArray src, int flags, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_sort(src.ref, dst!.ref, flags, callback), + (c) { + return c.complete(dst); + }, + ); +} /// SortIdx sorts each row or each column of a matrix. /// Instead of reordering the elements themselves, it stores the indices of sorted elements in the output array /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gadf35157cbf97f3cb85a545380e383506 -Future sortIdxAsync(InputArray src, int flags) async => - cvRunAsync((callback) => ccore.core_SortIdx_Async(src.ref, flags, callback), matCompleter); +Future sortIdxAsync(InputArray src, int flags, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_sortIdx(src.ref, dst!.ref, flags, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Split creates an array of single channel images from a multi-channel image /// Created images should be closed manualy to avoid memory leaks. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga0547c7fed86152d7e9d0096029c8518a -Future splitAsync(InputArray m) async => cvRunAsync( - (callback) => ccore.core_Split_Async(m.ref, callback), - (c, p) => VecMat.fromPointer(p.cast()), - ); +Future splitAsync(InputArray m) { + final vec = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_split(m.ref, vec, callback), + (c) { + return c.complete(VecMat.fromPointer(vec)); + }, + ); +} + +/// Calculates a square root of array elements. +/// +/// The function cv::sqrt calculates a square root of each input array element. +/// In case of multi-channel arrays, each channel is processed independently. +/// The accuracy is approximately the same as of the built-in std::sqrt . +/// +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga186222c3919657890f88df5a1f64a7d7 +Future sqrtAsync(Mat src, {Mat? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_sqrt(src.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Subtract calculates the per-element subtraction of two arrays or an array and a scalar. /// @@ -924,42 +1406,107 @@ Future splitAsync(InputArray m) async => cvRunAsync( Future subtractAsync( InputArray src1, InputArray src2, { + OutputArray? dst, InputArray? mask, int dtype = -1, -}) async => - cvRunAsync( - (callback) => - ccore.core_Subtract_Async(src1.ref, src2.ref, mask?.ref ?? Mat.empty().ref, dtype, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + mask ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_subtract(src1.ref, src2.ref, dst!.ref, mask!.ref, dtype, callback), + (c) { + return c.complete(dst); + }, + ); +} + +/// Calculates the sum of array elements. +/// +/// The function cv::sum calculates and returns the sum of array elements, +/// independently for each channel. +/// +/// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga716e10a2dd9e228e4d3c95818f106722 +Future sumAsync(Mat src) { + final p = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_sum(src.ref, p, callback), + (c) { + return c.complete(Scalar.fromPointer(p)); + }, + ); +} /// Trace returns the trace of a matrix. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3419ac19c7dcd2be4bd552a23e147dd8 -Future traceAsync(InputArray mtx) async => - cvRunAsync((callback) => ccore.core_Trace_Async(mtx.ref, callback), scalarCompleter); +Future traceAsync(InputArray mtx) { + final ptr = calloc(); + return cvRunAsync0( + (callback) => ccore.cv_trace(mtx.ref, ptr, callback), + (c) { + return c.complete(Scalar.fromPointer(ptr)); + }, + ); +} /// Transform performs the matrix transformation of every array element. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga393164aa54bb9169ce0a8cc44e08ff22 -Future transformAsync(InputArray src, InputArray m) async => - cvRunAsync((callback) => ccore.core_Transform_Async(src.ref, m.ref, callback), matCompleter); +Future transformAsync(InputArray src, InputArray m, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_transform(src.ref, dst!.ref, m.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Transpose transposes a matrix. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga46630ed6c0ea6254a35f447289bd7404 -Future transposeAsync(InputArray src) async => - cvRunAsync((callback) => ccore.core_Transpose_Async(src.ref, callback), matCompleter); +Future transposeAsync(InputArray src, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_transpose(src.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} + +/// Transpose for n-dimensional matrices. +/// +/// Input should be continuous single-channel matrix. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga46630ed6c0ea6254a35f447289bd7404 +Future transposeNDAsync(InputArray src, List order, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_transposeND(src.ref, dst!.ref, order.i32.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Pow raises every array element to a power. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf0d056b5bd1dc92500d6f6cf6bac41ef -Future powAsync(InputArray src, double power) async => - cvRunAsync((callback) => ccore.core_Pow_Async(src.ref, power, callback), matCompleter); +Future powAsync(InputArray src, double power, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_pow(src.ref, power, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// PolatToCart calculates x and y coordinates of 2D vectors from their magnitude and angle. /// @@ -968,28 +1515,46 @@ Future powAsync(InputArray src, double power) async => Future<(Mat x, Mat y)> polarToCartAsync( InputArray magnitude, InputArray angle, { + OutputArray? x, + OutputArray? y, bool angleInDegrees = false, -}) async => - cvRunAsync2( - (callback) => ccore.core_PolarToCart_Async(magnitude.ref, angle.ref, angleInDegrees, callback), - matCompleter2, - ); +}) { + x ??= Mat.empty(); + y ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_polarToCart(magnitude.ref, angle.ref, x!.ref, y!.ref, angleInDegrees, callback), + (c) { + return c.complete((x!, y!)); + }, + ); +} /// Phase calculates the rotation angle of 2D vectors. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9db9ca9b4d81c3bde5677b8f64dc0137 -Future phaseAsync(InputArray x, InputArray y, {bool angleInDegrees = false}) async => - cvRunAsync((callback) => ccore.core_Phase_Async(x.ref, y.ref, angleInDegrees, callback), matCompleter); +Future phaseAsync(InputArray x, InputArray y, {OutputArray? angle, bool angleInDegrees = false}) { + angle ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccore.cv_phase(x.ref, y.ref, angle!.ref, angleInDegrees, callback), + (c) { + return c.complete(angle); + }, + ); +} /// RandN Fills the array with normally distributed random numbers. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeff1f61e972d133a04ce3a5f81cf6808 -Future randnAsync(InputOutputArray dst, Scalar mean, Scalar stddev) async => cvRunAsync0( - (callback) => ccore.RandN_Async(dst.ref, mean.ref, stddev.ref, callback), - (c) => c.complete(dst), - ); +Future randnAsync(InputOutputArray dst, Scalar mean, Scalar stddev) { + return cvRunAsync0( + (callback) => ccore.cv_randn(dst.ref, mean.ref, stddev.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// RandShuffle Shuffles the array elements randomly. /// @@ -999,20 +1564,34 @@ Future randShuffleAsync( InputOutputArray dst, { double iterFactor = 1, Rng? rng, -}) async => - cvRunAsync0( - (callback) => rng == null - ? ccore.RandShuffle_Async(dst.ref, callback) - : ccore.RandShuffleWithParams_Async(dst.ref, iterFactor, rng.ref, callback), - (c) => c.complete(dst), +}) { + if (rng == null) { + return cvRunAsync0( + (callback) => ccore.cv_randShuffle(dst.ref, callback), + (c) { + return c.complete(dst); + }, ); + } else { + return cvRunAsync0( + (callback) => ccore.cv_randShuffle_1(dst.ref, iterFactor, rng.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } +} /// RandU Generates a single uniformly-distributed random /// number or an array of random numbers. /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1ba1026dca0807b27057ba6a49d258c0 -Future randuAsync(InputOutputArray dst, Scalar low, Scalar high) async => cvRunAsync0( - (callback) => ccore.RandU_Async(dst.ref, low.ref, high.ref, callback), - (c) => c.complete(dst), - ); +Future randuAsync(InputOutputArray dst, Scalar low, Scalar high) { + return cvRunAsync0( + (callback) => ccore.cv_randu(dst.ref, low.ref, high.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} diff --git a/packages/dartcv/lib/src/g/core.g.dart b/packages/dartcv/lib/src/g/core.g.dart index 74935673..cd41a459 100644 --- a/packages/dartcv/lib/src/g/core.g.dart +++ b/packages/dartcv/lib/src/g/core.g.dart @@ -3577,6 +3577,29 @@ class CvNativeCore { ffi.Pointer Function( int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer cv_PCABackProject( + Mat data, + Mat mean, + Mat eigenvectors, + Mat result, + imp1.CvCallback_0 callback, + ) { + return _cv_PCABackProject( + data, + mean, + eigenvectors, + result, + callback, + ); + } + + late final _cv_PCABackProjectPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_PCABackProject'); + late final _cv_PCABackProject = _cv_PCABackProjectPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); + ffi.Pointer cv_PCACompute( Mat src, Mat mean, @@ -3603,6 +3626,79 @@ class CvNativeCore { ffi.Pointer Function( Mat, Mat, Mat, Mat, int, imp1.CvCallback_0)>(); + ffi.Pointer cv_PCACompute_1( + Mat src, + Mat mean, + Mat eigenvectors, + Mat eigenvalues, + double retainedVariance, + imp1.CvCallback_0 callback, + ) { + return _cv_PCACompute_1( + src, + mean, + eigenvectors, + eigenvalues, + retainedVariance, + callback, + ); + } + + late final _cv_PCACompute_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, ffi.Double, + imp1.CvCallback_0)>>('cv_PCACompute_1'); + late final _cv_PCACompute_1 = _cv_PCACompute_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, double, imp1.CvCallback_0)>(); + + ffi.Pointer cv_PCAProject( + Mat data, + Mat mean, + Mat eigenvectors, + Mat result, + imp1.CvCallback_0 callback, + ) { + return _cv_PCAProject( + data, + mean, + eigenvectors, + result, + callback, + ); + } + + late final _cv_PCAProjectPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_PCAProject'); + late final _cv_PCAProject = _cv_PCAProjectPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); + + ffi.Pointer cv_PSNR( + Mat src1, + Mat src2, + double R, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_PSNR( + src1, + src2, + R, + rval, + callback, + ); + } + + late final _cv_PSNRPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Double, + ffi.Pointer, imp1.CvCallback_0)>>('cv_PSNR'); + late final _cv_PSNR = _cv_PSNRPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, double, ffi.Pointer, imp1.CvCallback_0)>(); + void cv_RNG_close( imp1.RNGPtr rng, ) { @@ -3808,6 +3904,32 @@ class CvNativeCore { late final _cv_RotatedRect_points = _cv_RotatedRect_pointsPtr.asFunction< ffi.Pointer Function(RotatedRect, ffi.Pointer)>(); + ffi.Pointer cv_SVBackSubst( + Mat w, + Mat u, + Mat vt, + Mat rhs, + Mat dst, + imp1.CvCallback_0 callback, + ) { + return _cv_SVBackSubst( + w, + u, + vt, + rhs, + dst, + callback, + ); + } + + late final _cv_SVBackSubstPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_SVBackSubst'); + late final _cv_SVBackSubst = _cv_SVBackSubstPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); + ffi.Pointer cv_SVD_Compute( Mat src, Mat w_r, @@ -3860,6 +3982,32 @@ class CvNativeCore { ffi.Pointer Function( Mat, Mat, Mat, Mat, Mat, imp1.CvCallback_0)>(); + ffi.Pointer cv_SVDecomp( + Mat w, + Mat u, + Mat vt, + Mat d, + int flags, + imp1.CvCallback_0 callback, + ) { + return _cv_SVDecomp( + w, + u, + vt, + d, + flags, + callback, + ); + } + + late final _cv_SVDecompPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_SVDecomp'); + late final _cv_SVDecomp = _cv_SVDecompPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, Mat, Mat, int, imp1.CvCallback_0)>(); + ffi.Pointer cv_absdiff( Mat src1, Mat src2, @@ -4236,7 +4384,7 @@ class CvNativeCore { Mat, Mat, Mat, Mat, bool, imp1.CvCallback_0)>(); ffi.Pointer cv_checkRange( - Mat self, + Mat a, bool quiet, ffi.Pointer pos, double minVal, @@ -4245,7 +4393,7 @@ class CvNativeCore { imp1.CvCallback_0 callback, ) { return _cv_checkRange( - self, + a, quiet, pos, minVal, @@ -4296,14 +4444,14 @@ class CvNativeCore { Mat src1, Mat src2, Mat dst, - int ct, + int cmpop, imp1.CvCallback_0 callback, ) { return _cv_compare( src1, src2, dst, - ct, + cmpop, callback, ); } @@ -4316,12 +4464,12 @@ class CvNativeCore { ffi.Pointer Function(Mat, Mat, Mat, int, imp1.CvCallback_0)>(); ffi.Pointer cv_completeSymm( - Mat self, + Mat m, bool lowerToUpper, imp1.CvCallback_0 callback, ) { return _cv_completeSymm( - self, + m, lowerToUpper, callback, ); @@ -4398,6 +4546,27 @@ class CvNativeCore { ffi.Pointer Function( Mat, Mat, int, int, int, int, int, Scalar, imp1.CvCallback_0)>(); + ffi.Pointer cv_copyTo( + Mat src, + Mat dst, + Mat mask, + imp1.CvCallback_0 callback, + ) { + return _cv_copyTo( + src, + dst, + mask, + callback, + ); + } + + late final _cv_copyToPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, Mat, imp1.CvCallback_0)>>('cv_copyTo'); + late final _cv_copyTo = _cv_copyToPtr.asFunction< + ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); + int cv_countNonZero( Mat src, ) { @@ -4626,6 +4795,27 @@ class CvNativeCore { late final _cv_flip = _cv_flipPtr.asFunction< ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); + ffi.Pointer cv_flipND( + Mat src, + Mat dst, + int axis, + imp1.CvCallback_0 callback, + ) { + return _cv_flipND( + src, + dst, + axis, + callback, + ); + } + + late final _cv_flipNDPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, ffi.Int, imp1.CvCallback_0)>>('cv_flipND'); + late final _cv_flipND = _cv_flipNDPtr.asFunction< + ffi.Pointer Function(Mat, Mat, int, imp1.CvCallback_0)>(); + ffi.Pointer cv_gemm( Mat src1, Mat src2, @@ -4703,6 +4893,19 @@ class CvNativeCore { late final _cv_getTickFrequency = _cv_getTickFrequencyPtr.asFunction(); + bool cv_hasNonZero( + Mat src, + ) { + return _cv_hasNonZero( + src, + ); + } + + late final _cv_hasNonZeroPtr = + _lookup>('cv_hasNonZero'); + late final _cv_hasNonZero = + _cv_hasNonZeroPtr.asFunction(); + ffi.Pointer cv_hconcat( Mat src1, Mat src2, @@ -5001,6 +5204,26 @@ class CvNativeCore { late final _cv_max = _cv_maxPtr.asFunction< ffi.Pointer Function(Mat, Mat, Mat, imp1.CvCallback_0)>(); + ffi.Pointer cv_mean( + Mat src, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_mean( + src, + rval, + callback, + ); + } + + late final _cv_meanPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_mean'); + late final _cv_mean = _cv_meanPtr.asFunction< + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer cv_meanStdDev( Mat src, ffi.Pointer dstMean, @@ -5047,6 +5270,28 @@ class CvNativeCore { ffi.Pointer Function(Mat, ffi.Pointer, ffi.Pointer, Mat, imp1.CvCallback_0)>(); + ffi.Pointer cv_mean_1( + Mat src, + Mat mask, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_mean_1( + src, + mask, + rval, + callback, + ); + } + + late final _cv_mean_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_mean_1'); + late final _cv_mean_1 = _cv_mean_1Ptr.asFunction< + ffi.Pointer Function( + Mat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer cv_merge( VecMat mats, Mat dst, @@ -5093,6 +5338,7 @@ class CvNativeCore { ffi.Pointer maxVal, ffi.Pointer minIdx, ffi.Pointer maxIdx, + Mat mask, imp1.CvCallback_0 callback, ) { return _cv_minMaxIdx( @@ -5101,6 +5347,7 @@ class CvNativeCore { maxVal, minIdx, maxIdx, + mask, callback, ); } @@ -5113,6 +5360,7 @@ class CvNativeCore { ffi.Pointer, ffi.Pointer, ffi.Pointer, + Mat, imp1.CvCallback_0)>>('cv_minMaxIdx'); late final _cv_minMaxIdx = _cv_minMaxIdxPtr.asFunction< ffi.Pointer Function( @@ -5121,6 +5369,7 @@ class CvNativeCore { ffi.Pointer, ffi.Pointer, ffi.Pointer, + Mat, imp1.CvCallback_0)>(); ffi.Pointer cv_minMaxLoc( @@ -5129,6 +5378,7 @@ class CvNativeCore { ffi.Pointer maxVal, ffi.Pointer minLoc, ffi.Pointer maxLoc, + Mat mask, imp1.CvCallback_0 callback, ) { return _cv_minMaxLoc( @@ -5137,6 +5387,7 @@ class CvNativeCore { maxVal, minLoc, maxLoc, + mask, callback, ); } @@ -5149,6 +5400,7 @@ class CvNativeCore { ffi.Pointer, ffi.Pointer, ffi.Pointer, + Mat, imp1.CvCallback_0)>>('cv_minMaxLoc'); late final _cv_minMaxLoc = _cv_minMaxLocPtr.asFunction< ffi.Pointer Function( @@ -5157,6 +5409,7 @@ class CvNativeCore { ffi.Pointer, ffi.Pointer, ffi.Pointer, + Mat, imp1.CvCallback_0)>(); ffi.Pointer cv_mixChannels( @@ -5207,6 +5460,34 @@ class CvNativeCore { ffi.Pointer Function( Mat, Mat, Mat, int, bool, imp1.CvCallback_0)>(); + ffi.Pointer cv_mulTransposed( + Mat src, + Mat dst, + bool aTa, + Mat delta, + double scale, + int dtype, + imp1.CvCallback_0 callback, + ) { + return _cv_mulTransposed( + src, + dst, + aTa, + delta, + scale, + dtype, + callback, + ); + } + + late final _cv_mulTransposedPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, Mat, ffi.Bool, Mat, ffi.Double, + ffi.Int, imp1.CvCallback_0)>>('cv_mulTransposed'); + late final _cv_mulTransposed = _cv_mulTransposedPtr.asFunction< + ffi.Pointer Function( + Mat, Mat, bool, Mat, double, int, imp1.CvCallback_0)>(); + ffi.Pointer cv_multiply( Mat src1, Mat src2, @@ -5313,6 +5594,25 @@ class CvNativeCore { ffi.Pointer Function( Mat, Mat, double, double, int, int, Mat, imp1.CvCallback_0)>(); + ffi.Pointer cv_patchNaNs( + Mat a, + double val, + imp1.CvCallback_0 callback, + ) { + return _cv_patchNaNs( + a, + val, + callback, + ); + } + + late final _cv_patchNaNsPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, ffi.Double, imp1.CvCallback_0)>>('cv_patchNaNs'); + late final _cv_patchNaNs = _cv_patchNaNsPtr.asFunction< + ffi.Pointer Function(Mat, double, imp1.CvCallback_0)>(); + ffi.Pointer cv_perspectiveTransform( Mat src, Mat dst, @@ -5828,6 +6128,25 @@ class CvNativeCore { ffi.Pointer Function( Mat, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer cv_sqrt( + Mat src, + Mat dst, + imp1.CvCallback_0 callback, + ) { + return _cv_sqrt( + src, + dst, + callback, + ); + } + + late final _cv_sqrtPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, Mat, imp1.CvCallback_0)>>('cv_sqrt'); + late final _cv_sqrt = _cv_sqrtPtr.asFunction< + ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); + ffi.Pointer cv_subtract( Mat src1, Mat src2, diff --git a/packages/dartcv/lib/src/g/core.yaml b/packages/dartcv/lib/src/g/core.yaml index a55e68e1..cb9df675 100644 --- a/packages/dartcv/lib/src/g/core.yaml +++ b/packages/dartcv/lib/src/g/core.yaml @@ -374,8 +374,16 @@ files: name: cv_Mat_type c:@F@cv_Mat_zeros: name: cv_Mat_zeros + c:@F@cv_PCABackProject: + name: cv_PCABackProject c:@F@cv_PCACompute: name: cv_PCACompute + c:@F@cv_PCACompute_1: + name: cv_PCACompute_1 + c:@F@cv_PCAProject: + name: cv_PCAProject + c:@F@cv_PSNR: + name: cv_PSNR c:@F@cv_RNG_close: name: cv_RNG_close c:@F@cv_RNG_create: @@ -398,10 +406,14 @@ files: name: cv_RotatedRect_boundingRect2f c:@F@cv_RotatedRect_points: name: cv_RotatedRect_points + c:@F@cv_SVBackSubst: + name: cv_SVBackSubst c:@F@cv_SVD_Compute: name: cv_SVD_Compute c:@F@cv_SVD_backSubst: name: cv_SVD_backSubst + c:@F@cv_SVDecomp: + name: cv_SVDecomp c:@F@cv_absdiff: name: cv_absdiff c:@F@cv_add: @@ -444,6 +456,8 @@ files: name: cv_convertScaleAbs c:@F@cv_copyMakeBorder: name: cv_copyMakeBorder + c:@F@cv_copyTo: + name: cv_copyTo c:@F@cv_countNonZero: name: cv_countNonZero c:@F@cv_dct: @@ -466,6 +480,8 @@ files: name: cv_findNonZero c:@F@cv_flip: name: cv_flip + c:@F@cv_flipND: + name: cv_flipND c:@F@cv_gemm: name: cv_gemm c:@F@cv_getNumThreads: @@ -476,6 +492,8 @@ files: name: cv_getTickCount c:@F@cv_getTickFrequency: name: cv_getTickFrequency + c:@F@cv_hasNonZero: + name: cv_hasNonZero c:@F@cv_hconcat: name: cv_hconcat c:@F@cv_idct: @@ -500,10 +518,14 @@ files: name: cv_magnitude c:@F@cv_max: name: cv_max + c:@F@cv_mean: + name: cv_mean c:@F@cv_meanStdDev: name: cv_meanStdDev c:@F@cv_meanStdDev_1: name: cv_meanStdDev_1 + c:@F@cv_mean_1: + name: cv_mean_1 c:@F@cv_merge: name: cv_merge c:@F@cv_min: @@ -516,6 +538,8 @@ files: name: cv_mixChannels c:@F@cv_mulSpectrums: name: cv_mulSpectrums + c:@F@cv_mulTransposed: + name: cv_mulTransposed c:@F@cv_multiply: name: cv_multiply c:@F@cv_norm: @@ -524,6 +548,8 @@ files: name: cv_norm_1 c:@F@cv_normalize: name: cv_normalize + c:@F@cv_patchNaNs: + name: cv_patchNaNs c:@F@cv_perspectiveTransform: name: cv_perspectiveTransform c:@F@cv_phase: @@ -572,6 +598,8 @@ files: name: cv_sortIdx c:@F@cv_split: name: cv_split + c:@F@cv_sqrt: + name: cv_sqrt c:@F@cv_subtract: name: cv_subtract c:@F@cv_sum: From 189dac93cd929fbaaedc80c7fe5515be5291e360 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sat, 19 Oct 2024 17:18:24 +0800 Subject: [PATCH 13/30] finish aruco,imghash --- packages/dartcv/lib/core.dart | 1 - .../dartcv/lib/src/calib3d/calib3d_async.dart | 22 +- packages/dartcv/lib/src/contrib/aruco.dart | 497 +++++------------- .../dartcv/lib/src/contrib/aruco_async.dart | 98 ++-- .../dartcv/lib/src/contrib/aruco_dict.dart | 7 +- packages/dartcv/lib/src/contrib/img_hash.dart | 400 +++++++------- packages/dartcv/lib/src/core/core_async.dart | 171 +++--- 7 files changed, 513 insertions(+), 683 deletions(-) diff --git a/packages/dartcv/lib/core.dart b/packages/dartcv/lib/core.dart index a9c4523f..dfc1b99c 100644 --- a/packages/dartcv/lib/core.dart +++ b/packages/dartcv/lib/core.dart @@ -21,7 +21,6 @@ export 'src/core/moments.dart'; export 'src/core/point.dart'; export 'src/core/rect.dart'; export 'src/core/rng.dart'; -export 'src/core/rng_async.dart'; export 'src/core/scalar.dart'; export 'src/core/size.dart'; export 'src/core/svd.dart'; diff --git a/packages/dartcv/lib/src/calib3d/calib3d_async.dart b/packages/dartcv/lib/src/calib3d/calib3d_async.dart index 361b6120..663fb4ea 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d_async.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d_async.dart @@ -61,7 +61,7 @@ Future<(Mat rval, Rect validPixROI)> getOptimalNewCameraMatrixAsync( double alpha, { (int, int) newImgSize = (0, 0), bool centerPrincipalPoint = false, -}) { +}) async { final validPixROI = calloc(); final rval = Mat.empty(); return cvRunAsync0<(Mat, Rect)>( @@ -94,7 +94,7 @@ Future<(double rmsErr, Mat cameraMatrix, Mat distCoeffs, Mat rvecs, Mat tvecs)> Mat? tvecs, int flags = 0, (int type, int count, double eps) criteria = (TERM_COUNT + TERM_EPS, 30, 1e-4), -}) { +}) async { rvecs ??= Mat.empty(); tvecs ??= Mat.empty(); final cRmsErr = calloc(); @@ -131,7 +131,7 @@ Future undistortAsync( InputArray distCoeffs, { OutputArray? dst, InputArray? newCameraMatrix, -}) { +}) async { dst ??= Mat.empty(); newCameraMatrix ??= Mat.empty(); return cvRunAsync0( @@ -159,7 +159,7 @@ Future undistortPointsAsync( InputArray? R, InputArray? P, (int type, int count, double eps) criteria = (TERM_COUNT + TERM_EPS, 30, 1e-4), -}) { +}) async { R ??= Mat.empty(); P ??= Mat.empty(); dst ??= Mat.empty(); @@ -188,7 +188,7 @@ Future<(bool success, Mat corners)> findChessboardCornersAsync( (int, int) patternSize, { OutputArray? corners, int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE, -}) { +}) async { corners ??= Mat.empty(); final r = calloc(); return cvRunAsync0( @@ -213,7 +213,7 @@ Future<(bool, Mat corners)> findChessboardCornersSBAsync( (int, int) patternSize, int flags, { OutputArray? corners, -}) { +}) async { corners ??= Mat.empty(); final b = calloc(); return cvRunAsync0( @@ -239,7 +239,7 @@ Future<(bool, Mat corners, Mat meta)> findChessboardCornersSBWithMetaAsync( int flags, { OutputArray? corners, OutputArray? meta, -}) { +}) async { corners ??= Mat.empty(); meta ??= Mat.empty(); final b = calloc(); @@ -268,7 +268,7 @@ Future drawChessboardCornersAsync( (int, int) patternSize, InputArray corners, bool patternWasFound, -) { +) async { return cvRunAsync0( (callback) => ccalib3d.cv_drawChessboardCorners( image.ref, @@ -295,7 +295,7 @@ Future<(Mat, Mat inliers)> estimateAffinePartial2DAsync( double confidence = 0.99, int refineIters = 10, OutputArray? inliers, -}) { +}) async { inliers ??= Mat.empty(); final rval = Mat.empty(); return cvRunAsync0( @@ -328,7 +328,7 @@ Future<(Mat, Mat inliers)> estimateAffine2DAsync( double confidence = 0.99, int refineIters = 10, OutputArray? inliers, -}) { +}) async { inliers ??= Mat.empty(); final rval = Mat.empty(); return cvRunAsync0( @@ -360,7 +360,7 @@ Future<(Mat, Mat)> findHomographyAsync( OutputArray? mask, int maxIters = 2000, double confidence = 0.995, -}) { +}) async { mask ??= Mat.empty(); final mat = Mat.empty(); return cvRunAsync0( diff --git a/packages/dartcv/lib/src/contrib/aruco.dart b/packages/dartcv/lib/src/contrib/aruco.dart index dc9f92d3..6c9f93b4 100644 --- a/packages/dartcv/lib/src/contrib/aruco.dart +++ b/packages/dartcv/lib/src/contrib/aruco.dart @@ -31,7 +31,7 @@ class ArucoDetector extends CvStruct { factory ArucoDetector.empty() { final p = calloc(); - cvRun(() => ccontrib.ArucoDetector_New(p)); + cvRun(() => ccontrib.cv_aruco_arucoDetector_create(p)); return ArucoDetector._(p); } @@ -41,18 +41,23 @@ class ArucoDetector extends CvStruct { ) { final p = calloc(); cvRun( - () => ccontrib.ArucoDetector_NewWithParams(dictionary.ref, parameters.ref, p), + () => ccontrib.cv_aruco_arucoDetector_create_1( + dictionary.ref, + parameters.ref, + p, + ), ); return ArucoDetector._(p); } @override cvg.ArucoDetector get ref => ptr.ref; - static final finalizer = OcvFinalizer(ccontrib.addresses.ArucoDetector_Close); + static final finalizer = + OcvFinalizer(ccontrib.addresses.cv_aruco_arucoDetector_close); void dispose() { finalizer.detach(this); - ccontrib.ArucoDetector_Close(ptr); + ccontrib.cv_aruco_arucoDetector_close(ptr); } /// DetectMarkers does basic marker detection. @@ -60,25 +65,24 @@ class ArucoDetector extends CvStruct { /// For further details, please see: /// https://docs.opencv.org/master/d9/d6a/group__aruco.html#ga3bc50d61fe4db7bce8d26d56b5a6428a (VecVecPoint2f corners, VecI32 ids, VecVecPoint2f rejectedImgPoints) detectMarkers(InputArray image) { - return using<(VecVecPoint2f, VecI32, VecVecPoint2f)>((arena) { - final pCorners = calloc(); - final pRejected = calloc(); - final pIds = calloc(); - cvRun( - () => ccontrib.ArucoDetector_DetectMarkers( - ref, - image.ref, - pCorners, - pIds, - pRejected, - ), - ); - return ( - VecVecPoint2f.fromPointer(pCorners), - VecI32.fromPointer(pIds), - VecVecPoint2f.fromPointer(pRejected) - ); - }); + final pCorners = calloc(); + final pRejected = calloc(); + final pIds = calloc(); + cvRun( + () => ccontrib.cv_aruco_arucoDetector_detectMarkers( + ref, + image.ref, + pCorners, + pIds, + pRejected, + ffi.nullptr, + ), + ); + return ( + VecVecPoint2f.fromPointer(pCorners), + VecI32.fromPointer(pIds), + VecVecPoint2f.fromPointer(pRejected) + ); } } @@ -89,11 +93,12 @@ void arucoDrawDetectedMarkers( Scalar borderColor, ) { cvRun( - () => ccontrib.ArucoDrawDetectedMarkers( + () => ccontrib.cv_aruco_drawDetectedMarkers( img.ref, markerCorners.ref, markerIds.ref, borderColor.ref, + ffi.nullptr, ), ); } @@ -105,22 +110,23 @@ Mat arucoGenerateImageMarker( int borderBits, [ Mat? outImg, ]) { - final p = outImg?.ptr ?? calloc(); + outImg ??= Mat.empty(); cvRun( - () => ccontrib.ArucoGenerateImageMarker( + () => ccontrib.cv_aruco_generateImageMarker( dictionaryId.value, id, sidePixels, borderBits, - p, + outImg!.ref, + ffi.nullptr, ), ); - return outImg ?? Mat.fromPointer(p); + return outImg; } -class ArucoDetectorParameters extends CvStruct { +class ArucoDetectorParameters extends CvStruct { ArucoDetectorParameters._( - cvg.ArucoDetectorParametersPtr ptr, [ + cvg.ArucoDetectorParamsPtr ptr, [ bool attach = true, ]) : super.fromPointer(ptr) { if (attach) { @@ -128,396 +134,175 @@ class ArucoDetectorParameters extends CvStruct { } } factory ArucoDetectorParameters.fromPointer( - cvg.ArucoDetectorParametersPtr ptr, [ + cvg.ArucoDetectorParamsPtr ptr, [ bool attach = true, ]) => ArucoDetectorParameters._(ptr, attach); factory ArucoDetectorParameters.empty() { - final p = calloc(); - cvRun(() => ccontrib.ArucoDetectorParameters_Create(p)); + final p = calloc(); + cvRun(() => ccontrib.cv_aruco_detectorParameters_create(p)); return ArucoDetectorParameters._(p); } @override - cvg.ArucoDetectorParameters get ref => ptr.ref; - static final finalizer = OcvFinalizer( - ccontrib.addresses.ArucoDetectorParameters_Close, + cvg.ArucoDetectorParams get ref => ptr.ref; + static final finalizer = OcvFinalizer( + ccontrib.addresses.cv_aruco_detectorParameters_close, ); void dispose() { finalizer.detach(this); - ccontrib.ArucoDetectorParameters_Close(ptr); + ccontrib.cv_aruco_detectorParameters_close(ptr); } - int get adaptiveThreshWinSizeMin { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetAdaptiveThreshWinSizeMin(ref, p), - ); - return p.value; - }); - } + int get adaptiveThreshWinSizeMin => ccontrib.cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMin(ref); - set adaptiveThreshWinSizeMin(int value) => cvRun( - () => ccontrib.ArucoDetectorParameters_SetAdaptiveThreshWinSizeMin(ref, value), - ); - - int get adaptiveThreshWinSizeMax { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetAdaptiveThreshWinSizeMax(ref, p), - ); - return p.value; - }); - } + set adaptiveThreshWinSizeMin(int value) => + ccontrib.cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMin(ref, value); - set adaptiveThreshWinSizeMax(int value) => cvRun( - () => ccontrib.ArucoDetectorParameters_SetAdaptiveThreshWinSizeMax(ref, value), - ); - - int get adaptiveThreshWinSizeStep { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetAdaptiveThreshWinSizeStep(ref, p), - ); - return p.value; - }); - } + int get adaptiveThreshWinSizeMax => ccontrib.cv_aruco_detectorParameters_get_adaptiveThreshWinSizeMax(ref); - set adaptiveThreshWinSizeStep(int value) => cvRun( - () => ccontrib.ArucoDetectorParameters_SetAdaptiveThreshWinSizeStep(ref, value), - ); - - double get adaptiveThreshConstant { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetAdaptiveThreshConstant(ref, p), - ); - return p.value; - }); - } + set adaptiveThreshWinSizeMax(int value) => + ccontrib.cv_aruco_detectorParameters_set_adaptiveThreshWinSizeMax(ref, value); - set adaptiveThreshConstant(double value) => cvRun( - () => ccontrib.ArucoDetectorParameters_SetAdaptiveThreshConstant(ref, value), - ); - - double get minMarkerPerimeterRate { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetMinMarkerPerimeterRate(ref, p), - ); - return p.value; - }); - } + int get adaptiveThreshWinSizeStep => + ccontrib.cv_aruco_detectorParameters_get_adaptiveThreshWinSizeStep(ref); + + set adaptiveThreshWinSizeStep(int value) => + ccontrib.cv_aruco_detectorParameters_set_adaptiveThreshWinSizeStep(ref, value); + + double get adaptiveThreshConstant => ccontrib.cv_aruco_detectorParameters_get_adaptiveThreshConstant(ref); + + set adaptiveThreshConstant(double value) => + ccontrib.cv_aruco_detectorParameters_set_adaptiveThreshConstant(ref, value); + + double get minMarkerPerimeterRate => ccontrib.cv_aruco_detectorParameters_get_minMarkerPerimeterRate(ref); set minMarkerPerimeterRate(double value) => - ccontrib.ArucoDetectorParameters_SetMinMarkerPerimeterRate(ref, value); - - double get maxMarkerPerimeterRate { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetMaxMarkerPerimeterRate(ref, p), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_minMarkerPerimeterRate(ref, value); + + double get maxMarkerPerimeterRate => ccontrib.cv_aruco_detectorParameters_get_maxMarkerPerimeterRate(ref); set maxMarkerPerimeterRate(double value) => - ccontrib.ArucoDetectorParameters_SetMaxMarkerPerimeterRate(ref, value); - - double get polygonalApproxAccuracyRate { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetPolygonalApproxAccuracyRate(ref, p), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_maxMarkerPerimeterRate(ref, value); + + double get polygonalApproxAccuracyRate => + ccontrib.cv_aruco_detectorParameters_get_polygonalApproxAccuracyRate(ref); set polygonalApproxAccuracyRate(double value) => - ccontrib.ArucoDetectorParameters_SetPolygonalApproxAccuracyRate(ref, value); - - double get minCornerDistanceRate { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetMinCornerDistanceRate(ref, p), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_polygonalApproxAccuracyRate(ref, value); + + double get minCornerDistanceRate => ccontrib.cv_aruco_detectorParameters_get_minCornerDistanceRate(ref); set minCornerDistanceRate(double value) => - ccontrib.ArucoDetectorParameters_SetMinCornerDistanceRate(ref, value); - - int get minDistanceToBorder { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetMinDistanceToBorder(ref, p)); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_minCornerDistanceRate(ref, value); - set minDistanceToBorder(int value) => ccontrib.ArucoDetectorParameters_SetMinDistanceToBorder(ref, value); + int get minDistanceToBorder => ccontrib.cv_aruco_detectorParameters_get_minDistanceToBorder(ref); - double get minMarkerDistanceRate { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetMinMarkerDistanceRate(ref, p), - ); - return p.value; - }); - } + set minDistanceToBorder(int value) => + ccontrib.cv_aruco_detectorParameters_set_minDistanceToBorder(ref, value); + + double get minMarkerDistanceRate => ccontrib.cv_aruco_detectorParameters_get_minMarkerDistanceRate(ref); set minMarkerDistanceRate(double value) => - ccontrib.ArucoDetectorParameters_SetMinMarkerDistanceRate(ref, value); - - int get cornerRefinementMethod { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetCornerRefinementMethod(ref, p), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_minMarkerDistanceRate(ref, value); + + int get cornerRefinementMethod => ccontrib.cv_aruco_detectorParameters_get_cornerRefinementMethod(ref); set cornerRefinementMethod(int value) => - ccontrib.ArucoDetectorParameters_SetCornerRefinementMethod(ref, value); - - int get cornerRefinementWinSize { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetCornerRefinementWinSize(ref, p), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_cornerRefinementMethod(ref, value); + + int get cornerRefinementWinSize => ccontrib.cv_aruco_detectorParameters_get_cornerRefinementWinSize(ref); set cornerRefinementWinSize(int value) => - ccontrib.ArucoDetectorParameters_SetCornerRefinementWinSize(ref, value); - - int get cornerRefinementMaxIterations { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetCornerRefinementMaxIterations( - ref, - p, - ), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_cornerRefinementWinSize(ref, value); + + int get cornerRefinementMaxIterations => + ccontrib.cv_aruco_detectorParameters_get_cornerRefinementMaxIterations(ref); set cornerRefinementMaxIterations(int value) => - ccontrib.ArucoDetectorParameters_SetCornerRefinementMaxIterations(ref, value); - - double get cornerRefinementMinAccuracy { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetCornerRefinementMinAccuracy(ref, p), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_cornerRefinementMaxIterations(ref, value); + + double get cornerRefinementMinAccuracy => + ccontrib.cv_aruco_detectorParameters_get_cornerRefinementMinAccuracy(ref); set cornerRefinementMinAccuracy(double value) => - ccontrib.ArucoDetectorParameters_SetCornerRefinementMinAccuracy(ref, value); - - int get markerBorderBits { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetMarkerBorderBits(ref, p)); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_cornerRefinementMinAccuracy(ref, value); - set markerBorderBits(int value) => ccontrib.ArucoDetectorParameters_SetMarkerBorderBits(ref, value); - - int get perspectiveRemovePixelPerCell { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetPerspectiveRemovePixelPerCell( - ref, - p, - ), - ); - return p.value; - }); - } + int get markerBorderBits => ccontrib.cv_aruco_detectorParameters_get_markerBorderBits(ref); + + set markerBorderBits(int value) => ccontrib.cv_aruco_detectorParameters_set_markerBorderBits(ref, value); + + int get perspectiveRemovePixelPerCell => + ccontrib.cv_aruco_detectorParameters_get_perspectiveRemovePixelPerCell(ref); set perspectiveRemovePixelPerCell(int value) => - ccontrib.ArucoDetectorParameters_SetPerspectiveRemovePixelPerCell(ref, value); - - double get perspectiveRemoveIgnoredMarginPerCell { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetPerspectiveRemoveIgnoredMarginPerCell( - ref, - p, - ), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_perspectiveRemovePixelPerCell(ref, value); + + double get perspectiveRemoveIgnoredMarginPerCell => + ccontrib.cv_aruco_detectorParameters_get_perspectiveRemoveIgnoredMarginPerCell(ref); set perspectiveRemoveIgnoredMarginPerCell(double value) => - ccontrib.ArucoDetectorParameters_SetPerspectiveRemoveIgnoredMarginPerCell( - ref, - value, - ); - - double get maxErroneousBitsInBorderRate { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetMaxErroneousBitsInBorderRate(ref, p), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_perspectiveRemoveIgnoredMarginPerCell(ref, value); + + double get maxErroneousBitsInBorderRate => + ccontrib.cv_aruco_detectorParameters_get_maxErroneousBitsInBorderRate(ref); set maxErroneousBitsInBorderRate(double value) => - ccontrib.ArucoDetectorParameters_SetMaxErroneousBitsInBorderRate(ref, value); - - double get minOtsuStdDev { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetMinOtsuStdDev(ref, p)); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_maxErroneousBitsInBorderRate(ref, value); - set minOtsuStdDev(double value) => ccontrib.ArucoDetectorParameters_SetMinOtsuStdDev(ref, value); + double get minOtsuStdDev => ccontrib.cv_aruco_detectorParameters_get_minOtsuStdDev(ref); - double get errorCorrectionRate { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetErrorCorrectionRate(ref, p)); - return p.value; - }); - } + set minOtsuStdDev(double value) => ccontrib.cv_aruco_detectorParameters_set_minOtsuStdDev(ref, value); + + double get errorCorrectionRate => ccontrib.cv_aruco_detectorParameters_get_errorCorrectionRate(ref); set errorCorrectionRate(double value) => - ccontrib.ArucoDetectorParameters_SetErrorCorrectionRate(ref, value); - - double get aprilTagQuadDecimate { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetAprilTagQuadDecimate(ref, p)); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_errorCorrectionRate(ref, value); + + double get aprilTagQuadDecimate => ccontrib.cv_aruco_detectorParameters_get_aprilTagQuadDecimate(ref); set aprilTagQuadDecimate(double value) => - ccontrib.ArucoDetectorParameters_SetAprilTagQuadDecimate(ref, value); - - double get aprilTagQuadSigma { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetAprilTagQuadSigma(ref, p)); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_aprilTagQuadDecimate(ref, value); - set aprilTagQuadSigma(double value) => ccontrib.ArucoDetectorParameters_SetAprilTagQuadSigma(ref, value); + double get aprilTagQuadSigma => ccontrib.cv_aruco_detectorParameters_get_aprilTagQuadSigma(ref); - int get aprilTagMinClusterPixels { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetAprilTagMinClusterPixels(ref, p), - ); - return p.value; - }); - } + set aprilTagQuadSigma(double value) => + ccontrib.cv_aruco_detectorParameters_set_aprilTagQuadSigma(ref, value); + + int get aprilTagMinClusterPixels => ccontrib.cv_aruco_detectorParameters_get_aprilTagMinClusterPixels(ref); set aprilTagMinClusterPixels(int value) => - ccontrib.ArucoDetectorParameters_SetAprilTagMinClusterPixels(ref, value); - - int get aprilTagMaxNmaxima { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetAprilTagMaxNmaxima(ref, p)); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_aprilTagMinClusterPixels(ref, value); - set aprilTagMaxNmaxima(int value) => ccontrib.ArucoDetectorParameters_SetAprilTagMaxNmaxima(ref, value); + int get aprilTagMaxNmaxima => ccontrib.cv_aruco_detectorParameters_get_aprilTagMaxNmaxima(ref); - double get aprilTagCriticalRad { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetAprilTagCriticalRad(ref, p)); - return p.value; - }); - } + set aprilTagMaxNmaxima(int value) => + ccontrib.cv_aruco_detectorParameters_set_aprilTagMaxNmaxima(ref, value); + + double get aprilTagCriticalRad => ccontrib.cv_aruco_detectorParameters_get_aprilTagCriticalRad(ref); set aprilTagCriticalRad(double value) => - ccontrib.ArucoDetectorParameters_SetAprilTagCriticalRad(ref, value); - - double get aprilTagMaxLineFitMse { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetAprilTagMaxLineFitMse(ref, p), - ); - return p.value; - }); - } + ccontrib.cv_aruco_detectorParameters_set_aprilTagCriticalRad(ref, value); - set aprilTagMaxLineFitMse(double value) => cvRun( - () => ccontrib.ArucoDetectorParameters_SetAprilTagMaxLineFitMse(ref, value), - ); - - int get aprilTagMinWhiteBlackDiff { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => ccontrib.ArucoDetectorParameters_GetAprilTagMinWhiteBlackDiff(ref, p), - ); - return p.value; - }); - } + double get aprilTagMaxLineFitMse => ccontrib.cv_aruco_detectorParameters_get_aprilTagMaxLineFitMse(ref); - set aprilTagMinWhiteBlackDiff(int value) => cvRun( - () => ccontrib.ArucoDetectorParameters_SetAprilTagMinWhiteBlackDiff(ref, value), - ); + set aprilTagMaxLineFitMse(double value) => + ccontrib.cv_aruco_detectorParameters_set_aprilTagMaxLineFitMse(ref, value); - int get aprilTagDeglitch { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetAprilTagDeglitch(ref, p)); - return p.value; - }); - } + int get aprilTagMinWhiteBlackDiff => + ccontrib.cv_aruco_detectorParameters_get_aprilTagMinWhiteBlackDiff(ref); - set aprilTagDeglitch(int value) => - cvRun(() => ccontrib.ArucoDetectorParameters_SetAprilTagDeglitch(ref, value)); + set aprilTagMinWhiteBlackDiff(int value) => + ccontrib.cv_aruco_detectorParameters_set_aprilTagMinWhiteBlackDiff(ref, value); - bool get detectInvertedMarker { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => ccontrib.ArucoDetectorParameters_GetDetectInvertedMarker(ref, p)); - return p.value; - }); - } + int get aprilTagDeglitch => ccontrib.cv_aruco_detectorParameters_get_aprilTagDeglitch(ref); + + set aprilTagDeglitch(int value) => ccontrib.cv_aruco_detectorParameters_set_aprilTagDeglitch(ref, value); + + bool get detectInvertedMarker => ccontrib.cv_aruco_detectorParameters_get_detectInvertedMarker(ref); - set detectInvertedMarker(bool value) => cvRun( - () => ccontrib.ArucoDetectorParameters_SetDetectInvertedMarker(ref, value), - ); + set detectInvertedMarker(bool value) => + ccontrib.cv_aruco_detectorParameters_set_detectInvertedMarker(ref, value); } diff --git a/packages/dartcv/lib/src/contrib/aruco_async.dart b/packages/dartcv/lib/src/contrib/aruco_async.dart index c8f00bcf..b2ae89b0 100644 --- a/packages/dartcv/lib/src/contrib/aruco_async.dart +++ b/packages/dartcv/lib/src/contrib/aruco_async.dart @@ -4,6 +4,9 @@ library cv.contrib; +import 'dart:ffi' as ffi; +import 'package:ffi/ffi.dart'; + import '../core/base.dart'; import '../core/mat.dart'; import '../core/point.dart'; @@ -15,34 +18,24 @@ import 'aruco.dart'; import 'aruco_dict.dart'; extension ArucoDetectorAsync on ArucoDetector { - static Future emptyAsync() async => cvRunAsync( - ccontrib.ArucoDetector_New_Async, - (c, p) => c.complete(ArucoDetector.fromPointer(p.cast())), - ); - - static Future createAsync( - ArucoDictionary dictionary, - ArucoDetectorParameters parameters, - ) async => - cvRunAsync( - (callback) => ccontrib.ArucoDetector_NewWithParams_Async( - dictionary.ref, - parameters.ref, - callback, - ), - (c, p) => c.complete(ArucoDetector.fromPointer(p.cast())), + Future<(VecVecPoint2f, VecI32, VecVecPoint2f)> detectMarkersAsync(InputArray image) async { + final pCorners = calloc(); + final pRejected = calloc(); + final pIds = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_aruco_arucoDetector_detectMarkers( + ref, + image.ref, + pCorners, + pIds, + pRejected, + callback, + ), (c) { + return c.complete( + (VecVecPoint2f.fromPointer(pCorners), VecI32.fromPointer(pIds), VecVecPoint2f.fromPointer(pRejected)), ); - - Future<(VecVecPoint2f, VecI32, VecVecPoint2f)> detectMarkersAsync( - InputArray image, - ) async => - cvRunAsync3<(VecVecPoint2f, VecI32, VecVecPoint2f)>( - (callback) => ccontrib.ArucoDetector_DetectMarkers_Async(ref, image.ref, callback), (c, p, p2, p3) { - final corners = VecVecPoint2f.fromPointer(p.cast()); - final ids = VecI32.fromPointer(p2.cast()); - final rejected = VecVecPoint2f.fromPointer(p3.cast()); - return c.complete((corners, ids, rejected)); - }); + }); + } } Future arucoDrawDetectedMarkersAsync( @@ -50,31 +43,36 @@ Future arucoDrawDetectedMarkersAsync( VecVecPoint2f markerCorners, VecI32 markerIds, Scalar borderColor, -) async => - cvRunAsync0( - (callback) => ccontrib.ArucoDrawDetectedMarkers_Async( - img.ref, - markerCorners.ref, - markerIds.ref, - borderColor.ref, - callback, - ), - (c) => c.complete(), - ); +) async { + return cvRunAsync0( + (callback) => ccontrib.cv_aruco_drawDetectedMarkers( + img.ref, + markerCorners.ref, + markerIds.ref, + borderColor.ref, + callback, + ), + (c) => c.complete(), + ); +} Future arucoGenerateImageMarkerAsync( PredefinedDictionaryType dictionaryId, int id, int sidePixels, - int borderBits, -) async => - cvRunAsync( - (callback) => ccontrib.ArucoGenerateImageMarker_Async( - dictionaryId.value, - id, - sidePixels, - borderBits, - callback, - ), - matCompleter, - ); + int borderBits, [ + Mat? outImg, +]) async { + outImg ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_aruco_generateImageMarker( + dictionaryId.value, + id, + sidePixels, + borderBits, + outImg!.ref, + callback, + ), (c) { + c.complete(outImg); + }); +} diff --git a/packages/dartcv/lib/src/contrib/aruco_dict.dart b/packages/dartcv/lib/src/contrib/aruco_dict.dart index fca7d9f5..51697608 100644 --- a/packages/dartcv/lib/src/contrib/aruco_dict.dart +++ b/packages/dartcv/lib/src/contrib/aruco_dict.dart @@ -94,16 +94,17 @@ class ArucoDictionary extends CvStruct { factory ArucoDictionary.predefined(PredefinedDictionaryType type) { final p = calloc(); - cvRun(() => ccontrib.getPredefinedDictionary(type.value, p)); + cvRun(() => ccontrib.cv_aruco_getPredefinedDictionary(type.value, p)); return ArucoDictionary._(p); } @override cvg.ArucoDictionary get ref => ptr.ref; - static final finalizer = OcvFinalizer(ccontrib.addresses.ArucoDictionary_Close); + static final finalizer = + OcvFinalizer(ccontrib.addresses.cv_aruco_arucoDictionary_close); void dispose() { finalizer.detach(this); - ccontrib.ArucoDictionary_Close(ptr); + ccontrib.cv_aruco_arucoDictionary_close(ptr); } } diff --git a/packages/dartcv/lib/src/contrib/img_hash.dart b/packages/dartcv/lib/src/contrib/img_hash.dart index 88182ea9..fd1e3f5e 100644 --- a/packages/dartcv/lib/src/contrib/img_hash.dart +++ b/packages/dartcv/lib/src/contrib/img_hash.dart @@ -31,11 +31,11 @@ class PHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#a444a3e9ec792cf029385809393f84ad5 @override double compare(InputArray hashOne, InputArray hashTwo) { - return using((arena) { - final p = arena(); - cvRun(() => ccontrib.pHashCompare(hashOne.ref, hashTwo.ref, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => ccontrib.cv_img_hash_pHash_compare(hashOne.ref, hashTwo.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// Compute computes hash of the input image using PHash. @@ -44,22 +44,30 @@ class PHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#ae2d9288db370089dfd8aab85d5e0b0f3 @override Mat compute(InputArray inputArr, [OutputArray? outputArr]) { - final p = outputArr?.ptr ?? calloc(); - cvRun(() => ccontrib.pHashCompute(inputArr.ref, p)); - return outputArr ?? Mat.fromPointer(p); + outputArr ??= Mat.empty(); + cvRun(() => ccontrib.cv_img_hash_pHash_compute(inputArr.ref, outputArr!.ref, ffi.nullptr)); + return outputArr; } @override - Future compareAsync(InputArray hashOne, InputArray hashTwo) async => cvRunAsync( - (callback) => ccontrib.pHashCompare_Async(hashOne.ref, hashTwo.ref, callback), - doubleCompleter, - ); + Future compareAsync(InputArray hashOne, InputArray hashTwo) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_pHash_compare(hashOne.ref, hashTwo.ref, p, callback), (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }); + } @override - Future computeAsync(InputArray inputArr) async => cvRunAsync( - (callback) => ccontrib.pHashCompute_Async(inputArr.ref, callback), - matCompleter, - ); + Future computeAsync(InputArray inputArr, [OutputArray? outputArr]) async { + outputArr ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_pHash_compute(inputArr.ref, outputArr!.ref, callback), (c) { + return c.complete(outputArr); + }); + } } /// AverageHash is implementation of the AverageHash algorithm. @@ -70,11 +78,11 @@ class AverageHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#a444a3e9ec792cf029385809393f84ad5 @override double compare(InputArray hashOne, InputArray hashTwo) { - return using((arena) { - final p = arena(); - cvRun(() => ccontrib.averageHashCompare(hashOne.ref, hashTwo.ref, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => ccontrib.cv_img_hash_averageHash_compare(hashOne.ref, hashTwo.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// Compute computes hash of the input image using AverageHash. @@ -83,25 +91,30 @@ class AverageHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#ae2d9288db370089dfd8aab85d5e0b0f3 @override Mat compute(InputArray inputArr, [OutputArray? outputArr]) { - final p = outputArr?.ptr ?? calloc(); - cvRun(() => ccontrib.averageHashCompute(inputArr.ref, p)); - return outputArr ?? Mat.fromPointer(p); + outputArr ??= Mat.empty(); + cvRun(() => ccontrib.cv_img_hash_averageHash_compute(inputArr.ref, outputArr!.ref, ffi.nullptr)); + return outputArr; } @override - Future compareAsync(InputArray hashOne, InputArray hashTwo) async => cvRunAsync( - (callback) => ccontrib.averageHashCompare_Async(hashOne.ref, hashTwo.ref, callback), - doubleCompleter, - ); + Future compareAsync(InputArray hashOne, InputArray hashTwo) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_averageHash_compare(hashOne.ref, hashTwo.ref, p, callback), (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }); + } @override - Future computeAsync(InputArray inputArr) async => cvRunAsync( - (callback) => ccontrib.averageHashCompute_Async( - inputArr.ref, - callback, - ), - matCompleter, - ); + Future computeAsync(InputArray inputArr, [OutputArray? outputArr]) async { + outputArr ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_averageHash_compute(inputArr.ref, outputArr!.ref, callback), (c) { + return c.complete(outputArr); + }); + } } /// !< use fewer block and generate 16*16/8 uchar hash value @@ -121,16 +134,17 @@ class BlockMeanHash extends CvStruct implements ImgHashBase { finalizer.attach(this, ptr.cast(), detach: this); } } - static final finalizer = OcvFinalizer(ccontrib.addresses.BlockMeanHash_Close); + static final finalizer = + OcvFinalizer(ccontrib.addresses.cv_img_hash_BlockMeanHash_close); void dispose() { finalizer.detach(this); - ccontrib.BlockMeanHash_Close(ptr); + ccontrib.cv_img_hash_BlockMeanHash_close(ptr); } factory BlockMeanHash({int mode = BLOCK_MEAN_HASH_MODE_0}) { final p = calloc(); - cvRun(() => ccontrib.BlockMeanHash_Create(mode, p)); + cvRun(() => ccontrib.cv_img_hash_BlockMeanHash_create(mode, p, ffi.nullptr)); return BlockMeanHash._(p, mode); } @@ -138,7 +152,7 @@ class BlockMeanHash extends CvStruct implements ImgHashBase { int get mode => _mode; set mode(int mode) { _mode = mode; - cvRun(() => ccontrib.BlockMeanHash_SetMode(ref, mode)); + cvRun(() => ccontrib.cv_img_hash_BlockMeanHash_setMode(ref, mode, ffi.nullptr)); } /// Compare compares the hash value between a and b using BlockMeanHash. @@ -147,11 +161,11 @@ class BlockMeanHash extends CvStruct implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#a444a3e9ec792cf029385809393f84ad5 @override double compare(InputArray hashOne, InputArray hashTwo) { - return using((arena) { - final p = arena(); - cvRun(() => ccontrib.BlockMeanHash_Compare(ref, hashOne.ref, hashTwo.ref, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => ccontrib.cv_img_hash_BlockMeanHash_compare(ref, hashOne.ref, hashTwo.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// Compute computes hash of the input image using BlockMeanHash. @@ -160,47 +174,50 @@ class BlockMeanHash extends CvStruct implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#ae2d9288db370089dfd8aab85d5e0b0f3 @override Mat compute(InputArray inputArr, [OutputArray? outputArr]) { - final p = outputArr?.ptr ?? calloc(); - cvRun(() => ccontrib.BlockMeanHash_Compute(ref, inputArr.ref, p)); - return outputArr ?? Mat.fromPointer(p); + outputArr ??= Mat.empty(); + cvRun(() => ccontrib.cv_img_hash_BlockMeanHash_compute(ref, inputArr.ref, outputArr!.ref, ffi.nullptr)); + return outputArr; } /// https://docs.opencv.org/4.x/df/d55/classcv_1_1img__hash_1_1BlockMeanHash.html#ad5aef85f58315551cac14bcabe05f0c3 - List getMean() { - return using>((arena) { - final ret = arena>(); - final length = arena(); - cvRun(() => ccontrib.BlockMeanHash_GetMean(ref, ret, length)); - if (length.value == 0) return List.empty(); - return List.generate(length.value, (i) => ret.value[i]); - }); + VecF64 getMean() { + final ret = calloc(); + cvRun(() => ccontrib.cv_img_hash_BlockMeanHash_getMean(ref, ret, ffi.nullptr)); + return VecF64.fromPointer(ret); } @override - Future compareAsync(InputArray hashOne, InputArray hashTwo) async => cvRunAsync( - (callback) => ccontrib.BlockMeanHash_Compare_Async( - ref, - hashOne.ref, - hashTwo.ref, - callback, - ), - doubleCompleter, - ); + Future compareAsync(InputArray hashOne, InputArray hashTwo) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_BlockMeanHash_compare(ref, hashOne.ref, hashTwo.ref, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); + } @override - Future computeAsync(InputArray inputArr) async => cvRunAsync1( - (callback) => ccontrib.BlockMeanHash_Compute_Async( - ref, - inputArr.ref, - callback, - ), - matCompleter, - ); - - Future getMeanAsync() async => cvRunAsync( - (callback) => ccontrib.BlockMeanHash_GetMean_Async(ref, callback), - vecF64Completer, - ); + Future computeAsync(InputArray inputArr, [OutputArray? outputArr]) async { + outputArr ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_BlockMeanHash_compute(ref, inputArr.ref, outputArr!.ref, callback), + (c) { + return c.complete(outputArr); + }); + } + + Future getMeanAsync() async { + final ret = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_BlockMeanHash_getMean(ref, ret, callback), + (c) { + return c.complete(VecF64.fromPointer(ret)); + }, + ); + } @override cvg.BlockMeanHash get ref => ptr.ref; @@ -214,11 +231,11 @@ class ColorMomentHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#a444a3e9ec792cf029385809393f84ad5 @override double compare(InputArray hashOne, InputArray hashTwo) { - return using((arena) { - final p = arena(); - cvRun(() => ccontrib.colorMomentHashCompare(hashOne.ref, hashTwo.ref, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => ccontrib.cv_img_hash_colorMomentHash_compare(hashOne.ref, hashTwo.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// Compute computes hash of the input image using ColorMomentHash. @@ -227,37 +244,40 @@ class ColorMomentHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#ae2d9288db370089dfd8aab85d5e0b0f3 @override Mat compute(InputArray inputArr, [OutputArray? outputArr]) { - final p = outputArr?.ptr ?? calloc(); - cvRun(() => ccontrib.colorMomentHashCompute(inputArr.ref, p)); - return outputArr ?? Mat.fromPointer(p); + outputArr ??= Mat.empty(); + cvRun(() => ccontrib.cv_img_hash_colorMomentHash_compute(inputArr.ref, outputArr!.ref, ffi.nullptr)); + return outputArr; } @override - Future compareAsync(InputArray hashOne, InputArray hashTwo) async => cvRunAsync( - (callback) => ccontrib.colorMomentHashCompare_Async( - hashOne.ref, - hashTwo.ref, - callback, - ), - doubleCompleter, - ); + Future compareAsync(InputArray hashOne, InputArray hashTwo) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_colorMomentHash_compare(hashOne.ref, hashTwo.ref, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }); + } @override - Future computeAsync(InputArray inputArr) async => cvRunAsync( - (callback) => ccontrib.colorMomentHashCompute_Async( - inputArr.ref, - callback, - ), - matCompleter, - ); + Future computeAsync(InputArray inputArr, [OutputArray? outputArr]) async { + outputArr ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_colorMomentHash_compute(inputArr.ref, outputArr!.ref, callback), + (c) { + return c.complete(outputArr); + }); + } } /// MarrHildrethHash is implementation of the MarrHildrethHash algorithm. -class NewMarrHildrethHash implements ImgHashBase { +class MarrHildrethHash implements ImgHashBase { double alpha = 2.0; double scale = 1.0; - NewMarrHildrethHash({this.alpha = 2.0, this.scale = 1.0}); + MarrHildrethHash({this.alpha = 2.0, this.scale = 1.0}); /// Compare compares the hash value between a and b using MarrHildrethHash. // @@ -265,19 +285,20 @@ class NewMarrHildrethHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#a444a3e9ec792cf029385809393f84ad5 @override double compare(InputArray hashOne, InputArray hashTwo) { - return using((arena) { - final p = arena(); - cvRun( - () => ccontrib.marrHildrethHashCompare( - hashOne.ref, - hashTwo.ref, - alpha, - scale, - p, - ), - ); - return p.value; - }); + final p = calloc(); + cvRun( + () => ccontrib.cv_img_hash_marrHildrethHash_compare( + hashOne.ref, + hashTwo.ref, + alpha, + scale, + p, + ffi.nullptr, + ), + ); + final rval = p.value; + calloc.free(p); + return rval; } /// Compute computes hash of the input image using MarrHildrethHash. @@ -286,48 +307,59 @@ class NewMarrHildrethHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#ae2d9288db370089dfd8aab85d5e0b0f3 @override Mat compute(InputArray inputArr, [OutputArray? outputArr]) { - final p = outputArr?.ptr ?? calloc(); + outputArr ??= Mat.empty(); cvRun( - () => ccontrib.marrHildrethHashCompute( + () => ccontrib.cv_img_hash_marrHildrethHash_compute( inputArr.ref, - p, + outputArr!.ref, alpha, scale, + ffi.nullptr, ), ); - return outputArr ?? Mat.fromPointer(p); + return outputArr; } @override - Future compareAsync(InputArray hashOne, InputArray hashTwo) async => cvRunAsync( - (callback) => ccontrib.marrHildrethHashCompare_Async( - hashOne.ref, - hashTwo.ref, - alpha, - scale, - callback, - ), - doubleCompleter, - ); + Future compareAsync(InputArray hashOne, InputArray hashTwo) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_marrHildrethHash_compare( + hashOne.ref, + hashTwo.ref, + alpha, + scale, + p, + callback, + ), (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }); + } @override - Future computeAsync(InputArray inputArr) async => cvRunAsync( - (callback) => ccontrib.marrHildrethHashCompute_Async( - inputArr.ref, - alpha, - scale, - callback, - ), - matCompleter, - ); + Future computeAsync(InputArray inputArr, [OutputArray? outputArr]) async { + outputArr ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_marrHildrethHash_compute( + inputArr.ref, + outputArr!.ref, + alpha, + scale, + callback, + ), (c) { + return c.complete(outputArr); + }); + } } -/// NewRadialVarianceHash is implementation of the NewRadialVarianceHash algorithm. -class NewRadialVarianceHash implements ImgHashBase { +/// RadialVarianceHash is implementation of the RadialVarianceHash algorithm. +class RadialVarianceHash implements ImgHashBase { double sigma = 1; int numOfAngleLine = 180; - NewRadialVarianceHash({this.sigma = 1, this.numOfAngleLine = 180}); + RadialVarianceHash({this.sigma = 1, this.numOfAngleLine = 180}); /// Compare compares the hash value between a and b using RadialVarianceHash. // @@ -335,19 +367,20 @@ class NewRadialVarianceHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#a444a3e9ec792cf029385809393f84ad5 @override double compare(InputArray hashOne, InputArray hashTwo) { - return using((arena) { - final p = arena(); - cvRun( - () => ccontrib.radialVarianceHashCompare( - hashOne.ref, - hashTwo.ref, - sigma, - numOfAngleLine, - p, - ), - ); - return p.value; - }); + final p = calloc(); + cvRun( + () => ccontrib.cv_img_hash_radialVarianceHash_compare( + hashOne.ref, + hashTwo.ref, + sigma, + numOfAngleLine, + p, + ffi.nullptr, + ), + ); + final rval = p.value; + calloc.free(p); + return rval; } /// Compute computes hash of the input image using RadialVarianceHash. @@ -356,38 +389,51 @@ class NewRadialVarianceHash implements ImgHashBase { /// https://docs.opencv.org/master/de/d29/classcv_1_1img__hash_1_1ImgHashBase.html#ae2d9288db370089dfd8aab85d5e0b0f3 @override Mat compute(InputArray inputArr, [OutputArray? outputArr]) { - final p = outputArr?.ptr ?? calloc(); + outputArr ??= Mat.empty(); cvRun( - () => ccontrib.radialVarianceHashCompute( + () => ccontrib.cv_img_hash_radialVarianceHash_compute( inputArr.ref, - p, + outputArr!.ref, sigma, numOfAngleLine, + ffi.nullptr, ), ); - return outputArr ?? Mat.fromPointer(p); + return outputArr; } @override - Future compareAsync(InputArray hashOne, InputArray hashTwo) async => cvRunAsync( - (callback) => ccontrib.radialVarianceHashCompare_Async( - hashOne.ref, - hashTwo.ref, - sigma, - numOfAngleLine, - callback, - ), - doubleCompleter, - ); + Future compareAsync(InputArray hashOne, InputArray hashTwo) async { + final p = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_radialVarianceHash_compare( + hashOne.ref, + hashTwo.ref, + sigma, + numOfAngleLine, + p, + callback, + ), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); + } @override - Future computeAsync(InputArray inputArr) async => cvRunAsync( - (callback) => ccontrib.radialVarianceHashCompute_Async( - inputArr.ref, - sigma, - numOfAngleLine, - callback, - ), - matCompleter, - ); + Future computeAsync(InputArray inputArr, [OutputArray? outputArr]) async { + outputArr ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_img_hash_radialVarianceHash_compute( + inputArr.ref, + outputArr!.ref, + sigma, + numOfAngleLine, + callback, + ), (c) { + return c.complete(outputArr); + }); + } } diff --git a/packages/dartcv/lib/src/core/core_async.dart b/packages/dartcv/lib/src/core/core_async.dart index 4a8f5f92..ee637895 100644 --- a/packages/dartcv/lib/src/core/core_async.dart +++ b/packages/dartcv/lib/src/core/core_async.dart @@ -27,7 +27,7 @@ import 'vec.dart'; /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6fef31bc8c4071cbc114a758a2b79c14 -Future absDiffAsync(Mat src1, Mat src2, {Mat? dst}) { +Future absDiffAsync(Mat src1, Mat src2, {Mat? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_absdiff(src1.ref, src2.ref, dst!.ref, callback), @@ -39,7 +39,7 @@ Future absDiffAsync(Mat src1, Mat src2, {Mat? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga10ac1bfb180e2cfda1701d06c24fdbd6 -Future addAsync(Mat src1, Mat src2, {Mat? dst, int dtype = -1, Mat? mask}) { +Future addAsync(Mat src1, Mat src2, {Mat? dst, int dtype = -1, Mat? mask}) async { dst ??= Mat.empty(); mask ??= Mat.empty(); return cvRunAsync0( @@ -62,7 +62,7 @@ Future addWeightedAsync( double gamma, { OutputArray? dst, int dtype = -1, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_addWeighted(src1.ref, alpha, src2.ref, beta, gamma, dst!.ref, dtype, callback), @@ -83,7 +83,7 @@ Future bitwiseANDAsync( InputArray src2, { OutputArray? dst, InputArray? mask, -}) { +}) async { dst ??= Mat.empty(); return mask == null ? cvRunAsync0( @@ -104,7 +104,7 @@ Future bitwiseANDAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga0002cf8b418479f4cb49a75442baee2f -Future bitwiseNOTAsync(InputArray src, {OutputArray? dst, InputArray? mask}) { +Future bitwiseNOTAsync(InputArray src, {OutputArray? dst, InputArray? mask}) async { dst ??= Mat.empty(); return mask == null ? cvRunAsync0( @@ -131,7 +131,7 @@ Future bitwiseORAsync( InputArray src2, { OutputArray? dst, InputArray? mask, -}) { +}) async { dst ??= Mat.empty(); return mask == null ? cvRunAsync0( @@ -158,7 +158,7 @@ Future bitwiseXORAsync( InputArray src2, { OutputArray? dst, InputArray? mask, -}) { +}) async { dst ??= Mat.empty(); return mask == null ? cvRunAsync0( @@ -190,7 +190,7 @@ Future<(Mat dist, Mat nidx)> batchDistanceAsync( InputArray? mask, int update = 0, bool crosscheck = false, -}) { +}) async { dist ??= Mat.empty(); nidx ??= Mat.empty(); mask ??= Mat.empty(); @@ -218,7 +218,7 @@ Future<(Mat dist, Mat nidx)> batchDistanceAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga247f571aa6244827d3d798f13892da58 -Future borderInterpolateAsync(int p, int len, int borderType) { +Future borderInterpolateAsync(int p, int len, int borderType) async { final ptr = calloc(); return cvRunAsync0( (callback) => ccore.cv_borderInterpolate(p, len, borderType, ptr, callback), @@ -240,7 +240,7 @@ Future<(Mat covar, Mat mean)> calcCovarMatrixAsync( int flags, { OutputArray? covar, int ctype = MatType.CV_64F, -}) { +}) async { covar ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_calcCovarMatrix( @@ -267,7 +267,7 @@ Future<(Mat magnitude, Mat angle)> cartToPolarAsync( OutputArray? magnitude, OutputArray? angle, bool angleInDegrees = false, -}) { +}) async { magnitude ??= Mat.empty(); angle ??= Mat.empty(); return cvRunAsync0( @@ -287,7 +287,7 @@ Future<(bool, Point)> checkRangeAsync( bool quiet = true, double minVal = -CV_F64_MAX, double maxVal = CV_F64_MAX, -}) { +}) async { final pos = calloc(); final pRval = calloc(); return cvRunAsync0( @@ -305,7 +305,7 @@ Future<(bool, Point)> checkRangeAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga303cfb72acf8cbb36d884650c09a3a97 -Future compareAsync(InputArray src1, InputArray src2, int cmpop, {OutputArray? dst}) { +Future compareAsync(InputArray src1, InputArray src2, int cmpop, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_compare(src1.ref, src2.ref, dst!.ref, cmpop, callback), @@ -319,7 +319,7 @@ Future compareAsync(InputArray src1, InputArray src2, int cmpop, {OutputArr /// /// For further details, please see: /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga6847337c0c55769e115a70e0f011b5ca -Future completeSymmAsync(InputOutputArray m, {bool lowerToUpper = false}) { +Future completeSymmAsync(InputOutputArray m, {bool lowerToUpper = false}) async { return cvRunAsync0( (callback) => ccore.cv_completeSymm(m.ref, lowerToUpper, callback), (c) { @@ -337,7 +337,7 @@ Future convertScaleAbsAsync( OutputArray? dst, double alpha = 1, double beta = 0, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_convertScaleAbs(src.ref, dst!.ref, alpha, beta, callback), @@ -360,7 +360,7 @@ Future copyMakeBorderAsync( int borderType, { OutputArray? dst, Scalar? value, -}) { +}) async { dst ??= Mat.empty(); value ??= Scalar(); return cvRunAsync0( @@ -385,7 +385,7 @@ Future copyMakeBorderAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga85aad4d668c01fbd64825f589e3696d4 -Future dctAsync(InputArray src, {OutputArray? dst, int flags = 0}) { +Future dctAsync(InputArray src, {OutputArray? dst, int flags = 0}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_dct(src.ref, dst!.ref, flags, callback), @@ -399,7 +399,7 @@ Future dctAsync(InputArray src, {OutputArray? dst, int flags = 0}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf802bd9ca3e07b8b6170645ef0611d0c -Future determinantAsync(InputArray mtx) { +Future determinantAsync(InputArray mtx) async { final p = calloc(); return cvRunAsync0( (callback) => ccore.cv_determinant(mtx.ref, p, callback), @@ -416,7 +416,7 @@ Future determinantAsync(InputArray mtx) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gadd6cf9baf2b8b704a11b5f04aaf4f39d -Future dftAsync(InputArray src, {OutputArray? dst, int flags = 0, int nonzeroRows = 0}) { +Future dftAsync(InputArray src, {OutputArray? dst, int flags = 0, int nonzeroRows = 0}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_dft(src.ref, dst!.ref, flags, nonzeroRows, callback), @@ -437,7 +437,7 @@ Future divideAsync( OutputArray? dst, double scale = 1, int dtype = -1, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_divide(src1.ref, src2.ref, dst!.ref, scale, dtype, callback), @@ -455,7 +455,7 @@ Future<(bool ret, Mat eigenvalues, Mat eigenvectors)> eigenAsync( InputArray src, { OutputArray? eigenvalues, OutputArray? eigenvectors, -}) { +}) async { eigenvalues ??= Mat.empty(); eigenvectors ??= Mat.empty(); final p = calloc(); @@ -477,7 +477,7 @@ Future<(Mat eigenvalues, Mat eigenvectors)> eigenNonSymmetricAsync( InputArray src, { OutputArray? eigenvalues, OutputArray? eigenvectors, -}) { +}) async { eigenvalues ??= Mat.empty(); eigenvectors ??= Mat.empty(); return cvRunAsync0( @@ -493,7 +493,7 @@ Future PCABackProjectAsync( InputArray mean, InputArray eigenvectors, { OutputArray? dst, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_PCABackProject(data.ref, mean.ref, eigenvectors.ref, dst!.ref, callback), @@ -518,7 +518,7 @@ Future<(Mat mean, Mat eigenvalues, Mat eigenvectors)> PCAComputeAsync( OutputArray? eigenvectors, OutputArray? eigenvalues, int maxComponents = 0, -}) { +}) async { eigenvalues ??= Mat.empty(); eigenvectors ??= Mat.empty(); return cvRunAsync0( @@ -540,7 +540,7 @@ Future<(Mat mean, Mat eigenvalues, Mat eigenvectors)> PCACompute1Async( double retainedVariance, { OutputArray? eigenvectors, OutputArray? eigenvalues, -}) { +}) async { eigenvectors ??= Mat.empty(); eigenvalues ??= Mat.empty(); return cvRunAsync0( @@ -556,7 +556,8 @@ Future<(Mat mean, Mat eigenvalues, Mat eigenvectors)> PCACompute1Async( }); } -Future<(Mat mean, Mat result)> PCAProjectAsync(Mat data, Mat mean, Mat eigenvectors, {OutputArray? result}) { +Future<(Mat mean, Mat result)> PCAProjectAsync(Mat data, Mat mean, Mat eigenvectors, + {OutputArray? result}) async { result ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_PCAProject(data.ref, mean.ref, eigenvectors.ref, result!.ref, callback), @@ -570,7 +571,7 @@ Future<(Mat mean, Mat result)> PCAProjectAsync(Mat data, Mat mean, Mat eigenvect /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3e10108e2162c338f1b848af619f39e5 -Future expAsync(InputArray src, {OutputArray? dst}) { +Future expAsync(InputArray src, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_exp(src.ref, dst!.ref, callback), @@ -584,7 +585,7 @@ Future expAsync(InputArray src, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacc6158574aa1f0281878c955bcf35642 -Future extractChannelAsync(InputArray src, int coi, {OutputArray? dst}) { +Future extractChannelAsync(InputArray src, int coi, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_extractChannel(src.ref, dst!.ref, coi, callback), @@ -598,7 +599,7 @@ Future extractChannelAsync(InputArray src, int coi, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaed7df59a3539b4cc0fe5c9c8d7586190 -Future findNonZeroAsync(InputArray src, {OutputArray? idx}) { +Future findNonZeroAsync(InputArray src, {OutputArray? idx}) async { idx ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_findNonZero(src.ref, idx!.ref, callback), @@ -612,7 +613,7 @@ Future findNonZeroAsync(InputArray src, {OutputArray? idx}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaca7be533e3dac7feb70fc60635adf441 -Future flipAsync(InputArray src, int flipCode, {OutputArray? dst}) { +Future flipAsync(InputArray src, int flipCode, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_flip(src.ref, dst!.ref, flipCode, callback), @@ -622,7 +623,7 @@ Future flipAsync(InputArray src, int flipCode, {OutputArray? dst}) { ); } -Future flipND(InputArray src, int axis, {OutputArray? dst}) { +Future flipNDAsync(InputArray src, int axis, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_flipND(src.ref, dst!.ref, axis, callback), @@ -644,7 +645,7 @@ Future gemmAsync( double beta, { OutputArray? dst, int flags = 0, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_gemm(src1.ref, src2.ref, alpha, src3.ref, beta, dst!.ref, flags, callback), @@ -659,7 +660,7 @@ Future gemmAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6577a2e59968936ae02eb2edde5de299 -Future getOptimalDFTSizeAsync(int vecsize) { +Future getOptimalDFTSizeAsync(int vecsize) async { final p = calloc(); return cvRunAsync0( (callback) => ccore.cv_getOptimalDFTSize(vecsize, p, callback), @@ -675,7 +676,7 @@ Future getOptimalDFTSizeAsync(int vecsize) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaab5ceee39e0580f879df645a872c6bf7 -Future hconcatAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { +Future hconcatAsync(InputArray src1, InputArray src2, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_hconcat(src1.ref, src2.ref, dst!.ref, callback), @@ -689,7 +690,7 @@ Future hconcatAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gaad07cede730cdde64b90e987aad179b8 -Future vconcatAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { +Future vconcatAsync(InputArray src1, InputArray src2, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_vconcat(src1.ref, src2.ref, dst!.ref, callback), @@ -703,7 +704,7 @@ Future vconcatAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4ad01c0978b0ce64baa246811deeac24 -Future rotateAsync(InputArray src, int rotateCode, {OutputArray? dst}) { +Future rotateAsync(InputArray src, int rotateCode, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_rotate(src.ref, dst!.ref, rotateCode, callback), @@ -721,7 +722,7 @@ Future idctAsync( InputArray src, { OutputArray? dst, int flags = 0, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_idct(src.ref, dst!.ref, flags, callback), @@ -740,7 +741,7 @@ Future idftAsync( OutputArray? dst, int flags = 0, int nonzeroRows = 0, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_idft(src.ref, dst!.ref, flags, nonzeroRows, callback), @@ -759,7 +760,7 @@ Future inRangeAsync( InputArray lowerb, InputArray upperb, { OutputArray? dst, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_inRange(src.ref, lowerb.ref, upperb.ref, dst!.ref, callback), @@ -778,7 +779,7 @@ Future inRangebyScalarAsync( Scalar lowerb, Scalar upperb, { OutputArray? dst, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_inRange_1(src.ref, lowerb.ref, upperb.ref, dst!.ref, callback), @@ -793,7 +794,7 @@ Future inRangebyScalarAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1d4bd886d35b00ec0b764cb4ce6eb515 -Future insertChannelAsync(InputArray src, InputOutputArray dst, int coi) { +Future insertChannelAsync(InputArray src, InputOutputArray dst, int coi) async { return cvRunAsync0( (callback) => ccore.cv_insertChannel(src.ref, dst.ref, coi, callback), (c) { @@ -810,7 +811,7 @@ Future<(double rval, Mat dst)> invertAsync( InputArray src, { OutputArray? dst, int flags = DECOMP_LU, -}) { +}) async { dst ??= Mat.empty(); final p = calloc(); return cvRunAsync0( @@ -835,7 +836,7 @@ Future<(double rval, Mat bestLabels, Mat centers)> kmeansAsync( int attempts, int flags, { OutputArray? centers, -}) { +}) async { centers ??= Mat.empty(); final p = calloc(); return cvRunAsync0( @@ -870,7 +871,7 @@ Future<(double rval, Mat bestLabels, Mat centers)> kmeansByPointsAsync( int attempts, int flags, { OutputArray? centers, -}) { +}) async { centers ??= Mat.empty(); final p = calloc(); return cvRunAsync0( @@ -897,7 +898,7 @@ Future<(double rval, Mat bestLabels, Mat centers)> kmeansByPointsAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga937ecdce4679a77168730830a955bea7 -Future logAsync(InputArray src, {OutputArray? dst}) { +Future logAsync(InputArray src, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_log(src.ref, dst!.ref, callback), @@ -924,7 +925,7 @@ Future logAsync(InputArray src, {OutputArray? dst}) { /// number of channels as in the input array. /// /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gab55b8d062b7f5587720ede032d34156f -Future LUTAsync(InputArray src, InputArray lut, {OutputArray? dst}) { +Future LUTAsync(InputArray src, InputArray lut, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_LUT(src.ref, lut.ref, dst!.ref, callback), @@ -938,7 +939,7 @@ Future LUTAsync(InputArray src, InputArray lut, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6d3b097586bca4409873d64a90fe64c3 -Future magnitudeAsync(InputArray x, InputArray y, {OutputArray? magnitude}) { +Future magnitudeAsync(InputArray x, InputArray y, {OutputArray? magnitude}) async { magnitude ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_magnitude(x.ref, y.ref, magnitude!.ref, callback), @@ -952,7 +953,7 @@ Future magnitudeAsync(InputArray x, InputArray y, {OutputArray? magnitude}) /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacc40fa15eac0fb83f8ca70b7cc0b588d -Future maxAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { +Future maxAsync(InputArray src1, InputArray src2, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_max(src1.ref, src2.ref, dst!.ref, callback), @@ -966,7 +967,7 @@ Future maxAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga846c858f4004d59493d7c6a4354b301d -Future<(Scalar mean, Scalar stddev)> meanStdDevAsync(InputArray src, {InputArray? mask}) { +Future<(Scalar mean, Scalar stddev)> meanStdDevAsync(InputArray src, {InputArray? mask}) async { final mean = calloc(); final stddev = calloc(); return mask == null @@ -988,7 +989,7 @@ Future<(Scalar mean, Scalar stddev)> meanStdDevAsync(InputArray src, {InputArray /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga7d7b4d6c6ee504b30a20b1680029c7b4 -Future mergeAsync(VecMat mv, {OutputArray? dst}) { +Future mergeAsync(VecMat mv, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_merge(mv.ref, dst!.ref, callback), @@ -1002,7 +1003,7 @@ Future mergeAsync(VecMat mv, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9af368f182ee76d0463d0d8d5330b764 -Future minAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { +Future minAsync(InputArray src1, InputArray src2, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_min(src1.ref, src2.ref, dst!.ref, callback), @@ -1019,7 +1020,7 @@ Future minAsync(InputArray src1, InputArray src2, {OutputArray? dst}) { Future<(double minVal, double maxVal, int minIdx, int maxIdx)> minMaxIdxAsync( InputArray src, { InputArray? mask, -}) { +}) async { mask ??= Mat.empty(); final minValP = calloc(); final maxValP = calloc(); @@ -1045,7 +1046,7 @@ Future<(double minVal, double maxVal, int minIdx, int maxIdx)> minMaxIdxAsync( Future<(double minVal, double maxVal, Point minLoc, Point maxLoc)> minMaxLocAsync( InputArray src, { InputArray? mask, -}) { +}) async { mask ??= Mat.empty(); final minValP = calloc(); final maxValP = calloc(); @@ -1066,7 +1067,7 @@ Future<(double minVal, double maxVal, Point minLoc, Point maxLoc)> minMaxLocAsyn /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga51d768c270a1cdd3497255017c4504be -Future mixChannelsAsync(VecMat src, VecMat dst, VecI32 fromTo) { +Future mixChannelsAsync(VecMat src, VecMat dst, VecI32 fromTo) async { return cvRunAsync0( (callback) => ccore.cv_mixChannels(src.ref, dst.ref, fromTo.ref, callback), (c) { @@ -1085,7 +1086,7 @@ Future mulSpectrumsAsync( int flags, { OutputArray? c, bool conjB = false, -}) { +}) async { c ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_mulSpectrums(a.ref, b.ref, c!.ref, flags, conjB, callback), @@ -1106,7 +1107,7 @@ Future multiplyAsync( OutputArray? dst, double scale = 1, int dtype = -1, -}) { +}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_multiply(src1.ref, src2.ref, dst!.ref, scale, dtype, callback), @@ -1128,7 +1129,7 @@ Future normalizeAsync( int normType = NORM_L2, int dtype = -1, InputArray? mask, -}) { +}) async { mask ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_normalize(src.ref, dst.ref, alpha, beta, normType, dtype, mask!.ref, callback), @@ -1146,7 +1147,7 @@ Future normAsync( InputArray src1, { int normType = NORM_L2, InputArray? mask, -}) { +}) async { mask ??= Mat.empty(); final p = calloc(); return cvRunAsync0( @@ -1168,7 +1169,7 @@ Future norm1Async( InputArray src2, { int normType = NORM_L2, InputArray? mask, -}) { +}) async { final p = calloc(); mask ??= Mat.empty(); return cvRunAsync0( @@ -1185,7 +1186,7 @@ Future norm1Async( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gad327659ac03e5fd6894b90025e6900a7 -Future perspectiveTransformAsync(InputArray src, InputArray m, {OutputArray? dst}) { +Future perspectiveTransformAsync(InputArray src, InputArray m, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_perspectiveTransform(src.ref, dst!.ref, m.ref, callback), @@ -1204,7 +1205,7 @@ Future<(bool ret, Mat dst)> solveAsync( InputArray src2, { OutputArray? dst, int flags = DECOMP_LU, -}) { +}) async { dst ??= Mat.empty(); final p = calloc(); return cvRunAsync0( @@ -1221,7 +1222,7 @@ Future<(bool ret, Mat dst)> solveAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1c3b0b925b085b6e96931ee309e6a1da -Future<(int rval, Mat roots)> solveCubicAsync(InputArray coeffs, {OutputArray? roots}) { +Future<(int rval, Mat roots)> solveCubicAsync(InputArray coeffs, {OutputArray? roots}) async { roots ??= Mat.empty(); final p = calloc(); return cvRunAsync0( @@ -1242,7 +1243,7 @@ Future<(double rval, Mat roots)> solvePolyAsync( InputArray coeffs, { OutputArray? roots, int maxIters = 300, -}) { +}) async { roots ??= Mat.empty(); final p = calloc(); return cvRunAsync0( @@ -1259,7 +1260,7 @@ Future<(double rval, Mat roots)> solvePolyAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4b78072a303f29d9031d56e5638da78e -Future reduceAsync(InputArray src, int dim, int rtype, {OutputArray? dst, int dtype = -1}) { +Future reduceAsync(InputArray src, int dim, int rtype, {OutputArray? dst, int dtype = -1}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_reduce(src.ref, dst!.ref, dim, rtype, dtype, callback), @@ -1273,7 +1274,7 @@ Future reduceAsync(InputArray src, int dim, int rtype, {OutputArray? dst, i /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa87ea34d99bcc5bf9695048355163da0 -Future reduceArgMaxAsync(InputArray src, int axis, {OutputArray? dst, bool lastIndex = false}) { +Future reduceArgMaxAsync(InputArray src, int axis, {OutputArray? dst, bool lastIndex = false}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_reduceArgMax(src.ref, dst!.ref, axis, lastIndex, callback), @@ -1287,7 +1288,7 @@ Future reduceArgMaxAsync(InputArray src, int axis, {OutputArray? dst, bool /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeecd548276bfb91b938989e66b722088 -Future reduceArgMinAsync(InputArray src, int axis, {OutputArray? dst, bool lastIndex = false}) { +Future reduceArgMinAsync(InputArray src, int axis, {OutputArray? dst, bool lastIndex = false}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_reduceArgMin(src.ref, dst!.ref, axis, lastIndex, callback), @@ -1301,7 +1302,7 @@ Future reduceArgMinAsync(InputArray src, int axis, {OutputArray? dst, bool /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga496c3860f3ac44c40b48811333cfda2d -Future repeatAsync(InputArray src, int ny, int nx, {OutputArray? dst}) { +Future repeatAsync(InputArray src, int ny, int nx, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_repeat(src.ref, ny, nx, dst!.ref, callback), @@ -1315,7 +1316,7 @@ Future repeatAsync(InputArray src, int ny, int nx, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9e0845db4135f55dcf20227402f00d98 -Future scaleAddAsync(InputArray src1, double alpha, InputArray src2, {OutputArray? dst}) { +Future scaleAddAsync(InputArray src1, double alpha, InputArray src2, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_scaleAdd(src1.ref, alpha, src2.ref, dst!.ref, callback), @@ -1329,7 +1330,7 @@ Future scaleAddAsync(InputArray src1, double alpha, InputArray src2, {Outpu /// For further details, please see: /// /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga388d7575224a4a277ceb98ccaa327c99 -Future setIdentityAsync(InputOutputArray mtx, {double s = 1}) { +Future setIdentityAsync(InputOutputArray mtx, {double s = 1}) async { return cvRunAsync0( (callback) => ccore.cv_setIdentity(mtx.ref, s, callback), (c) { @@ -1342,7 +1343,7 @@ Future setIdentityAsync(InputOutputArray mtx, {double s = 1}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga45dd56da289494ce874be2324856898f -Future sortAsync(InputArray src, int flags, {OutputArray? dst}) { +Future sortAsync(InputArray src, int flags, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_sort(src.ref, dst!.ref, flags, callback), @@ -1357,7 +1358,7 @@ Future sortAsync(InputArray src, int flags, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gadf35157cbf97f3cb85a545380e383506 -Future sortIdxAsync(InputArray src, int flags, {OutputArray? dst}) { +Future sortIdxAsync(InputArray src, int flags, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_sortIdx(src.ref, dst!.ref, flags, callback), @@ -1372,7 +1373,7 @@ Future sortIdxAsync(InputArray src, int flags, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga0547c7fed86152d7e9d0096029c8518a -Future splitAsync(InputArray m) { +Future splitAsync(InputArray m) async { final vec = calloc(); return cvRunAsync0( (callback) => ccore.cv_split(m.ref, vec, callback), @@ -1389,7 +1390,7 @@ Future splitAsync(InputArray m) { /// The accuracy is approximately the same as of the built-in std::sqrt . /// /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga186222c3919657890f88df5a1f64a7d7 -Future sqrtAsync(Mat src, {Mat? dst}) { +Future sqrtAsync(Mat src, {Mat? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_sqrt(src.ref, dst!.ref, callback), @@ -1409,7 +1410,7 @@ Future subtractAsync( OutputArray? dst, InputArray? mask, int dtype = -1, -}) { +}) async { dst ??= Mat.empty(); mask ??= Mat.empty(); return cvRunAsync0( @@ -1426,7 +1427,7 @@ Future subtractAsync( /// independently for each channel. /// /// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga716e10a2dd9e228e4d3c95818f106722 -Future sumAsync(Mat src) { +Future sumAsync(Mat src) async { final p = calloc(); return cvRunAsync0( (callback) => ccore.cv_sum(src.ref, p, callback), @@ -1440,7 +1441,7 @@ Future sumAsync(Mat src) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3419ac19c7dcd2be4bd552a23e147dd8 -Future traceAsync(InputArray mtx) { +Future traceAsync(InputArray mtx) async { final ptr = calloc(); return cvRunAsync0( (callback) => ccore.cv_trace(mtx.ref, ptr, callback), @@ -1454,7 +1455,7 @@ Future traceAsync(InputArray mtx) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga393164aa54bb9169ce0a8cc44e08ff22 -Future transformAsync(InputArray src, InputArray m, {OutputArray? dst}) { +Future transformAsync(InputArray src, InputArray m, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_transform(src.ref, dst!.ref, m.ref, callback), @@ -1468,7 +1469,7 @@ Future transformAsync(InputArray src, InputArray m, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga46630ed6c0ea6254a35f447289bd7404 -Future transposeAsync(InputArray src, {OutputArray? dst}) { +Future transposeAsync(InputArray src, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_transpose(src.ref, dst!.ref, callback), @@ -1484,7 +1485,7 @@ Future transposeAsync(InputArray src, {OutputArray? dst}) { /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga46630ed6c0ea6254a35f447289bd7404 -Future transposeNDAsync(InputArray src, List order, {OutputArray? dst}) { +Future transposeNDAsync(InputArray src, List order, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_transposeND(src.ref, dst!.ref, order.i32.ref, callback), @@ -1498,7 +1499,7 @@ Future transposeNDAsync(InputArray src, List order, {OutputArray? dst} /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf0d056b5bd1dc92500d6f6cf6bac41ef -Future powAsync(InputArray src, double power, {OutputArray? dst}) { +Future powAsync(InputArray src, double power, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_pow(src.ref, power, dst!.ref, callback), @@ -1518,7 +1519,7 @@ Future<(Mat x, Mat y)> polarToCartAsync( OutputArray? x, OutputArray? y, bool angleInDegrees = false, -}) { +}) async { x ??= Mat.empty(); y ??= Mat.empty(); return cvRunAsync0( @@ -1533,7 +1534,7 @@ Future<(Mat x, Mat y)> polarToCartAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9db9ca9b4d81c3bde5677b8f64dc0137 -Future phaseAsync(InputArray x, InputArray y, {OutputArray? angle, bool angleInDegrees = false}) { +Future phaseAsync(InputArray x, InputArray y, {OutputArray? angle, bool angleInDegrees = false}) async { angle ??= Mat.empty(); return cvRunAsync0( (callback) => ccore.cv_phase(x.ref, y.ref, angle!.ref, angleInDegrees, callback), @@ -1547,7 +1548,7 @@ Future phaseAsync(InputArray x, InputArray y, {OutputArray? angle, bool ang /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeff1f61e972d133a04ce3a5f81cf6808 -Future randnAsync(InputOutputArray dst, Scalar mean, Scalar stddev) { +Future randnAsync(InputOutputArray dst, Scalar mean, Scalar stddev) async { return cvRunAsync0( (callback) => ccore.cv_randn(dst.ref, mean.ref, stddev.ref, callback), (c) { @@ -1564,7 +1565,7 @@ Future randShuffleAsync( InputOutputArray dst, { double iterFactor = 1, Rng? rng, -}) { +}) async { if (rng == null) { return cvRunAsync0( (callback) => ccore.cv_randShuffle(dst.ref, callback), @@ -1587,7 +1588,7 @@ Future randShuffleAsync( /// /// For further details, please see: /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1ba1026dca0807b27057ba6a49d258c0 -Future randuAsync(InputOutputArray dst, Scalar low, Scalar high) { +Future randuAsync(InputOutputArray dst, Scalar low, Scalar high) async { return cvRunAsync0( (callback) => ccore.cv_randu(dst.ref, low.ref, high.ref, callback), (c) { From e7113d5711b2f3beb7e0290ec69d1143850e0c26 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sat, 19 Oct 2024 21:23:08 +0800 Subject: [PATCH 14/30] finish quality --- packages/dartcv/lib/src/contrib/quality.dart | 232 +++++++++++-------- 1 file changed, 130 insertions(+), 102 deletions(-) diff --git a/packages/dartcv/lib/src/contrib/quality.dart b/packages/dartcv/lib/src/contrib/quality.dart index 17e6fc7d..78ca171c 100644 --- a/packages/dartcv/lib/src/contrib/quality.dart +++ b/packages/dartcv/lib/src/contrib/quality.dart @@ -28,7 +28,7 @@ class QualityBRISQUE extends CvStruct { final p = calloc(); final cm = modelFile.toNativeUtf8().cast(); final cr = rangeFile.toNativeUtf8().cast(); - cvRun(() => ccontrib.QualityBRISQUE_create(cm, cr, p)); + cvRun(() => ccontrib.cv_quality_QualityBRISQUE_create(cm, cr, p, ffi.nullptr)); calloc.free(cm); calloc.free(cr); return QualityBRISQUE.fromPointer(p, false); @@ -39,15 +39,18 @@ class QualityBRISQUE extends CvStruct { /// https://docs.opencv.org/4.x/d8/d99/classcv_1_1quality_1_1QualityBRISQUE.html#a011769e13ad8537dcec8f698a298ab1b Scalar compute(Mat img) { final p = calloc(); - cvRun(() => ccontrib.QualityBRISQUE_compute(ref, img.ref, p)); + cvRun(() => ccontrib.cv_quality_QualityBRISQUE_compute(ref, img.ref, p, ffi.nullptr)); return Scalar.fromPointer(p); } /// async version of [compute] - Future computeAsync(Mat img) => cvRunAsync( - (callback) => ccontrib.QualityBRISQUE_compute_async(ref, img.ref, callback), - scalarCompleter, - ); + Future computeAsync(Mat img) async { + final p = calloc(); + return cvRunAsync0((callback) => ccontrib.cv_quality_QualityBRISQUE_compute(ref, img.ref, p, callback), + (c) { + return c.complete(Scalar.fromPointer(p)); + }); + } /// static method for computing quality /// @@ -56,31 +59,33 @@ class QualityBRISQUE extends CvStruct { final p = calloc(); final cm = modelFile.toNativeUtf8().cast(); final cr = rangeFile.toNativeUtf8().cast(); - cvRun(() => ccontrib.QualityBRISQUE_compute_static(img.ref, cm, cr, p)); + cvRun(() => ccontrib.cv_quality_QualityBRISQUE_compute_static(img.ref, cm, cr, p, ffi.nullptr)); calloc.free(cm); calloc.free(cr); return Scalar.fromPointer(p); } /// async version of [compute1] - static Future compute1Async(String modelFile, String rangeFile, Mat img) => cvRunAsync( - (callback) { - final cm = modelFile.toNativeUtf8().cast(); - final cr = rangeFile.toNativeUtf8().cast(); - final status = ccontrib.QualityBRISQUE_compute_static_async(img.ref, cm, cr, callback); - calloc.free(cm); - calloc.free(cr); - return status; - }, - scalarCompleter, - ); + static Future compute1Async(String modelFile, String rangeFile, Mat img) async { + final p = calloc(); + final cm = modelFile.toNativeUtf8().cast(); + final cr = rangeFile.toNativeUtf8().cast(); + return cvRunAsync0( + (callback) => ccontrib.cv_quality_QualityBRISQUE_compute_static(img.ref, cm, cr, p, callback), (c) { + calloc.free(cm); + calloc.free(cr); + return c.complete(Scalar.fromPointer(p)); + }); + } /// static method for computing image features used by the BRISQUE algorithm /// /// https://docs.opencv.org/4.x/d8/d99/classcv_1_1quality_1_1QualityBRISQUE.html#a71931f138fa9b2db5109e2b50f3a8a74 static Mat computeFeatures(Mat img, {Mat? features}) { features ??= Mat.empty(); - cvRun(() => ccontrib.QualityBRISQUE_computeFeatures_static(img.ref, features!.ref)); + cvRun( + () => ccontrib.cv_quality_QualityBRISQUE_computeFeatures_static(img.ref, features!.ref, ffi.nullptr), + ); return features; } @@ -88,14 +93,13 @@ class QualityBRISQUE extends CvStruct { static Future computeFeaturesAsync(Mat img, {Mat? features}) => cvRunAsync0( (callback) { features ??= Mat.empty(); - final status = - ccontrib.QualityBRISQUE_computeFeatures_static_async(img.ref, features!.ref, callback); - return status; + return ccontrib.cv_quality_QualityBRISQUE_computeFeatures_static(img.ref, features!.ref, callback); }, (c) => c.complete(features), ); - static final finalizer = OcvFinalizer(ccontrib.addresses.QualityBRISQUE_close); + static final finalizer = + OcvFinalizer(ccontrib.addresses.cv_quality_QualityBRISQUE_close); @override cvg.QualityBRISQUE get ref => ptr.ref; } @@ -112,7 +116,7 @@ class QualityGMSD extends CvStruct { /// https://docs.opencv.org/4.x/d8/d81/classcv_1_1quality_1_1QualityGMSD.html#af1c9e3cdf594358f47504a8b6b42f583 factory QualityGMSD.create(Mat ref) { final p = calloc(); - cvRun(() => ccontrib.QualityGMSD_create(ref.ref, p)); + cvRun(() => ccontrib.cv_quality_QualityGMSD_create(ref.ref, p, ffi.nullptr)); return QualityGMSD.fromPointer(p, false); } @@ -121,15 +125,17 @@ class QualityGMSD extends CvStruct { /// https://docs.opencv.org/4.x/d8/d81/classcv_1_1quality_1_1QualityGMSD.html#a4fbafa647a6fea744a1f5b632fc12c46 Scalar compute(Mat cmp) { final p = calloc(); - cvRun(() => ccontrib.QualityGMSD_compute(ref, cmp.ref, p)); + cvRun(() => ccontrib.cv_quality_QualityGMSD_compute(ref, cmp.ref, p, ffi.nullptr)); return Scalar.fromPointer(p); } /// async version of [compute] - Future computeAsync(Mat cmp) => cvRunAsync( - (callback) => ccontrib.QualityGMSD_compute_async(ref, cmp.ref, callback), - scalarCompleter, - ); + Future computeAsync(Mat cmp) async { + final p = calloc(); + return cvRunAsync0((callback) => ccontrib.cv_quality_QualityGMSD_compute(ref, cmp.ref, p, callback), (c) { + return c.complete(Scalar.fromPointer(p)); + }); + } /// static method for computing quality /// @@ -137,23 +143,25 @@ class QualityGMSD extends CvStruct { static (Scalar, Mat) compute1(Mat ref, Mat cmp, {Mat? qualityMap}) { final p = calloc(); qualityMap ??= Mat.empty(); - cvRun(() => ccontrib.QualityGMSD_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p)); + cvRun( + () => ccontrib.cv_quality_QualityGMSD_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), + ); return (Scalar.fromPointer(p), qualityMap); } /// async version of [compute1] - static Future<(Scalar, Mat qualityMap)> compute1Async(Mat ref, Mat cmp, {Mat? qualityMap}) => - cvRunAsync1<(Scalar, Mat)>( - (callback) { - qualityMap ??= Mat.empty(); - final status = - ccontrib.QualityGMSD_compute_static_async(ref.ref, cmp.ref, qualityMap!.ref, callback); - return status; - }, - (c, p) => c.complete((Scalar.fromPointer(p.cast()), qualityMap!)), - ); + static Future<(Scalar, Mat qualityMap)> compute1Async(Mat ref, Mat cmp, {Mat? qualityMap}) async { + final p = calloc(); + qualityMap ??= Mat.empty(); + return cvRunAsync0( + (callback) => + ccontrib.cv_quality_QualityGMSD_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, callback), + (c) { + return c.complete((Scalar.fromPointer(p), qualityMap!)); + }); + } - static final finalizer = OcvFinalizer(ccontrib.addresses.QualityGMSD_close); + static final finalizer = OcvFinalizer(ccontrib.addresses.cv_quality_QualityGMSD_close); @override cvg.QualityGMSD get ref => ptr.ref; } @@ -170,7 +178,7 @@ class QualityMSE extends CvStruct { /// https://docs.opencv.org/4.x/d7/d80/classcv_1_1quality_1_1QualityMSE.html#a74f0f81437ca1fbb1c058d4fd85454d3 factory QualityMSE.create(Mat ref) { final p = calloc(); - cvRun(() => ccontrib.QualityMSE_create(ref.ref, p)); + cvRun(() => ccontrib.cv_quality_QualityMSE_create(ref.ref, p, ffi.nullptr)); return QualityMSE.fromPointer(p, false); } @@ -179,15 +187,18 @@ class QualityMSE extends CvStruct { /// https://docs.opencv.org/4.x/d7/d80/classcv_1_1quality_1_1QualityMSE.html#a82ba740a06f48562a08517079712218c Scalar compute(Mat cmpImgs) { final p = calloc(); - cvRun(() => ccontrib.QualityMSE_compute(ref, cmpImgs.ref, p)); + cvRun(() => ccontrib.cv_quality_QualityMSE_compute(ref, cmpImgs.ref, p, ffi.nullptr)); return Scalar.fromPointer(p); } /// async version of [compute] - Future computeAsync(Mat cmpImgs) => cvRunAsync( - (callback) => ccontrib.QualityMSE_compute_async(ref, cmpImgs.ref, callback), - (c, p) => c.complete(Scalar.fromPointer(p.cast())), - ); + Future computeAsync(Mat cmpImgs) async { + final p = calloc(); + return cvRunAsync0((callback) => ccontrib.cv_quality_QualityMSE_compute(ref, cmpImgs.ref, p, callback), + (c) { + return c.complete(Scalar.fromPointer(p)); + }); + } /// static method for computing quality /// @@ -195,23 +206,25 @@ class QualityMSE extends CvStruct { static (Scalar, Mat qualityMap) compute1(Mat ref, Mat cmp, {Mat? qualityMap}) { final p = calloc(); qualityMap ??= Mat.empty(); - cvRun(() => ccontrib.QualityMSE_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p)); + cvRun( + () => ccontrib.cv_quality_QualityMSE_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), + ); return (Scalar.fromPointer(p), qualityMap); } /// async version of [compute1] - static Future<(Scalar, Mat qualityMap)> compute1Async(Mat ref, Mat cmp, {Mat? qualityMap}) => - cvRunAsync1<(Scalar, Mat)>( - (callback) { - qualityMap ??= Mat.empty(); - final status = - ccontrib.QualityMSE_compute_static_async(ref.ref, cmp.ref, qualityMap!.ref, callback); - return status; - }, - (c, p) => c.complete((Scalar.fromPointer(p.cast()), qualityMap!)), - ); + static Future<(Scalar, Mat qualityMap)> compute1Async(Mat ref, Mat cmp, {Mat? qualityMap}) async { + final p = calloc(); + qualityMap ??= Mat.empty(); + return cvRunAsync0( + (callback) => + ccontrib.cv_quality_QualityMSE_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, callback), + (c) { + return c.complete((Scalar.fromPointer(p), qualityMap!)); + }); + } - static final finalizer = OcvFinalizer(ccontrib.addresses.QualityMSE_close); + static final finalizer = OcvFinalizer(ccontrib.addresses.cv_quality_QualityMSE_close); @override cvg.QualityMSE get ref => ptr.ref; } @@ -228,7 +241,7 @@ class QualityPSNR extends CvStruct { /// https://docs.opencv.org/4.x/d8/d0c/classcv_1_1quality_1_1QualityPSNR.html#a458e57903165a07be261e8ab7cf121d3 factory QualityPSNR.create(Mat ref, {double maxPixelValue = 255}) { final p = calloc(); - cvRun(() => ccontrib.QualityPSNR_create(ref.ref, maxPixelValue, p)); + cvRun(() => ccontrib.cv_quality_QualityPSNR_create(ref.ref, maxPixelValue, p, ffi.nullptr)); return QualityPSNR.fromPointer(p, false); } @@ -237,15 +250,17 @@ class QualityPSNR extends CvStruct { /// https://docs.opencv.org/4.x/d8/d0c/classcv_1_1quality_1_1QualityPSNR.html#a4c08dcc4944fa7ae2bd9dc00607c3f1a Scalar compute(Mat cmp) { final p = calloc(); - cvRun(() => ccontrib.QualityPSNR_compute(ref, cmp.ref, p)); + cvRun(() => ccontrib.cv_quality_QualityPSNR_compute(ref, cmp.ref, p, ffi.nullptr)); return Scalar.fromPointer(p); } /// async version of [compute] - Future computeAsync(Mat cmp) => cvRunAsync( - (callback) => ccontrib.QualityPSNR_compute_async(ref, cmp.ref, callback), - scalarCompleter, - ); + Future computeAsync(Mat cmp) async { + final p = calloc(); + return cvRunAsync0((callback) => ccontrib.cv_quality_QualityPSNR_compute(ref, cmp.ref, p, callback), (c) { + return c.complete(Scalar.fromPointer(p)); + }); + } /// static method for computing quality /// @@ -253,7 +268,16 @@ class QualityPSNR extends CvStruct { static (Scalar, Mat qualityMap) compute1(Mat ref, Mat cmp, {Mat? qualityMap, double maxPixelValue = 255}) { final p = calloc(); qualityMap ??= Mat.empty(); - cvRun(() => ccontrib.QualityPSNR_compute_static(ref.ref, cmp.ref, maxPixelValue, qualityMap!.ref, p)); + cvRun( + () => ccontrib.cv_quality_QualityPSNR_compute_static( + ref.ref, + cmp.ref, + maxPixelValue, + qualityMap!.ref, + p, + ffi.nullptr, + ), + ); return (Scalar.fromPointer(p), qualityMap); } @@ -263,26 +287,26 @@ class QualityPSNR extends CvStruct { Mat cmp, { Mat? qualityMap, double maxPixelValue = 255, - }) => - cvRunAsync<(Scalar, Mat)>( - (callback) { - qualityMap ??= Mat.empty(); - final status = ccontrib.QualityPSNR_compute_static_async( - ref.ref, - cmp.ref, - maxPixelValue, - qualityMap!.ref, - callback, - ); - return status; - }, - (c, p) => c.complete((Scalar.fromPointer(p.cast()), qualityMap!)), - ); + }) async { + final p = calloc(); + qualityMap ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_quality_QualityPSNR_compute_static( + ref.ref, + cmp.ref, + maxPixelValue, + qualityMap!.ref, + p, + callback, + ), (c) { + return c.complete((Scalar.fromPointer(p), qualityMap!)); + }); + } - double get maxPixelValue => ccontrib.QualityPSNR_getMaxPixelValue(ref); - set maxPixelValue(double value) => ccontrib.QualityPSNR_setMaxPixelValue(ref, value); + double get maxPixelValue => ccontrib.cv_quality_QualityPSNR_getMaxPixelValue(ref); + set maxPixelValue(double value) => ccontrib.cv_quality_QualityPSNR_setMaxPixelValue(ref, value); - static final finalizer = OcvFinalizer(ccontrib.addresses.QualityPSNR_close); + static final finalizer = OcvFinalizer(ccontrib.addresses.cv_quality_QualityPSNR_close); @override cvg.QualityPSNR get ref => ptr.ref; } @@ -299,7 +323,7 @@ class QualitySSIM extends CvStruct { /// https://docs.opencv.org/4.x/d9/db5/classcv_1_1quality_1_1QualitySSIM.html#a4ec6e4557fd24782e619f00852ea3289 factory QualitySSIM.create(Mat ref) { final p = calloc(); - cvRun(() => ccontrib.QualitySSIM_create(ref.ref, p)); + cvRun(() => ccontrib.cv_quality_QualitySSIM_create(ref.ref, p, ffi.nullptr)); return QualitySSIM.fromPointer(p, false); } @@ -308,15 +332,17 @@ class QualitySSIM extends CvStruct { /// https://docs.opencv.org/4.x/d9/db5/classcv_1_1quality_1_1QualitySSIM.html#a49d5ecc72e83b8876c8293244c3667e4 Scalar compute(Mat cmp) { final p = calloc(); - cvRun(() => ccontrib.QualitySSIM_compute(ref, cmp.ref, p)); + cvRun(() => ccontrib.cv_quality_QualitySSIM_compute(ref, cmp.ref, p, ffi.nullptr)); return Scalar.fromPointer(p); } /// async version of [compute] - Future computeAsync(Mat cmp) => cvRunAsync( - (callback) => ccontrib.QualitySSIM_compute_async(ref, cmp.ref, callback), - scalarCompleter, - ); + Future computeAsync(Mat cmp) async { + final p = calloc(); + return cvRunAsync0((callback) => ccontrib.cv_quality_QualitySSIM_compute(ref, cmp.ref, p, callback), (c) { + return c.complete(Scalar.fromPointer(p)); + }); + } /// static method for computing quality /// @@ -324,7 +350,9 @@ class QualitySSIM extends CvStruct { static (Scalar, Mat qualityMap) compute1(Mat ref, Mat cmp, {Mat? qualityMap}) { final p = calloc(); qualityMap ??= Mat.empty(); - cvRun(() => ccontrib.QualitySSIM_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p)); + cvRun( + () => ccontrib.cv_quality_QualitySSIM_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), + ); return (Scalar.fromPointer(p), qualityMap); } @@ -333,18 +361,18 @@ class QualitySSIM extends CvStruct { Mat ref, Mat cmp, { Mat? qualityMap, - }) => - cvRunAsync<(Scalar, Mat)>( - (callback) { - qualityMap ??= Mat.empty(); - final status = - ccontrib.QualitySSIM_compute_static_async(ref.ref, cmp.ref, qualityMap!.ref, callback); - return status; - }, - (c, p) => c.complete((Scalar.fromPointer(p.cast()), qualityMap!)), - ); + }) async { + final p = calloc(); + qualityMap ??= Mat.empty(); + return cvRunAsync0( + (callback) => + ccontrib.cv_quality_QualitySSIM_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, callback), + (c) { + return c.complete((Scalar.fromPointer(p), qualityMap!)); + }); + } - static final finalizer = OcvFinalizer(ccontrib.addresses.QualitySSIM_close); + static final finalizer = OcvFinalizer(ccontrib.addresses.cv_quality_QualitySSIM_close); @override cvg.QualitySSIM get ref => ptr.ref; } From d2029381e0823c692b373ca6d93f53fcfb531742 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sun, 20 Oct 2024 09:35:09 +0800 Subject: [PATCH 15/30] finish contrib --- .../dartcv/lib/src/contrib/wechat_qrcode.dart | 37 +- .../lib/src/contrib/wechat_qrcode_async.dart | 51 -- packages/dartcv/lib/src/contrib/ximgproc.dart | 571 ++++++++++-------- .../dartcv/lib/src/contrib/xobjdetect.dart | 15 +- packages/dartcv/lib/src/g/contrib.g.dart | 120 +++- packages/dartcv/lib/src/g/contrib.yaml | 4 + 6 files changed, 439 insertions(+), 359 deletions(-) delete mode 100644 packages/dartcv/lib/src/contrib/wechat_qrcode_async.dart diff --git a/packages/dartcv/lib/src/contrib/wechat_qrcode.dart b/packages/dartcv/lib/src/contrib/wechat_qrcode.dart index 08fa361f..750f679d 100644 --- a/packages/dartcv/lib/src/contrib/wechat_qrcode.dart +++ b/packages/dartcv/lib/src/contrib/wechat_qrcode.dart @@ -28,7 +28,7 @@ class WeChatQRCode extends CvStruct { factory WeChatQRCode.empty() { final p = calloc(); - cvRun(() => ccontrib.WeChatQRCode_New(p)); + cvRun(() => ccontrib.cv_wechat_qrcode_WeChatQRCode_create(p)); return WeChatQRCode._(p); } @@ -49,7 +49,7 @@ class WeChatQRCode extends CvStruct { final dm = detectorCaffeModelPath.toNativeUtf8(allocator: arena).cast(); final srp = superResolutionPrototxtPath.toNativeUtf8(allocator: arena).cast(); final srm = superResolutionCaffeModelPath.toNativeUtf8(allocator: arena).cast(); - cvRun(() => ccontrib.WeChatQRCode_NewWithParams(dp, dm, srp, srm, p)); + cvRun(() => ccontrib.cv_wechat_qrcode_WeChatQRCode_create_1(dp, dm, srp, srm, p, ffi.nullptr)); arena.releaseAll(); return WeChatQRCode._(p); } @@ -62,21 +62,30 @@ class WeChatQRCode extends CvStruct { ]) { final p = calloc(); final rval = calloc(); - cvRun(() => ccontrib.WeChatQRCode_DetectAndDecode(ptr, img.ref, p, rval)); + cvRun(() => ccontrib.cv_wechat_qrcode_WeChatQRCode_detectAndDecode(ref, img.ref, p, rval, ffi.nullptr)); final vec = VecVecChar.fromPointer(rval); final points = VecMat.fromPointer(p); return (vec.asStringList(), points); } - /// https://docs.opencv.org/4.x/d5/d04/classcv_1_1wechat__qrcode_1_1WeChatQRCode.html#abf807138abc2626c159abd3e9a80e791 - double get scaleFactor { - return cvRunArena((arena) { - final p = calloc(); - cvRun(() => ccontrib.WeChatQRCode_GetScaleFactor(ptr, p)); - return p.value; + Future<(List, VecMat)> detectAndDecodeAsync( + InputArray img, [ + VecMat? points, + ]) async { + final p = calloc(); + final rval = calloc(); + return cvRunAsync0( + (callback) => ccontrib.cv_wechat_qrcode_WeChatQRCode_detectAndDecode(ref, img.ref, p, rval, callback), + (c) { + final vec = VecVecChar.fromPointer(rval); + final points = VecMat.fromPointer(p); + return c.complete((vec.asStringList(), points)); }); } + /// https://docs.opencv.org/4.x/d5/d04/classcv_1_1wechat__qrcode_1_1WeChatQRCode.html#abf807138abc2626c159abd3e9a80e791 + double get scaleFactor => ccontrib.cv_wechat_qrcode_WeChatQRCode_getScaleFactor(ref); + /// set scale factor QR code detector use neural network to detect QR. /// Before running the neural network, the input image is pre-processed by scaling. /// By default, the input image is scaled to an image with an area of 160000 pixels. @@ -88,15 +97,15 @@ class WeChatQRCode extends CvStruct { /// use default scaled to an image with an area of 160000 pixels. /// /// https://docs.opencv.org/4.x/d5/d04/classcv_1_1wechat__qrcode_1_1WeChatQRCode.html#a084f9aa8693fa0a62c43dd10d2533ab8 - set scaleFactor(double scaleFactor) { - cvRun(() => ccontrib.WeChatQRCode_SetScaleFactor(ptr, scaleFactor)); - } + set scaleFactor(double scaleFactor) => + ccontrib.cv_wechat_qrcode_WeChatQRCode_setScaleFactor(ref, scaleFactor); - static final finalizer = OcvFinalizer(ccontrib.addresses.WeChatQRCode_Close); + static final finalizer = + OcvFinalizer(ccontrib.addresses.cv_wechat_qrcode_WeChatQRCode_close); void dispose() { finalizer.detach(this); - ccontrib.WeChatQRCode_Close(ptr); + ccontrib.cv_wechat_qrcode_WeChatQRCode_close(ptr); } @override diff --git a/packages/dartcv/lib/src/contrib/wechat_qrcode_async.dart b/packages/dartcv/lib/src/contrib/wechat_qrcode_async.dart deleted file mode 100644 index 8fe3d33a..00000000 --- a/packages/dartcv/lib/src/contrib/wechat_qrcode_async.dart +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2024, rainyl and all contributors. All rights reserved. -// Use of this source code is governed by a Apache-2.0 license -// that can be found in the LICENSE file. - -library cv.contrib; - -import 'dart:ffi' as ffi; -import 'package:ffi/ffi.dart'; - -import '../core/base.dart'; -import '../core/mat.dart'; -import '../core/vec.dart'; -import '../g/contrib.g.dart' as cvg; -import '../native_lib.dart' show ccontrib; -import 'wechat_qrcode.dart'; - -extension WeChatQRCodeAsync on WeChatQRCode { - static Future emptyAsync() async => cvRunAsync( - ccontrib.WeChatQRCode_New_Async, - (c, p) => c.complete(WeChatQRCode.fromPointer(p.cast())), - ); - - static Future createAsync([ - String detectorPrototxtPath = "", - String detectorCaffeModelPath = "", - String superResolutionPrototxtPath = "", - String superResolutionCaffeModelPath = "", - ]) async { - final arena = Arena(); - final dp = detectorPrototxtPath.toNativeUtf8(allocator: arena).cast(); - final dm = detectorCaffeModelPath.toNativeUtf8(allocator: arena).cast(); - final srp = superResolutionPrototxtPath.toNativeUtf8(allocator: arena).cast(); - final srm = superResolutionCaffeModelPath.toNativeUtf8(allocator: arena).cast(); - final rval = cvRunAsync( - (callback) => ccontrib.WeChatQRCode_NewWithParams_Async(dp, dm, srp, srm, callback), - (c, p) => c.complete(WeChatQRCode.fromPointer(p.cast())), - ); - arena.releaseAll(); - return rval; - } - - Future<(List, VecMat)> detectAndDecodeAsync(InputArray img) async => - cvRunAsync2<(List, VecMat)>( - (callback) => ccontrib.WeChatQRCode_DetectAndDecode_Async(ptr, img.ref, callback), (c, p, p2) { - final vec = VecVecChar.fromPointer(p.cast()); - final points = VecMat.fromPointer(p2.cast()); - final rval = vec.asStringList(); - vec.dispose(); - return c.complete((rval, points)); - }); -} diff --git a/packages/dartcv/lib/src/contrib/ximgproc.dart b/packages/dartcv/lib/src/contrib/ximgproc.dart index e01fc677..4f9d9757 100644 --- a/packages/dartcv/lib/src/contrib/ximgproc.dart +++ b/packages/dartcv/lib/src/contrib/ximgproc.dart @@ -33,20 +33,29 @@ class ximgproc { int niters, { OutputArray? dst, }) { - final p = dst?.ptr ?? calloc(); - cvRun(() => ccontrib.ximgproc_anisotropicDiffusion(src.ref, p, alpha, K, niters)); - return dst ?? Mat.fromPointer(p); + dst ??= Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_anisotropicDiffusion(src.ref, dst!.ref, alpha, K, niters, ffi.nullptr)); + return dst; } /// Performs anisotropic diffusion on an image. /// /// The function applies Perona-Malik anisotropic diffusion to an image. /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#gaffedd976e0a8efb5938107acab185ec2 - static Future anisotropicDiffusionAsync(InputArray src, double alpha, double K, int niters) async => - cvRunAsync( - (callback) => ccontrib.ximgproc_anisotropicDiffusion_Async(src.ref, alpha, K, niters, callback), - matCompleter, - ); + static Future anisotropicDiffusionAsync( + InputArray src, + double alpha, + double K, + int niters, { + OutputArray? dst, + }) async { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => + ccontrib.cv_ximgproc_anisotropicDiffusion(src.ref, dst!.ref, alpha, K, niters, callback), (c) { + return c.complete(dst); + }); + } /// Smoothes an image using the Edge-Preserving filter. /// @@ -59,9 +68,9 @@ class ximgproc { /// /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#ga86fcda65ced0aafa2741088d82e9161c static Mat edgePreservingFilter(InputArray src, int d, double threshold, {OutputArray? dst}) { - final p = dst?.ptr ?? calloc(); - cvRun(() => ccontrib.ximgproc_edgePreservingFilter(src.ref, p, d, threshold)); - return dst ?? Mat.fromPointer(p); + dst ??= Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_edgePreservingFilter(src.ref, dst!.ref, d, threshold, ffi.nullptr)); + return dst; } /// Smoothes an image using the Edge-Preserving filter. @@ -74,10 +83,15 @@ class ximgproc { /// DOI: 10.5220/0006509000850094. /// /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#ga86fcda65ced0aafa2741088d82e9161c - static Future edgePreservingFilterAsync(InputArray src, int d, double threshold) async => cvRunAsync( - (callback) => ccontrib.ximgproc_edgePreservingFilter_Async(src.ref, d, threshold, callback), - matCompleter, - ); + static Future edgePreservingFilterAsync(InputArray src, int d, double threshold, + {OutputArray? dst}) async { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_ximgproc_edgePreservingFilter(src.ref, dst!.ref, d, threshold, callback), + (c) { + return c.complete(dst); + }); + } /// Finds ellipses fastly in an image using projective invariant pruning. /// @@ -94,17 +108,18 @@ class ximgproc { double reliabilityThreshold = 0.5, double centerDistanceThreshold = 0.05, }) { - final p = ellipses?.ptr ?? calloc(); + ellipses ??= Mat.empty(); cvRun( - () => ccontrib.ximgproc_findEllipses( + () => ccontrib.cv_ximgproc_findEllipses( image.ref, - p, + ellipses!.ref, scoreThreshold, reliabilityThreshold, centerDistanceThreshold, + ffi.nullptr, ), ); - return ellipses ?? Mat.fromPointer(p); + return ellipses; } /// Finds ellipses fastly in an image using projective invariant pruning. @@ -117,20 +132,24 @@ class ximgproc { /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#ga45405d89eeaa32d00e5a3d1ecc3090c2 static Future findEllipsesAsync( InputArray image, { + OutputArray? ellipses, double scoreThreshold = 0.7, double reliabilityThreshold = 0.5, double centerDistanceThreshold = 0.05, - }) async => - cvRunAsync( - (callback) => ccontrib.ximgproc_findEllipses_Async( - image.ref, - scoreThreshold, - reliabilityThreshold, - centerDistanceThreshold, - callback, - ), - matCompleter, - ); + }) async { + ellipses ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_ximgproc_findEllipses( + image.ref, + ellipses!.ref, + scoreThreshold, + reliabilityThreshold, + centerDistanceThreshold, + callback, + ), (c) { + return c.complete(ellipses); + }); + } /// Performs thresholding on input images using Niblack's technique or some of /// the popular variations it inspired. @@ -146,20 +165,21 @@ class ximgproc { int binarizationMethod = BINARIZATION_NIBLACK, double r = 128, }) { - final p = dst?.ptr ?? calloc(); + dst ??= Mat.empty(); cvRun( - () => ccontrib.ximgproc_niBlackThreshold( + () => ccontrib.cv_ximgproc_niBlackThreshold( src.ref, - p, + dst!.ref, maxValue, type, blockSize, k, binarizationMethod, r, + ffi.nullptr, ), ); - return dst ?? Mat.fromPointer(p); + return dst; } /// Performs thresholding on input images using Niblack's technique or some of @@ -172,39 +192,45 @@ class ximgproc { int type, int blockSize, double k, { + OutputArray? dst, int binarizationMethod = BINARIZATION_NIBLACK, double r = 128, - }) async => - cvRunAsync( - (callback) => ccontrib.ximgproc_niBlackThreshold_Async( - src.ref, - maxValue, - type, - blockSize, - k, - binarizationMethod, - r, - callback, - ), - matCompleter, - ); + }) async { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_ximgproc_niBlackThreshold( + src.ref, + dst!.ref, + maxValue, + type, + blockSize, + k, + binarizationMethod, + r, + callback, + ), (c) { + return c.complete(dst); + }); + } /// Calculates an affine transformation that normalize given image using Pei&Lin Normalization. /// /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#ga50d064b92f63916f4162474eea22d656 static Mat PeiLinNormalization(InputArray I, {OutputArray? T}) { - final p = T?.ptr ?? calloc(); - cvRun(() => ccontrib.ximgproc_PeiLinNormalization(I.ref, p)); - return T ?? Mat.fromPointer(p); + T ??= Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_PeiLinNormalization(I.ref, T!.ref, ffi.nullptr)); + return T; } /// Calculates an affine transformation that normalize given image using Pei&Lin Normalization. /// /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#ga50d064b92f63916f4162474eea22d656 - static Future PeiLinNormalizationAsync(InputArray I) async => cvRunAsync( - (callback) => ccontrib.ximgproc_PeiLinNormalization_Async(I.ref, callback), - matCompleter, - ); + static Future PeiLinNormalizationAsync(InputArray I, {OutputArray? T}) async { + T ??= Mat.empty(); + return cvRunAsync0((callback) => ccontrib.cv_ximgproc_PeiLinNormalization(I.ref, T!.ref, callback), (c) { + return c.complete(T); + }); + } /// Applies a binary blob thinning operation, to achieve a skeletization of the input image. /// @@ -213,9 +239,9 @@ class ximgproc { /// /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#ga37002c6ca80c978edb6ead5d6b39740c static Mat thinning(InputArray src, {OutputArray? dst, int thinningType = THINNING_ZHANGSUEN}) { - final p = dst?.ptr ?? calloc(); - cvRun(() => ccontrib.ximgproc_thinning(src.ref, p, thinningType)); - return dst ?? Mat.fromPointer(p); + dst ??= Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_thinning(src.ref, dst!.ref, thinningType, ffi.nullptr)); + return dst; } /// Applies a binary blob thinning operation, to achieve a skeletization of the input image. @@ -224,11 +250,17 @@ class ximgproc { /// technique of Zhang-Suen. /// /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#ga37002c6ca80c978edb6ead5d6b39740c - static Future thinningAsync(InputArray src, {int thinningType = THINNING_ZHANGSUEN}) async => - cvRunAsync( - (callback) => ccontrib.ximgproc_thinning_Async(src.ref, thinningType, callback), - matCompleter, - ); + static Future thinningAsync( + InputArray src, { + OutputArray? dst, + int thinningType = THINNING_ZHANGSUEN, + }) async { + dst ??= Mat.empty(); + return cvRunAsync0((callback) => ccontrib.cv_ximgproc_thinning(src.ref, dst!.ref, thinningType, callback), + (c) { + return c.complete(dst); + }); + } static const int THINNING_ZHANGSUEN = 0; static const int THINNING_GUOHALL = 1; @@ -260,20 +292,24 @@ class EdgeBoxes extends CvStruct { double gamma = 2, double kappa = 1.5, }) { - final p = calloc() - ..ref.alpha = alpha - ..ref.beta = beta - ..ref.eta = eta - ..ref.minScore = minScore - ..ref.maxBoxes = maxBoxes - ..ref.edgeMinMag = edgeMinMag - ..ref.edgeMergeThr = edgeMergeThr - ..ref.clusterMinMag = clusterMinMag - ..ref.maxAspectRatio = maxAspectRatio - ..ref.minBoxArea = minBoxArea - ..ref.gamma = gamma - ..ref.kappa = kappa; - + final p = calloc(); + cvRun( + () => ccontrib.cv_ximgproc_EdgeBoxes_create( + alpha, + beta, + eta, + minScore, + maxBoxes, + edgeMinMag, + edgeMergeThr, + clusterMinMag, + maxAspectRatio, + minBoxArea, + gamma, + kappa, + p, + ), + ); return EdgeBoxes.fromPointer(p); } @@ -284,46 +320,53 @@ class EdgeBoxes extends CvStruct { final pvr = calloc(); final pvf = calloc(); cvRun( - () => ccontrib.ximgproc_EdgeBoxes_getBoundingBoxes(ref, edge_map.ref, orientation_map.ref, pvr, pvf), + () => ccontrib.cv_ximgproc_EdgeBoxes_getBoundingBoxes( + ref, + edge_map.ref, + orientation_map.ref, + pvr, + pvf, + ffi.nullptr, + ), ); return (VecRect.fromPointer(pvr), VecF32.fromPointer(pvf)); } - double get alpha => ref.alpha; - set alpha(double value) => ref.alpha = value; + double get alpha => ccontrib.cv_ximgproc_EdgeBoxes_getAlpha(ref); + set alpha(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setAlpha(ref, value); - double get beta => ref.beta; - set beta(double value) => ref.beta = value; + double get beta => ccontrib.cv_ximgproc_EdgeBoxes_getBeta(ref); + set beta(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setBeta(ref, value); - double get eta => ref.eta; - set eta(double value) => ref.eta = value; + double get eta => ccontrib.cv_ximgproc_EdgeBoxes_getEta(ref); + set eta(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setEta(ref, value); - double get minScore => ref.minScore; - set minScore(double value) => ref.minScore = value; + double get minScore => ccontrib.cv_ximgproc_EdgeBoxes_getMinScore(ref); + set minScore(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setMinScore(ref, value); - int get maxBoxes => ref.maxBoxes; - set maxBoxes(int value) => ref.maxBoxes = value; + int get maxBoxes => ccontrib.cv_ximgproc_EdgeBoxes_getMaxBoxes(ref); + set maxBoxes(int value) => ccontrib.cv_ximgproc_EdgeBoxes_setMaxBoxes(ref, value); - double get edgeMinMag => ref.edgeMinMag; - set edgeMinMag(double value) => ref.edgeMinMag = value; + double get edgeMinMag => ccontrib.cv_ximgproc_EdgeBoxes_getEdgeMinMag(ref); + set edgeMinMag(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setEdgeMinMag(ref, value); - double get edgeMergeThr => ref.edgeMergeThr; - set edgeMergeThr(double value) => ref.edgeMergeThr = value; + double get edgeMergeThr => ccontrib.cv_ximgproc_EdgeBoxes_getEdgeMergeThr(ref); + set edgeMergeThr(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setEdgeMergeThr(ref, value); - double get clusterMinMag => ref.clusterMinMag; - set clusterMinMag(double value) => ref.clusterMinMag = value; + double get clusterMinMag => ccontrib.cv_ximgproc_EdgeBoxes_getClusterMinMag(ref); + set clusterMinMag(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setClusterMinMag(ref, value); - double get maxAspectRatio => ref.maxAspectRatio; - set maxAspectRatio(double value) => ref.maxAspectRatio = value; + double get maxAspectRatio => ccontrib.cv_ximgproc_EdgeBoxes_getMaxAspectRatio(ref); + set maxAspectRatio(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setMaxAspectRatio(ref, value); - double get minBoxArea => ref.minBoxArea; - set minBoxArea(double value) => ref.minBoxArea = value; + double get minBoxArea => ccontrib.cv_ximgproc_EdgeBoxes_getMinBoxArea(ref); + set minBoxArea(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setMinBoxArea(ref, value); - double get gamma => ref.gamma; - set gamma(double value) => ref.gamma = value; + double get gamma => ccontrib.cv_ximgproc_EdgeBoxes_getGamma(ref); + set gamma(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setGamma(ref, value); - double get kappa => ref.kappa; - set kappa(double value) => ref.kappa = value; + double get kappa => ccontrib.cv_ximgproc_EdgeBoxes_getKappa(ref); + set kappa(double value) => ccontrib.cv_ximgproc_EdgeBoxes_setKappa(ref, value); static final finalizer = ffi.NativeFinalizer(calloc.nativeFree); @@ -354,43 +397,38 @@ class RFFeatureGetter extends CvStruct { factory RFFeatureGetter.empty() { final p = calloc(); - cvRun(() => ccontrib.ximgproc_RFFeatureGetter_Create(p)); + cvRun(() => ccontrib.cv_ximgproc_RFFeatureGetter_create(p)); return RFFeatureGetter.fromPointer(p); } Mat getFeatures(InputArray src, int gnrmRad, int gsmthRad, int shrink, int outNum, int gradNum) { - final p = calloc(); + final dst = Mat.empty(); cvRun( - () => ccontrib.ximgproc_RFFeatureGetter_getFeatures( + () => ccontrib.cv_ximgproc_RFFeatureGetter_getFeatures( ref, src.ref, - p, + dst.ref, gnrmRad, gsmthRad, shrink, outNum, gradNum, + ffi.nullptr, ), ); - return Mat.fromPointer(p); + return dst; } - void clear() => cvRun(() => ccontrib.ximgproc_RFFeatureGetter_Clear(ref)); + void clear() => cvRun(() => ccontrib.cv_ximgproc_RFFeatureGetter_clear(ref)); - bool isEmpty() { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_RFFeatureGetter_Empty(ref, p)); - final rval = p.value; - calloc.free(p); - return rval; - } + bool isEmpty() => ccontrib.cv_ximgproc_RFFeatureGetter_empty(ref); static final finalizer = - OcvFinalizer(ccontrib.addresses.ximgproc_RFFeatureGetter_Close); + OcvFinalizer(ccontrib.addresses.cv_ximgproc_RFFeatureGetter_close); void dispose() { finalizer.detach(this); - ccontrib.ximgproc_RFFeatureGetter_Close(ptr); + ccontrib.cv_ximgproc_RFFeatureGetter_close(ptr); } @override @@ -408,8 +446,8 @@ class StructuredEdgeDetection extends CvStruct { final cmodel = model.toNativeUtf8().cast(); final p = calloc(); howToGetFeatures == null - ? cvRun(() => ccontrib.ximgproc_StructuredEdgeDetection_Create(cmodel, p)) - : cvRun(() => ccontrib.ximgproc_StructuredEdgeDetection_Create_1(cmodel, howToGetFeatures.ref, p)); + ? cvRun(() => ccontrib.cv_ximgproc_StructuredEdgeDetection_create(cmodel, p)) + : cvRun(() => ccontrib.cv_ximgproc_StructuredEdgeDetection_create_1(cmodel, howToGetFeatures.ref, p)); calloc.free(cmodel); return StructuredEdgeDetection.fromPointer(p); } @@ -418,9 +456,12 @@ class StructuredEdgeDetection extends CvStruct { /// /// https://docs.opencv.org/4.x/d8/d54/classcv_1_1ximgproc_1_1StructuredEdgeDetection.html#a4ef982e80edccef6e92da9db2c20a222 Mat computeOrientation(Mat src) { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_StructuredEdgeDetection_computeOrientation(ref, src.ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun( + () => + ccontrib.cv_ximgproc_StructuredEdgeDetection_computeOrientation(ref, src.ref, dst.ref, ffi.nullptr), + ); + return dst; } /// The function detects edges in src and draw them to dst. @@ -431,9 +472,9 @@ class StructuredEdgeDetection extends CvStruct { /// https://docs.opencv.org/4.x/d8/d54/classcv_1_1ximgproc_1_1StructuredEdgeDetection.html#a31308e06ffea4507b5feb2e1856b1bd8 Mat detectEdges(InputArray src) { cvAssert(src.type.depth == MatType.CV_32F); - final p = calloc(); - cvRun(() => ccontrib.ximgproc_StructuredEdgeDetection_detectEdges(ref, src.ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_StructuredEdgeDetection_detectEdges(ref, src.ref, dst.ref, ffi.nullptr)); + return dst; } /// The function edgenms in edge image and suppress edges where edge is stronger in orthogonal direction. @@ -447,28 +488,30 @@ class StructuredEdgeDetection extends CvStruct { double m = 1, bool isParallel = true, }) { - final p = calloc(); + final dst = Mat.empty(); cvRun( - () => ccontrib.ximgproc_StructuredEdgeDetection_edgesNms( + () => ccontrib.cv_ximgproc_StructuredEdgeDetection_edgesNms( ref, edgeImage.ref, orientationImage.ref, - p, + dst.ref, r, s, m, isParallel, + ffi.nullptr, ), ); - return Mat.fromPointer(p); + return dst; } - static final finalizer = - OcvFinalizer(ccontrib.addresses.ximgproc_StructuredEdgeDetection_Close); + static final finalizer = OcvFinalizer( + ccontrib.addresses.cv_ximgproc_StructuredEdgeDetection_close, + ); void dispose() { finalizer.detach(this); - ccontrib.ximgproc_StructuredEdgeDetection_Close(ptr); + ccontrib.cv_ximgproc_StructuredEdgeDetection_close(ptr); } @override @@ -484,7 +527,7 @@ class GraphSegmentation extends CvStruct { /// https://docs.opencv.org/4.x/d5/df0/group__ximgproc__segmentation.html#gae067b832eee0d26aa30269a7ae423d2f factory GraphSegmentation.create({double sigma = 0.5, double k = 300, int minSize = 100}) { final p = calloc(); - cvRun(() => ccontrib.ximgproc_GraphSegmentation_Create(sigma, k, minSize, p)); + cvRun(() => ccontrib.cv_ximgproc_GraphSegmentation_create(sigma, k, minSize, p)); return GraphSegmentation.fromPointer(p); } @@ -492,47 +535,29 @@ class GraphSegmentation extends CvStruct { /// /// https://docs.opencv.org/4.x/dd/d19/classcv_1_1ximgproc_1_1segmentation_1_1GraphSegmentation.html#a13a3603cb371d740c3c4b01d63553d90 Mat processImage(Mat src) { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_GraphSegmentation_processImage(ref, src.ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_GraphSegmentation_processImage(ref, src.ref, dst.ref, ffi.nullptr)); + return dst; } - double get K { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_GraphSegmentation_getK(ref, p)); - final rval = p.value; - calloc.free(p); - return rval; - } + double get K => ccontrib.cv_ximgproc_GraphSegmentation_getK(ref); - set K(double value) => cvRun(() => ccontrib.ximgproc_GraphSegmentation_setK(ref, value)); + set K(double value) => ccontrib.cv_ximgproc_GraphSegmentation_setK(ref, value); - double get sigma { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_GraphSegmentation_getSigma(ref, p)); - final rval = p.value; - calloc.free(p); - return rval; - } + double get sigma => ccontrib.cv_ximgproc_GraphSegmentation_getSigma(ref); - set sigma(double value) => cvRun(() => ccontrib.ximgproc_GraphSegmentation_setSigma(ref, value)); + set sigma(double value) => ccontrib.cv_ximgproc_GraphSegmentation_setSigma(ref, value); - int get minSize { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_GraphSegmentation_getMinSize(ref, p)); - final rval = p.value; - calloc.free(p); - return rval; - } + int get minSize => ccontrib.cv_ximgproc_GraphSegmentation_getMinSize(ref); - set minSize(int value) => cvRun(() => ccontrib.ximgproc_GraphSegmentation_setMinSize(ref, value)); + set minSize(int value) => ccontrib.cv_ximgproc_GraphSegmentation_setMinSize(ref, value); static final finalizer = - OcvFinalizer(ccontrib.addresses.ximgproc_GraphSegmentation_Close); + OcvFinalizer(ccontrib.addresses.cv_ximgproc_GraphSegmentation_close); void dispose() { finalizer.detach(this); - ccontrib.ximgproc_GraphSegmentation_Close(ptr); + ccontrib.cv_ximgproc_GraphSegmentation_close(ptr); } @override @@ -651,64 +676,66 @@ class EdgeDrawing extends CvStruct { /// Creates a smart pointer to a EdgeDrawing object and initializes it. factory EdgeDrawing.empty() { final p = calloc(); - cvRun(() => ccontrib.ximgproc_EdgeDrawing_Create(p)); + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_create(p)); return EdgeDrawing.fromPointer(p); } /// Segment an image and store output in dst. /// /// https://docs.opencv.org/4.x/dd/d19/classcv_1_1ximgproc_1_1segmentation_1_1GraphSegmentation.html#a13a3603cb371d740c3c4b01d63553d90 - void detectEdges(Mat src) => cvRun(() => ccontrib.ximgproc_EdgeDrawing_detectEdges(ref, src.ref)); + void detectEdges(Mat src) => + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_detectEdges(ref, src.ref, ffi.nullptr)); Mat detectEllipses() { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_EdgeDrawing_detectEllipses(ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_detectEllipses(ref, dst.ref, ffi.nullptr)); + return dst; } Mat detectLines() { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_EdgeDrawing_detectLines(ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_detectLines(ref, dst.ref, ffi.nullptr)); + return dst; } Mat getEdgeImage() { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_EdgeDrawing_getEdgeImage(ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_getEdgeImage(ref, dst.ref, ffi.nullptr)); + return dst; } Mat getGradientImage() { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_EdgeDrawing_getGradientImage(ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_getGradientImage(ref, dst.ref, ffi.nullptr)); + return dst; } VecI32 getSegmentIndicesOfLines() { final p = calloc(); - cvRun(() => ccontrib.ximgproc_EdgeDrawing_getSegmentIndicesOfLines(ref, p)); + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_getSegmentIndicesOfLines(ref, p, ffi.nullptr)); return VecI32.fromPointer(p); } VecVecPoint getSegments() { final p = calloc(); - cvRun(() => ccontrib.ximgproc_EdgeDrawing_getSegments(ref, p)); + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_getSegments(ref, p, ffi.nullptr)); return VecVecPoint.fromPointer(p); } EdgeDrawingParams get params { final p = calloc(); - cvRun(() => ccontrib.ximgproc_EdgeDrawing_getParams(ref, p)); + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_getParams(ref, p, ffi.nullptr)); return EdgeDrawingParams.fromPointer(p); } - set params(EdgeDrawingParams value) => cvRun(() => ccontrib.ximgproc_EdgeDrawing_setParams(ref, value.ref)); + set params(EdgeDrawingParams value) => + cvRun(() => ccontrib.cv_ximgproc_EdgeDrawing_setParams(ref, value.ref, ffi.nullptr)); - static final finalizer = OcvFinalizer(ccontrib.addresses.ximgproc_EdgeDrawing_Close); + static final finalizer = OcvFinalizer(ccontrib.addresses.cv_ximgproc_EdgeDrawing_close); void dispose() { finalizer.detach(this); - ccontrib.ximgproc_EdgeDrawing_Close(ptr); + ccontrib.cv_ximgproc_EdgeDrawing_close(ptr); } @override @@ -720,37 +747,46 @@ class ximgproc_rl { /// ///https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#gaa2b3524997874269670f2f63d54d792d static Mat createRLEImage(VecPoint3i runs, {(int, int) size = (0, 0)}) { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_rl_createRLEImage(runs.ref, p, size.cvd.ref)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_rl_createRLEImage(runs.ref, dst.ref, size.cvd.ref, ffi.nullptr)); + return dst; } ///Creates a run-length encoded image from a vector of runs (column begin, column end, row) /// ///https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#gaa2b3524997874269670f2f63d54d792d - static Future createRLEImageAsync(VecPoint3i runs, {(int, int) size = (0, 0)}) async => cvRunAsync( - (callback) => ccontrib.ximgproc_rl_createRLEImage_Async(runs.ref, size.toSize().ref, callback), - matCompleter, - ); + static Future createRLEImageAsync(VecPoint3i runs, {(int, int) size = (0, 0)}) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_ximgproc_rl_createRLEImage(runs.ref, dst.ref, size.cvd.ref, callback), (c) { + return c.complete(dst); + }); + } /// Dilates an run-length encoded binary image by using a specific structuring element. /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#gac3de990089892266fa30189edcb6da3c static Mat dilate(InputArray rlSrc, InputArray rlKernel, {(int, int) anchor = (0, 0)}) { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_rl_dilate(rlSrc.ref, p, rlKernel.ref, anchor.toPoint().ref)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun( + () => + ccontrib.cv_ximgproc_rl_dilate(rlSrc.ref, dst.ref, rlKernel.ref, anchor.toPoint().ref, ffi.nullptr), + ); + return dst; } /// Dilates an run-length encoded binary image by using a specific structuring element. /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#gac3de990089892266fa30189edcb6da3c - static Future dilateAsync(InputArray rlSrc, InputArray rlKernel, {(int, int) anchor = (0, 0)}) async => - cvRunAsync( + static Future dilateAsync(InputArray rlSrc, InputArray rlKernel, {(int, int) anchor = (0, 0)}) async { + final dst = Mat.empty(); + return cvRunAsync0( (callback) => - ccontrib.ximgproc_rl_dilate_Async(rlSrc.ref, rlKernel.ref, anchor.toPoint().ref, callback), - matCompleter, - ); + ccontrib.cv_ximgproc_rl_dilate(rlSrc.ref, dst.ref, rlKernel.ref, anchor.toPoint().ref, callback), + (c) { + return c.complete(dst); + }); + } /// Erodes an run-length encoded binary image by using a specific structuring element. /// @@ -761,9 +797,18 @@ class ximgproc_rl { bool bBoundaryOn = true, (int, int) anchor = (0, 0), }) { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_rl_erode(rlSrc.ref, p, rlKernel.ref, bBoundaryOn, anchor.toPoint().ref)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun( + () => ccontrib.cv_ximgproc_rl_erode( + rlSrc.ref, + dst.ref, + rlKernel.ref, + bBoundaryOn, + anchor.toPoint().ref, + ffi.nullptr, + ), + ); + return dst; } /// Erodes an run-length encoded binary image by using a specific structuring element. @@ -774,55 +819,48 @@ class ximgproc_rl { InputArray rlKernel, { bool bBoundaryOn = true, (int, int) anchor = (0, 0), - }) async => - cvRunAsync( - (callback) => ccontrib.ximgproc_rl_erode_Async( - rlSrc.ref, - rlKernel.ref, - bBoundaryOn, - anchor.toPoint().ref, - callback, - ), - matCompleter, - ); + }) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_ximgproc_rl_erode( + rlSrc.ref, + dst.ref, + rlKernel.ref, + bBoundaryOn, + anchor.toPoint().ref, + callback, + ), (c) { + return c.complete(dst); + }); + } /// Returns a run length encoded structuring element of the specified size and shape. /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga8a7c10c524fb2572e2eefe0caf0375fc static Mat getStructuringElement(int shape, (int, int) ksize) { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_rl_getStructuringElement(shape, ksize.cvd.ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_rl_getStructuringElement(shape, ksize.cvd.ref, dst.ref, ffi.nullptr)); + return dst; } /// Returns a run length encoded structuring element of the specified size and shape. /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga8a7c10c524fb2572e2eefe0caf0375fc - static Future getStructuringElementAsync(int shape, (int, int) ksize) async => cvRunAsync( - (callback) => ccontrib.ximgproc_rl_getStructuringElement_Async(shape, ksize.toSize().ref, callback), - matCompleter, - ); - - /// Check whether a custom made structuring element can be used with run length morphological operations. - /// (It must consist of a continuous array of single runs per row) - /// - /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga85ed82296e9e9893dcbaa92b87837019 - static bool isRLMorphologyPossible(InputArray rlStructuringElement) { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_rl_isRLMorphologyPossible(rlStructuringElement.ref, p)); - final rval = p.value; - calloc.free(p); - return rval; + static Future getStructuringElementAsync(int shape, (int, int) ksize) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_ximgproc_rl_getStructuringElement(shape, ksize.cvd.ref, dst.ref, callback), + (c) { + return c.complete(dst); + }); } /// Check whether a custom made structuring element can be used with run length morphological operations. /// (It must consist of a continuous array of single runs per row) /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga85ed82296e9e9893dcbaa92b87837019 - static Future isRLMorphologyPossibleAsync(InputArray rlStructuringElement) async => cvRunAsync( - (callback) => ccontrib.ximgproc_rl_isRLMorphologyPossible_Async(rlStructuringElement.ref, callback), - boolCompleter, - ); + static bool isRLMorphologyPossible(InputArray rlStructuringElement) => + ccontrib.cv_ximgproc_rl_isRLMorphologyPossible(rlStructuringElement.ref); /// Applies a morphological operation to a run-length encoded binary image. /// @@ -834,18 +872,19 @@ class ximgproc_rl { bool bBoundaryOnForErosion = true, (int, int) anchor = (0, 0), }) { - final p = calloc(); + final dst = Mat.empty(); cvRun( - () => ccontrib.ximgproc_rl_morphologyEx( + () => ccontrib.cv_ximgproc_rl_morphologyEx( rlSrc.ref, - p, + dst.ref, op, rlKernel.ref, bBoundaryOnForErosion, anchor.toPoint().ref, + ffi.nullptr, ), ); - return Mat.fromPointer(p); + return dst; } /// Applies a morphological operation to a run-length encoded binary image. @@ -857,49 +896,57 @@ class ximgproc_rl { InputArray rlKernel, { bool bBoundaryOnForErosion = true, (int, int) anchor = (0, 0), - }) async => - cvRunAsync( - (callback) => ccontrib.ximgproc_rl_morphologyEx_Async( - rlSrc.ref, - op, - rlKernel.ref, - bBoundaryOnForErosion, - anchor.toPoint().ref, - callback, - ), - matCompleter, - ); + }) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_ximgproc_rl_morphologyEx( + rlSrc.ref, + dst.ref, + op, + rlKernel.ref, + bBoundaryOnForErosion, + anchor.toPoint().ref, + callback, + ), (c) { + return c.complete(dst); + }); + } /// Paint run length encoded binary image into an image. /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga7cabc1c2901b8b58082f8febc366638b static Mat paint(InputOutputArray image, InputArray rlSrc, Scalar value) { - cvRun(() => ccontrib.ximgproc_rl_paint(image.ref, rlSrc.ref, value.ref)); + cvRun(() => ccontrib.cv_ximgproc_rl_paint(image.ref, rlSrc.ref, value.ref, ffi.nullptr)); return image; } /// Paint run length encoded binary image into an image. /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga7cabc1c2901b8b58082f8febc366638b - static Future paintAsync(InputOutputArray image, InputArray rlSrc, Scalar value) async => cvRunAsync0( - (callback) => ccontrib.ximgproc_rl_paint_Async(image.ref, rlSrc.ref, value.ref, callback), - (c) => c.complete(image), - ); + static Future paintAsync(InputOutputArray image, InputArray rlSrc, Scalar value) async { + return cvRunAsync0((callback) => ccontrib.cv_ximgproc_rl_paint(image.ref, rlSrc.ref, value.ref, callback), + (c) { + return c.complete(image); + }); + } /// Applies a fixed-level threshold to each array element. /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga6c9167cbfe788a52a07f6dd3ef8ca4d9 - static Mat threshold(InputArray sr, double thresh, int type) { - final p = calloc(); - cvRun(() => ccontrib.ximgproc_rl_threshold(sr.ref, p, thresh, type)); - return Mat.fromPointer(p); + static Mat threshold(InputArray src, double thresh, int type) { + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_ximgproc_rl_threshold(src.ref, dst.ref, thresh, type, ffi.nullptr)); + return dst; } /// Applies a fixed-level threshold to each array element. /// /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga6c9167cbfe788a52a07f6dd3ef8ca4d9 - static Future thresholdAsync(InputArray src, double thresh, int type) async => cvRunAsync( - (callback) => ccontrib.ximgproc_rl_threshold_Async(src.ref, thresh, type, callback), - matCompleter, - ); + static Future thresholdAsync(InputArray src, double thresh, int type) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => ccontrib.cv_ximgproc_rl_threshold(src.ref, dst.ref, thresh, type, callback), (c) { + return c.complete(dst); + }); + } } diff --git a/packages/dartcv/lib/src/contrib/xobjdetect.dart b/packages/dartcv/lib/src/contrib/xobjdetect.dart index 02f21e55..ce88459d 100644 --- a/packages/dartcv/lib/src/contrib/xobjdetect.dart +++ b/packages/dartcv/lib/src/contrib/xobjdetect.dart @@ -31,15 +31,16 @@ class WBDetector extends CvStruct { /// https://docs.opencv.org/4.x/de/d0e/classcv_1_1xobjdetect_1_1WBDetector.html#a58377ae61694aac08ad842ac830972d9 factory WBDetector.create() { final ptr = calloc(); - cvRun(() => ccontrib.WBDetector_Create(ptr)); + cvRun(() => ccontrib.cv_xobjdetect_WBDetector_create(ptr)); return WBDetector.fromPointer(ptr); } - static final finalizer = OcvFinalizer(ccontrib.addresses.WBDetector_Close); + static final finalizer = + OcvFinalizer(ccontrib.addresses.cv_xobjdetect_WBDetector_close); void dispose() { finalizer.detach(this); - ccontrib.WBDetector_Close(ptr); + ccontrib.cv_xobjdetect_WBDetector_close(ptr); } /// Detect objects on image using WaldBoost detector. @@ -56,7 +57,7 @@ class WBDetector extends CvStruct { (VecRect bboxes, VecF64 confidences) detect(Mat img) { final bboxesPtr = calloc(); final confidencesPtr = calloc(); - cvRun(() => ccontrib.WBDetector_Detect(ptr, img.ref, bboxesPtr, confidencesPtr)); + cvRun(() => ccontrib.cv_xobjdetect_WBDetector_detect(ref, img.ref, bboxesPtr, confidencesPtr)); return (VecRect.fromPointer(bboxesPtr), VecF64.fromPointer(confidencesPtr)); } @@ -66,7 +67,7 @@ class WBDetector extends CvStruct { void train(String posSamples, String negImgs) { final cp = posSamples.toNativeUtf8().cast(); final cn = negImgs.toNativeUtf8().cast(); - cvRun(() => ccontrib.WBDetector_Train(ptr, cp, cn)); + cvRun(() => ccontrib.cv_xobjdetect_WBDetector_train(ref, cp, cn)); calloc.free(cp); calloc.free(cn); } @@ -74,14 +75,14 @@ class WBDetector extends CvStruct { /// Read detector void read(String filename) { final cp = filename.toNativeUtf8().cast(); - cvRun(() => ccontrib.WBDetector_Read(ptr, cp)); + cvRun(() => ccontrib.cv_xobjdetect_WBDetector_read(ref, cp)); calloc.free(cp); } /// Write detector void write(String filename) { final cp = filename.toNativeUtf8().cast(); - cvRun(() => ccontrib.WBDetector_Write(ptr, cp)); + cvRun(() => ccontrib.cv_xobjdetect_WBDetector_write(ref, cp)); calloc.free(cp); } diff --git a/packages/dartcv/lib/src/g/contrib.g.dart b/packages/dartcv/lib/src/g/contrib.g.dart index 1b4686d9..5f1db29f 100644 --- a/packages/dartcv/lib/src/g/contrib.g.dart +++ b/packages/dartcv/lib/src/g/contrib.g.dart @@ -2172,49 +2172,116 @@ class CvNativeContrib { ffi.Pointer Function(WeChatQRCode, Mat, ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer cv_wechat_qrcode_WeChatQRCode_getScaleFactor( + double cv_wechat_qrcode_WeChatQRCode_getScaleFactor( WeChatQRCode self, - ffi.Pointer rval, - imp1.CvCallback_0 callback, ) { return _cv_wechat_qrcode_WeChatQRCode_getScaleFactor( self, - rval, - callback, ); } - late final _cv_wechat_qrcode_WeChatQRCode_getScaleFactorPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - WeChatQRCode, ffi.Pointer, imp1.CvCallback_0)>>( - 'cv_wechat_qrcode_WeChatQRCode_getScaleFactor'); + late final _cv_wechat_qrcode_WeChatQRCode_getScaleFactorPtr = + _lookup>( + 'cv_wechat_qrcode_WeChatQRCode_getScaleFactor'); late final _cv_wechat_qrcode_WeChatQRCode_getScaleFactor = - _cv_wechat_qrcode_WeChatQRCode_getScaleFactorPtr.asFunction< - ffi.Pointer Function( - WeChatQRCode, ffi.Pointer, imp1.CvCallback_0)>(); + _cv_wechat_qrcode_WeChatQRCode_getScaleFactorPtr + .asFunction(); - ffi.Pointer cv_wechat_qrcode_WeChatQRCode_setScaleFactor( + void cv_wechat_qrcode_WeChatQRCode_setScaleFactor( WeChatQRCode self, double scale_factor, - imp1.CvCallback_0 callback, ) { return _cv_wechat_qrcode_WeChatQRCode_setScaleFactor( self, scale_factor, - callback, ); } - late final _cv_wechat_qrcode_WeChatQRCode_setScaleFactorPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - WeChatQRCode, ffi.Float, imp1.CvCallback_0)>>( - 'cv_wechat_qrcode_WeChatQRCode_setScaleFactor'); + late final _cv_wechat_qrcode_WeChatQRCode_setScaleFactorPtr = + _lookup>( + 'cv_wechat_qrcode_WeChatQRCode_setScaleFactor'); late final _cv_wechat_qrcode_WeChatQRCode_setScaleFactor = - _cv_wechat_qrcode_WeChatQRCode_setScaleFactorPtr.asFunction< + _cv_wechat_qrcode_WeChatQRCode_setScaleFactorPtr + .asFunction(); + + void cv_ximgproc_EdgeBoxes_close( + EdgeBoxesPtr self, + ) { + return _cv_ximgproc_EdgeBoxes_close( + self, + ); + } + + late final _cv_ximgproc_EdgeBoxes_closePtr = + _lookup>( + 'cv_ximgproc_EdgeBoxes_close'); + late final _cv_ximgproc_EdgeBoxes_close = + _cv_ximgproc_EdgeBoxes_closePtr.asFunction(); + + ffi.Pointer cv_ximgproc_EdgeBoxes_create( + double alpha, + double beta, + double eta, + double minScore, + int maxBoxes, + double edgeMinMag, + double edgeMergeThr, + double clusterMinMag, + double maxAspectRatio, + double minBoxArea, + double gamma, + double kappa, + ffi.Pointer rval, + ) { + return _cv_ximgproc_EdgeBoxes_create( + alpha, + beta, + eta, + minScore, + maxBoxes, + edgeMinMag, + edgeMergeThr, + clusterMinMag, + maxAspectRatio, + minBoxArea, + gamma, + kappa, + rval, + ); + } + + late final _cv_ximgproc_EdgeBoxes_createPtr = _lookup< + ffi.NativeFunction< ffi.Pointer Function( - WeChatQRCode, double, imp1.CvCallback_0)>(); + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Int, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Pointer)>>('cv_ximgproc_EdgeBoxes_create'); + late final _cv_ximgproc_EdgeBoxes_create = + _cv_ximgproc_EdgeBoxes_createPtr.asFunction< + ffi.Pointer Function( + double, + double, + double, + double, + int, + double, + double, + double, + double, + double, + double, + double, + ffi.Pointer)>(); double cv_ximgproc_EdgeBoxes_getAlpha( EdgeBoxes self, @@ -3243,7 +3310,7 @@ class CvNativeContrib { Mat orientation_image, Mat dst, int r, - int s, + int s_, double m, bool isParallel, imp1.CvCallback_0 callback, @@ -3254,7 +3321,7 @@ class CvNativeContrib { orientation_image, dst, r, - s, + s_, m, isParallel, callback, @@ -3758,6 +3825,9 @@ class _SymbolAddresses { ffi.Pointer> get cv_wechat_qrcode_WeChatQRCode_close => _library._cv_wechat_qrcode_WeChatQRCode_closePtr; + ffi.Pointer> + get cv_ximgproc_EdgeBoxes_close => + _library._cv_ximgproc_EdgeBoxes_closePtr; ffi.Pointer> get cv_ximgproc_EdgeDrawing_close => _library._cv_ximgproc_EdgeDrawing_closePtr; diff --git a/packages/dartcv/lib/src/g/contrib.yaml b/packages/dartcv/lib/src/g/contrib.yaml index 884f7837..c5f79511 100644 --- a/packages/dartcv/lib/src/g/contrib.yaml +++ b/packages/dartcv/lib/src/g/contrib.yaml @@ -234,6 +234,10 @@ files: name: cv_wechat_qrcode_WeChatQRCode_getScaleFactor c:@F@cv_wechat_qrcode_WeChatQRCode_setScaleFactor: name: cv_wechat_qrcode_WeChatQRCode_setScaleFactor + c:@F@cv_ximgproc_EdgeBoxes_close: + name: cv_ximgproc_EdgeBoxes_close + c:@F@cv_ximgproc_EdgeBoxes_create: + name: cv_ximgproc_EdgeBoxes_create c:@F@cv_ximgproc_EdgeBoxes_getAlpha: name: cv_ximgproc_EdgeBoxes_getAlpha c:@F@cv_ximgproc_EdgeBoxes_getBeta: From fc614cfe7ab35fcacfcc3e37c3280e351235c980 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sun, 20 Oct 2024 11:14:58 +0800 Subject: [PATCH 16/30] finish dnn+features2d --- packages/dartcv/lib/src/dnn/asyncarray.dart | 8 +- packages/dartcv/lib/src/dnn/dnn.dart | 249 +++++----- packages/dartcv/lib/src/dnn/dnn_async.dart | 401 +++++++-------- .../dartcv/lib/src/features2d/features2d.dart | 160 +++--- .../lib/src/features2d/features2d_async.dart | 460 ++++++------------ packages/dartcv/lib/src/g/dnn.g.dart | 10 +- 6 files changed, 519 insertions(+), 769 deletions(-) diff --git a/packages/dartcv/lib/src/dnn/asyncarray.dart b/packages/dartcv/lib/src/dnn/asyncarray.dart index 5daad673..a163ea0d 100644 --- a/packages/dartcv/lib/src/dnn/asyncarray.dart +++ b/packages/dartcv/lib/src/dnn/asyncarray.dart @@ -24,21 +24,21 @@ class AsyncArray extends CvStruct { factory AsyncArray.empty() { final p = calloc(); - cvRun(() => cdnn.AsyncArray_New(p)); + cvRun(() => cdnn.cv_dnn_AsyncArray_new(p)); final arr = AsyncArray._(p); return arr; } - static final finalizer = OcvFinalizer(cdnn.addresses.AsyncArray_Close); + static final finalizer = OcvFinalizer(cdnn.addresses.cv_dnn_AsyncArray_close); void dispose() { finalizer.detach(this); - cdnn.AsyncArray_Close(ptr); + cdnn.cv_dnn_AsyncArray_close(ptr); } Mat get() { final dst = Mat.empty(); - cvRun(() => cdnn.AsyncArray_Get(ref, dst.ref)); + cvRun(() => cdnn.cv_dnn_AsyncArray_get(ref, dst.ref)); return dst; } diff --git a/packages/dartcv/lib/src/dnn/dnn.dart b/packages/dartcv/lib/src/dnn/dnn.dart index 7211b4ad..1624c2a2 100644 --- a/packages/dartcv/lib/src/dnn/dnn.dart +++ b/packages/dartcv/lib/src/dnn/dnn.dart @@ -31,17 +31,17 @@ class Layer extends CvStruct { factory Layer.fromPointer(cvg.LayerPtr ptr, [bool attach = true]) => Layer._(ptr, attach); - static final finalizer = OcvFinalizer(cdnn.addresses.Layer_Close); + static final finalizer = OcvFinalizer(cdnn.addresses.cv_dnn_Layer_close); void dispose() { finalizer.detach(this); - cdnn.Layer_Close(ptr); + cdnn.cv_dnn_Layer_close(ptr); } /// GetName returns name for this layer. String get name { final p = calloc>(); - cvRun(() => cdnn.Layer_GetName(ref, p)); + cvRun(() => cdnn.cv_dnn_Layer_getName(ref, p)); final r = p.value.toDartString(); calloc.free(p); return r; @@ -50,7 +50,7 @@ class Layer extends CvStruct { /// GetType returns type for this layer. String get type { final p = calloc>(); - cvRun(() => cdnn.Layer_GetType(ref, p)); + cvRun(() => cdnn.cv_dnn_Layer_getType(ref, p)); final r = p.value.toDartString(); calloc.free(p); return r; @@ -61,12 +61,13 @@ class Layer extends CvStruct { /// For further details, please see: /// https://docs.opencv.org/master/d3/d6c/classcv_1_1dnn_1_1Layer.html#a60ffc8238f3fa26cd3f49daa7ac0884b int inputNameToIndex(String name) { - return using((arena) { - final cName = name.toNativeUtf8(allocator: arena).cast(); - final p = arena(); - cvRun(() => cdnn.Layer_InputNameToIndex(ref, cName, p)); - return p.value; - }); + final cName = name.toNativeUtf8().cast(); + final p = calloc(); + cvRun(() => cdnn.cv_dnn_Layer_inputNameToIndex(ref, cName, p)); + final rval = p.value; + calloc.free(p); + calloc.free(cName); + return rval; } /// OutputNameToIndex returns index of output blob in output array. @@ -74,12 +75,11 @@ class Layer extends CvStruct { /// For further details, please see: /// https://docs.opencv.org/master/d3/d6c/classcv_1_1dnn_1_1Layer.html#a60ffc8238f3fa26cd3f49daa7ac0884b int outputNameToIndex(String name) { - return using((arena) { - final cName = name.toNativeUtf8(allocator: arena).cast(); - final p = arena(); - cvRun(() => cdnn.Layer_OutputNameToIndex(ref, cName, p)); - return p.value; - }); + final cName = name.toNativeUtf8().cast(); + final p = calloc(); + cvRun(() => cdnn.cv_dnn_Layer_outputNameToIndex(ref, cName, p)); + calloc.free(p); + return p.value; } @override @@ -104,7 +104,7 @@ class Net extends CvStruct { factory Net.empty() { final p = calloc(); - cvRun(() => cdnn.Net_Create(p)); + cvRun(() => cdnn.cv_dnn_Net_create(p)); final net = Net._(p); return net; } @@ -113,15 +113,16 @@ class Net extends CvStruct { /// /// https://docs.opencv.org/4.x/d6/d0f/group__dnn.html#ga4823489a689bf4edfae7447eb807b067 factory Net.fromFile(String path, {String config = "", String framework = ""}) { - return using((arena) { - final cPath = path.toNativeUtf8(allocator: arena).cast(); - final cConfig = config.toNativeUtf8(allocator: arena).cast(); - final cFramework = framework.toNativeUtf8(allocator: arena).cast(); - final p = calloc(); - cvRun(() => cdnn.Net_ReadNet(cPath, cConfig, cFramework, p)); - final net = Net._(p); - return net; - }); + final cPath = path.toNativeUtf8().cast(); + final cConfig = config.toNativeUtf8().cast(); + final cFramework = framework.toNativeUtf8().cast(); + final p = calloc(); + cvRun(() => cdnn.cv_dnn_Net_readNet(cPath, cConfig, cFramework, p, ffi.nullptr)); + calloc.free(cPath); + calloc.free(cConfig); + calloc.free(cFramework); + final net = Net._(p); + return net; } /// Read deep learning network represented in one of the supported formats. @@ -129,29 +130,28 @@ class Net extends CvStruct { /// This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. /// https://docs.opencv.org/4.x/d6/d0f/group__dnn.html#ga138439da76f26266fdefec9723f6c5cd factory Net.fromBytes(String framework, Uint8List bufferModel, {Uint8List? bufferConfig}) { - return using((arena) { - bufferConfig ??= Uint8List(0); - final cFramework = framework.toNativeUtf8(allocator: arena).cast(); - final bufM = VecUChar.fromList(bufferModel); - final bufC = VecUChar.fromList(bufferConfig!); - final p = calloc(); - cvRun(() => cdnn.Net_ReadNetBytes(cFramework, bufM.ref, bufC.ref, p)); - final net = Net._(p); - return net; - }); + bufferConfig ??= Uint8List(0); + final cFramework = framework.toNativeUtf8().cast(); + final bufM = VecUChar.fromList(bufferModel); + final bufC = VecUChar.fromList(bufferConfig); + final p = calloc(); + cvRun(() => cdnn.cv_dnn_Net_readNetBytes(cFramework, bufM.ref, bufC.ref, p, ffi.nullptr)); + calloc.free(cFramework); + final net = Net._(p); + return net; } /// Reads a network model stored in Caffe framework's format. /// https://docs.opencv.org/4.x/d6/d0f/group__dnn.html#ga7117752a0216d9f84a9677eefdabf514 factory Net.fromCaffe(String prototxt, String caffeModel) { - return using((arena) { - final cProto = prototxt.toNativeUtf8(allocator: arena).cast(); - final cCaffe = caffeModel.toNativeUtf8(allocator: arena).cast(); - final p = calloc(); - cvRun(() => cdnn.Net_ReadNetFromCaffe(cProto, cCaffe, p)); - final net = Net._(p); - return net; - }); + final cProto = prototxt.toNativeUtf8().cast(); + final cCaffe = caffeModel.toNativeUtf8().cast(); + final p = calloc(); + cvRun(() => cdnn.cv_dnn_Net_readNetFromCaffe(cProto, cCaffe, p, ffi.nullptr)); + calloc.free(cProto); + calloc.free(cCaffe); + final net = Net._(p); + return net; } /// Reads a network model stored in Caffe model in memory. @@ -160,7 +160,7 @@ class Net extends CvStruct { final p = calloc(); final bufP = VecUChar.fromList(bufferProto); final bufM = VecUChar.fromList(bufferModel); - cvRun(() => cdnn.Net_ReadNetFromCaffeBytes(bufP.ref, bufM.ref, p)); + cvRun(() => cdnn.cv_dnn_Net_readNetFromCaffeBytes(bufP.ref, bufM.ref, p, ffi.nullptr)); final net = Net._(p); return net; } @@ -169,13 +169,12 @@ class Net extends CvStruct { /// /// https://docs.opencv.org/4.x/d6/d0f/group__dnn.html#gafd98356f905742ff082e3e4e193633a3 factory Net.fromOnnx(String path) { - return using((arena) { - final p = calloc(); - final cpath = path.toNativeUtf8(allocator: arena).cast(); - cvRun(() => cdnn.Net_ReadNetFromONNX(cpath, p)); - final net = Net._(p); - return net; - }); + final p = calloc(); + final cpath = path.toNativeUtf8().cast(); + cvRun(() => cdnn.cv_dnn_Net_readNetFromONNX(cpath, p, ffi.nullptr)); + calloc.free(cpath); + final net = Net._(p); + return net; } /// Reads a network model from ONNX in-memory buffer. @@ -184,7 +183,7 @@ class Net extends CvStruct { factory Net.fromOnnxBytes(Uint8List bufferModel) { final p = calloc(); final bufM = VecUChar.fromList(bufferModel); - cvRun(() => cdnn.Net_ReadNetFromONNXBytes(bufM.ref, p)); + cvRun(() => cdnn.cv_dnn_Net_readNetFromONNXBytes(bufM.ref, p, ffi.nullptr)); final net = Net._(p); return net; } @@ -193,14 +192,14 @@ class Net extends CvStruct { /// /// https://docs.opencv.org/4.x/d6/d0f/group__dnn.html#ga91c313cd8269ddddaf3cb8299df2d4cb factory Net.fromTensorflow(String path, {String config = ""}) { - return using((arena) { - final p = calloc(); - final cpath = path.toNativeUtf8(allocator: arena).cast(); - final cconf = config.toNativeUtf8(allocator: arena).cast(); - cvRun(() => cdnn.Net_ReadNetFromTensorflow(cpath, cconf, p)); - final net = Net._(p); - return net; - }); + final p = calloc(); + final cpath = path.toNativeUtf8().cast(); + final cconf = config.toNativeUtf8().cast(); + cvRun(() => cdnn.cv_dnn_Net_readNetFromTensorflow(cpath, cconf, p, ffi.nullptr)); + calloc.free(cpath); + calloc.free(cconf); + final net = Net._(p); + return net; } /// Reads a network model stored in TensorFlow framework's format. @@ -211,7 +210,7 @@ class Net extends CvStruct { final bufM = VecUChar.fromList(bufferModel); final bufC = VecUChar.fromList(bufferConfig); final p = calloc(); - cvRun(() => cdnn.Net_ReadNetFromTensorflowBytes(bufM.ref, bufC.ref, p)); + cvRun(() => cdnn.cv_dnn_Net_readNetFromTensorflowBytes(bufM.ref, bufC.ref, p, ffi.nullptr)); final net = Net._(p); return net; } @@ -220,13 +219,12 @@ class Net extends CvStruct { /// /// https://docs.opencv.org/4.x/d6/d0f/group__dnn.html#gae563b9ed2bc79838499a22727ad6c604 factory Net.fromTFLite(String path) { - return using((arena) { - final p = calloc(); - final cpath = path.toNativeUtf8(allocator: arena).cast(); - cvRun(() => cdnn.Net_ReadNetFromTFLite(cpath, p)); - final net = Net._(p); - return net; - }); + final p = calloc(); + final cpath = path.toNativeUtf8().cast(); + cvRun(() => cdnn.cv_dnn_Net_readNetFromTFLite(cpath, p, ffi.nullptr)); + calloc.free(cpath); + final net = Net._(p); + return net; } /// Reads a network model stored in TensorFlow framework's format. @@ -235,7 +233,7 @@ class Net extends CvStruct { factory Net.fromTFLiteBytes(Uint8List bufferModel) { final bufM = VecUChar.fromList(bufferModel); final p = calloc(); - cvRun(() => cdnn.Net_ReadNetFromTFLiteBytes(bufM.ref, p)); + cvRun(() => cdnn.cv_dnn_Net_readNetFromTFLiteBytes(bufM.ref, p, ffi.nullptr)); final net = Net._(p); return net; } @@ -243,30 +241,23 @@ class Net extends CvStruct { /// Reads a network model stored in Torch7 framework's format. /// https://docs.opencv.org/4.x/d6/d0f/group__dnn.html#ga73785dd1e95cd3070ef36f3109b053fe factory Net.fromTorch(String path, {bool isBinary = true, bool evaluate = true}) { - return using((arena) { - final p = calloc(); - final cpath = path.toNativeUtf8(allocator: arena).cast(); - cvRun(() => cdnn.Net_ReadNetFromTorch(cpath, isBinary, evaluate, p)); - final net = Net._(p); - return net; - }); + final p = calloc(); + final cpath = path.toNativeUtf8().cast(); + cvRun(() => cdnn.cv_dnn_Net_readNetFromTorch(cpath, isBinary, evaluate, p, ffi.nullptr)); + calloc.free(cpath); + final net = Net._(p); + return net; } /// Empty returns true if there are no layers in the network. /// /// For further details, please see: /// https://docs.opencv.org/master/db/d30/classcv_1_1dnn_1_1Net.html#a6a5778787d5b8770deab5eda6968e66c - bool get isEmpty { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cdnn.Net_Empty(ref, p)); - return p.value; - }); - } + bool get isEmpty => cdnn.cv_dnn_Net_empty(ref); String dump() { final p = calloc>(); - cvRun(() => cdnn.Net_Dump(ref, p)); + cvRun(() => cdnn.cv_dnn_Net_dump(ref, p)); final ret = p.value.cast().toDartString(); calloc.free(p); return ret; @@ -277,11 +268,10 @@ class Net extends CvStruct { /// For further details, please see: /// https://docs.opencv.org/4.x/db/d30/classcv_1_1dnn_1_1Net.html#a5e74adacffd6aa53d56046581de7fcbd void setInput(InputArray blob, {String name = "", double scalefactor = 1.0, Scalar? mean}) { - // mean ??= Scalar.default_(); not supported yet - using((arena) { - final cname = name.toNativeUtf8(allocator: arena); - cvRun(() => cdnn.Net_SetInput(ref, blob.ref, cname.cast())); - }); + mean ??= Scalar(); + final cname = name.toNativeUtf8(); + cvRun(() => cdnn.cv_dnn_Net_setInput(ref, blob.ref, cname.cast(), scalefactor, mean!.ref, ffi.nullptr)); + calloc.free(cname); } /// Forward runs forward pass to compute output of layer with name outputName. @@ -289,11 +279,11 @@ class Net extends CvStruct { /// For further details, please see: /// https://docs.opencv.org/4.x/db/d30/classcv_1_1dnn_1_1Net.html#a98ed94cb6ef7063d3697259566da310b Mat forward({String outputName = ""}) { - return cvRunArena((arena) { - final m = Mat.empty(); - cvRun(() => cdnn.Net_Forward(ref, outputName.toNativeUtf8(allocator: arena).cast(), m.ptr)); - return m; - }); + final m = Mat.empty(); + final cOutName = outputName.toNativeUtf8().cast(); + cvRun(() => cdnn.cv_dnn_Net_forward(ref, cOutName, m.ref, ffi.nullptr)); + calloc.free(cOutName); + return m; } /// OpenVINO not supported yet, this is not available @@ -316,7 +306,7 @@ class Net extends CvStruct { VecMat forwardLayers(List names) { final vecName = names.i8; final vecMat = calloc(); - cvRun(() => cdnn.Net_ForwardLayers(ref, vecMat, vecName.ref)); + cvRun(() => cdnn.cv_dnn_Net_forwardLayers(ref, vecMat, vecName.ref, ffi.nullptr)); return VecMat.fromPointer(vecMat); } @@ -324,13 +314,14 @@ class Net extends CvStruct { /// /// For further details, please see: /// https://docs.opencv.org/3.4/db/d30/classcv_1_1dnn_1_1Net.html#a7f767df11386d39374db49cd8df8f59e - void setPreferableBackend(int backendId) => cvRun(() => cdnn.Net_SetPreferableBackend(ref, backendId)); + void setPreferableBackend(int backendId) => + cvRun(() => cdnn.cv_dnn_Net_setPreferableBackend(ref, backendId)); /// SetPreferableTarget ask network to make computations on specific target device. /// /// For further details, please see: /// https://docs.opencv.org/3.4/db/d30/classcv_1_1dnn_1_1Net.html#a9dddbefbc7f3defbe3eeb5dc3d3483f4 - void setPreferableTarget(int targetId) => cvRun(() => cdnn.Net_SetPreferableTarget(ref, targetId)); + void setPreferableTarget(int targetId) => cvRun(() => cdnn.cv_dnn_Net_setPreferableTarget(ref, targetId)); /// GetLayer returns pointer to layer with specified id from the network. /// @@ -338,7 +329,7 @@ class Net extends CvStruct { /// https://docs.opencv.org/master/db/d30/classcv_1_1dnn_1_1Net.html#a70aec7f768f38c32b1ee25f3a56526df Layer getLayer(int index) { final p = calloc(); - cvRun(() => cdnn.Net_GetLayer(ref, index, p)); + cvRun(() => cdnn.cv_dnn_Net_getLayer(ref, index, p)); final layer = Layer.fromPointer(p); return layer; } @@ -349,7 +340,7 @@ class Net extends CvStruct { /// https://docs.opencv.org/master/db/d30/classcv_1_1dnn_1_1Net.html#ae8be9806024a0d1d41aba687cce99e6b List getLayerNames() { final cNames = calloc(); - cvRun(() => cdnn.Net_GetLayerNames(ref, cNames)); + cvRun(() => cdnn.cv_dnn_Net_getLayerNames(ref, cNames, ffi.nullptr)); final vec = VecVecChar.fromPointer(cNames); return vec.asStringList(); } @@ -358,12 +349,13 @@ class Net extends CvStruct { /// /// For further details, please see: /// https://docs.opencv.org/master/db/d30/classcv_1_1dnn_1_1Net.html#a06ce946f675f75d1c020c5ddbc78aedc - int getPerfProfile() { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cdnn.Net_GetPerfProfile(ref, p)); - return p.value; - }); + (int, VecF64 layersTimes) getPerfProfile() { + final p = calloc(); + final p1 = calloc(); + cvRun(() => cdnn.cv_dnn_Net_getPerfProfile(ref, p, p1, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return (rval, VecF64.fromPointer(p1)); } /// GetUnconnectedOutLayers returns indexes of layers with unconnected outputs. @@ -372,7 +364,7 @@ class Net extends CvStruct { /// https://docs.opencv.org/master/db/d30/classcv_1_1dnn_1_1Net.html#ae62a73984f62c49fd3e8e689405b056a List getUnconnectedOutLayers() { final ids = calloc(); - cvRun(() => cdnn.Net_GetUnconnectedOutLayers(ref, ids)); + cvRun(() => cdnn.cv_dnn_Net_getUnconnectedOutLayers(ref, ids, ffi.nullptr)); return VecI32.fromPointer(ids).toList(); } @@ -381,15 +373,15 @@ class Net extends CvStruct { (VecF32, VecI32) getInputDetails() { final sc = calloc(); final zp = calloc(); - cvRun(() => cdnn.Net_GetInputDetails(ref, sc, zp)); + cvRun(() => cdnn.cv_dnn_Net_getInputDetails(ref, sc, zp, ffi.nullptr)); return (VecF32.fromPointer(sc), VecI32.fromPointer(zp)); } - static final finalizer = OcvFinalizer(cdnn.addresses.Net_Close); + static final finalizer = OcvFinalizer(cdnn.addresses.cv_dnn_Net_close); void dispose() { finalizer.detach(this); - cdnn.Net_Close(ptr); + cdnn.cv_dnn_Net_close(ptr); } @override @@ -414,7 +406,7 @@ Mat blobFromImage( mean ??= Scalar.zeros; final blob = Mat.empty(); cvRun( - () => cdnn.Net_BlobFromImage( + () => cdnn.cv_dnn_Net_blobFromImage( image.ref, blob.ref, scalefactor, @@ -423,6 +415,7 @@ Mat blobFromImage( swapRB, crop, ddepth, + ffi.nullptr, ), ); return blob; @@ -446,7 +439,7 @@ Mat blobFromImages( blob ??= Mat.empty(); mean ??= Scalar.zeros; cvRun( - () => cdnn.Net_BlobFromImages( + () => cdnn.cv_dnn_Net_blobFromImages( images.ref, blob!.ref, scalefactor, @@ -455,6 +448,7 @@ Mat blobFromImages( swapRB, crop, ddepth, + ffi.nullptr, ), ); return blob; @@ -467,7 +461,7 @@ Mat blobFromImages( /// https://docs.opencv.org/master/d6/d0f/group__dnn.html#ga4051b5fa2ed5f54b76c059a8625df9f5 List imagesFromBlob(Mat blob) { final mats = calloc(); - cvRun(() => cdnn.Net_ImagesFromBlob(blob.ref, mats)); + cvRun(() => cdnn.cv_dnn_Net_imagesFromBlob(blob.ref, mats, ffi.nullptr)); return VecMat.fromPointer(mats).toList(); } @@ -477,15 +471,15 @@ List imagesFromBlob(Mat blob) { /// a bones structure from pose detection, or a color plane from Colorization) Mat getBlobChannel(Mat blob, int imgidx, int chnidx) { final m = Mat.empty(); - cvRun(() => cdnn.Net_GetBlobChannel(blob.ref, imgidx, chnidx, m.ptr)); + cvRun(() => cdnn.cv_dnn_Net_getBlobChannel(blob.ref, imgidx, chnidx, m.ref, ffi.nullptr)); return m; } /// GetBlobSize retrieves the 4 dimensional size information in (N,C,H,W) order -Scalar getBlobSize(Mat blob) { - final s = calloc(); - cvRun(() => cdnn.Net_GetBlobSize(blob.ref, s)); - return Scalar.fromPointer(s); +VecI32 getBlobSize(Mat blob) { + final s = calloc(); + cvRun(() => cdnn.cv_dnn_Net_getBlobSize(blob.ref, s)); + return VecI32.fromPointer(s); } /// NMSBoxes performs non maximum suppression given boxes and corresponding scores. @@ -501,14 +495,17 @@ List NMSBoxes( int topK = 0, }) { final indices = calloc(); - cdnn.NMSBoxesWithParams( - bboxes.ref, - scores.ref, - scoreThreshold, - nmsThreshold, - indices, - eta, - topK, + cvRun( + () => cdnn.cv_dnn_NMSBoxes_1( + bboxes.ref, + scores.ref, + scoreThreshold, + nmsThreshold, + indices, + eta, + topK, + ffi.nullptr, + ), ); return VecI32.fromPointer(indices).toList(); } diff --git a/packages/dartcv/lib/src/dnn/dnn_async.dart b/packages/dartcv/lib/src/dnn/dnn_async.dart index 38fc6f8a..527d1820 100644 --- a/packages/dartcv/lib/src/dnn/dnn_async.dart +++ b/packages/dartcv/lib/src/dnn/dnn_async.dart @@ -22,59 +22,19 @@ import '../g/dnn.g.dart' as cvg; import '../native_lib.dart' show cdnn; import './dnn.dart'; -extension LayerAsync on Layer { - Future inputNameToIndexAsync(String name) async { - final cName = name.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cdnn.Layer_InputNameToIndex_Async(ref, cName, callback), - (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }, - ); - calloc.free(cName); - - return rval; - } - - Future outputNameToIndexAsync(String name) async { - final cName = name.toNativeUtf8().cast(); - final rval = cvRunAsync( - (callback) => cdnn.Layer_OutputNameToIndex_Async(ref, cName, callback), - (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }, - ); - calloc.free(cName); - return rval; - } -} - extension NetAsync on Net { - static Future emptyAsync() async { - final rval = await cvRunAsync(cdnn.Net_Create_Async, (c, p) { - return c.complete(Net.fromPointer(p.cast())); - }); - - return rval; - } - static Future fromFileAsync(String path, {String config = "", String framework = ""}) async { final cPath = path.toNativeUtf8().cast(); final cConfig = config.toNativeUtf8().cast(); final cFramework = framework.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cdnn.Net_ReadNet_Async(cPath, cConfig, cFramework, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + final p = calloc(); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNet(cPath, cConfig, cFramework, p, callback), (c) { + calloc.free(cPath); + calloc.free(cConfig); + calloc.free(cFramework); + final net = Net.fromPointer(p); + return c.complete(net); }); - calloc.free(cPath); - calloc.free(cConfig); - calloc.free(cFramework); - - return rval; } static Future fromBytesAsync( @@ -86,263 +46,187 @@ extension NetAsync on Net { final cFramework = framework.toNativeUtf8().cast(); final bufM = VecUChar.fromList(bufferModel); final bufC = VecUChar.fromList(bufferConfig); - final rval = await cvRunAsync( - (callback) => cdnn.Net_ReadNetBytes_Async(cFramework, bufM.ref, bufC.ref, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + final p = calloc(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_readNetBytes(cFramework, bufM.ref, bufC.ref, p, callback), (c) { + calloc.free(cFramework); + final net = Net.fromPointer(p); + return c.complete(net); }); - - calloc.free(cFramework); - - return rval; } static Future fromCaffeAsync(String prototxt, String caffeModel) async { final cProto = prototxt.toNativeUtf8().cast(); final cCaffe = caffeModel.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cdnn.Net_ReadNetFromCaffe_Async(cProto, cCaffe, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + final p = calloc(); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNetFromCaffe(cProto, cCaffe, p, callback), (c) { + calloc.free(cProto); + calloc.free(cCaffe); + final net = Net.fromPointer(p); + return c.complete(net); }); - calloc.free(cProto); - calloc.free(cCaffe); - - return rval; } static Future fromCaffeBytesAsync(Uint8List bufferProto, Uint8List bufferModel) async { + final p = calloc(); final bufP = VecUChar.fromList(bufferProto); final bufM = VecUChar.fromList(bufferModel); - final rval = await cvRunAsync( - (callback) => cdnn.Net_ReadNetFromCaffeBytes_Async(bufP.ref, bufM.ref, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNetFromCaffeBytes(bufP.ref, bufM.ref, p, callback), + (c) { + final net = Net.fromPointer(p); + return c.complete(net); }); - return rval; } static Future fromOnnxAsync(String path) async { + final p = calloc(); final cpath = path.toNativeUtf8().cast(); - final rval = await cvRunAsync((callback) => cdnn.Net_ReadNetFromONNX_Async(cpath, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNetFromONNX(cpath, p, callback), (c) { + calloc.free(cpath); + final net = Net.fromPointer(p); + return c.complete(net); }); - calloc.free(cpath); - - return rval; } static Future fromOnnxBytesAsync(Uint8List bufferModel) async { + final p = calloc(); final bufM = VecUChar.fromList(bufferModel); - final rval = - await cvRunAsync((callback) => cdnn.Net_ReadNetFromONNXBytes_Async(bufM.ref, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNetFromONNXBytes(bufM.ref, p, callback), (c) { + final net = Net.fromPointer(p); + return c.complete(net); }); - return rval; } static Future fromTensorflowAsync(String path, {String config = ""}) async { + final p = calloc(); final cpath = path.toNativeUtf8().cast(); final cconf = config.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cdnn.Net_ReadNetFromTensorflow_Async(cpath, cconf, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNetFromTensorflow(cpath, cconf, p, callback), (c) { + calloc.free(cpath); + calloc.free(cconf); + final net = Net.fromPointer(p); + return c.complete(net); }); - calloc.free(cpath); - calloc.free(cconf); - - return rval; } static Future fromTensorflowBytesAsync(Uint8List bufferModel, {Uint8List? bufferConfig}) async { bufferConfig ??= Uint8List(0); final bufM = VecUChar.fromList(bufferModel); final bufC = VecUChar.fromList(bufferConfig); - final rval = await cvRunAsync( - (callback) => cdnn.Net_ReadNetFromTensorflowBytes_Async(bufM.ref, bufC.ref, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + final p = calloc(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_readNetFromTensorflowBytes(bufM.ref, bufC.ref, p, callback), (c) { + final net = Net.fromPointer(p); + return c.complete(net); }); - return rval; } static Future fromTFLiteAsync(String path) async { + final p = calloc(); final cpath = path.toNativeUtf8().cast(); - final rval = - await cvRunAsync((callback) => cdnn.Net_ReadNetFromTFLite_Async(cpath, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNetFromTFLite(cpath, p, callback), (c) { + calloc.free(cpath); + final net = Net.fromPointer(p); + return c.complete(net); }); - calloc.free(cpath); - return rval; } static Future fromTFLiteBytesAsync(Uint8List bufferModel) async { final bufM = VecUChar.fromList(bufferModel); - final rval = await cvRunAsync( - (callback) => cdnn.Net_ReadNetFromTFLiteBytes_Async(bufM.ref, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + final p = calloc(); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNetFromTFLiteBytes(bufM.ref, p, callback), (c) { + final net = Net.fromPointer(p); + return c.complete(net); }); - return rval; } static Future fromTorchAsync(String path, {bool isBinary = true, bool evaluate = true}) async { + final p = calloc(); final cpath = path.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cdnn.Net_ReadNetFromTorch_Async(cpath, isBinary, evaluate, callback), (c, p) { - return c.complete(Net.fromPointer(p.cast())); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNetFromTorch(cpath, isBinary, evaluate, p, callback), + (c) { + calloc.free(cpath); + final net = Net.fromPointer(p); + return c.complete(net); }); - calloc.free(cpath); - return rval; - } - - Future isEmptyAsync() async { - final rval = cvRunAsync( - (callback) => cdnn.Net_Empty_Async(ref, callback), - (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }, - ); - return rval; - } - - Future dumpAsync() async { - final rval = cvRunAsync( - (callback) => cdnn.Net_Dump_Async(ref, callback), - (c, p) { - final rval = p.cast>().value.toDartString(); - calloc.free(p); - return c.complete(rval); - }, - ); - return rval; } - Future setInputAsync(InputArray blob, {String name = ""}) async { - final cname = name.toNativeUtf8().cast(); - await cvRunAsync0( - (callback) => cdnn.Net_SetInput_Async(ref, blob.ref, cname, callback), + Future setInputAsync( + InputArray blob, { + String name = "", + double scalefactor = 1.0, + Scalar? mean, + }) async { + mean ??= Scalar(); + final cname = name.toNativeUtf8(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_setInput(ref, blob.ref, cname.cast(), scalefactor, mean!.ref, callback), (c) { - return c.complete(); + calloc.free(cname); }, ); - calloc.free(cname); } Future forwardAsync({String outputName = ""}) async { - final rval = cvRunAsync( - (callback) => cdnn.Net_Forward_Async(ref, outputName.toNativeUtf8().cast(), callback), - (c, result) => c.complete(Mat.fromPointer(result.cast())), - ); - return rval; + final m = Mat.empty(); + final cOutName = outputName.toNativeUtf8().cast(); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_forward(ref, cOutName, m.ref, callback), (c) { + calloc.free(cOutName); + return c.complete(m); + }); } Future forwardLayersAsync(List names) async { final vecName = names.i8; - final rval = cvRunAsync( - (callback) => cdnn.Net_ForwardLayers_Async(ref, vecName.ref, callback), - (c, result) => c.complete(VecMat.fromPointer(result.cast())), - ); - return rval; - } - - Future setPreferableBackendAsync(int backendId) async { - await cvRunAsync0( - (callback) => cdnn.Net_SetPreferableBackend_Async(ref, backendId, callback), - (c) => c.complete(), - ); - } - - Future setPreferableTargetAsync(int targetId) async { - await cvRunAsync0( - (callback) => cdnn.Net_SetPreferableTarget_Async(ref, targetId, callback), - (c) => c.complete(), + final vecMat = calloc(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_forwardLayers(ref, vecMat, vecName.ref, callback), + (c) { + return c.complete(VecMat.fromPointer(vecMat)); + }, ); } - Future getPerfProfileAsync() async { - final rval = cvRunAsync( - (callback) => cdnn.Net_GetPerfProfile_Async(ref, callback), - (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }, - ); - return rval; + Future<(int, VecF64 layersTimes)> getPerfProfileAsync() async { + final p = calloc(); + final p1 = calloc(); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_getPerfProfile(ref, p, p1, callback), (c) { + final rval = p.value; + calloc.free(p); + return c.complete((rval, VecF64.fromPointer(p1))); + }); } Future getUnconnectedOutLayersAsync() async { - final rval = cvRunAsync( - (callback) => cdnn.Net_GetUnconnectedOutLayers_Async(ref, callback), - (c, result) => c.complete(VecI32.fromPointer(result.cast())), - ); - return rval; + final ids = calloc(); + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_getUnconnectedOutLayers(ref, ids, callback), (c) { + return c.complete(VecI32.fromPointer(ids)); + }); } Future> getLayerNamesAsync() async { - final rval = cvRunAsync>( - (callback) => cdnn.Net_GetLayerNames_Async(ref, callback), - (c, result) => c.complete(VecVecChar.fromPointer(result.cast()).asStringList()), + final cNames = calloc(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_getLayerNames(ref, cNames, callback), + (c) { + final vec = VecVecChar.fromPointer(cNames); + return c.complete(vec.asStringList()); + }, ); - return rval; } Future<(VecF32, VecI32)> getInputDetailsAsync() async { - final rval = cvRunAsync2<(VecF32, VecI32)>( - (callback) => cdnn.Net_GetInputDetails_Async(ref, callback), - (c, sc, zp) => c.complete( - (VecF32.fromPointer(sc.cast()), VecI32.fromPointer(zp.cast())), - ), - ); - return rval; - } - - Future getLayerAsync(int index) async { - final rval = cvRunAsync( - (callback) => cdnn.Net_GetLayer_Async(ref, index, callback), - (c, result) => c.complete(Layer.fromPointer(result.cast())), + final sc = calloc(); + final zp = calloc(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_getInputDetails(ref, sc, zp, callback), + (c) { + return c.complete((VecF32.fromPointer(sc), VecI32.fromPointer(zp))); + }, ); - return rval; } } -Future getBlobChannelAsync(Mat blob, int imgidx, int chnidx) async { - final rval = cvRunAsync( - (callback) => cdnn.Net_GetBlobChannel_Async(blob.ref, imgidx, chnidx, callback), - (c, result) => c.complete(Mat.fromPointer(result.cast())), - ); - return rval; -} - -Future getBlobSizeAsync(Mat blob) async { - final rval = cvRunAsync( - (callback) => cdnn.Net_GetBlobSize_Async(blob.ref, callback), - (c, result) => c.complete(Scalar.fromPointer(result.cast())), - ); - return rval; -} - -Future> NMSBoxesAsync( - VecRect bboxes, - VecF32 scores, - double scoreThreshold, - double nmsThreshold, { - double eta = 1.0, - int topK = 0, -}) async { - final rval = cvRunAsync>( - (callback) => cdnn.NMSBoxesWithParams_Async( - bboxes.ref, - scores.ref, - scoreThreshold, - nmsThreshold, - eta, - topK, - callback, - ), - (c, result) => c.complete(VecI32.fromPointer(result.cast()).toList()), - ); - return rval; -} - Future blobFromImageAsync( InputArray image, { double scalefactor = 1.0, @@ -353,9 +237,11 @@ Future blobFromImageAsync( int ddepth = MatType.CV_32F, }) async { mean ??= Scalar.zeros; - final rval = await cvRunAsync( - (callback) => cdnn.Net_BlobFromImage_Async( + final blob = Mat.empty(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_blobFromImage( image.ref, + blob.ref, scalefactor, size.cvd.ref, mean!.ref, @@ -364,13 +250,15 @@ Future blobFromImageAsync( ddepth, callback, ), - (c, mat) => c.complete(Mat.fromPointer(mat.cast())), + (c) { + return c.complete(blob); + }, ); - return rval; } Future blobFromImagesAsync( VecMat images, { + Mat? blob, double scalefactor = 1.0, (int, int) size = (0, 0), Scalar? mean, @@ -378,10 +266,12 @@ Future blobFromImagesAsync( bool crop = false, int ddepth = MatType.CV_32F, }) async { + blob ??= Mat.empty(); mean ??= Scalar.zeros; - final rval = await cvRunAsync( - (callback) => cdnn.Net_BlobFromImages_Async( + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_blobFromImages( images.ref, + blob!.ref, scalefactor, size.cvd.ref, mean!.ref, @@ -390,15 +280,54 @@ Future blobFromImagesAsync( ddepth, callback, ), - (c, blob) => c.complete(Mat.fromPointer(blob.cast())), + (c) { + return c.complete(blob); + }, ); - return rval; } Future> imagesFromBlobAsync(Mat blob) async { - final rval = cvRunAsync>( - (callback) => cdnn.Net_ImagesFromBlob_Async(blob.ref, callback), - (c, result) => c.complete(VecMat.fromPointer(result.cast()).toList()), + final mats = calloc(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_imagesFromBlob(blob.ref, mats, callback), + (c) { + return c.complete(VecMat.fromPointer(mats).toList()); + }, + ); +} + +Future getBlobChannelAsync(Mat blob, int imgidx, int chnidx) async { + final m = Mat.empty(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_getBlobChannel(blob.ref, imgidx, chnidx, m.ref, callback), + (c) { + return c.complete(m); + }, + ); +} + +Future> NMSBoxesAsync( + VecRect bboxes, + VecF32 scores, + double scoreThreshold, + double nmsThreshold, { + double eta = 1.0, + int topK = 0, +}) async { + final indices = calloc(); + return cvRunAsync0( + (callback) => cdnn.cv_dnn_NMSBoxes_1( + bboxes.ref, + scores.ref, + scoreThreshold, + nmsThreshold, + indices, + eta, + topK, + callback, + ), + (c) { + return c.complete(VecI32.fromPointer(indices).toList()); + }, ); - return rval; } diff --git a/packages/dartcv/lib/src/features2d/features2d.dart b/packages/dartcv/lib/src/features2d/features2d.dart index 31d87111..8d0b4004 100644 --- a/packages/dartcv/lib/src/features2d/features2d.dart +++ b/packages/dartcv/lib/src/features2d/features2d.dart @@ -35,7 +35,7 @@ class AKAZE extends CvStruct { /// https://docs.opencv.org/master/d8/d30/classcv_1_1AKAZE.html factory AKAZE.empty() { final p = calloc(); - cvRun(() => cfeatures2d.AKAZE_Create(p)); + cvRun(() => cfeatures2d.cv_AKAZE_create(p)); return AKAZE._(p); } @@ -45,7 +45,7 @@ class AKAZE extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.AKAZE_Detect(ptr.ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_AKAZE_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } @@ -57,16 +57,16 @@ class AKAZE extends CvStruct { final desc = Mat.empty(); final ret = calloc(); cvRun( - () => cfeatures2d.AKAZE_DetectAndCompute(ptr.ref, src.ref, mask.ref, desc.ref, ret), + () => cfeatures2d.cv_AKAZE_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), ); return (VecKeyPoint.fromPointer(ret), desc); } - static final finalizer = OcvFinalizer(cfeatures2d.addresses.AKAZE_Close); + static final finalizer = OcvFinalizer(cfeatures2d.addresses.cv_AKAZE_close); void dispose() { finalizer.detach(this); - cfeatures2d.AKAZE_Close(ptr); + cfeatures2d.cv_AKAZE_close(ptr); } @override @@ -89,7 +89,7 @@ class AgastFeatureDetector extends CvStruct { /// https://docs.opencv.org/master/d7/d19/classcv_1_1AgastFeatureDetector.html factory AgastFeatureDetector.empty() { final p = calloc(); - cvRun(() => cfeatures2d.AgastFeatureDetector_Create(p)); + cvRun(() => cfeatures2d.cv_AgastFeatureDetector_create(p)); return AgastFeatureDetector._(p); } @@ -99,17 +99,17 @@ class AgastFeatureDetector extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.AgastFeatureDetector_Detect(ptr.ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_AgastFeatureDetector_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } static final finalizer = OcvFinalizer( - cfeatures2d.addresses.AgastFeatureDetector_Close, + cfeatures2d.addresses.cv_AgastFeatureDetector_close, ); void dispose() { finalizer.detach(this); - cfeatures2d.AgastFeatureDetector_Close(ptr); + cfeatures2d.cv_AgastFeatureDetector_close(ptr); } @override @@ -131,7 +131,7 @@ class BRISK extends CvStruct { /// https://docs.opencv.org/master/d8/d30/classcv_1_1AKAZE.html factory BRISK.empty() { final p = calloc(); - cvRun(() => cfeatures2d.BRISK_Create(p)); + cvRun(() => cfeatures2d.cv_BRISK_create(p)); return BRISK._(p); } @@ -141,7 +141,7 @@ class BRISK extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.BRISK_Detect(ptr.ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_BRISK_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } @@ -153,16 +153,16 @@ class BRISK extends CvStruct { final desc = Mat.empty(); final ret = calloc(); cvRun( - () => cfeatures2d.BRISK_DetectAndCompute(ptr.ref, src.ref, mask.ref, desc.ref, ret), + () => cfeatures2d.cv_BRISK_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), ); return (VecKeyPoint.fromPointer(ret), desc); } - static final finalizer = OcvFinalizer(cfeatures2d.addresses.BRISK_Close); + static final finalizer = OcvFinalizer(cfeatures2d.addresses.cv_BRISK_close); void dispose() { finalizer.detach(this); - cfeatures2d.BRISK_Close(ptr); + cfeatures2d.cv_BRISK_close(ptr); } @override @@ -199,7 +199,7 @@ class FastFeatureDetector extends CvStruct { /// https://docs.opencv.org/master/df/d74/classcv_1_1FastFeatureDetector.html factory FastFeatureDetector.empty() { final p = calloc(); - cvRun(() => cfeatures2d.FastFeatureDetector_Create(p)); + cvRun(() => cfeatures2d.cv_FastFeatureDetector_create(p)); return FastFeatureDetector._(p); } @@ -214,7 +214,7 @@ class FastFeatureDetector extends CvStruct { }) { final p = calloc(); cvRun( - () => cfeatures2d.FastFeatureDetector_CreateWithParams( + () => cfeatures2d.cv_FastFeatureDetector_create_1( threshold, nonmaxSuppression, type.value, @@ -230,17 +230,17 @@ class FastFeatureDetector extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.FastFeatureDetector_Detect(ptr.ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_FastFeatureDetector_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } static final finalizer = OcvFinalizer( - cfeatures2d.addresses.FastFeatureDetector_Close, + cfeatures2d.addresses.cv_FastFeatureDetector_close, ); void dispose() { finalizer.detach(this); - cfeatures2d.FastFeatureDetector_Close(ptr); + cfeatures2d.cv_FastFeatureDetector_close(ptr); } @override @@ -263,7 +263,7 @@ class GFTTDetector extends CvStruct { /// https://docs.opencv.org/master/df/d21/classcv_1_1GFTTDetector.html factory GFTTDetector.empty() { final p = calloc(); - cvRun(() => cfeatures2d.GFTTDetector_Create(p)); + cvRun(() => cfeatures2d.cv_GFTTDetector_create(p)); return GFTTDetector._(p); } @@ -273,15 +273,15 @@ class GFTTDetector extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.GFTTDetector_Detect(ptr.ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_GFTTDetector_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } - static final finalizer = OcvFinalizer(cfeatures2d.addresses.GFTTDetector_Close); + static final finalizer = OcvFinalizer(cfeatures2d.addresses.cv_GFTTDetector_close); void dispose() { finalizer.detach(this); - cfeatures2d.GFTTDetector_Close(ptr); + cfeatures2d.cv_GFTTDetector_close(ptr); } @override @@ -303,7 +303,7 @@ class KAZE extends CvStruct { /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html factory KAZE.empty() { final p = calloc(); - cvRun(() => cfeatures2d.KAZE_Create(p)); + cvRun(() => cfeatures2d.cv_KAZE_create(p)); return KAZE._(p); } @@ -313,7 +313,7 @@ class KAZE extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.KAZE_Detect(ptr.ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_KAZE_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } @@ -325,16 +325,16 @@ class KAZE extends CvStruct { final desc = Mat.empty(); final ret = calloc(); cvRun( - () => cfeatures2d.KAZE_DetectAndCompute(ptr.ref, src.ref, mask.ref, desc.ref, ret), + () => cfeatures2d.cv_KAZE_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), ); return (VecKeyPoint.fromPointer(ret), desc); } - static final finalizer = OcvFinalizer(cfeatures2d.addresses.KAZE_Close); + static final finalizer = OcvFinalizer(cfeatures2d.addresses.cv_KAZE_close); void dispose() { finalizer.detach(this); - cfeatures2d.KAZE_Close(ptr); + cfeatures2d.cv_KAZE_close(ptr); } @override @@ -356,7 +356,7 @@ class MSER extends CvStruct { /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html factory MSER.empty() { final p = calloc(); - cvRun(() => cfeatures2d.MSER_Create(p)); + cvRun(() => cfeatures2d.cv_MSER_create(p)); return MSER._(p); } @@ -366,15 +366,15 @@ class MSER extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.MSER_Detect(ptr.ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_MSER_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } - static final finalizer = OcvFinalizer(cfeatures2d.addresses.MSER_Close); + static final finalizer = OcvFinalizer(cfeatures2d.addresses.cv_MSER_close); void dispose() { finalizer.detach(this); - cfeatures2d.MSER_Close(ptr); + cfeatures2d.cv_MSER_close(ptr); } @override @@ -404,11 +404,11 @@ class ORB extends CvStruct { /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html factory ORB.empty() { final p = calloc(); - cvRun(() => cfeatures2d.ORB_Create(p)); + cvRun(() => cfeatures2d.cv_ORB_create(p)); return ORB._(p); } - /// NewORBWithParams returns a new ORB algorithm with parameters + /// returns a new ORB algorithm with parameters /// /// For further details, please see: /// https://docs.opencv.org/master/db/d95/classcv_1_1ORB.html#aeff0cbe668659b7ca14bb85ff1c4073b @@ -425,7 +425,7 @@ class ORB extends CvStruct { }) { final p = calloc(); cvRun( - () => cfeatures2d.ORB_CreateWithParams( + () => cfeatures2d.cv_ORB_create_1( nFeatures, scaleFactor, nLevels, @@ -447,7 +447,7 @@ class ORB extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.ORB_Detect(ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_ORB_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } @@ -458,15 +458,15 @@ class ORB extends CvStruct { (VecKeyPoint, Mat) detectAndCompute(Mat src, Mat mask) { final pdesc = calloc(); final ret = calloc(); - cvRun(() => cfeatures2d.ORB_DetectAndCompute(ref, src.ref, mask.ref, pdesc, ret)); + cvRun(() => cfeatures2d.cv_ORB_detectAndCompute(ref, src.ref, mask.ref, pdesc, ret, ffi.nullptr)); return (VecKeyPoint.fromPointer(ret), Mat.fromPointer(pdesc)); } - static final finalizer = OcvFinalizer(cfeatures2d.addresses.ORB_Close); + static final finalizer = OcvFinalizer(cfeatures2d.addresses.cv_ORB_close); void dispose() { finalizer.detach(this); - cfeatures2d.ORB_Close(ptr); + cfeatures2d.cv_ORB_close(ptr); } @override @@ -485,7 +485,7 @@ class SimpleBlobDetectorParams extends CvStruct { factory SimpleBlobDetectorParams.empty() { final p = calloc(); - cvRun(() => cfeatures2d.SimpleBlobDetectorParams_Create(p)); + cvRun(() => cfeatures2d.cv_SimpleBlobDetectorParams_create(p)); return SimpleBlobDetectorParams._(p); } @@ -668,13 +668,13 @@ class SimpleBlobDetector extends CvStruct { /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html factory SimpleBlobDetector.empty() { final p = calloc(); - cvRun(() => cfeatures2d.SimpleBlobDetector_Create(p)); + cvRun(() => cfeatures2d.cv_SimpleBlobDetector_create(p)); return SimpleBlobDetector._(p); } factory SimpleBlobDetector.create(SimpleBlobDetectorParams params) { final p = calloc(); - cvRun(() => cfeatures2d.SimpleBlobDetector_Create_WithParams(params.ref, p)); + cvRun(() => cfeatures2d.cv_SimpleBlobDetector_create_1(params.ref, p)); return SimpleBlobDetector._(p); } @@ -684,17 +684,17 @@ class SimpleBlobDetector extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.SimpleBlobDetector_Detect(ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_SimpleBlobDetector_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } static final finalizer = OcvFinalizer( - cfeatures2d.addresses.SimpleBlobDetector_Close, + cfeatures2d.addresses.cv_SimpleBlobDetector_close, ); void dispose() { finalizer.detach(this); - cfeatures2d.SimpleBlobDetector_Close(ptr); + cfeatures2d.cv_SimpleBlobDetector_close(ptr); } @override @@ -716,13 +716,13 @@ class BFMatcher extends CvStruct { /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html factory BFMatcher.empty() { final p = calloc(); - cvRun(() => cfeatures2d.BFMatcher_Create(p)); + cvRun(() => cfeatures2d.cv_BFMatcher_create(p)); return BFMatcher._(p); } factory BFMatcher.create({int type = NORM_L2, bool crossCheck = false}) { final p = calloc(); - cvRun(() => cfeatures2d.BFMatcher_CreateWithParams(type, crossCheck, p)); + cvRun(() => cfeatures2d.cv_BFMatcher_create_1(type, crossCheck, p)); return BFMatcher._(p); } @@ -732,7 +732,7 @@ class BFMatcher extends CvStruct { /// https://docs.opencv.org/4.x/db/d39/classcv_1_1DescriptorMatcher.html#a0f046f47b68ec7074391e1e85c750cba VecDMatch match(Mat query, Mat train) { final ret = calloc(); - cvRun(() => cfeatures2d.BFMatcher_Match(ptr.ref, query.ref, train.ref, ret)); + cvRun(() => cfeatures2d.cv_BFMatcher_match(ref, query.ref, train.ref, ret, ffi.nullptr)); return VecDMatch.fromPointer(ret); } @@ -742,15 +742,15 @@ class BFMatcher extends CvStruct { /// https://docs.opencv.org/master/db/d39/classcv_1_1DescriptorMatcher.html#aa880f9353cdf185ccf3013e08210483a VecVecDMatch knnMatch(Mat query, Mat train, int k) { final ret = calloc(); - cvRun(() => cfeatures2d.BFMatcher_KnnMatch(ptr.ref, query.ref, train.ref, k, ret)); + cvRun(() => cfeatures2d.cv_BFMatcher_knnMatch(ref, query.ref, train.ref, k, ret, ffi.nullptr)); return VecVecDMatch.fromPointer(ret); } - static final finalizer = OcvFinalizer(cfeatures2d.addresses.BFMatcher_Close); + static final finalizer = OcvFinalizer(cfeatures2d.addresses.cv_BFMatcher_close); void dispose() { finalizer.detach(this); - cfeatures2d.BFMatcher_Close(ptr); + cfeatures2d.cv_BFMatcher_close(ptr); } @override @@ -773,7 +773,7 @@ class FlannBasedMatcher extends CvStruct { /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html factory FlannBasedMatcher.empty() { final p = calloc(); - cvRun(() => cfeatures2d.FlannBasedMatcher_Create(p)); + cvRun(() => cfeatures2d.cv_FlannBasedMatcher_create(p)); return FlannBasedMatcher._(p); } @@ -784,18 +784,18 @@ class FlannBasedMatcher extends CvStruct { VecVecDMatch knnMatch(Mat query, Mat train, int k) { final ret = calloc(); cvRun( - () => cfeatures2d.FlannBasedMatcher_KnnMatch(ptr.ref, query.ref, train.ref, k, ret), + () => cfeatures2d.cv_FlannBasedMatcher_knnMatch(ref, query.ref, train.ref, k, ret, ffi.nullptr), ); return VecVecDMatch.fromPointer(ret); } static final finalizer = OcvFinalizer( - cfeatures2d.addresses.FlannBasedMatcher_Close, + cfeatures2d.addresses.cv_FlannBasedMatcher_close, ); void dispose() { finalizer.detach(this); - cfeatures2d.FlannBasedMatcher_Close(ptr); + cfeatures2d.cv_FlannBasedMatcher_close(ptr); } @override @@ -819,24 +819,6 @@ enum DrawMatchesFlag { final int value; } -void drawKeyPoints( - Mat src, - VecKeyPoint keypoints, - Mat dst, - Scalar color, - DrawMatchesFlag flag, -) { - cvRun( - () => cfeatures2d.DrawKeyPoints( - src.ref, - keypoints.ref, - dst.ref, - color.ref, - flag.value, - ), - ); -} - /// SIFT is a wrapper around the cv::SIFT. class SIFT extends CvStruct { SIFT._(cvg.SIFTPtr ptr, [bool attach = true]) : super.fromPointer(ptr) { @@ -852,7 +834,7 @@ class SIFT extends CvStruct { /// https://docs.opencv.org/master/d5/d3c/classcv_1_1xfeatures2d_1_1SIFT.html factory SIFT.empty() { final p = calloc(); - cvRun(() => cfeatures2d.SIFT_Create(p)); + cvRun(() => cfeatures2d.cv_SIFT_create(p)); return SIFT._(p); } @@ -862,7 +844,7 @@ class SIFT extends CvStruct { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 VecKeyPoint detect(Mat src) { final ret = calloc(); - cvRun(() => cfeatures2d.SIFT_Detect(ptr.ref, src.ref, ret)); + cvRun(() => cfeatures2d.cv_SIFT_detect(ref, src.ref, ret, ffi.nullptr)); return VecKeyPoint.fromPointer(ret); } @@ -874,22 +856,41 @@ class SIFT extends CvStruct { final desc = Mat.empty(); final ret = calloc(); cvRun( - () => cfeatures2d.SIFT_DetectAndCompute(ptr.ref, src.ref, mask.ref, desc.ref, ret), + () => cfeatures2d.cv_SIFT_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), ); return (VecKeyPoint.fromPointer(ret), desc); } - static final finalizer = OcvFinalizer(cfeatures2d.addresses.SIFT_Close); + static final finalizer = OcvFinalizer(cfeatures2d.addresses.cv_SIFT_close); void dispose() { finalizer.detach(this); - cfeatures2d.SIFT_Close(ptr); + cfeatures2d.cv_SIFT_close(ptr); } @override cvg.SIFT get ref => ptr.ref; } +void drawKeyPoints( + Mat src, + VecKeyPoint keypoints, + Mat dst, + Scalar color, + DrawMatchesFlag flag, +) { + cvRun( + () => cfeatures2d.cv_drawKeyPoints( + src.ref, + keypoints.ref, + dst.ref, + color.ref, + flag.value, + ffi.nullptr, + ), + ); +} + /// DrawMatches draws matches on combined train and querry images. /// /// For further details, please see: @@ -910,7 +911,7 @@ void drawMatches( singlePointColor ??= Scalar.all(-1); matchesMask ??= VecChar.fromList([]); cvRun( - () => cfeatures2d.DrawMatches( + () => cfeatures2d.cv_drawMatches( img1.ref, keypoints1.ref, img2.ref, @@ -921,6 +922,7 @@ void drawMatches( singlePointColor!.ref, matchesMask!.ref, flags.value, + ffi.nullptr, ), ); } diff --git a/packages/dartcv/lib/src/features2d/features2d_async.dart b/packages/dartcv/lib/src/features2d/features2d_async.dart index dee3d493..5bc4ba78 100644 --- a/packages/dartcv/lib/src/features2d/features2d_async.dart +++ b/packages/dartcv/lib/src/features2d/features2d_async.dart @@ -6,394 +6,237 @@ library cv.features2d; +import 'dart:ffi' as ffi; + +import 'package:ffi/ffi.dart'; + import '../core/base.dart'; import '../core/dmatch.dart'; import '../core/keypoint.dart'; import '../core/mat.dart'; import '../core/scalar.dart'; import '../core/vec.dart'; -import '../g/constants.g.dart'; import '../g/features2d.g.dart' as cvg; import '../native_lib.dart' show cfeatures2d; import './features2d.dart'; extension AKAZEAsync on AKAZE { - /// returns a new AKAZE algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d8/d30/classcv_1_1AKAZE.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.AKAZE_Create_Async, - (c, p) => c.complete(AKAZE.fromPointer(p.cast())), - ); - /// Detect keypoints in an image using AKAZE. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.AKAZE_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_AKAZE_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } /// DetectAndCompute keypoints and compute in an image using AKAZE. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#a8be0d1c20b08eb867184b8d74c15a677 - Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async => - cvRunAsync2<(VecKeyPoint, Mat)>( - (callback) => cfeatures2d.AKAZE_DetectAndCompute_Async( - ref, - src.ref, - mask.ref, - callback, - ), - (c, keypoints, desc) => c.complete( - ( - VecKeyPoint.fromPointer(keypoints.cast()), - Mat.fromPointer(desc.cast()), - ), - ), - ); + Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async { + final desc = Mat.empty(); + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_AKAZE_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), + (c) { + return c.complete((VecKeyPoint.fromPointer(ret), desc)); + }, + ); + } } extension AgastFeatureDetectorAsync on AgastFeatureDetector { - /// returns a new AgastFeatureDetector algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/d19/classcv_1_1AgastFeatureDetector.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.AgastFeatureDetector_Create_Async, - (c, p) => c.complete(AgastFeatureDetector.fromPointer(p.cast())), - ); - /// Detect keypoints in an image using AgastFeatureDetector. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.AgastFeatureDetector_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_AgastFeatureDetector_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } } extension BRISKAsync on BRISK { - /// returns a new BRISK algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d8/d30/classcv_1_1AKAZE.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.BRISK_Create_Async, - (c, p) => c.complete(BRISK.fromPointer(p.cast())), - ); - /// Detect keypoints in an image using BRISK. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.BRISK_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_BRISK_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } /// DetectAndCompute keypoints and compute in an image using BRISK. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#a8be0d1c20b08eb867184b8d74c15a677 - Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async => - cvRunAsync2<(VecKeyPoint, Mat)>( - (callback) => cfeatures2d.BRISK_DetectAndCompute_Async( - ref, - src.ref, - mask.ref, - callback, - ), - (c, keypoints, desc) => c.complete( - ( - VecKeyPoint.fromPointer(keypoints.cast()), - Mat.fromPointer(desc.cast()), - ), - ), - ); + Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async { + final desc = Mat.empty(); + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_BRISK_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), + (c) { + return c.complete((VecKeyPoint.fromPointer(ret), desc)); + }, + ); + } } extension FastFeatureDetectorAsync on FastFeatureDetector { - /// returns a new FastFeatureDetector algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/df/d74/classcv_1_1FastFeatureDetector.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.FastFeatureDetector_Create_Async, - (c, p) => c.complete(FastFeatureDetector.fromPointer(p.cast())), - ); - - /// returns a new FastFeatureDetector algorithm with parameters - /// - /// For further details, please see: - /// https://docs.opencv.org/master/df/d74/classcv_1_1FastFeatureDetector.html#ab986f2ff8f8778aab1707e2642bc7f8e - static Future createAsync({ - int threshold = 10, - bool nonmaxSuppression = true, - FastFeatureDetectorType type = FastFeatureDetectorType.TYPE_9_16, - }) async => - cvRunAsync( - (callback) => cfeatures2d.FastFeatureDetector_CreateWithParams_Async( - threshold, - nonmaxSuppression, - type.value, - callback, - ), - (c, p) => c.complete(FastFeatureDetector.fromPointer(p.cast())), - ); - /// Detect keypoints in an image using FastFeatureDetector. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.FastFeatureDetector_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_FastFeatureDetector_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } } extension GFTTDetectorAsync on GFTTDetector { - /// returns a new GFTTDetector algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/df/d21/classcv_1_1GFTTDetector.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.GFTTDetector_Create_Async, - (c, p) => c.complete(GFTTDetector.fromPointer(p.cast())), - ); - /// Detect keypoints in an image using GFTTDetector. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.GFTTDetector_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_GFTTDetector_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } } extension KAZEAsync on KAZE { - /// returns a new KAZE algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.KAZE_Create_Async, - (c, p) => c.complete(KAZE.fromPointer(p.cast())), - ); - /// Detect keypoints in an image using KAZE. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.KAZE_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_KAZE_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } /// DetectAndCompute keypoints and compute in an image using KAZE. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#a8be0d1c20b08eb867184b8d74c15a677 - Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async => - cvRunAsync2<(VecKeyPoint, Mat)>( - (callback) => cfeatures2d.KAZE_DetectAndCompute_Async( - ref, - src.ref, - mask.ref, - callback, - ), - (c, keypoints, desc) => c.complete( - ( - VecKeyPoint.fromPointer(keypoints.cast()), - Mat.fromPointer(desc.cast()), - ), - ), - ); + Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async { + final desc = Mat.empty(); + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_KAZE_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), + (c) { + return c.complete((VecKeyPoint.fromPointer(ret), desc)); + }, + ); + } } extension MSERAsync on MSER { - /// returns a new MSER algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.MSER_Create_Async, - (c, p) => c.complete(MSER.fromPointer(p.cast())), - ); - /// Detect keypoints in an image using MSER. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.MSER_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_MSER_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } } extension ORBAsync on ORB { - /// returns a new ORB algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html - static Future emptyAsync() async => - cvRunAsync(cfeatures2d.ORB_Create_Async, (c, p) => c.complete(ORB.fromPointer(p.cast()))); - - /// NewORBWithParams returns a new ORB algorithm with parameters - /// - /// For further details, please see: - /// https://docs.opencv.org/master/db/d95/classcv_1_1ORB.html#aeff0cbe668659b7ca14bb85ff1c4073b - static Future createAsync({ - int nFeatures = 500, - double scaleFactor = 1.2, - int nLevels = 8, - int edgeThreshold = 31, - int firstLevel = 0, - int WTA_K = 2, - ORBScoreType scoreType = ORBScoreType.HARRIS_SCORE, - int patchSize = 31, - int fastThreshold = 20, - }) async => - cvRunAsync( - (callback) => cfeatures2d.ORB_CreateWithParams_Async( - nFeatures, - scaleFactor, - nLevels, - edgeThreshold, - firstLevel, - WTA_K, - scoreType.value, - patchSize, - fastThreshold, - callback, - ), - (c, p) => c.complete(ORB.fromPointer(p.cast())), - ); - /// Detect keypoints in an image using ORB. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.ORB_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_ORB_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } /// DetectAndCompute keypoints and compute in an image using ORB. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#a8be0d1c20b08eb867184b8d74c15a677 - Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async => - cvRunAsync2<(VecKeyPoint, Mat)>( - (callback) => cfeatures2d.ORB_DetectAndCompute_Async( - ref, - src.ref, - mask.ref, - callback, - ), - (c, keypoints, desc) => c.complete( - ( - VecKeyPoint.fromPointer(keypoints.cast()), - Mat.fromPointer(desc.cast()), - ), - ), - ); + Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async { + final pdesc = calloc(); + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_ORB_detectAndCompute(ref, src.ref, mask.ref, pdesc, ret, ffi.nullptr), + (c) { + return c.complete((VecKeyPoint.fromPointer(ret), Mat.fromPointer(pdesc))); + }, + ); + } } extension SimpleBlobDetectorAsync on SimpleBlobDetector { - /// returns a new SimpleBlobDetector algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.SimpleBlobDetector_Create_Async, - (c, p) => c.complete(SimpleBlobDetector.fromPointer(p.cast())), - ); - - static Future createAsync( - SimpleBlobDetectorParams params, - ) async => - cvRunAsync( - (callback) => cfeatures2d.SimpleBlobDetector_Create_WithParams_Async( - params.ref, - callback, - ), - (c, p) => c.complete( - SimpleBlobDetector.fromPointer(p.cast()), - ), - ); - /// Detect keypoints in an image using SimpleBlobDetector. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.SimpleBlobDetector_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_SimpleBlobDetector_detect(ref, src.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } } extension BFMatcherAsync on BFMatcher { - /// returns a new BFMatcher algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.BFMatcher_Create_Async, - (c, p) => c.complete(BFMatcher.fromPointer(p.cast())), - ); - - static Future createAsync({ - int type = NORM_L2, - bool crossCheck = false, - }) async => - cvRunAsync( - (callback) => cfeatures2d.BFMatcher_CreateWithParams_Async(type, crossCheck, callback), - (c, p) => c.complete(BFMatcher.fromPointer(p.cast())), - ); - /// Match Finds the best match for each descriptor from a query set. /// /// For further details, please see: /// https://docs.opencv.org/4.x/db/d39/classcv_1_1DescriptorMatcher.html#a0f046f47b68ec7074391e1e85c750cba Future matchAsync(Mat query, Mat train) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.BFMatcher_Match_Async(ref, query.ref, train.ref, callback), - (c, ret) => c.complete(VecDMatch.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_BFMatcher_match(ref, query.ref, train.ref, ret, ffi.nullptr), + (c) { + return c.complete(VecDMatch.fromPointer(ret)); + }, ); - return rval; } /// KnnMatch Finds the k best matches for each descriptor from a query set. @@ -401,88 +244,61 @@ extension BFMatcherAsync on BFMatcher { /// For further details, please see: /// https://docs.opencv.org/master/db/d39/classcv_1_1DescriptorMatcher.html#aa880f9353cdf185ccf3013e08210483a Future knnMatchAsync(Mat query, Mat train, int k) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.BFMatcher_KnnMatch_Async( - ref, - query.ref, - train.ref, - k, - callback, - ), - (c, ret) => c.complete(VecVecDMatch.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_BFMatcher_knnMatch(ref, query.ref, train.ref, k, ret, ffi.nullptr), + (c) { + return c.complete(VecVecDMatch.fromPointer(ret)); + }, ); - return rval; } } extension FlannBasedMatcherAsync on FlannBasedMatcher { - /// returns a new FlannBasedMatcher algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d3/d61/classcv_1_1KAZE.html - static Future emptyAsync() async => cvRunAsync( - cfeatures2d.FlannBasedMatcher_Create_Async, - (c, p) => c.complete(FlannBasedMatcher.fromPointer(p.cast())), - ); - /// KnnMatch Finds the k best matches for each descriptor from a query set. /// /// For further details, please see: /// https://docs.opencv.org/master/db/d39/classcv_1_1DescriptorMatcher.html#aa880f9353cdf185ccf3013e08210483a Future knnMatchAsync(Mat query, Mat train, int k) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.FlannBasedMatcher_KnnMatch_Async( - ref, - query.ref, - train.ref, - k, - callback, - ), - (c, ret) => c.complete(VecVecDMatch.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_FlannBasedMatcher_knnMatch(ref, query.ref, train.ref, k, ret, ffi.nullptr), + (c) { + return c.complete(VecVecDMatch.fromPointer(ret)); + }, ); - return rval; } } extension SIFTAsync on SIFT { - /// returns a new SIFT algorithm - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d5/d3c/classcv_1_1xfeatures2d_1_1SIFT.html - static Future emptyAsync() async => - cvRunAsync(cfeatures2d.SIFT_Create_Async, (c, p) => c.complete(SIFT.fromPointer(p.cast()))); - /// Detect keypoints in an image using SIFT. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { - final rval = cvRunAsync( - (callback) => cfeatures2d.SIFT_Detect_Async(ref, src.ref, callback), - (c, ret) => c.complete(VecKeyPoint.fromPointer(ret.cast())), + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_SIFT_detect(ref, src.ref, ret, callback), + (c) { + return c.complete(VecKeyPoint.fromPointer(ret)); + }, ); - return rval; } /// DetectAndCompute keypoints and compute in an image using SIFT. /// /// For further details, please see: /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#a8be0d1c20b08eb867184b8d74c15a677 - Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async => - cvRunAsync2<(VecKeyPoint, Mat)>( - (callback) => cfeatures2d.SIFT_DetectAndCompute_Async( - ref, - src.ref, - mask.ref, - callback, - ), - (c, keypoints, desc) => c.complete( - ( - VecKeyPoint.fromPointer(keypoints.cast()), - Mat.fromPointer(desc.cast()), - ), - ), - ); + Future<(VecKeyPoint, Mat)> detectAndComputeAsync(Mat src, Mat mask) async { + final desc = Mat.empty(); + final ret = calloc(); + return cvRunAsync0( + (callback) => cfeatures2d.cv_SIFT_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, callback), + (c) { + return c.complete((VecKeyPoint.fromPointer(ret), desc)); + }, + ); + } } Future drawKeyPointsAsync( @@ -493,7 +309,7 @@ Future drawKeyPointsAsync( DrawMatchesFlag flag, ) async { await cvRunAsync0( - (callback) => cfeatures2d.DrawKeyPoints_Async( + (callback) => cfeatures2d.cv_drawKeyPoints( src.ref, keypoints.ref, dst.ref, @@ -523,9 +339,9 @@ Future drawMatchesAsync( }) async { matchColor ??= Scalar.all(-1); singlePointColor ??= Scalar.all(-1); - matchesMask ??= VecChar(); - await cvRunAsync0( - (callback) => cfeatures2d.DrawMatches_Async( + matchesMask ??= VecChar.fromList([]); + return cvRunAsync0( + (callback) => cfeatures2d.cv_drawMatches( img1.ref, keypoints1.ref, img2.ref, @@ -538,6 +354,8 @@ Future drawMatchesAsync( flags.value, callback, ), - (c) => c.complete(), + (c) { + c.complete(); + }, ); } diff --git a/packages/dartcv/lib/src/g/dnn.g.dart b/packages/dartcv/lib/src/g/dnn.g.dart index b7cdaf88..cce807d0 100644 --- a/packages/dartcv/lib/src/g/dnn.g.dart +++ b/packages/dartcv/lib/src/g/dnn.g.dart @@ -911,12 +911,16 @@ class CvNativeDnn { Net net, Mat blob, ffi.Pointer name, + double scalefactor, + Scalar mean, imp1.CvCallback_0 callback, ) { return _cv_dnn_Net_setInput( net, blob, name, + scalefactor, + mean, callback, ); } @@ -924,10 +928,10 @@ class CvNativeDnn { late final _cv_dnn_Net_setInputPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Net, Mat, ffi.Pointer, - imp1.CvCallback_0)>>('cv_dnn_Net_setInput'); + ffi.Double, Scalar, imp1.CvCallback_0)>>('cv_dnn_Net_setInput'); late final _cv_dnn_Net_setInput = _cv_dnn_Net_setInputPtr.asFunction< - ffi.Pointer Function( - Net, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer Function(Net, Mat, ffi.Pointer, double, + Scalar, imp1.CvCallback_0)>(); ffi.Pointer cv_dnn_Net_setPreferableBackend( Net net, From b7085a744fc5d202d876b53d0ddc6b67b486af23 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sun, 20 Oct 2024 17:15:47 +0800 Subject: [PATCH 17/30] fnish part of imgproc, imgcodecs --- packages/dartcv/lib/contrib.dart | 1 - packages/dartcv/lib/imgcodecs.dart | 1 - packages/dartcv/lib/imgproc.dart | 1 - packages/dartcv/lib/src/g/imgproc.g.dart | 66 +-- packages/dartcv/lib/src/highgui/highgui.dart | 435 ++++++++---------- .../dartcv/lib/src/imgcodecs/imgcodecs.dart | 124 +++-- .../lib/src/imgcodecs/imgcodecs_async.dart | 94 ---- packages/dartcv/lib/src/imgproc/clahe.dart | 34 +- .../dartcv/lib/src/imgproc/clahe_async.dart | 26 -- packages/dartcv/lib/src/imgproc/imgproc.dart | 399 +++++++++++----- packages/dartcv/lib/src/imgproc/subdiv2d.dart | 182 ++++---- .../lib/src/imgproc/subdiv2d_async.dart | 266 +++++++---- 12 files changed, 892 insertions(+), 737 deletions(-) delete mode 100644 packages/dartcv/lib/src/imgcodecs/imgcodecs_async.dart delete mode 100644 packages/dartcv/lib/src/imgproc/clahe_async.dart diff --git a/packages/dartcv/lib/contrib.dart b/packages/dartcv/lib/contrib.dart index dd2fc249..94b390b8 100644 --- a/packages/dartcv/lib/contrib.dart +++ b/packages/dartcv/lib/contrib.dart @@ -10,6 +10,5 @@ export 'src/contrib/aruco_dict.dart'; export 'src/contrib/img_hash.dart'; export 'src/contrib/quality.dart'; export 'src/contrib/wechat_qrcode.dart'; -export 'src/contrib/wechat_qrcode_async.dart'; export 'src/contrib/ximgproc.dart'; export 'src/contrib/xobjdetect.dart'; diff --git a/packages/dartcv/lib/imgcodecs.dart b/packages/dartcv/lib/imgcodecs.dart index 89c0b631..f0f01131 100644 --- a/packages/dartcv/lib/imgcodecs.dart +++ b/packages/dartcv/lib/imgcodecs.dart @@ -5,4 +5,3 @@ library dartcv.imgcodecs; export 'src/imgcodecs/imgcodecs.dart'; -export 'src/imgcodecs/imgcodecs_async.dart'; diff --git a/packages/dartcv/lib/imgproc.dart b/packages/dartcv/lib/imgproc.dart index 16e30311..6781194a 100644 --- a/packages/dartcv/lib/imgproc.dart +++ b/packages/dartcv/lib/imgproc.dart @@ -5,7 +5,6 @@ library dartcv.imgproc; export 'src/imgproc/clahe.dart'; -export 'src/imgproc/clahe_async.dart'; export 'src/imgproc/imgproc.dart'; export 'src/imgproc/imgproc_async.dart'; export 'src/imgproc/subdiv2d.dart'; diff --git a/packages/dartcv/lib/src/g/imgproc.g.dart b/packages/dartcv/lib/src/g/imgproc.g.dart index 1df68dba..205c78cf 100644 --- a/packages/dartcv/lib/src/g/imgproc.g.dart +++ b/packages/dartcv/lib/src/g/imgproc.g.dart @@ -116,85 +116,65 @@ class CvNativeImgproc { late final _cv_CLAHE_create_1 = _cv_CLAHE_create_1Ptr.asFunction< ffi.Pointer Function(double, CvSize, ffi.Pointer)>(); - ffi.Pointer cv_CLAHE_getClipLimit( + double cv_CLAHE_getClipLimit( CLAHE self, - ffi.Pointer rval, - imp1.CvCallback_0 callback, ) { return _cv_CLAHE_getClipLimit( self, - rval, - callback, ); } - late final _cv_CLAHE_getClipLimitPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(CLAHE, ffi.Pointer, - imp1.CvCallback_0)>>('cv_CLAHE_getClipLimit'); - late final _cv_CLAHE_getClipLimit = _cv_CLAHE_getClipLimitPtr.asFunction< - ffi.Pointer Function( - CLAHE, ffi.Pointer, imp1.CvCallback_0)>(); + late final _cv_CLAHE_getClipLimitPtr = + _lookup>( + 'cv_CLAHE_getClipLimit'); + late final _cv_CLAHE_getClipLimit = + _cv_CLAHE_getClipLimitPtr.asFunction(); - ffi.Pointer cv_CLAHE_getTilesGridSize( + ffi.Pointer cv_CLAHE_getTilesGridSize( CLAHE self, - ffi.Pointer rval, - imp1.CvCallback_0 callback, ) { return _cv_CLAHE_getTilesGridSize( self, - rval, - callback, ); } - late final _cv_CLAHE_getTilesGridSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(CLAHE, ffi.Pointer, - imp1.CvCallback_0)>>('cv_CLAHE_getTilesGridSize'); - late final _cv_CLAHE_getTilesGridSize = - _cv_CLAHE_getTilesGridSizePtr.asFunction< - ffi.Pointer Function( - CLAHE, ffi.Pointer, imp1.CvCallback_0)>(); + late final _cv_CLAHE_getTilesGridSizePtr = + _lookup Function(CLAHE)>>( + 'cv_CLAHE_getTilesGridSize'); + late final _cv_CLAHE_getTilesGridSize = _cv_CLAHE_getTilesGridSizePtr + .asFunction Function(CLAHE)>(); - ffi.Pointer cv_CLAHE_setClipLimit( + void cv_CLAHE_setClipLimit( CLAHE self, double clipLimit, - imp1.CvCallback_0 callback, ) { return _cv_CLAHE_setClipLimit( self, clipLimit, - callback, ); } - late final _cv_CLAHE_setClipLimitPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - CLAHE, ffi.Double, imp1.CvCallback_0)>>('cv_CLAHE_setClipLimit'); - late final _cv_CLAHE_setClipLimit = _cv_CLAHE_setClipLimitPtr.asFunction< - ffi.Pointer Function(CLAHE, double, imp1.CvCallback_0)>(); + late final _cv_CLAHE_setClipLimitPtr = + _lookup>( + 'cv_CLAHE_setClipLimit'); + late final _cv_CLAHE_setClipLimit = + _cv_CLAHE_setClipLimitPtr.asFunction(); - ffi.Pointer cv_CLAHE_setTilesGridSize( + void cv_CLAHE_setTilesGridSize( CLAHE self, CvSize size, - imp1.CvCallback_0 callback, ) { return _cv_CLAHE_setTilesGridSize( self, size, - callback, ); } - late final _cv_CLAHE_setTilesGridSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - CLAHE, CvSize, imp1.CvCallback_0)>>('cv_CLAHE_setTilesGridSize'); + late final _cv_CLAHE_setTilesGridSizePtr = + _lookup>( + 'cv_CLAHE_setTilesGridSize'); late final _cv_CLAHE_setTilesGridSize = - _cv_CLAHE_setTilesGridSizePtr.asFunction< - ffi.Pointer Function(CLAHE, CvSize, imp1.CvCallback_0)>(); + _cv_CLAHE_setTilesGridSizePtr.asFunction(); ffi.Pointer cv_GaussianBlur( Mat src, diff --git a/packages/dartcv/lib/src/highgui/highgui.dart b/packages/dartcv/lib/src/highgui/highgui.dart index 526a773d..0d24d093 100644 --- a/packages/dartcv/lib/src/highgui/highgui.dart +++ b/packages/dartcv/lib/src/highgui/highgui.dart @@ -16,263 +16,232 @@ import '../core/rect.dart'; import '../g/highgui.g.dart' as cvg; import '../native_lib.dart' show chighgui; -/// [Window] is a wrapper around OpenCV's "HighGUI" named windows. -/// While OpenCV was designed for use in full-scale applications and can be used -/// within functionally rich UI frameworks (such as Qt*, WinForms*, or Cocoa*) -/// or without any UI at all, sometimes there it is required to try functionality -/// quickly and visualize the results. This is what the HighGUI module has been designed for. +String currentUIFramework() => chighgui.cv_currentUIFramework().toDartString(); + +int getMouseWheelDelta(int flags) => chighgui.cv_getMouseWheelDelta(flags); + +int pollKey() => chighgui.cv_pollKey(); + +/// waits for a pressed key. +/// This function is the only method in OpenCV's HighGUI that can fetch +/// and handle events, so it needs to be called periodically +/// for normal event processing /// /// For further details, please see: -/// http://docs.opencv.org/master/d7/dfc/group__highgui.html -class Window { - /// creates a new named OpenCV window - /// - /// For further details, please see: - /// http://docs.opencv.org/master/d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b - Window(this.name, [int flags = 0]) { - cvRunArena((arena) { - cvRun(() => chighgui.Window_New(name.toNativeUtf8(allocator: arena).cast(), flags)); - }); - } +/// http://docs.opencv.org/master/d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7 +int waitKey(int delay) => chighgui.cv_waitKey(delay); +int waitKeyEx(int delay) => chighgui.cv_waitKeyEx(delay); - void close() { - cvRunArena((arena) { - chighgui.Window_Close(name.toNativeUtf8(allocator: arena).cast()); - }); - } - - /// [getWindowProperty] returns properties of a window. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#gaaf9504b8f9cf19024d9d44a14e461656 - double getWindowProperty(WindowPropertyFlags flag) { - return cvRunArena((arena) { - final result = arena(); - cvRun( - () => chighgui.Window_GetProperty( - name.toNativeUtf8(allocator: arena).cast(), - flag.value, - result, - ), - ); - return result.value; - }); - } +/// creates a new named OpenCV window +/// +/// For further details, please see: +/// http://docs.opencv.org/master/d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b +void namedWindow(String name, [int flags = 0]) { + final cname = name.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_namedWindow(cname, flags)); + calloc.free(cname); +} - /// [setWindowProperty] changes parameters of a window dynamically. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga66e4a6db4d4e06148bcdfe0d70a5df27 - void setWindowProperty(WindowPropertyFlags flag, double value) { - cvRunArena((arena) { - cvRun(() => chighgui.Window_SetProperty(name.toNativeUtf8(allocator: arena).cast(), flag.value, value)); - }); - } +void destroyWindow(String name) { + final cname = name.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_destroyWindow(cname)); + calloc.free(cname); +} - /// SetWindowTitle updates window title. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga56f8849295fd10d0c319724ddb773d96 - void setWindowTitle(String title) { - cvRunArena((arena) { - cvRun( - () => chighgui.Window_SetTitle( - name.toNativeUtf8(allocator: arena).cast(), - title.toNativeUtf8(allocator: arena).cast(), - ), - ); - }); - } +/// destroy all windows. +void destroyAllWindows() { + cvRun(chighgui.cv_destroyAllWindows); +} - /// IMShow displays an image Mat in the specified window. - /// This function should be followed by the WaitKey function which displays - /// the image for specified milliseconds. Otherwise, it won't display the image. - /// - /// For further details, please see: - /// http://docs.opencv.org/master/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563 - void imshow(Mat img) { - cvRunArena((arena) { - cvRun(() => chighgui.Window_IMShow(name.toNativeUtf8(allocator: arena).cast(), img.ref)); - }); - } +/// displays an image Mat in the specified window. +/// This function should be followed by the WaitKey function which displays +/// the image for specified milliseconds. Otherwise, it won't display the image. +/// +/// For further details, please see: +/// http://docs.opencv.org/master/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563 +void imshow(String name, Mat img) { + final cname = name.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_imshow(cname, img.ref)); + calloc.free(cname); +} - /// WaitKey waits for a pressed key. - /// This function is the only method in OpenCV's HighGUI that can fetch - /// and handle events, so it needs to be called periodically - /// for normal event processing - /// - /// For further details, please see: - /// http://docs.opencv.org/master/d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7 - int waitKey(int delay) { - return cvRunArena((arena) { - final ret = arena(); - cvRun(() => chighgui.Window_WaitKey(delay, ret)); - return ret.value; - }); - } +Rect getWindowImageRect(String name) { + final cname = name.toNativeUtf8().cast(); + final p = calloc(); + cvRun(() => chighgui.cv_getWindowImageRect(cname, p)); + calloc.free(cname); + return Rect.fromPointer(p); +} - /// MoveWindow moves window to the specified position. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga8d86b207f7211250dbe6e28f76307ffb - void moveWindow(int x, int y) { - cvRunArena((arena) { - cvRun(() => chighgui.Window_Move(name.toNativeUtf8(allocator: arena).cast(), x, y)); - }); - } +/// [getWindowProperty] returns properties of a window. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d7/dfc/group__highgui.html#gaaf9504b8f9cf19024d9d44a14e461656 +double getWindowProperty(String name, WindowPropertyFlags flag) { + final cname = name.toNativeUtf8().cast(); + final p = calloc(); + cvRun(() => chighgui.cv_getWindowProperty(cname, flag.value, p)); + final rval = p.value; + calloc.free(p); + calloc.free(cname); + return rval; +} - /// ResizeWindow resizes window to the specified size. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga9e80e080f7ef33f897e415358aee7f7e - void resizeWindow(int width, int height) { - cvRunArena((arena) { - cvRun(() => chighgui.Window_Resize(name.toNativeUtf8(allocator: arena).cast(), width, height)); - }); - } +/// [setWindowProperty] changes parameters of a window dynamically. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga66e4a6db4d4e06148bcdfe0d70a5df27 +void setWindowProperty(String name, WindowPropertyFlags flag, double value) { + final cname = name.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setWindowProperty(cname, flag.value, value)); + calloc.free(cname); +} - /// SelectROI selects a Region Of Interest (ROI) on the given image. - /// It creates a window and allows user to select a ROI cvRunArena mouse. - /// - /// Controls: - /// use space or enter to finish selection, - /// use key c to cancel selection (function will return a zero Rect). - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga8daf4730d3adf7035b6de9be4c469af5 - Rect selectROI(Mat img) { - final result = calloc(); - final cname = name.toNativeUtf8().cast(); - cvRun(() => chighgui.Window_SelectROI(cname, img.ref, result)); - calloc.free(cname); - return Rect.fromPointer(result); - } +/// SetWindowTitle updates window title. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga56f8849295fd10d0c319724ddb773d96 +void setWindowTitle(String name, String title) { + final cname = name.toNativeUtf8().cast(); + final ctitle = title.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setWindowTitle(cname, ctitle)); + calloc.free(ctitle); + calloc.free(cname); +} - /// SelectROIs selects multiple Regions Of Interest (ROI) on the given image. - /// It creates a window and allows user to select ROIs cvRunArena mouse. - /// - /// Controls: - /// use space or enter to finish current selection and start a new one - /// use esc to terminate multiple ROI selection process - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga0f11fad74a6432b8055fb21621a0f893 - VecRect selectROIs(Mat img) { - return cvRunArena((arena) { - final result = calloc(); - final cname = name.toNativeUtf8().cast(); - cvRun(() => chighgui.Window_SelectROIs(cname, img.ref, result)); - calloc.free(cname); - return VecRect.fromPointer(result); - }); - } +/// MoveWindow moves window to the specified position. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga8d86b207f7211250dbe6e28f76307ffb +void moveWindow(String name, int x, int y) { + final cname = name.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_moveWindow(cname, x, y)); + calloc.free(cname); +} - String name; - // https://stackoverflow.com/a/48055987/18539998 - bool get isOpen { - final ret = getWindowProperty(WindowPropertyFlags.WND_PROP_VISIBLE).toInt(); - return ret != 0; - } +/// ResizeWindow resizes window to the specified size. +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga9e80e080f7ef33f897e415358aee7f7e +void resizeWindow(String name, int width, int height) { + final cname = name.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_resizeWindow(cname, width, height)); + calloc.free(cname); } -/// WaitKey that is not attached to a specific Window. -/// Only use when no Window exists in your application, e.g. command line app. -int waitKey(int delay) { - return cvRunArena((arena) { - final ret = arena(); - cvRun(() => chighgui.Window_WaitKey(delay, ret)); - return ret.value; - }); +/// SelectROI selects a Region Of Interest (ROI) on the given image. +/// It creates a window and allows user to select a ROI cvRunArena mouse. +/// +/// Controls: +/// use space or enter to finish selection, +/// use key c to cancel selection (function will return a zero Rect). +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga8daf4730d3adf7035b6de9be4c469af5 +Rect selectROI( + String name, + Mat img, { + bool showCrosshair = true, + bool fromCenter = false, + bool printNotice = true, +}) { + final cname = name.toNativeUtf8().cast(); + final p = calloc(); + cvRun(() => chighgui.cv_selectROI(cname, img.ref, showCrosshair, fromCenter, printNotice, p)); + calloc.free(cname); + return Rect.fromPointer(p); } -class Trackbar { - Trackbar(this.name, this.parent, this.max, {int? value}) { - cvRunArena((arena) { - final ppname = parent.name.toNativeUtf8(allocator: arena).cast(); - final cname = name.toNativeUtf8(allocator: arena).cast(); - cvRun(() => chighgui.Trackbar_Create(ppname, cname, max)); - if (value != null) { - pos = value; - } - }); - } +/// SelectROIs selects multiple Regions Of Interest (ROI) on the given image. +/// It creates a window and allows user to select ROIs cvRunArena mouse. +/// +/// Controls: +/// use space or enter to finish current selection and start a new one +/// use esc to terminate multiple ROI selection process +/// +/// For further details, please see: +/// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga0f11fad74a6432b8055fb21621a0f893 +VecRect selectROIs( + String name, + Mat img, { + bool showCrosshair = true, + bool fromCenter = false, + bool printNotice = true, +}) { + final p = calloc(); + final cname = name.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_selectROIs(cname, img.ref, p, showCrosshair, fromCenter, printNotice)); + calloc.free(cname); + return VecRect.fromPointer(p); +} - /// pos returns the trackbar position. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga122632e9e91b9ec06943472c55d9cda8 - int get pos { - return cvRunArena((arena) { - final result = arena(); - cvRun( - () => chighgui.Trackbar_GetPos( - parent.name.toNativeUtf8(allocator: arena).cast(), - name.toNativeUtf8(allocator: arena).cast(), - result, - ), - ); - return result.value; - }); - } +// https://stackoverflow.com/a/48055987/18539998 +bool isWindowOpen(String name) { + final ret = getWindowProperty(name, WindowPropertyFlags.WND_PROP_VISIBLE).toInt(); + return ret != 0; +} - /// pos sets the trackbar position. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga67d73c4c9430f13481fd58410d01bd8d - set pos(int pos) { - cvRunArena((arena) { - cvRun( - () => chighgui.Trackbar_SetPos( - parent.name.toNativeUtf8(allocator: arena).cast(), - name.toNativeUtf8(allocator: arena).cast(), - pos, - ), - ); - }); +void createTrackbar( + String name, + String winname, + int maxval, { + cvg.Dartcv_TrackbarCallbackFunction? onChange, +}) { + final cname = name.toNativeUtf8().cast(); + final cwinname = winname.toNativeUtf8().cast(); + if (onChange == null) { + cvRun(() => chighgui.cv_createTrackbar(cname, cwinname, maxval)); + } else { + final funcPointer = ffi.NativeCallable.isolateLocal(onChange); + cvRun( + () => chighgui.cv_createTrackbar_1( + cname, + cwinname, + ffi.nullptr, + maxval, + funcPointer.nativeFunction, + ffi.nullptr, + ), + ); } + calloc.free(cname); + calloc.free(cwinname); +} - /// SetMin sets the trackbar minimum position. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#gabe26ffe8d2b60cc678895595a581b7aa - // ignore: avoid_setters_without_getters - set minPos(int pos) { - cvRunArena((arena) { - cvRun( - () => chighgui.Trackbar_SetMin( - parent.name.toNativeUtf8(allocator: arena).cast(), - name.toNativeUtf8(allocator: arena).cast(), - pos, - ), - ); - }); - } +int getTrackbarPos(String name, String winname) { + final cname = name.toNativeUtf8().cast(); + final cwinname = winname.toNativeUtf8().cast(); + final p = calloc(); + cvRun(() => chighgui.cv_getTrackbarPos(cname, cwinname, p)); + final rval = p.value; + calloc.free(p); + calloc.free(cname); + calloc.free(cwinname); + return rval; +} - /// SetMax sets the trackbar maximum position. - /// - /// For further details, please see: - /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga7e5437ccba37f1154b65210902fc4480 - // ignore: avoid_setters_without_getters - set maxPos(int pos) { - cvRunArena((arena) { - cvRun( - () => chighgui.Trackbar_SetMax( - parent.name.toNativeUtf8(allocator: arena).cast(), - name.toNativeUtf8(allocator: arena).cast(), - pos, - ), - ); - }); - } +void setTrackbarPos(String name, String winname, int pos) { + final cname = name.toNativeUtf8().cast(); + final cwinname = winname.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setTrackbarPos(cname, cwinname, pos)); + calloc.free(cname); + calloc.free(cwinname); +} - String name; - Window parent; - int max; +void setTrackbarMin(String name, String winname, int minval) { + final cname = name.toNativeUtf8().cast(); + final cwinname = winname.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setTrackbarMin(cname, cwinname, minval)); + calloc.free(cname); + calloc.free(cwinname); } -/// destroy all windows. -void destroyAllWindows() { - cvRun(chighgui.destroyAllWindows); +void setTrackbarMax(String name, String winname, int maxval) { + final cname = name.toNativeUtf8().cast(); + final cwinname = winname.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setTrackbarMax(cname, cwinname, maxval)); + calloc.free(cname); + calloc.free(cwinname); } enum WindowFlag { diff --git a/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart b/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart index 6bf155c9..c565071f 100644 --- a/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart +++ b/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart @@ -4,6 +4,7 @@ library cv.imgcodecs; +import 'dart:async'; import 'dart:ffi' as ffi; import 'dart:typed_data'; @@ -16,7 +17,7 @@ import '../g/constants.g.dart'; import '../g/imgcodecs.g.dart' as cvg; import '../native_lib.dart' show cimgcodecs; -/// IMRead reads an image from a file into a Mat. +/// read an image from a file into a Mat. /// The flags param is one of the IMReadFlag flags. /// If the image cannot be read (because of missing file, improper permissions, /// unsupported or invalid format), the function returns an empty Mat. @@ -24,35 +25,61 @@ import '../native_lib.dart' show cimgcodecs; /// For further details, please see: /// http://docs.opencv.org/master/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56 Mat imread(String filename, {int flags = IMREAD_COLOR}) { - return cvRunArena((arena) { - final p = calloc(); - cvRun(() => cimgcodecs.Image_IMRead(filename.toNativeUtf8(allocator: arena).cast(), flags, p)); - return Mat.fromPointer(p); - }); + final dst = Mat.empty(); + final cname = filename.toNativeUtf8().cast(); + cvRun(() => cimgcodecs.cv_imread(cname, flags, dst.ref, ffi.nullptr)); + calloc.free(cname); + return dst; +} + +Future imreadAsync(String filename, {int flags = IMREAD_COLOR}) { + final dst = Mat.empty(); + final cname = filename.toNativeUtf8().cast(); + return cvRunAsync0( + (callback) => cimgcodecs.cv_imread(cname, flags, dst.ref, callback), + (c) { + calloc.free(cname); + return c.complete(dst); + }, + ); } -/// IMWrite writes a Mat to an image file. +/// write a Mat to an image file. /// /// For further details, please see: /// http://docs.opencv.org/master/d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce bool imwrite(String filename, InputArray img, {VecI32? params}) { - return using((arena) { - final fname = filename.toNativeUtf8(allocator: arena); - final p = arena(); - if (params == null) { - cvRun(() => cimgcodecs.Image_IMWrite(fname.cast(), img.ref, p)); - } else { - cvRun( - () => cimgcodecs.Image_IMWrite_WithParams( - fname.cast(), - img.ref, - params.ref, - p, - ), - ); - } - return p.value; - }); + final fname = filename.toNativeUtf8().cast(); + final p = calloc(); + if (params == null) { + cvRun(() => cimgcodecs.cv_imwrite(fname.cast(), img.ref, p, ffi.nullptr)); + } else { + cvRun(() => cimgcodecs.cv_imwrite_1(fname.cast(), img.ref, params.ref, p, ffi.nullptr)); + } + final rval = p.value; + calloc.free(p); + return rval; +} + +Future imwriteAsync(String filename, InputArray img, {VecI32? params}) { + final fname = filename.toNativeUtf8().cast(); + final p = calloc(); + void completeFunc(Completer c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + } + + if (params == null) { + return cvRunAsync0( + (callback) => cimgcodecs.cv_imwrite(fname.cast(), img.ref, p, callback), + completeFunc, + ); + } + return cvRunAsync0( + (callback) => cimgcodecs.cv_imwrite_1(fname.cast(), img.ref, params.ref, p, callback), + completeFunc, + ); } /// IMEncode encodes an image Mat into a memory buffer. @@ -71,8 +98,8 @@ bool imwrite(String filename, InputArray img, {VecI32? params}) { final cExt = ext.toNativeUtf8().cast(); params == null - ? cvRun(() => cimgcodecs.Image_IMEncode(cExt, img.ref, pSuccess, buffer)) - : cvRun(() => cimgcodecs.Image_IMEncode_WithParams(cExt, img.ref, params.ref, pSuccess, buffer)); + ? cvRun(() => cimgcodecs.cv_imencode(cExt, img.ref, pSuccess, buffer, ffi.nullptr)) + : cvRun(() => cimgcodecs.cv_imencode_1(cExt, img.ref, params.ref, pSuccess, buffer, ffi.nullptr)); final success = pSuccess.value; calloc.free(cExt); calloc.free(pSuccess); @@ -83,6 +110,38 @@ bool imwrite(String filename, InputArray img, {VecI32? params}) { return (success, u8List); } +Future<(bool, Uint8List)> imencodeAsync( + String ext, + InputArray img, { + VecI32? params, +}) { + final buffer = calloc(); + final pSuccess = calloc(); + final cExt = ext.toNativeUtf8().cast(); + + void completeFunc(Completer<(bool, Uint8List)> c) { + final success = pSuccess.value; + calloc.free(cExt); + calloc.free(pSuccess); + + final vec = VecUChar.fromPointer(buffer); + final u8List = vec.toU8List(); // will copy data + vec.dispose(); + return c.complete((success, u8List)); + } + + if (params == null) { + return cvRunAsync0( + (callback) => cimgcodecs.cv_imencode(cExt, img.ref, pSuccess, buffer, callback), + completeFunc, + ); + } + return cvRunAsync0( + (callback) => cimgcodecs.cv_imencode_1(cExt, img.ref, params.ref, pSuccess, buffer, callback), + completeFunc, + ); +} + /// imdecode reads an image from a buffer in memory. /// The function imdecode reads an image from the specified buffer in memory. /// If the buffer is too short or contains invalid data, the function @@ -94,6 +153,17 @@ bool imwrite(String filename, InputArray img, {VecI32? params}) { Mat imdecode(Uint8List buf, int flags, {Mat? dst}) { final vec = VecUChar.fromList(buf); dst ??= Mat.empty(); - cvRun(() => cimgcodecs.Image_IMDecode(vec.ref, flags, dst!.ptr)); + cvRun(() => cimgcodecs.cv_imdecode(vec.ref, flags, dst!.ref, ffi.nullptr)); return dst; } + +Future imdecodeAsync(Uint8List buf, int flags, {Mat? dst}) { + final vec = VecUChar.fromList(buf); + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgcodecs.cv_imdecode(vec.ref, flags, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} diff --git a/packages/dartcv/lib/src/imgcodecs/imgcodecs_async.dart b/packages/dartcv/lib/src/imgcodecs/imgcodecs_async.dart deleted file mode 100644 index 59bdac95..00000000 --- a/packages/dartcv/lib/src/imgcodecs/imgcodecs_async.dart +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2024, rainyl and all contributors. All rights reserved. -// Use of this source code is governed by a Apache-2.0 license -// that can be found in the LICENSE file. - -library cv.imgcodecs; - -import 'dart:ffi' as ffi; -import 'dart:typed_data'; - -import 'package:ffi/ffi.dart'; - -import '../core/base.dart'; -import '../core/mat.dart'; -import '../core/vec.dart'; -import '../g/constants.g.dart'; -import '../native_lib.dart' show cimgcodecs; - -/// IMRead reads an image from a file into a Mat. -/// The flags param is one of the IMReadFlag flags. -/// If the image cannot be read (because of missing file, improper permissions, -/// unsupported or invalid format), the function returns an empty Mat. -/// -/// For further details, please see: -/// http://docs.opencv.org/master/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56 -Future imreadAsync(String filename, {int flags = IMREAD_COLOR}) async { - final cname = filename.toNativeUtf8().cast(); - final rval = cvRunAsync((callback) => cimgcodecs.Image_IMRead_Async(cname, flags, callback), matCompleter); - calloc.free(cname); - return rval; -} - -/// IMWrite writes a Mat to an image file. -/// -/// For further details, please see: -/// http://docs.opencv.org/master/d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce -Future imwriteAsync(String filename, InputArray img, {VecI32? params}) async { - final cname = filename.toNativeUtf8().cast(); - final rval = cvRunAsync( - (callback) => params == null - ? cimgcodecs.Image_IMWrite_Async(cname, img.ref, callback) - : cimgcodecs.Image_IMWrite_WithParams_Async(cname, img.ref, params.ref, callback), - (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }, - ); - calloc.free(cname); - return rval; -} - -/// IMEncode encodes an image Mat into a memory buffer. -/// This function compresses the image and stores it in the returned memory buffer, -/// using the image format passed in in the form of a file extension string. -/// -/// For further details, please see: -/// http://docs.opencv.org/master/d4/da8/group__imgcodecs.html#ga461f9ac09887e47797a54567df3b8b63 -Future<(bool, Uint8List)> imencodeAsync( - String ext, - InputArray img, { - VecI32? params, -}) async { - final cExt = ext.toNativeUtf8().cast(); - final rval = cvRunAsync2<(bool, Uint8List)>( - (callback) => params == null - ? cimgcodecs.Image_IMEncode_Async(cExt, img.ref, callback) - : cimgcodecs.Image_IMEncode_WithParams_Async(cExt, img.ref, params.ref, callback), - (c, p, p1) { - final v = p.cast().value; - calloc.free(p); - final vec = VecUChar.fromPointer(p1.cast()); - final data = vec.toU8List(); - vec.dispose(); - return c.complete((v, data)); - }, - ); - return rval; -} - -/// imdecode reads an image from a buffer in memory. -/// The function imdecode reads an image from the specified buffer in memory. -/// If the buffer is too short or contains invalid data, the function -/// returns an empty matrix. -/// @param buf Input array or vector of bytes. -/// @param flags The same flags as in cv::imread, see cv::ImreadModes. -/// For further details, please see: -/// https://docs.opencv.org/master/d4/da8/group__imgcodecs.html#ga26a67788faa58ade337f8d28ba0eb19e -Future imdecodeAsync(Uint8List buf, int flags) async { - final vec = VecUChar.fromList(buf); - final rval = - cvRunAsync((callback) => cimgcodecs.Image_IMDecode_Async(vec.ref, flags, callback), matCompleter); - vec.dispose(); - return rval; -} diff --git a/packages/dartcv/lib/src/imgproc/clahe.dart b/packages/dartcv/lib/src/imgproc/clahe.dart index 647df860..cb9bbcdc 100644 --- a/packages/dartcv/lib/src/imgproc/clahe.dart +++ b/packages/dartcv/lib/src/imgproc/clahe.dart @@ -22,7 +22,7 @@ class CLAHE extends CvStruct { factory CLAHE.fromPointer(cvg.CLAHEPtr ptr) => CLAHE._(ptr); factory CLAHE.empty() { final p = calloc(); - cimgproc.CLAHE_Create(p); + cimgproc.cv_CLAHE_create(p); return CLAHE._(p); } @@ -38,7 +38,7 @@ class CLAHE extends CvStruct { final size = calloc() ..ref.width = tileGridSize.$1 ..ref.height = tileGridSize.$2; - cimgproc.CLAHE_CreateWithParams(clipLimit, size.ref, p); + cimgproc.cv_CLAHE_create_1(clipLimit, size.ref, p); calloc.free(size); return CLAHE._(p); } @@ -49,37 +49,39 @@ class CLAHE extends CvStruct { /// https:///docs.opencv.org/master/d6/db6/classcv_1_1CLAHE.html#a4e92e0e427de21be8d1fae8dcd862c5e Mat apply(Mat src, {Mat? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.CLAHE_Apply(ref, src.ref, dst!.ref)); + cvRun(() => cimgproc.cv_CLAHE_apply(ref, src.ref, dst!.ref, ffi.nullptr)); return dst; } - double get clipLimit { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cimgproc.CLAHE_GetClipLimit(ref, p)); - return p.value; + Future applyAsync(Mat src, {Mat? dst}) async { + dst ??= Mat.empty(); + return cvRunAsync0((callback) => cimgproc.cv_CLAHE_apply(ref, src.ref, dst!.ref, callback), (c) { + return c.complete(dst); }); } - set clipLimit(double value) { - cvRun(() => cimgproc.CLAHE_SetClipLimit(ref, value)); - } + double get clipLimit => cimgproc.cv_CLAHE_getClipLimit(ref); + + set clipLimit(double value) => cimgproc.cv_CLAHE_setClipLimit(ref, value); Size get tilesGridSize { - final p = calloc(); - cvRun(() => cimgproc.CLAHE_GetTilesGridSize(ref, p)); + final p = cimgproc.cv_CLAHE_getTilesGridSize(ref); return Size.fromPointer(p); } - set tilesGridSize(Size value) => cvRun(() => cimgproc.CLAHE_SetTilesGridSize(ref, value.ref)); + set tilesGridSize(Size value) => cimgproc.cv_CLAHE_setTilesGridSize(ref, value.ref); - static final finalizer = OcvFinalizer(cimgproc.addresses.CLAHE_Close); + static final finalizer = OcvFinalizer(cimgproc.addresses.cv_CLAHE_close); void dispose() { finalizer.detach(this); - cimgproc.CLAHE_Close(ptr); + cimgproc.cv_CLAHE_close(ptr); } @override cvg.CLAHE get ref => ptr.ref; } + +CLAHE createCLAHE({double clipLimit = 40, (int width, int height) tileGridSize = (8, 8)}) { + return CLAHE.create(clipLimit, tileGridSize); +} diff --git a/packages/dartcv/lib/src/imgproc/clahe_async.dart b/packages/dartcv/lib/src/imgproc/clahe_async.dart deleted file mode 100644 index 271b9d4e..00000000 --- a/packages/dartcv/lib/src/imgproc/clahe_async.dart +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2024, rainyl and all contributors. All rights reserved. -// Use of this source code is governed by a Apache-2.0 license -// that can be found in the LICENSE file. - -library cv.imgproc.clahe; - -import '../core/base.dart'; -import '../core/mat.dart'; -import '../core/size.dart'; -import '../g/imgproc.g.dart' as cvg; -import '../native_lib.dart' show cimgproc; -import 'clahe.dart'; - -extension CLAHEAsync on CLAHE { - static Future createAsync([ - double clipLimit = 40, - (int width, int height) tileGridSize = (8, 8), - ]) async => - cvRunAsync( - (callback) => cimgproc.CLAHE_CreateWithParams_Async(clipLimit, tileGridSize.toSize().ref, callback), - (c, p) => c.complete(CLAHE.fromPointer(p.cast())), - ); - - Future applyAsync(Mat src) async => - cvRunAsync((callback) => cimgproc.CLAHE_Apply_Async(ref, src.ref, callback), matCompleter); -} diff --git a/packages/dartcv/lib/src/imgproc/imgproc.dart b/packages/dartcv/lib/src/imgproc/imgproc.dart index 07de902d..adc29993 100644 --- a/packages/dartcv/lib/src/imgproc/imgproc.dart +++ b/packages/dartcv/lib/src/imgproc/imgproc.dart @@ -32,7 +32,7 @@ import '../native_lib.dart' show cimgproc; /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga0012a5fdaea70b8a9970165d98722b4c VecPoint approxPolyDP(VecPoint curve, double epsilon, bool closed) { final vec = calloc(); - cvRun(() => cimgproc.ApproxPolyDP(curve.ref, epsilon, closed, vec)); + cvRun(() => cimgproc.cv_approxPolyDP(curve.ref, epsilon, closed, vec, ffi.nullptr)); return VecPoint.fromPointer(vec); } @@ -42,11 +42,11 @@ VecPoint approxPolyDP(VecPoint curve, double epsilon, bool closed) { /// /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga8d26483c636be6b35c3ec6335798a47c double arcLength(VecPoint curve, bool closed) { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cimgproc.ArcLength(curve.ref, closed, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => cimgproc.cv_arcLength(curve.ref, closed, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// ConvexHull finds the convex hull of a point set. @@ -55,7 +55,7 @@ double arcLength(VecPoint curve, bool closed) { /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga014b28e56cb8854c0de4a211cb2be656 Mat convexHull(VecPoint points, {Mat? hull, bool clockwise = false, bool returnPoints = true}) { hull ??= Mat.empty(); - cvRun(() => cimgproc.ConvexHull(points.ref, hull!.ref, clockwise, returnPoints)); + cvRun(() => cimgproc.cv_convexHull(points.ref, hull!.ref, clockwise, returnPoints, ffi.nullptr)); return hull; } @@ -65,7 +65,7 @@ Mat convexHull(VecPoint points, {Mat? hull, bool clockwise = false, bool returnP /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gada4437098113fd8683c932e0567f47ba Mat convexityDefects(VecPoint contour, Mat hull, {Mat? convexityDefects}) { convexityDefects ??= Mat.empty(); - cvRun(() => cimgproc.ConvexityDefects(contour.ref, hull.ref, convexityDefects!.ref)); + cvRun(() => cimgproc.cv_convexityDefects(contour.ref, hull.ref, convexityDefects!.ref, ffi.nullptr)); return convexityDefects; } @@ -77,7 +77,7 @@ Mat convexityDefects(VecPoint contour, Mat hull, {Mat? convexityDefects}) { /// http:///docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0 Mat cvtColor(Mat src, int code, {Mat? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.CvtColor(src.ref, dst!.ref, code)); + cvRun(() => cimgproc.cv_cvtColor(src.ref, dst!.ref, code, ffi.nullptr)); return dst; } @@ -88,7 +88,7 @@ Mat cvtColor(Mat src, int code, {Mat? dst}) { Mat equalizeHist(Mat src, {Mat? dst}) { cvAssert(src.channels == 1, "src must be grayscale"); dst ??= Mat.empty(); - cvRun(() => cimgproc.EqualizeHist(src.ref, dst!.ref)); + cvRun(() => cimgproc.cv_equalizeHist(src.ref, dst!.ref, ffi.nullptr)); return dst; } @@ -107,7 +107,7 @@ Mat calcHist( }) { hist ??= Mat.empty(); cvRun( - () => cimgproc.CalcHist( + () => cimgproc.cv_calcHist( src.ref, channels.ref, mask.ref, @@ -115,6 +115,7 @@ Mat calcHist( histSize.ref, ranges.ref, accumulate, + ffi.nullptr, ), ); @@ -133,9 +134,19 @@ Mat calcBackProject( Mat? dst, double scale = 1.0, }) { - final p = dst?.ptr ?? calloc(); - cvRun(() => cimgproc.CalcBackProject(src.ref, channels.ref, hist.ref, p, ranges.ref, scale)); - return dst ?? Mat.fromPointer(p); + dst ??= Mat.empty(); + cvRun( + () => cimgproc.cv_calcBackProject( + src.ref, + channels.ref, + hist.ref, + dst!.ref, + ranges.ref, + scale, + ffi.nullptr, + ), + ); + return dst; } /// CompareHist Compares two histograms. @@ -145,7 +156,7 @@ Mat calcBackProject( double compareHist(Mat hist1, Mat hist2, {int method = 0}) { return cvRunArena((arena) { final p = arena(); - cvRun(() => cimgproc.CompareHist(hist1.ref, hist2.ref, method, p)); + cvRun(() => cimgproc.cv_compareHist(hist1.ref, hist2.ref, method, p, ffi.nullptr)); return p.value; }); } @@ -156,7 +167,7 @@ double compareHist(Mat hist1, Mat hist2, {int method = 0}) { (bool, Point, Point) clipLine(Rect imgRect, Point pt1, Point pt2) { final bool r = using((arena) { final rval = arena(); - cvRun(() => cimgproc.ClipLine(imgRect.ref, pt1.ref, pt2.ref, rval)); + cvRun(() => cimgproc.cv_clipLine(imgRect.ref, pt1.ref, pt2.ref, rval, ffi.nullptr)); return rval.value; }); return (r, pt1, pt2); @@ -174,7 +185,7 @@ double compareHist(Mat hist1, Mat hist2, {int method = 0}) { /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga9d7064d478c95d60003cf839430737ed Mat bilateralFilter(Mat src, int diameter, double sigmaColor, double sigmaSpace, {Mat? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.BilateralFilter(src.ref, dst!.ref, diameter, sigmaColor, sigmaSpace)); + cvRun(() => cimgproc.cv_bilateralFilter(src.ref, dst!.ref, diameter, sigmaColor, sigmaSpace, ffi.nullptr)); return dst; } @@ -184,7 +195,7 @@ Mat bilateralFilter(Mat src, int diameter, double sigmaColor, double sigmaSpace, /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37 Mat blur(Mat src, (int, int) ksize, {Mat? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.Blur(src.ref, dst!.ref, ksize.cvd.ref)); + cvRun(() => cimgproc.cv_blur(src.ref, dst!.ref, ksize.cvd.ref, ffi.nullptr)); return dst; } @@ -204,7 +215,16 @@ Mat boxFilter( dst ??= Mat.empty(); anchor ??= Point(-1, -1); cvRun( - () => cimgproc.BoxFilter(src.ref, dst!.ref, depth, ksize.cvd.ref, anchor!.ref, normalize, borderType), + () => cimgproc.cv_boxFilter( + src.ref, + dst!.ref, + depth, + ksize.cvd.ref, + anchor!.ref, + normalize, + borderType, + ffi.nullptr, + ), ); return dst; } @@ -225,7 +245,16 @@ Mat sqrBoxFilter( dst ??= Mat.empty(); anchor ??= Point(-1, -1); cvRun( - () => cimgproc.SqrBoxFilter(src.ref, dst!.ref, depth, ksize.cvd.ref, anchor!.ref, normalize, borderType), + () => cimgproc.cv_sqrBoxFilter( + src.ref, + dst!.ref, + depth, + ksize.cvd.ref, + anchor!.ref, + normalize, + borderType, + ffi.nullptr, + ), ); return dst; } @@ -247,7 +276,7 @@ Mat dilate( dst ??= Mat.empty(); anchor ??= Point(-1, -1); cvRun( - () => cimgproc.DilateWithParams( + () => cimgproc.cv_dilate_1( src.ref, dst!.ref, kernel.ref, @@ -255,6 +284,7 @@ Mat dilate( iterations, borderType, borderValue!.ref, + ffi.nullptr, ), ); return dst; @@ -277,7 +307,7 @@ Mat erode( dst ??= Mat.empty(); anchor ??= Point(-1, -1); cvRun( - () => cimgproc.ErodeWithParams( + () => cimgproc.cv_erode_1( src.ref, dst!.ref, kernel.ref, @@ -285,6 +315,7 @@ Mat erode( iterations, borderType, borderValue!.ref, + ffi.nullptr, ), ); return dst; @@ -309,7 +340,17 @@ Mat erode( }) { dst ??= Mat.empty(); labels ??= Mat.empty(); - cvRun(() => cimgproc.DistanceTransform(src.ref, dst!.ref, labels!.ref, distanceType, maskSize, labelType)); + cvRun( + () => cimgproc.cv_distanceTransform( + src.ref, + dst!.ref, + labels!.ref, + distanceType, + maskSize, + labelType, + ffi.nullptr, + ), + ); return (dst, labels); } @@ -331,7 +372,7 @@ Mat erode( final pRect = calloc(); final pRval = calloc(); cvRun( - () => cimgproc.FloodFill( + () => cimgproc.cv_floodFill( image.ref, mask!.ref, seedPoint.ref, @@ -341,6 +382,7 @@ Mat erode( upDiff!.ref, flags, pRval, + ffi.nullptr, ), ); final rval = pRval.value; @@ -354,7 +396,7 @@ Mat erode( /// https:///docs.opencv.org/3.3.0/d3/dc0/group__imgproc__shape.html#gacb413ddce8e48ff3ca61ed7cf626a366 Rect boundingRect(VecPoint points) { final rect = calloc(); - cvRun(() => cimgproc.BoundingRect(points.ref, rect)); + cvRun(() => cimgproc.cv_boundingRect(points.ref, rect, ffi.nullptr)); return Rect.fromPointer(rect); } @@ -366,10 +408,10 @@ Rect boundingRect(VecPoint points) { VecPoint2f boxPoints(RotatedRect rect, {VecPoint2f? pts}) { if (pts == null) { final p = calloc(); - cvRun(() => cimgproc.BoxPoints(rect.ref, p)); + cvRun(() => cimgproc.cv_boxPoints(rect.ref, p, ffi.nullptr)); return VecPoint2f.fromPointer(p); } - cvRun(() => cimgproc.BoxPoints(rect.ref, pts.ptr)); + cvRun(() => cimgproc.cv_boxPoints(rect.ref, pts.ptr, ffi.nullptr)); return pts; } @@ -380,7 +422,7 @@ VecPoint2f boxPoints(RotatedRect rect, {VecPoint2f? pts}) { double contourArea(VecPoint contour) { return cvRunArena((arena) { final area = arena(); - cvRun(() => cimgproc.ContourArea(contour.ref, area)); + cvRun(() => cimgproc.cv_contourArea(contour.ref, area, ffi.nullptr)); return area.value; }); } @@ -391,7 +433,7 @@ double contourArea(VecPoint contour) { /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga3d476a3417130ae5154aea421ca7ead9 RotatedRect minAreaRect(VecPoint points) { final p = calloc(); - cvRun(() => cimgproc.MinAreaRect(points.ref, p)); + cvRun(() => cimgproc.cv_minAreaRect(points.ref, p, ffi.nullptr)); return RotatedRect.fromPointer(p); } @@ -401,7 +443,7 @@ RotatedRect minAreaRect(VecPoint points) { /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaf259efaad93098103d6c27b9e4900ffa RotatedRect fitEllipse(VecPoint points) { final p = calloc(); - cvRun(() => cimgproc.FitEllipse(points.ref, p)); + cvRun(() => cimgproc.cv_fitEllipse(points.ref, p, ffi.nullptr)); return RotatedRect.fromPointer(p); } @@ -413,7 +455,7 @@ RotatedRect fitEllipse(VecPoint points) { return cvRunArena<(Point2f, double)>((arena) { final center = calloc(); final radius = arena(); - cvRun(() => cimgproc.MinEnclosingCircle(points.ref, center, radius)); + cvRun(() => cimgproc.cv_minEnclosingCircle(points.ref, center, radius, ffi.nullptr)); return (Point2f.fromPointer(center), radius.value); }); } @@ -425,7 +467,7 @@ RotatedRect fitEllipse(VecPoint points) { (Contours contours, Mat hierarchy) findContours(Mat src, int mode, int method) { final hierarchy = Mat.empty(); final v = calloc(); - cvRun(() => cimgproc.FindContours(src.ref, hierarchy.ref, mode, method, v)); + cvRun(() => cimgproc.cv_findContours(src.ref, hierarchy.ref, mode, method, v, ffi.nullptr)); return (Contours.fromPointer(v), hierarchy); } @@ -436,7 +478,7 @@ RotatedRect fitEllipse(VecPoint points) { double pointPolygonTest(VecPoint points, Point2f pt, bool measureDist) { return cvRunArena((arena) { final r = arena(); - cvRun(() => cimgproc.PointPolygonTest(points.ref, pt.ref, measureDist, r)); + cvRun(() => cimgproc.cv_pointPolygonTest(points.ref, pt.ref, measureDist, r, ffi.nullptr)); return r.value; }); } @@ -448,7 +490,17 @@ double pointPolygonTest(VecPoint points, Point2f pt, bool measureDist) { int connectedComponents(Mat image, Mat labels, int connectivity, int ltype, int ccltype) { return cvRunArena((arena) { final p = arena(); - cvRun(() => cimgproc.ConnectedComponents(image.ref, labels.ref, connectivity, ltype, ccltype, p)); + cvRun( + () => cimgproc.cv_connectedComponents( + image.ref, + labels.ref, + connectivity, + ltype, + ccltype, + p, + ffi.nullptr, + ), + ); return p.value; }); } @@ -470,7 +522,7 @@ int connectedComponentsWithStats( return cvRunArena((arena) { final p = arena(); cvRun( - () => cimgproc.ConnectedComponentsWithStats( + () => cimgproc.cv_connectedComponents_1( src.ref, labels.ref, stats.ref, @@ -479,6 +531,7 @@ int connectedComponentsWithStats( ltype, ccltype, p, + ffi.nullptr, ), ); return p.value; @@ -492,7 +545,7 @@ int connectedComponentsWithStats( Mat matchTemplate(Mat image, Mat templ, int method, {OutputArray? result, Mat? mask}) { mask ??= Mat.empty(); result ??= Mat.empty(); - cvRun(() => cimgproc.MatchTemplate(image.ref, templ.ref, result!.ref, method, mask!.ref)); + cvRun(() => cimgproc.cv_matchTemplate(image.ref, templ.ref, result!.ref, method, mask!.ref, ffi.nullptr)); return result; } @@ -503,7 +556,7 @@ Mat matchTemplate(Mat image, Mat templ, int method, {OutputArray? result, Mat? m /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga556a180f43cab22649c23ada36a8a139 Moments moments(Mat src, {bool binaryImage = false}) { final m = calloc(); - cvRun(() => cimgproc.Moments(src.ref, binaryImage, m)); + cvRun(() => cimgproc.cv_moments(src.ref, binaryImage, m, ffi.nullptr)); return Moments.fromPointer(m); } @@ -518,7 +571,7 @@ Mat pyrDown( int borderType = BORDER_DEFAULT, }) { dst ??= Mat.empty(); - cvRun(() => cimgproc.PyrDown(src.ref, dst!.ref, dstsize.cvd.ref, borderType)); + cvRun(() => cimgproc.cv_pyrDown(src.ref, dst!.ref, dstsize.cvd.ref, borderType, ffi.nullptr)); return dst; } @@ -533,7 +586,7 @@ Mat pyrUp( int borderType = BORDER_DEFAULT, }) { dst ??= Mat.empty(); - cvRun(() => cimgproc.PyrUp(src.ref, dst!.ref, dstsize.cvd.ref, borderType)); + cvRun(() => cimgproc.cv_pyrUp(src.ref, dst!.ref, dstsize.cvd.ref, borderType, ffi.nullptr)); return dst; } @@ -544,7 +597,7 @@ Mat pyrUp( /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga94756fad83d9d24d29c9bf478558c40a Scalar morphologyDefaultBorderValue() { final s = calloc(); - cvRun(() => cimgproc.MorphologyDefaultBorderValue(s)); + cvRun(() => cimgproc.cv_morphologyDefaultBorderValue(s, ffi.nullptr)); return Scalar.fromPointer(s); } @@ -566,7 +619,7 @@ Mat morphologyEx( dst ??= Mat.empty(); anchor ??= Point(-1, -1); cvRun( - () => cimgproc.MorphologyExWithParams( + () => cimgproc.cv_morphologyEx_1( src.ref, dst!.ref, op, @@ -575,6 +628,7 @@ Mat morphologyEx( iterations, borderType, borderValue!.ref, + ffi.nullptr, ), ); return dst; @@ -587,9 +641,9 @@ Mat morphologyEx( /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gac342a1bb6eabf6f55c803b09268e36dc Mat getStructuringElement(int shape, (int, int) ksize, {Point? anchor}) { anchor ??= Point(-1, -1); - final r = calloc(); - cvRun(() => cimgproc.GetStructuringElement(shape, ksize.cvd.ref, r)); - return Mat.fromPointer(r); + final mat = Mat.empty(); + cvRun(() => cimgproc.cv_getStructuringElement(shape, ksize.cvd.ref, mat.ref, ffi.nullptr)); + return mat; } /// GaussianBlur blurs an image Mat using a Gaussian filter. @@ -607,7 +661,9 @@ Mat gaussianBlur( int borderType = BORDER_DEFAULT, }) { dst ??= Mat.empty(); - cvRun(() => cimgproc.GaussianBlur(src.ref, dst!.ref, ksize.cvd.ref, sigmaX, sigmaY, borderType)); + cvRun( + () => cimgproc.cv_GaussianBlur(src.ref, dst!.ref, ksize.cvd.ref, sigmaX, sigmaY, borderType, ffi.nullptr), + ); return dst; } @@ -616,9 +672,9 @@ Mat gaussianBlur( /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gac05a120c1ae92a6060dd0db190a61afa Mat getGaussianKernel(int ksize, double sigma, {int ktype = 6}) { - final r = calloc(); - cvRun(() => cimgproc.GetGaussianKernel(ksize, sigma, ktype, r)); - return Mat.fromPointer(r); + final mat = Mat.empty(); + cvRun(() => cimgproc.cv_getGaussianKernel(ksize, sigma, ktype, mat.ref, ffi.nullptr)); + return mat; } /// Sobel calculates the first, second, third, or mixed image derivatives using an extended Sobel operator @@ -637,7 +693,9 @@ Mat sobel( int borderType = BORDER_DEFAULT, }) { dst ??= Mat.empty(); - cvRun(() => cimgproc.Sobel(src.ref, dst!.ref, ddepth, dx, dy, ksize, scale, delta, borderType)); + cvRun( + () => cimgproc.cv_Sobel(src.ref, dst!.ref, ddepth, dx, dy, ksize, scale, delta, borderType, ffi.nullptr), + ); return dst; } @@ -654,7 +712,7 @@ Mat sobel( }) { dx ??= Mat.empty(); dy ??= Mat.empty(); - cvRun(() => cimgproc.SpatialGradient(src.ref, dx!.ref, dy!.ref, ksize, borderType)); + cvRun(() => cimgproc.cv_spatialGradient(src.ref, dx!.ref, dy!.ref, ksize, borderType, ffi.nullptr)); return (dx, dy); } @@ -672,7 +730,7 @@ Mat laplacian( int borderType = BORDER_DEFAULT, }) { dst ??= Mat.empty(); - cvRun(() => cimgproc.Laplacian(src.ref, dst!.ref, ddepth, ksize, scale, delta, borderType)); + cvRun(() => cimgproc.cv_Laplacian(src.ref, dst!.ref, ddepth, ksize, scale, delta, borderType, ffi.nullptr)); return dst; } @@ -691,7 +749,7 @@ Mat scharr( int borderType = BORDER_DEFAULT, }) { dst ??= Mat.empty(); - cvRun(() => cimgproc.Scharr(src.ref, dst!.ref, ddepth, dx, dy, scale, delta, borderType)); + cvRun(() => cimgproc.cv_Scharr(src.ref, dst!.ref, ddepth, dx, dy, scale, delta, borderType, ffi.nullptr)); return dst; } @@ -701,7 +759,7 @@ Mat scharr( /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9 Mat medianBlur(Mat src, int ksize, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.MedianBlur(src.ref, dst!.ref, ksize)); + cvRun(() => cimgproc.cv_medianBlur(src.ref, dst!.ref, ksize, ffi.nullptr)); return dst; } @@ -724,7 +782,17 @@ Mat canny( bool l2gradient = false, }) { edges ??= Mat.empty(); - cvRun(() => cimgproc.Canny(image.ref, edges!.ref, threshold1, threshold2, apertureSize, l2gradient)); + cvRun( + () => cimgproc.cv_canny( + image.ref, + edges!.ref, + threshold1, + threshold2, + apertureSize, + l2gradient, + ffi.nullptr, + ), + ); return edges; } @@ -743,7 +811,7 @@ VecPoint2f cornerSubPix( final size = winSize.cvd; final zone = zeroZone.cvd; final c = criteria.toTermCriteria(); - cvRun(() => cimgproc.CornerSubPix(image.ref, corners.ref, size.ref, zone.ref, c.ref)); + cvRun(() => cimgproc.cv_cornerSubPix(image.ref, corners.ref, size.ref, zone.ref, c.ref, ffi.nullptr)); return corners; } @@ -768,7 +836,7 @@ VecPoint2f goodFeaturesToTrack( mask ??= Mat.empty(); if (gradientSize == null) { cvRun( - () => cimgproc.GoodFeaturesToTrack( + () => cimgproc.cv_goodFeaturesToTrack( image.ref, c, maxCorners, @@ -778,11 +846,12 @@ VecPoint2f goodFeaturesToTrack( blockSize, useHarrisDetector, k, + ffi.nullptr, ), ); } else { cvRun( - () => cimgproc.GoodFeaturesToTrackWithGradient( + () => cimgproc.cv_goodFeaturesToTrack_1( image.ref, c, maxCorners, @@ -793,6 +862,7 @@ VecPoint2f goodFeaturesToTrack( gradientSize, useHarrisDetector, k, + ffi.nullptr, ), ); } @@ -812,7 +882,18 @@ VecPoint2f goodFeaturesToTrack( int iterCount, { int mode = GC_EVAL, }) { - cvRun(() => cimgproc.GrabCut(img.ref, mask.ref, rect.ref, bgdModel.ref, fgdModel.ref, iterCount, mode)); + cvRun( + () => cimgproc.cv_grabCut( + img.ref, + mask.ref, + rect.ref, + bgdModel.ref, + fgdModel.ref, + iterCount, + mode, + ffi.nullptr, + ), + ); return (mask, bgdModel, fgdModel); } @@ -835,7 +916,7 @@ Mat HoughCircles( }) { circles ??= Mat.empty(); cvRun( - () => cimgproc.HoughCirclesWithParams( + () => cimgproc.cv_HoughCircles_1( image.ref, circles!.ref, method, @@ -845,6 +926,7 @@ Mat HoughCircles( param2, minRadius, maxRadius, + ffi.nullptr, ), ); return circles; @@ -868,8 +950,20 @@ Mat HoughLines( double max_theta = CV_PI, }) { lines ??= Mat.empty(); - cvRun(() => - cimgproc.HoughLines(image.ref, lines!.ref, rho, theta, threshold, srn, stn, min_theta, max_theta)); + cvRun( + () => cimgproc.cv_HoughLines( + image.ref, + lines!.ref, + rho, + theta, + threshold, + srn, + stn, + min_theta, + max_theta, + ffi.nullptr, + ), + ); return lines; } @@ -890,7 +984,7 @@ Mat HoughLinesP( }) { lines ??= Mat.empty(); cvRun( - () => cimgproc.HoughLinesPWithParams( + () => cimgproc.cv_HoughLinesP_1( image.ref, lines!.ref, rho, @@ -898,6 +992,7 @@ Mat HoughLinesP( threshold, minLineLength, maxLineGap, + ffi.nullptr, ), ); return lines; @@ -923,7 +1018,7 @@ Mat HoughLinesPointSet( }) { lines ??= Mat.empty(); cvRun( - () => cimgproc.HoughLinesPointSet( + () => cimgproc.cv_HoughLinesPointSet( point.ref, lines!.ref, lines_max, @@ -934,6 +1029,7 @@ Mat HoughLinesPointSet( min_theta, max_theta, theta_step, + ffi.nullptr, ), ); return lines; @@ -953,7 +1049,7 @@ Mat HoughLinesPointSet( sum ??= Mat.empty(); sqsum ??= Mat.empty(); tilted ??= Mat.empty(); - cvRun(() => cimgproc.Integral(src.ref, sum!.ref, sqsum!.ref, tilted!.ref, sdepth, sqdepth)); + cvRun(() => cimgproc.cv_integral(src.ref, sum!.ref, sqsum!.ref, tilted!.ref, sdepth, sqdepth, ffi.nullptr)); return (sum, sqsum, tilted); } @@ -971,7 +1067,7 @@ Mat HoughLinesPointSet( dst ??= Mat.empty(); final rval = cvRunArena((arena) { final p = arena(); - cvRun(() => cimgproc.Threshold(src.ref, dst!.ref, thresh, maxval, type, p)); + cvRun(() => cimgproc.cv_threshold(src.ref, dst!.ref, thresh, maxval, type, p, ffi.nullptr)); return p.value; }); return (rval, dst); @@ -992,7 +1088,7 @@ Mat adaptiveThreshold( }) { dst ??= Mat.empty(); cvRun( - () => cimgproc.AdaptiveThreshold( + () => cimgproc.cv_adaptiveThreshold( src.ref, dst!.ref, maxValue, @@ -1000,6 +1096,7 @@ Mat adaptiveThreshold( thresholdType, blockSize, C, + ffi.nullptr, ), ); return dst; @@ -1020,8 +1117,19 @@ Mat arrowedLine( int shift = 0, double tipLength = 0.1, }) { - cvRun(() => - cimgproc.ArrowedLine(img.ref, pt1.ref, pt2.ref, color.ref, thickness, line_type, shift, tipLength)); + cvRun( + () => cimgproc.cv_arrowedLine( + img.ref, + pt1.ref, + pt2.ref, + color.ref, + thickness, + line_type, + shift, + tipLength, + ffi.nullptr, + ), + ); return img; } @@ -1038,7 +1146,18 @@ Mat circle( int lineType = LINE_8, int shift = 0, }) { - cvRun(() => cimgproc.CircleWithParams(img.ref, center.ref, radius, color.ref, thickness, lineType, shift)); + cvRun( + () => cimgproc.cv_circle_1( + img.ref, + center.ref, + radius, + color.ref, + thickness, + lineType, + shift, + ffi.nullptr, + ), + ); return img; } @@ -1059,7 +1178,7 @@ Mat ellipse( int shift = 0, }) { cvRun( - () => cimgproc.EllipseWithParams( + () => cimgproc.cv_ellipse_1( img.ref, center.ref, axes.ref, @@ -1070,6 +1189,7 @@ Mat ellipse( thickness, lineType, shift, + ffi.nullptr, ), ); return img; @@ -1088,7 +1208,9 @@ Mat line( int lineType = LINE_8, int shift = 0, }) { - cvRun(() => cimgproc.Line(img.ref, pt1.ref, pt2.ref, color.ref, thickness, lineType, shift)); + cvRun( + () => cimgproc.cv_line(img.ref, pt1.ref, pt2.ref, color.ref, thickness, lineType, shift, ffi.nullptr), + ); return img; } @@ -1105,7 +1227,9 @@ Mat rectangle( int lineType = LINE_8, int shift = 0, }) { - cvRun(() => cimgproc.RectangleWithParams(img.ref, rect.ref, color.ref, thickness, lineType, shift)); + cvRun( + () => cimgproc.cv_rectangle_1(img.ref, rect.ref, color.ref, thickness, lineType, shift, ffi.nullptr), + ); return img; } @@ -1122,7 +1246,9 @@ Mat fillPoly( Point? offset, }) { offset ??= Point(0, 0); - cvRun(() => cimgproc.FillPolyWithParams(img.ref, pts.ref, color.ref, lineType, shift, offset!.ref)); + cvRun( + () => cimgproc.cv_fillPoly_1(img.ref, pts.ref, color.ref, lineType, shift, offset!.ref, ffi.nullptr), + ); return img; } @@ -1139,7 +1265,7 @@ Mat polylines( int lineType = LINE_8, int shift = 0, }) { - cvRun(() => cimgproc.Polylines(img.ref, pts.ref, isClosed, color.ref, thickness)); + cvRun(() => cimgproc.cv_polylines(img.ref, pts.ref, isClosed, color.ref, thickness, ffi.nullptr)); return img; } @@ -1159,8 +1285,17 @@ Mat polylines( final baseline = arena(); final size = calloc(); final textPtr = text.toNativeUtf8(allocator: arena); - cvRun(() => - cimgproc.GetTextSizeWithBaseline(textPtr.cast(), fontFace, fontScale, thickness, baseline, size)); + cvRun( + () => cimgproc.cv_getTextSize( + textPtr.cast(), + fontFace, + fontScale, + thickness, + baseline, + size, + ffi.nullptr, + ), + ); return (Size.fromPointer(size), baseline.value); }); } @@ -1185,7 +1320,7 @@ Mat putText( }) { final textPtr = text.toNativeUtf8().cast(); cvRun( - () => cimgproc.PutTextWithParams( + () => cimgproc.cv_putText_1( img.ref, textPtr, org.ref, @@ -1195,6 +1330,7 @@ Mat putText( thickness, lineType, bottomLeftOrigin, + ffi.nullptr, ), ); calloc.free(textPtr); @@ -1219,7 +1355,7 @@ Mat resize( int interpolation = INTER_LINEAR, }) { dst ??= Mat.empty(); - cvRun(() => cimgproc.Resize(src.ref, dst!.ref, dsize.cvd.ref, fx, fy, interpolation)); + cvRun(() => cimgproc.cv_resize(src.ref, dst!.ref, dsize.cvd.ref, fx, fy, interpolation, ffi.nullptr)); return dst; } @@ -1235,7 +1371,7 @@ Mat getRectSubPix( int patchType = -1, }) { patch ??= Mat.empty(); - cvRun(() => cimgproc.GetRectSubPix(image.ref, patchSize.cvd.ref, center.ref, patch!.ref)); + cvRun(() => cimgproc.cv_getRectSubPix(image.ref, patchSize.cvd.ref, center.ref, patch!.ref, ffi.nullptr)); return patch; } @@ -1244,9 +1380,9 @@ Mat getRectSubPix( /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326 Mat getRotationMatrix2D(Point2f center, double angle, double scale) { - final mat = calloc(); - cvRun(() => cimgproc.GetRotationMatrix2D(center.ref, angle, scale, mat)); - return Mat.fromPointer(mat); + final mat = Mat.empty(); + cvRun(() => cimgproc.cv_getRotationMatrix2D(center.ref, angle, scale, mat.ref, ffi.nullptr)); + return mat; } /// WarpAffine applies an affine transformation to an image. @@ -1265,7 +1401,7 @@ Mat warpAffine( dst ??= Mat.empty(); borderValue ??= Scalar(); cvRun( - () => cimgproc.WarpAffineWithParams( + () => cimgproc.cv_warpAffine_1( src.ref, dst!.ref, M.ref, @@ -1273,6 +1409,7 @@ Mat warpAffine( flags, borderMode, borderValue!.ref, + ffi.nullptr, ), ); return dst; @@ -1295,7 +1432,7 @@ Mat warpPerspective( dst ??= Mat.empty(); borderValue ??= Scalar(); cvRun( - () => cimgproc.WarpPerspectiveWithParams( + () => cimgproc.cv_warpPerspective_1( src.ref, dst!.ref, M.ref, @@ -1303,6 +1440,7 @@ Mat warpPerspective( flags, borderMode, borderValue!.ref, + ffi.nullptr, ), ); return dst; @@ -1313,7 +1451,7 @@ Mat warpPerspective( /// For further details, please see: /// https:///docs.opencv.org/4.x/d3/d47/group__imgproc__segmentation.html#ga3267243e4d3f95165d55a618c65ac6e1 Mat watershed(InputArray image, InputOutputArray markers) { - cvRun(() => cimgproc.Watershed(image.ref, markers.ref)); + cvRun(() => cimgproc.cv_watershed(image.ref, markers.ref, ffi.nullptr)); return markers; } @@ -1323,7 +1461,7 @@ Mat watershed(InputArray image, InputOutputArray markers) { /// https:///docs.opencv.org/master/d3/d50/group__imgproc__colormap.html#gadf478a5e5ff49d8aa24e726ea6f65d15 Mat applyColorMap(InputArray src, int colormap, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.ApplyColorMap(src.ref, dst!.ref, colormap)); + cvRun(() => cimgproc.cv_applyColorMap(src.ref, dst!.ref, colormap, ffi.nullptr)); return dst; } @@ -1333,7 +1471,7 @@ Mat applyColorMap(InputArray src, int colormap, {OutputArray? dst}) { /// https:///docs.opencv.org/master/d3/d50/group__imgproc__colormap.html#gacb22288ddccc55f9bd9e6d492b409cae Mat applyCustomColorMap(InputArray src, InputArray userColor, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.ApplyCustomColorMap(src.ref, dst!.ref, userColor.ref)); + cvRun(() => cimgproc.cv_applyColorMap_1(src.ref, dst!.ref, userColor.ref, ffi.nullptr)); return dst; } @@ -1343,9 +1481,9 @@ Mat applyCustomColorMap(InputArray src, InputArray userColor, {OutputArray? dst} /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8c1ae0e3589a9d77fffc962c49b22043 Mat getPerspectiveTransform(VecPoint src, VecPoint dst, [int solveMethod = DECOMP_LU]) { - final mat = calloc(); - cvRun(() => cimgproc.GetPerspectiveTransform(src.ref, dst.ref, mat, solveMethod)); - return Mat.fromPointer(mat); + final mat = Mat.empty(); + cvRun(() => cimgproc.cv_getPerspectiveTransform(src.ref, dst.ref, mat.ref, solveMethod, ffi.nullptr)); + return mat; } /// GetPerspectiveTransform2f returns 3x3 perspective transformation for the @@ -1354,9 +1492,9 @@ Mat getPerspectiveTransform(VecPoint src, VecPoint dst, [int solveMethod = DECOM /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8c1ae0e3589a9d77fffc962c49b22043 Mat getPerspectiveTransform2f(VecPoint2f src, VecPoint2f dst, [int solveMethod = DECOMP_LU]) { - final mat = calloc(); - cvRun(() => cimgproc.GetPerspectiveTransform2f(src.ref, dst.ref, mat, solveMethod)); - return Mat.fromPointer(mat); + final mat = Mat.empty(); + cvRun(() => cimgproc.cv_getPerspectiveTransform2f(src.ref, dst.ref, mat.ref, solveMethod, ffi.nullptr)); + return mat; } /// GetAffineTransform returns a 2x3 affine transformation matrix for the @@ -1365,15 +1503,15 @@ Mat getPerspectiveTransform2f(VecPoint2f src, VecPoint2f dst, [int solveMethod = /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8f6d378f9f8eebb5cb55cd3ae295a999 Mat getAffineTransform(VecPoint src, VecPoint dst) { - final mat = calloc(); - cvRun(() => cimgproc.GetAffineTransform(src.ref, dst.ref, mat)); - return Mat.fromPointer(mat); + final mat = Mat.empty(); + cvRun(() => cimgproc.cv_getAffineTransform(src.ref, dst.ref, mat.ref, ffi.nullptr)); + return mat; } Mat getAffineTransform2f(VecPoint2f src, VecPoint2f dst) { - final mat = calloc(); - cvRun(() => cimgproc.GetAffineTransform2f(src.ref, dst.ref, mat)); - return Mat.fromPointer(mat); + final mat = Mat.empty(); + cvRun(() => cimgproc.cv_getAffineTransform2f(src.ref, dst.ref, mat.ref, ffi.nullptr)); + return mat; } /// DrawContours draws contours outlines or filled contours. @@ -1394,7 +1532,7 @@ Mat drawContours( offset ??= Point(0, 0); hierarchy ??= Mat.empty(); cvRun( - () => cimgproc.DrawContoursWithParams( + () => cimgproc.cv_drawContours_1( image.ref, contours.ref, contourIdx, @@ -1404,6 +1542,7 @@ Mat drawContours( hierarchy!.ref, maxLevel, offset!.ref, + ffi.nullptr, ), ); return image; @@ -1424,8 +1563,18 @@ Mat remap( }) { borderValue ??= Scalar(); dst ??= Mat.empty(); - cvRun(() => - cimgproc.Remap(src.ref, dst!.ref, map1.ref, map2.ref, interpolation, borderMode, borderValue!.ref)); + cvRun( + () => cimgproc.cv_remap( + src.ref, + dst!.ref, + map1.ref, + map2.ref, + interpolation, + borderMode, + borderValue!.ref, + ffi.nullptr, + ), + ); return dst; } @@ -1444,7 +1593,18 @@ Mat filter2D( }) { dst ??= Mat.empty(); anchor ??= Point(-1, -1); - cvRun(() => cimgproc.Filter2D(src.ref, dst!.ref, ddepth, kernel.ref, anchor!.ref, delta, borderType)); + cvRun( + () => cimgproc.cv_filter2D( + src.ref, + dst!.ref, + ddepth, + kernel.ref, + anchor!.ref, + delta, + borderType, + ffi.nullptr, + ), + ); return dst; } @@ -1465,7 +1625,7 @@ Mat sepFilter2D( anchor ??= Point(-1, -1); dst ??= Mat.empty(); cvRun( - () => cimgproc.SepFilter2D( + () => cimgproc.cv_sepFilter2D( src.ref, dst!.ref, ddepth, @@ -1474,6 +1634,7 @@ Mat sepFilter2D( anchor!.ref, delta, borderType, + ffi.nullptr, ), ); return dst; @@ -1485,7 +1646,7 @@ Mat sepFilter2D( /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gaec3a0b126a85b5ca2c667b16e0ae022d Mat logPolar(InputArray src, Point2f center, double M, int flags, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.LogPolar(src.ref, dst!.ref, center.ref, M, flags)); + cvRun(() => cimgproc.cv_logPolar(src.ref, dst!.ref, center.ref, M, flags, ffi.nullptr)); return dst; } @@ -1495,7 +1656,7 @@ Mat logPolar(InputArray src, Point2f center, double M, int flags, {OutputArray? /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gaa38a6884ac8b6e0b9bed47939b5362f3 Mat linearPolar(InputArray src, Point2f center, double maxRadius, int flags, {OutputArray? dst}) { dst ??= Mat.empty(); - cvRun(() => cimgproc.LinearPolar(src.ref, dst!.ref, center.ref, maxRadius, flags)); + cvRun(() => cimgproc.cv_linearPolar(src.ref, dst!.ref, center.ref, maxRadius, flags, ffi.nullptr)); return dst; } @@ -1505,7 +1666,7 @@ Mat linearPolar(InputArray src, Point2f center, double maxRadius, int flags, {Ou /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaf849da1fdafa67ee84b1e9a23b93f91f Mat fitLine(VecPoint points, int distType, double param, double reps, double aeps, {OutputArray? line}) { line ??= Mat.empty(); - cvRun(() => cimgproc.FitLine(points.ref, line!.ref, distType, param, reps, aeps)); + cvRun(() => cimgproc.cv_fitLine(points.ref, line!.ref, distType, param, reps, aeps, ffi.nullptr)); return line; } @@ -1516,7 +1677,7 @@ Mat fitLine(VecPoint points, int distType, double param, double reps, double aep double matchShapes(VecPoint contour1, VecPoint contour2, int method, double parameter) { return cvRunArena((arena) { final r = arena(); - cvRun(() => cimgproc.MatchShapes(contour1.ref, contour2.ref, method, parameter, r)); + cvRun(() => cimgproc.cv_matchShapes(contour1.ref, contour2.ref, method, parameter, r, ffi.nullptr)); return r.value; }); } @@ -1529,7 +1690,7 @@ double matchShapes(VecPoint contour1, VecPoint contour2, int method, double para /// https://docs.opencv.org/4.x/da/d54/group__imgproc__transform.html#ga57d3505a878a7e1a636645727ca08f51 Mat invertAffineTransform(InputArray M, {OutputArray? iM}) { iM ??= Mat.empty(); - cvRun(() => cimgproc.InvertAffineTransform(M.ref, iM!.ref)); + cvRun(() => cimgproc.cv_invertAffineTransform(M.ref, iM!.ref, ffi.nullptr)); return iM; } @@ -1542,7 +1703,7 @@ Mat invertAffineTransform(InputArray M, {OutputArray? iM}) { return cvRunArena<(Point2f, double)>((arena) { final p = arena(); final pp = calloc(); - cvRun(() => cimgproc.PhaseCorrelate(src1.ref, src2.ref, window!.ref, p, pp)); + cvRun(() => cimgproc.cv_phaseCorrelate(src1.ref, src2.ref, window!.ref, p, pp, ffi.nullptr)); return (Point2f.fromPointer(pp), p.value); }); } @@ -1554,9 +1715,9 @@ Mat invertAffineTransform(InputArray M, {OutputArray? iM}) { /// Mat accumulate(InputArray src, InputOutputArray dst, {InputArray? mask}) { if (mask == null) { - cvRun(() => cimgproc.Mat_Accumulate(src.ref, dst.ref)); + cvRun(() => cimgproc.cv_accumulate(src.ref, dst.ref, ffi.nullptr)); } else { - cvRun(() => cimgproc.Mat_AccumulateWithMask(src.ref, dst.ref, mask.ref)); + cvRun(() => cimgproc.cv_accumulate_1(src.ref, dst.ref, mask.ref, ffi.nullptr)); } return dst; } @@ -1567,9 +1728,9 @@ Mat accumulate(InputArray src, InputOutputArray dst, {InputArray? mask}) { /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#gacb75e7ffb573227088cef9ceaf80be8c Mat accumulateSquare(InputArray src, InputOutputArray dst, {InputArray? mask}) { if (mask == null) { - cvRun(() => cimgproc.Mat_AccumulateSquare(src.ref, dst.ref)); + cvRun(() => cimgproc.cv_accumulateSquare(src.ref, dst.ref, ffi.nullptr)); } else { - cvRun(() => cimgproc.Mat_AccumulateSquareWithMask(src.ref, dst.ref, mask.ref)); + cvRun(() => cimgproc.cv_accumulateSquare_1(src.ref, dst.ref, mask.ref, ffi.nullptr)); } return dst; } @@ -1580,9 +1741,11 @@ Mat accumulateSquare(InputArray src, InputOutputArray dst, {InputArray? mask}) { /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#ga82518a940ecfda49460f66117ac82520 Mat accumulateProduct(InputArray src1, InputArray src2, InputOutputArray dst, {InputArray? mask}) { if (mask == null) { - cvRun(() => cimgproc.Mat_AccumulateProduct(src1.ref, src2.ref, dst.ref)); + cvRun(() => cimgproc.cv_accumulateProduct(src1.ref, src2.ref, dst.ref, ffi.nullptr)); } else { - cvRun(() => cimgproc.Mat_AccumulateProductWithMask(src1.ref, src2.ref, dst.ref, mask.ref)); + cvRun( + () => cimgproc.cv_accumulateProduct_1(src1.ref, src2.ref, dst.ref, mask.ref, ffi.nullptr), + ); } return dst; } @@ -1593,9 +1756,9 @@ Mat accumulateProduct(InputArray src1, InputArray src2, InputOutputArray dst, {I /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#ga4f9552b541187f61f6818e8d2d826bc7 Mat accumulateWeighted(InputArray src, InputOutputArray dst, double alpha, {InputArray? mask}) { if (mask == null) { - cvRun(() => cimgproc.Mat_AccumulatedWeighted(src.ref, dst.ref, alpha)); + cvRun(() => cimgproc.cv_accumulatedWeighted(src.ref, dst.ref, alpha, ffi.nullptr)); } else { - cvRun(() => cimgproc.Mat_AccumulatedWeightedWithMask(src.ref, dst.ref, alpha, mask.ref)); + cvRun(() => cimgproc.cv_accumulatedWeighted_1(src.ref, dst.ref, alpha, mask.ref, ffi.nullptr)); } return dst; } diff --git a/packages/dartcv/lib/src/imgproc/subdiv2d.dart b/packages/dartcv/lib/src/imgproc/subdiv2d.dart index ddf8c70d..09d07931 100644 --- a/packages/dartcv/lib/src/imgproc/subdiv2d.dart +++ b/packages/dartcv/lib/src/imgproc/subdiv2d.dart @@ -27,45 +27,45 @@ class Subdiv2D extends CvStruct { factory Subdiv2D.empty() { final p = calloc(); - cvRun(() => cimgproc.Subdiv2D_NewEmpty(p)); + cvRun(() => cimgproc.cv_Subdiv2D_create(p)); return Subdiv2D._(p); } factory Subdiv2D.fromRect(Rect rect) { final p = calloc(); - cvRun(() => cimgproc.Subdiv2D_NewWithRect(rect.ref, p)); + cvRun(() => cimgproc.cv_Subdiv2D_create_1(rect.ref, p)); return Subdiv2D._(p); } - static final finalizer = OcvFinalizer(cimgproc.addresses.Subdiv2D_Close); + static final finalizer = OcvFinalizer(cimgproc.addresses.cv_Subdiv2D_close); void dispose() { finalizer.detach(this); - cimgproc.Subdiv2D_Close(ptr); + cimgproc.cv_Subdiv2D_close(ptr); } /// Returns the edge destination. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aee192f95bf19c74619641496c457586d (int rval, Point2f dstpt) edgeDst(int edge) { - return using<(int, Point2f)>((arena) { - final pp = calloc(); - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_EdgeDst(ref, edge, pp, p)); - return (p.value, Point2f.fromPointer(pp)); - }); + final pp = calloc(); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_edgeDst(ref, edge, pp, p, ffi.nullptr)); + final rval = (p.value, Point2f.fromPointer(pp)); + calloc.free(p); + return rval; } /// Returns the edge origin. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a5563e3cae0a9b95df63e72f0c12f9389 (int rval, Point2f orgpt) edgeOrg(int edge) { - return using<(int, Point2f)>((arena) { - final pp = calloc(); - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_EdgeOrg(ref, edge, pp, p)); - return (p.value, Point2f.fromPointer(pp)); - }); + final pp = calloc(); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_edgeOrg(ref, edge, pp, p, ffi.nullptr)); + final rval = (p.value, Point2f.fromPointer(pp)); + calloc.free(p); + return rval; } /// Finds the subdivision vertex closest to the given point. @@ -77,12 +77,12 @@ class Subdiv2D extends CvStruct { /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a3ec256af000e129e08eb5f269ccdeb0f (int rval, Point2f nearestPt) findNearest(Point2f pt) { - return using<(int, Point2f)>((arena) { - final pp = calloc(); - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_FindNearest(ref, pt.ref, pp, p)); - return (p.value, Point2f.fromPointer(pp)); - }); + final pp = calloc(); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_findNearest(ref, pt.ref, pp, p, ffi.nullptr)); + final rval = (p.value, Point2f.fromPointer(pp)); + calloc.free(p); + return rval; } /// Returns one of the edges related to the given edge. @@ -101,37 +101,36 @@ class Subdiv2D extends CvStruct { /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#af73f08576709bad7a36f8f8e5fc43c84 int getEdge(int edge, int nextEdgeType) { - return using((arena) { - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_GetEdge(ref, edge, nextEdgeType, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_getEdge(ref, edge, nextEdgeType, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// Returns a list of all edges. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#ab527c11e9938eed53cf9c790afa9416d List getEdgeList() { - return using>((arena) { - final pv = arena>(); - final psize = arena(); - cvRun(() => cimgproc.Subdiv2D_GetEdgeList(ref, pv, psize)); - return List.generate(psize.value, (i) { - final v = pv.value[i]; - return Vec4f(v.val1, v.val2, v.val3, v.val4); - }); + final pv = calloc>(); + final psize = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_getEdgeList(ref, pv, psize, ffi.nullptr)); + final rval = List.generate(psize.value, (i) { + final v = pv.value[i]; + return Vec4f(v.val1, v.val2, v.val3, v.val4); }); + calloc.free(psize); + calloc.free(pv); + return rval; } /// Returns a list of the leading edge ID connected to each triangle. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a2d02a1d66ef7f8f267beb549cb2823f1 VecI32 getLeadingEdgeList() { - return using((arena) { - final pv = calloc(); - cvRun(() => cimgproc.Subdiv2D_GetLeadingEdgeList(ref, pv)); - return VecI32.fromPointer(pv); - }); + final pv = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_getLeadingEdgeList(ref, pv, ffi.nullptr)); + return VecI32.fromPointer(pv); } /// Returns a list of all triangles. @@ -141,59 +140,56 @@ class Subdiv2D extends CvStruct { /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a26bfe32209bc8ae9ecc53e93da01e466 List getTriangleList() { - return using>((arena) { - final pv = arena>(); - final psize = arena(); - cvRun(() => cimgproc.Subdiv2D_GetTriangleList(ref, pv, psize)); - return List.generate(psize.value, (i) { - final v = pv.value[i]; - return Vec6f(v.val1, v.val2, v.val3, v.val4, v.val5, v.val6); - }); + final pv = calloc>(); + final psize = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_getTriangleList(ref, pv, psize, ffi.nullptr)); + final rval = List.generate(psize.value, (i) { + final v = pv.value[i]; + return Vec6f(v.val1, v.val2, v.val3, v.val4, v.val5, v.val6); }); + calloc.free(psize); + calloc.free(pv); + return rval; } /// Returns vertex location from vertex ID. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a5297daca30f90d1e6d0cc5a75ba76351 (Point2f rval, int firstEdge) getVertex(int vertex) { - return using<(Point2f, int)>((arena) { - final pp = calloc(); - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_GetVertex(ref, vertex, p, pp)); - return (Point2f.fromPointer(pp), p.value); - }); + final pp = calloc(); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_getVertex(ref, vertex, p, pp, ffi.nullptr)); + final rval = (Point2f.fromPointer(pp), p.value); + calloc.free(p); + return rval; } /// Returns a list of all Voronoi facets. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a3a9e080423475be056a79da4c04741ea (VecVecPoint2f facetList, VecPoint2f facetCenters) getVoronoiFacetList(VecI32 idx) { - return using<(VecVecPoint2f, VecPoint2f)>((arena) { - final pf = calloc(); - final pfc = calloc(); - cvRun(() => cimgproc.Subdiv2D_GetVoronoiFacetList(ref, idx.ref, pf, pfc)); - return (VecVecPoint2f.fromPointer(pf), VecPoint2f.fromPointer(pfc)); - }); + final pf = calloc(); + final pfc = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_getVoronoiFacetList(ref, idx.ref, pf, pfc, ffi.nullptr)); + return (VecVecPoint2f.fromPointer(pf), VecPoint2f.fromPointer(pfc)); } /// Creates a new empty Delaunay subdivision. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#ae4a3d65e798c46fd6ce64370f24b0287 void initDelaunay(Rect rect) { - return using((arena) { - cvRun(() => cimgproc.Subdiv2D_InitDelaunay(ref, rect.ref)); - }); + cvRun(() => cimgproc.cv_Subdiv2D_initDelaunay(ref, rect.ref, ffi.nullptr)); } /// Insert multiple points into a Delaunay triangulation. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a37223a499032ef57364f1372ad0c9c2e int insert(Point2f pt) { - return using((arena) { - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_Insert(ref, pt.ref, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_insert(ref, pt.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// Insert a single point into a Delaunay triangulation. @@ -202,9 +198,7 @@ class Subdiv2D extends CvStruct { /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a18a6c9999210d769538297d843c613f2 void insertVec(VecPoint2f pv) { - return using((arena) { - cvRun(() => cimgproc.Subdiv2D_InsertVec(ref, pv.ref)); - }); + cvRun(() => cimgproc.cv_Subdiv2D_insertVec(ref, pv.ref, ffi.nullptr)); } /// Returns the location of a point within a Delaunay triangulation. @@ -220,44 +214,46 @@ class Subdiv2D extends CvStruct { /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aec8f1fd5a802f62faa97520b465897d7 (int rval, int edge, int vertex) locate(Point2f pt) { - return using<(int, int, int)>((arena) { - final edge = arena(); - final vertex = arena(); - final rval = arena(); - cvRun(() => cimgproc.Subdiv2D_Locate(ref, pt.ref, edge, vertex, rval)); - return (rval.value, edge.value, vertex.value); - }); + final pedge = calloc(); + final pvertex = calloc(); + final prval = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_locate(ref, pt.ref, pedge, pvertex, prval, ffi.nullptr)); + final rval = (prval.value, pedge.value, pvertex.value); + calloc.free(pedge); + calloc.free(pvertex); + calloc.free(prval); + return rval; } /// Returns next edge around the edge origin. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a36ebf478e2546615c2db457106393acb int nextEdge(int edge) { - return using((arena) { - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_NextEdge(ref, edge, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_nextEdge(ref, edge, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// Returns another edge of the same quad-edge. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aa1179507f651b67c22e06517fbc6a145 int rotateEdge(int edge, int rotate) { - return using((arena) { - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_RotateEdge(ref, edge, rotate, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_rotateEdge(ref, edge, rotate, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aabbb10b8d5b0311b7e22040fc0db56b4 int symEdge(int edge) { - return using((arena) { - final p = arena(); - cvRun(() => cimgproc.Subdiv2D_SymEdge(ref, edge, p)); - return p.value; - }); + final p = calloc(); + cvRun(() => cimgproc.cv_Subdiv2D_symEdge(ref, edge, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } @override diff --git a/packages/dartcv/lib/src/imgproc/subdiv2d_async.dart b/packages/dartcv/lib/src/imgproc/subdiv2d_async.dart index 2d4ba90e..bd8827b6 100644 --- a/packages/dartcv/lib/src/imgproc/subdiv2d_async.dart +++ b/packages/dartcv/lib/src/imgproc/subdiv2d_async.dart @@ -15,41 +15,42 @@ import '../core/point.dart'; import '../core/rect.dart'; import '../core/vec.dart'; import '../g/imgproc.g.dart' as cvg; -import '../g/types.g.dart' as cvt; import '../native_lib.dart' show cimgproc; import 'subdiv2d.dart'; /// Async version of [Subdiv2D] extension Subdiv2DAsync on Subdiv2D { - static Future emptyAsync() async => cvRunAsync( - cimgproc.Subdiv2D_NewEmpty_Async, - (c, p) => c.complete(Subdiv2D.fromPointer(p.cast())), - ); - - static Future fromRectAsync(Rect rect) async => cvRunAsync( - (callback) => cimgproc.Subdiv2D_NewWithRect_Async(rect.ref, callback), - (c, p) => c.complete(Subdiv2D.fromPointer(p.cast())), - ); - /// Returns the edge destination. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aee192f95bf19c74619641496c457586d - Future<(int rval, Point2f dstpt)> edgeDstAsync(int edge) async => - cvRunAsync2((callback) => cimgproc.Subdiv2D_EdgeDst_Async(ref, edge, callback), (completer, p, p1) { - final rval = p.cast().value; + Future<(int rval, Point2f dstpt)> edgeDstAsync(int edge) async { + final pp = calloc(); + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_edgeDst(ref, edge, pp, p, callback), + (c) { + final rval = (p.value, Point2f.fromPointer(pp)); calloc.free(p); - completer.complete((rval, Point2f.fromPointer(p1.cast()))); - }); + return c.complete(rval); + }, + ); + } /// Returns the edge origin. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a5563e3cae0a9b95df63e72f0c12f9389 - Future<(int rval, Point2f orgpt)> edgeOrgAsync(int edge) async => - cvRunAsync2((callback) => cimgproc.Subdiv2D_EdgeOrg_Async(ref, edge, callback), (completer, p, p1) { - final rval = p.cast().value; + Future<(int rval, Point2f orgpt)> edgeOrgAsync(int edge) async { + final pp = calloc(); + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_edgeOrg(ref, edge, pp, p, callback), + (c) { + final rval = (p.value, Point2f.fromPointer(pp)); calloc.free(p); - completer.complete((rval, Point2f.fromPointer(p1.cast()))); - }); + return c.complete(rval); + }, + ); + } /// Finds the subdivision vertex closest to the given point. /// @@ -59,13 +60,18 @@ extension Subdiv2DAsync on Subdiv2D { /// though the facet (located using locate() ) is used as a starting point. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a3ec256af000e129e08eb5f269ccdeb0f - Future<(int rval, Point2f nearestPt)> findNearestAsync(Point2f pt) async => - cvRunAsync2((callback) => cimgproc.Subdiv2D_FindNearest_Async(ref, pt.ref, callback), - (completer, p, p1) { - final rval = p.cast().value; + Future<(int rval, Point2f nearestPt)> findNearestAsync(Point2f pt) async { + final pp = calloc(); + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_findNearest(ref, pt.ref, pp, p, callback), + (c) { + final rval = (p.value, Point2f.fromPointer(pp)); calloc.free(p); - completer.complete((rval, Point2f.fromPointer(p1.cast()))); - }); + return c.complete(rval); + }, + ); + } /// Returns one of the edges related to the given edge. /// @@ -82,24 +88,50 @@ extension Subdiv2DAsync on Subdiv2D { /// - [PREV_AROUND_RIGHT] previous around the right facet (reversed eDnext ) /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#af73f08576709bad7a36f8f8e5fc43c84 - Future getEdgeAsync(int edge, int nextEdgeType) async => cvRunAsync( - (callback) => cimgproc.Subdiv2D_GetEdge_Async(ref, edge, nextEdgeType, callback), - intCompleter, - ); + Future getEdgeAsync(int edge, int nextEdgeType) async { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_getEdge(ref, edge, nextEdgeType, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); + } /// Returns a list of all edges. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#ab527c11e9938eed53cf9c790afa9416d - Future getEdgeListAsync() async => cvRunAsync1( - (callback) => cimgproc.Subdiv2D_GetEdgeList_Async(ref, callback), - (completer, p) => completer.complete(VecVec4f.fromPointer(p.cast())), - ); + Future> getEdgeListAsync() async { + final pv = calloc>(); + final psize = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_getEdgeList(ref, pv, psize, callback), + (c) { + final rval = List.generate(psize.value, (i) { + final v = pv.value[i]; + return Vec4f(v.val1, v.val2, v.val3, v.val4); + }); + calloc.free(psize); + calloc.free(pv); + return c.complete(rval); + }, + ); + } /// Returns a list of the leading edge ID connected to each triangle. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a2d02a1d66ef7f8f267beb549cb2823f1 - Future getLeadingEdgeListAsync() async => - cvRunAsync((callback) => cimgproc.Subdiv2D_GetLeadingEdgeList_Async(ref, callback), vecI32Completer); + Future getLeadingEdgeListAsync() async { + final pv = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_getLeadingEdgeList(ref, pv, callback), + (c) { + return c.complete(VecI32.fromPointer(pv)); + }, + ); + } /// Returns a list of all triangles. /// @@ -107,58 +139,93 @@ extension Subdiv2DAsync on Subdiv2D { /// i.e. p1_x = v[0], p1_y = v[1], p2_x = v[2], p2_y = v[3], p3_x = v[4], p3_y = v[5]. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a26bfe32209bc8ae9ecc53e93da01e466 - Future getTriangleListAsync() async => cvRunAsync1( - (callback) => cimgproc.Subdiv2D_GetTriangleList_Async(ref, callback), - (completer, p) => completer.complete(VecVec6f.fromPointer(p.cast())), - ); + Future> getTriangleListAsync() async { + final pv = calloc>(); + final psize = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_getTriangleList(ref, pv, psize, callback), + (c) { + final rval = List.generate(psize.value, (i) { + final v = pv.value[i]; + return Vec6f(v.val1, v.val2, v.val3, v.val4, v.val5, v.val6); + }); + calloc.free(psize); + calloc.free(pv); + return c.complete(rval); + }, + ); + } /// Returns vertex location from vertex ID. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a5297daca30f90d1e6d0cc5a75ba76351 - Future<(Point2f rval, int firstEdge)> getVertexAsync(int vertex) async => - cvRunAsync2((callback) => cimgproc.Subdiv2D_GetVertex_Async(ref, vertex, callback), (c, p, p1) { - final firstEdge = p1.cast().value; - calloc.free(p1); - c.complete((Point2f.fromPointer(p.cast()), firstEdge)); - }); + Future<(Point2f rval, int firstEdge)> getVertexAsync(int vertex) async { + final pp = calloc(); + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_getVertex(ref, vertex, p, pp, callback), + (c) { + final rval = (Point2f.fromPointer(pp), p.value); + calloc.free(p); + return c.complete(rval); + }, + ); + } /// Returns a list of all Voronoi facets. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a3a9e080423475be056a79da4c04741ea - Future<(VecVecPoint2f facetList, VecPoint2f facetCenters)> getVoronoiFacetListAsync(VecI32 idx) async => - cvRunAsync2( - (callback) => cimgproc.Subdiv2D_GetVoronoiFacetList_Async(ref, idx.ref, callback), - (completer, p, p1) => completer.complete( - ( - VecVecPoint2f.fromPointer(p.cast()), - VecPoint2f.fromPointer(p1.cast()) - ), - ), - ); + Future<(VecVecPoint2f facetList, VecPoint2f facetCenters)> getVoronoiFacetListAsync(VecI32 idx) async { + final pf = calloc(); + final pfc = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_getVoronoiFacetList(ref, idx.ref, pf, pfc, callback), + (c) { + return c.complete((VecVecPoint2f.fromPointer(pf), VecPoint2f.fromPointer(pfc))); + }, + ); + } /// Creates a new empty Delaunay subdivision. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#ae4a3d65e798c46fd6ce64370f24b0287 - Future initDelaunayAsync(Rect rect) async => cvRunAsync0( - (callback) => cimgproc.Subdiv2D_InitDelaunay_Async(ref, rect.ref, callback), - (c) => c.complete(), - ); + Future initDelaunayAsync(Rect rect) async { + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_initDelaunay(ref, rect.ref, callback), + (c) { + c.complete(); + }, + ); + } /// Insert multiple points into a Delaunay triangulation. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a37223a499032ef57364f1372ad0c9c2e - Future insertAsync(Point2f pt) async => - cvRunAsync((callback) => cimgproc.Subdiv2D_Insert_Async(ref, pt.ref, callback), intCompleter); + Future insertAsync(Point2f pt) async { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_insert(ref, pt.ref, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); + } /// Insert a single point into a Delaunay triangulation. /// /// The function locates the input point within the subdivision and gives one of the triangle edges or vertices. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a18a6c9999210d769538297d843c613f2 - Future insertVecAsync(VecPoint2f pv) async => cvRunAsync0( - (callback) => cimgproc.Subdiv2D_InsertVec_Async(ref, pv.ref, callback), - (c) => c.complete(), - ); + Future insertVecAsync(VecPoint2f pv) async { + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_insertVec(ref, pv.ref, callback), + (c) { + c.complete(); + }, + ); + } /// Returns the location of a point within a Delaunay triangulation. /// @@ -172,31 +239,62 @@ extension Subdiv2DAsync on Subdiv2D { /// - One of input arguments is invalid. A runtime error is raised or, if silent or "parent" error processing mode is selected, [PTLOC_ERROR] is returned. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aec8f1fd5a802f62faa97520b465897d7 - Future<(int rval, int edge, int vertex)> locateAsync(Point2f pt) async => - cvRunAsync3((callback) => cimgproc.Subdiv2D_Locate_Async(ref, pt.ref, callback), - (completer, p, p1, p2) { - final rval = p.cast().value; - calloc.free(p); - final edge = p1.cast().value; - calloc.free(p1); - final vertex = p2.cast().value; - calloc.free(p2); - completer.complete((rval, edge, vertex)); - }); + Future<(int rval, int edge, int vertex)> locateAsync(Point2f pt) async { + final pedge = calloc(); + final pvertex = calloc(); + final prval = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_locate(ref, pt.ref, pedge, pvertex, prval, callback), + (c) { + final rval = (prval.value, pedge.value, pvertex.value); + calloc.free(pedge); + calloc.free(pvertex); + calloc.free(prval); + return c.complete(rval); + }, + ); + } /// Returns next edge around the edge origin. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#a36ebf478e2546615c2db457106393acb - Future nextEdgeAsync(int edge) async => - cvRunAsync((callback) => cimgproc.Subdiv2D_NextEdge_Async(ref, edge, callback), intCompleter); + Future nextEdgeAsync(int edge) async { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_nextEdge(ref, edge, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); + } /// Returns another edge of the same quad-edge. /// /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aa1179507f651b67c22e06517fbc6a145 - Future rotateEdgeAsync(int edge, int rotate) async => - cvRunAsync((callback) => cimgproc.Subdiv2D_RotateEdge_Async(ref, edge, rotate, callback), intCompleter); + Future rotateEdgeAsync(int edge, int rotate) async { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_rotateEdge(ref, edge, rotate, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); + } /// https://docs.opencv.org/4.x/df/dbf/classcv_1_1Subdiv2D.html#aabbb10b8d5b0311b7e22040fc0db56b4 - Future symEdgeAsync(int edge) async => - cvRunAsync((callback) => cimgproc.Subdiv2D_SymEdge_Async(ref, edge, callback), intCompleter); + Future symEdgeAsync(int edge) async { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_Subdiv2D_symEdge(ref, edge, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); + } } From adfee11a3d4c9aa3edef4c476c874c9c7c26b24e Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sun, 20 Oct 2024 20:31:07 +0800 Subject: [PATCH 18/30] finish imgproc --- packages/dartcv/lib/src/imgproc/imgproc.dart | 188 +- .../dartcv/lib/src/imgproc/imgproc_async.dart | 1904 +++++++++++------ 2 files changed, 1330 insertions(+), 762 deletions(-) diff --git a/packages/dartcv/lib/src/imgproc/imgproc.dart b/packages/dartcv/lib/src/imgproc/imgproc.dart index adc29993..3a25fcbd 100644 --- a/packages/dartcv/lib/src/imgproc/imgproc.dart +++ b/packages/dartcv/lib/src/imgproc/imgproc.dart @@ -154,23 +154,22 @@ Mat calcBackProject( /// For further details, please see: /// https:///docs.opencv.org/master/d6/dc7/group__imgproc__hist.html#gaf4190090efa5c47cb367cf97a9a519bd double compareHist(Mat hist1, Mat hist2, {int method = 0}) { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cimgproc.cv_compareHist(hist1.ref, hist2.ref, method, p, ffi.nullptr)); - return p.value; - }); + final p = calloc(); + cvRun(() => cimgproc.cv_compareHist(hist1.ref, hist2.ref, method, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// ClipLine clips the line against the image rectangle. /// For further details, please see: /// https:///docs.opencv.org/master/d6/d6e/group__imgproc__draw.html#gaf483cb46ad6b049bc35ec67052ef1c2c (bool, Point, Point) clipLine(Rect imgRect, Point pt1, Point pt2) { - final bool r = using((arena) { - final rval = arena(); - cvRun(() => cimgproc.cv_clipLine(imgRect.ref, pt1.ref, pt2.ref, rval, ffi.nullptr)); - return rval.value; - }); - return (r, pt1, pt2); + final p = calloc(); + cvRun(() => cimgproc.cv_clipLine(imgRect.ref, pt1.ref, pt2.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return (rval, pt1, pt2); } /// BilateralFilter applies a bilateral filter to an image. @@ -420,11 +419,11 @@ VecPoint2f boxPoints(RotatedRect rect, {VecPoint2f? pts}) { /// For further details, please see: /// https:///docs.opencv.org/3.3.0/d3/dc0/group__imgproc__shape.html#ga2c759ed9f497d4a618048a2f56dc97f1 double contourArea(VecPoint contour) { - return cvRunArena((arena) { - final area = arena(); - cvRun(() => cimgproc.cv_contourArea(contour.ref, area, ffi.nullptr)); - return area.value; - }); + final p = calloc(); + cvRun(() => cimgproc.cv_contourArea(contour.ref, p, ffi.nullptr)); + final rval = p.value; + calloc.free(p); + return rval; } /// MinAreaRect finds a rotated rectangle of the minimum area enclosing the input 2D point set. @@ -452,12 +451,12 @@ RotatedRect fitEllipse(VecPoint points) { /// For further details, please see: /// https:///docs.opencv.org/3.4/d3/dc0/group__imgproc__shape.html#ga8ce13c24081bbc7151e9326f412190f1 (Point2f center, double radius) minEnclosingCircle(VecPoint points) { - return cvRunArena<(Point2f, double)>((arena) { - final center = calloc(); - final radius = arena(); - cvRun(() => cimgproc.cv_minEnclosingCircle(points.ref, center, radius, ffi.nullptr)); - return (Point2f.fromPointer(center), radius.value); - }); + final center = calloc(); + final pRadius = calloc(); + cvRun(() => cimgproc.cv_minEnclosingCircle(points.ref, center, pRadius, ffi.nullptr)); + final rval = (Point2f.fromPointer(center), pRadius.value); + calloc.free(pRadius); + return rval; } /// FindContours finds contours in a binary image. @@ -476,11 +475,11 @@ RotatedRect fitEllipse(VecPoint points) { /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga1a539e8db2135af2566103705d7a5722 double pointPolygonTest(VecPoint points, Point2f pt, bool measureDist) { - return cvRunArena((arena) { - final r = arena(); - cvRun(() => cimgproc.cv_pointPolygonTest(points.ref, pt.ref, measureDist, r, ffi.nullptr)); - return r.value; - }); + final r = calloc(); + cvRun(() => cimgproc.cv_pointPolygonTest(points.ref, pt.ref, measureDist, r, ffi.nullptr)); + final rval = r.value; + calloc.free(r); + return rval; } /// ConnectedComponents computes the connected components labeled image of boolean image. @@ -488,21 +487,21 @@ double pointPolygonTest(VecPoint points, Point2f pt, bool measureDist) { /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaedef8c7340499ca391d459122e51bef5 int connectedComponents(Mat image, Mat labels, int connectivity, int ltype, int ccltype) { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => cimgproc.cv_connectedComponents( - image.ref, - labels.ref, - connectivity, - ltype, - ccltype, - p, - ffi.nullptr, - ), - ); - return p.value; - }); + final p = calloc(); + cvRun( + () => cimgproc.cv_connectedComponents( + image.ref, + labels.ref, + connectivity, + ltype, + ccltype, + p, + ffi.nullptr, + ), + ); + final rval = p.value; + calloc.free(p); + return rval; } /// ConnectedComponentsWithStats computes the connected components labeled image of boolean @@ -519,23 +518,23 @@ int connectedComponentsWithStats( int ltype, int ccltype, ) { - return cvRunArena((arena) { - final p = arena(); - cvRun( - () => cimgproc.cv_connectedComponents_1( - src.ref, - labels.ref, - stats.ref, - centroids.ref, - connectivity, - ltype, - ccltype, - p, - ffi.nullptr, - ), - ); - return p.value; - }); + final p = calloc(); + cvRun( + () => cimgproc.cv_connectedComponents_1( + src.ref, + labels.ref, + stats.ref, + centroids.ref, + connectivity, + ltype, + ccltype, + p, + ffi.nullptr, + ), + ); + final rval = p.value; + calloc.free(p); + return rval; } /// MatchTemplate compares a template against overlapped image regions. @@ -1065,12 +1064,11 @@ Mat HoughLinesPointSet( OutputArray? dst, }) { dst ??= Mat.empty(); - final rval = cvRunArena((arena) { - final p = arena(); - cvRun(() => cimgproc.cv_threshold(src.ref, dst!.ref, thresh, maxval, type, p, ffi.nullptr)); - return p.value; - }); - return (rval, dst); + final p = calloc(); + cvRun(() => cimgproc.cv_threshold(src.ref, dst!.ref, thresh, maxval, type, p, ffi.nullptr)); + final rval = (p.value, dst); + calloc.free(p); + return rval; } /// AdaptiveThreshold applies a fixed-level threshold to each array element. @@ -1281,23 +1279,23 @@ Mat polylines( double fontScale, int thickness, ) { - return using<(Size, int)>((arena) { - final baseline = arena(); - final size = calloc(); - final textPtr = text.toNativeUtf8(allocator: arena); - cvRun( - () => cimgproc.cv_getTextSize( - textPtr.cast(), - fontFace, - fontScale, - thickness, - baseline, - size, - ffi.nullptr, - ), - ); - return (Size.fromPointer(size), baseline.value); - }); + final pBaseline = calloc(); + final size = calloc(); + final textPtr = text.toNativeUtf8().cast(); + cvRun( + () => cimgproc.cv_getTextSize( + textPtr, + fontFace, + fontScale, + thickness, + pBaseline, + size, + ffi.nullptr, + ), + ); + final rval = (Size.fromPointer(size), pBaseline.value); + calloc.free(pBaseline); + return rval; } /// PutTextWithParams draws a text string. @@ -1675,11 +1673,11 @@ Mat fitLine(VecPoint points, int distType, double param, double reps, double aep /// For further details, please see: /// https:///docs.opencv.org/4.x/d3/dc0/group__imgproc__shape.html#gaadc90cb16e2362c9bd6e7363e6e4c317 double matchShapes(VecPoint contour1, VecPoint contour2, int method, double parameter) { - return cvRunArena((arena) { - final r = arena(); - cvRun(() => cimgproc.cv_matchShapes(contour1.ref, contour2.ref, method, parameter, r, ffi.nullptr)); - return r.value; - }); + final r = calloc(); + cvRun(() => cimgproc.cv_matchShapes(contour1.ref, contour2.ref, method, parameter, r, ffi.nullptr)); + final rval = r.value; + calloc.free(r); + return rval; } /// Inverts an affine transformation. @@ -1700,12 +1698,12 @@ Mat invertAffineTransform(InputArray M, {OutputArray? iM}) { /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#ga552420a2ace9ef3fb053cd630fdb4952 (Point2f rval, double response) phaseCorrelate(InputArray src1, InputArray src2, {InputArray? window}) { window ??= Mat.empty(); - return cvRunArena<(Point2f, double)>((arena) { - final p = arena(); - final pp = calloc(); - cvRun(() => cimgproc.cv_phaseCorrelate(src1.ref, src2.ref, window!.ref, p, pp, ffi.nullptr)); - return (Point2f.fromPointer(pp), p.value); - }); + final p = calloc(); + final pp = calloc(); + cvRun(() => cimgproc.cv_phaseCorrelate(src1.ref, src2.ref, window!.ref, p, pp, ffi.nullptr)); + final rval = (Point2f.fromPointer(pp), p.value); + calloc.free(p); + return rval; } /// Adds the square of a source image to the accumulator image. @@ -1743,9 +1741,7 @@ Mat accumulateProduct(InputArray src1, InputArray src2, InputOutputArray dst, {I if (mask == null) { cvRun(() => cimgproc.cv_accumulateProduct(src1.ref, src2.ref, dst.ref, ffi.nullptr)); } else { - cvRun( - () => cimgproc.cv_accumulateProduct_1(src1.ref, src2.ref, dst.ref, mask.ref, ffi.nullptr), - ); + cvRun(() => cimgproc.cv_accumulateProduct_1(src1.ref, src2.ref, dst.ref, mask.ref, ffi.nullptr)); } return dst; } diff --git a/packages/dartcv/lib/src/imgproc/imgproc_async.dart b/packages/dartcv/lib/src/imgproc/imgproc_async.dart index dec29f58..f171a32b 100644 --- a/packages/dartcv/lib/src/imgproc/imgproc_async.dart +++ b/packages/dartcv/lib/src/imgproc/imgproc_async.dart @@ -8,7 +8,6 @@ library cv.imgproc; import 'dart:async'; import 'dart:ffi' as ffi; -import 'dart:ffi'; import 'package:ffi/ffi.dart'; @@ -31,40 +30,60 @@ import '../native_lib.dart' show cimgproc; /// For further details, please see: /// /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga0012a5fdaea70b8a9970165d98722b4c -Future approxPolyDPAsync(VecPoint curve, double epsilon, bool closed) async => cvRunAsync( - (callback) => cimgproc.ApproxPolyDP_Async(curve.ref, epsilon, closed, callback), - vecPointCompleter, - ); +Future approxPolyDPAsync(VecPoint curve, double epsilon, bool closed) { + final vec = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_approxPolyDP(curve.ref, epsilon, closed, vec, callback), + (c) { + return c.complete(VecPoint.fromPointer(vec)); + }, + ); +} /// ArcLength calculates a contour perimeter or a curve length. /// /// For further details, please see: /// /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga8d26483c636be6b35c3ec6335798a47c -Future arcLengthAsync(VecPoint curve, bool closed) async => - cvRunAsync((callback) => cimgproc.ArcLength_Async(curve.ref, closed, callback), doubleCompleter); +Future arcLengthAsync(VecPoint curve, bool closed) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_arcLength(curve.ref, closed, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// ConvexHull finds the convex hull of a point set. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga014b28e56cb8854c0de4a211cb2be656 -Future convexHullAsync( - VecPoint points, { - Mat? hull, - bool clockwise = false, - bool returnPoints = true, -}) async => - cvRunAsync( - (callback) => cimgproc.ConvexHull_Async(points.ref, clockwise, returnPoints, callback), - matCompleter, - ); +Future convexHullAsync(VecPoint points, {Mat? hull, bool clockwise = false, bool returnPoints = true}) { + hull ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_convexHull(points.ref, hull!.ref, clockwise, returnPoints, callback), + (c) { + return c.complete(hull); + }, + ); +} /// ConvexityDefects finds the convexity defects of a contour. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gada4437098113fd8683c932e0567f47ba -Future convexityDefectsAsync(VecPoint contour, Mat hull, {Mat? convexityDefects}) async => - cvRunAsync((callback) => cimgproc.ConvexityDefects_Async(contour.ref, hull.ref, callback), matCompleter); +Future convexityDefectsAsync(VecPoint contour, Mat hull, {Mat? convexityDefects}) { + convexityDefects ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_convexityDefects(contour.ref, hull.ref, convexityDefects!.ref, callback), + (c) { + return c.complete(convexityDefects); + }, + ); +} /// CvtColor converts an image from one color space to another. /// It converts the src Mat image to the dst Mat using the @@ -72,16 +91,29 @@ Future convexityDefectsAsync(VecPoint contour, Mat hull, {Mat? convexityDef /// /// For further details, please see: /// http:///docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0 -Future cvtColorAsync(Mat src, int code) async => - cvRunAsync((callback) => cimgproc.CvtColor_Async(src.ref, code, callback), matCompleter); +Future cvtColorAsync(Mat src, int code, {Mat? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_cvtColor(src.ref, dst!.ref, code, callback), + (c) { + return c.complete(dst); + }, + ); +} /// EqualizeHist Equalizes the histogram of a grayscale image. /// /// For further details, please see: /// https:///docs.opencv.org/master/d6/dc7/group__imgproc__hist.html#ga7e54091f0c937d49bf84152a16f76d6e -Future equalizeHistAsync(Mat src) async { +Future equalizeHistAsync(Mat src, {Mat? dst}) { cvAssert(src.channels == 1, "src must be grayscale"); - return cvRunAsync((callback) => cimgproc.EqualizeHist_Async(src.ref, callback), matCompleter); + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_equalizeHist(src.ref, dst!.ref, callback), + (c) { + return c.complete(dst); + }, + ); } /// CalcHist Calculates a histogram of a set of images @@ -94,20 +126,26 @@ Future calcHistAsync( Mat mask, VecI32 histSize, VecF32 ranges, { + Mat? hist, bool accumulate = false, -}) async => - cvRunAsync( - (callback) => cimgproc.CalcHist_Async( - src.ref, - channels.ref, - mask.ref, - histSize.ref, - ranges.ref, - accumulate, - callback, - ), - matCompleter, - ); +}) { + hist ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_calcHist( + src.ref, + channels.ref, + mask.ref, + hist!.ref, + histSize.ref, + ranges.ref, + accumulate, + callback, + ), + (c) { + return c.complete(hist); + }, + ); +} /// CalcBackProject calculates the back projection of a histogram. /// @@ -118,33 +156,56 @@ Future calcBackProjectAsync( VecI32 channels, Mat hist, VecF32 ranges, { + Mat? dst, double scale = 1.0, -}) async => - cvRunAsync( - (callback) => - cimgproc.CalcBackProject_Async(src.ref, channels.ref, hist.ref, ranges.ref, scale, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_calcBackProject( + src.ref, + channels.ref, + hist.ref, + dst!.ref, + ranges.ref, + scale, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// CompareHist Compares two histograms. /// mode: HistCompMethods /// For further details, please see: /// https:///docs.opencv.org/master/d6/dc7/group__imgproc__hist.html#gaf4190090efa5c47cb367cf97a9a519bd -Future compareHistAsync(Mat hist1, Mat hist2, {int method = 0}) async => cvRunAsync( - (callback) => cimgproc.CompareHist_Async(hist1.ref, hist2.ref, method, callback), - doubleCompleter, - ); +Future compareHistAsync(Mat hist1, Mat hist2, {int method = 0}) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_compareHist(hist1.ref, hist2.ref, method, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// ClipLine clips the line against the image rectangle. /// For further details, please see: /// https:///docs.opencv.org/master/d6/d6e/group__imgproc__draw.html#gaf483cb46ad6b049bc35ec67052ef1c2c -Future<(bool, Point, Point)> clipLineAsync(Rect imgRect, Point pt1, Point pt2) async => - cvRunAsync((callback) => cimgproc.ClipLine_Async(imgRect.ref, pt1.ref, pt2.ref, callback), - (completer, p) { - final success = p.cast().value; +Future<(bool, Point, Point)> clipLineAsync(Rect imgRect, Point pt1, Point pt2) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_clipLine(imgRect.ref, pt1.ref, pt2.ref, p, callback), + (c) { + final rval = p.value; calloc.free(p); - completer.complete((success, pt1, pt2)); - }); + return c.complete((rval, pt1, pt2)); + }, + ); +} /// BilateralFilter applies a bilateral filter to an image. /// @@ -156,32 +217,93 @@ Future<(bool, Point, Point)> clipLineAsync(Rect imgRect, Point pt1, Point pt2) a /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga9d7064d478c95d60003cf839430737ed -Future bilateralFilterAsync(Mat src, int diameter, double sigmaColor, double sigmaSpace) async => - cvRunAsync( - (callback) => cimgproc.BilateralFilter_Async(src.ref, diameter, sigmaColor, sigmaSpace, callback), - matCompleter, - ); +Future bilateralFilterAsync(Mat src, int diameter, double sigmaColor, double sigmaSpace, {Mat? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_bilateralFilter(src.ref, dst!.ref, diameter, sigmaColor, sigmaSpace, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Blur blurs an image Mat using a normalized box filter. /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37 -Future blurAsync(Mat src, (int, int) ksize) async => - cvRunAsync((callback) => cimgproc.Blur_Async(src.ref, ksize.cvd.ref, callback), matCompleter); +Future blurAsync(Mat src, (int, int) ksize, {Mat? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_blur(src.ref, dst!.ref, ksize.cvd.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// BoxFilter blurs an image using the box filter. /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gad533230ebf2d42509547d514f7d3fbc3 -Future boxFilterAsync(Mat src, int depth, (int, int) ksize) async => - cvRunAsync((callback) => cimgproc.BoxFilter_Async(src.ref, depth, ksize.cvd.ref, callback), matCompleter); +Future boxFilterAsync( + Mat src, + int depth, + (int, int) ksize, { + Point? anchor, + bool normalize = true, + int borderType = BORDER_DEFAULT, + Mat? dst, +}) { + dst ??= Mat.empty(); + anchor ??= Point(-1, -1); + return cvRunAsync0( + (callback) => cimgproc.cv_boxFilter( + src.ref, + dst!.ref, + depth, + ksize.cvd.ref, + anchor!.ref, + normalize, + borderType, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// SqBoxFilter calculates the normalized sum of squares of the pixel values overlapping the filter. /// /// For further details, please see: /// https://docs.opencv.org/4.x/d4/d86/group__imgproc__filter.html#ga76e863e7869912edbe88321253b72688 -Future sqrBoxFilterAsync(Mat src, int depth, (int, int) ksize) async => cvRunAsync( - (callback) => cimgproc.SqBoxFilter_Async(src.ref, depth, ksize.cvd.ref, callback), matCompleter); +Future sqrBoxFilterAsync( + Mat src, + int depth, + (int, int) ksize, { + Point? anchor, + bool normalize = true, + int borderType = BORDER_DEFAULT, + Mat? dst, +}) { + dst ??= Mat.empty(); + anchor ??= Point(-1, -1); + return cvRunAsync0( + (callback) => cimgproc.cv_sqrBoxFilter( + src.ref, + dst!.ref, + depth, + ksize.cvd.ref, + anchor!.ref, + normalize, + borderType, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// Dilate dilates an image by using a specific structuring element. /// @@ -190,23 +312,31 @@ Future sqrBoxFilterAsync(Mat src, int depth, (int, int) ksize) async => cvR Future dilateAsync( Mat src, Mat kernel, { + Mat? dst, Point? anchor, int iterations = 1, int borderType = BORDER_CONSTANT, Scalar? borderValue, -}) async => - cvRunAsync( - (callback) => cimgproc.DilateWithParams_Async( - src.ref, - kernel.ref, - anchor?.ref ?? Point(-1, -1).ref, - iterations, - borderType, - borderValue?.ref ?? Scalar().ref, - callback, - ), - matCompleter, - ); +}) { + borderValue ??= Scalar(); + dst ??= Mat.empty(); + anchor ??= Point(-1, -1); + return cvRunAsync0( + (callback) => cimgproc.cv_dilate_1( + src.ref, + dst!.ref, + kernel.ref, + anchor!.ref, + iterations, + borderType, + borderValue!.ref, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// Erode erodes an image by using a specific structuring element. /// @@ -220,19 +350,26 @@ Future erodeAsync( int iterations = 1, int borderType = BORDER_CONSTANT, Scalar? borderValue, -}) async => - cvRunAsync( - (callback) => cimgproc.ErodeWithParams_Async( - src.ref, - kernel.ref, - anchor?.ref ?? Point(-1, -1).ref, - iterations, - borderType, - borderValue?.ref ?? Scalar().ref, - callback, - ), - matCompleter, - ); +}) { + borderValue ??= Scalar(); + dst ??= Mat.empty(); + anchor ??= Point(-1, -1); + return cvRunAsync0( + (callback) => cimgproc.cv_erode_1( + src.ref, + dst!.ref, + kernel.ref, + anchor!.ref, + iterations, + borderType, + borderValue!.ref, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// DistanceTransform Calculates the distance to the closest zero pixel for each pixel of the source image. /// @@ -246,12 +383,27 @@ Future<(Mat dst, Mat labels)> distanceTransformAsync( Mat src, int distanceType, int maskSize, - int labelType, -) async => - cvRunAsync2( - (callback) => cimgproc.DistanceTransform_Async(src.ref, distanceType, maskSize, labelType, callback), - matCompleter2, - ); + int labelType, { + Mat? dst, + Mat? labels, +}) { + dst ??= Mat.empty(); + labels ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_distanceTransform( + src.ref, + dst!.ref, + labels!.ref, + distanceType, + maskSize, + labelType, + callback, + ), + (c) { + return c.complete((dst!, labels!)); + }, + ); +} /// Fills a connected component with the given color. /// @@ -264,152 +416,253 @@ Future<(int rval, Mat image, Mat mask, Rect rect)> floodFillAsync( Scalar? loDiff, Scalar? upDiff, int flags = 4, -}) async => - cvRunAsync2( - (callback) => cimgproc.FloodFill_Async( - image.ref, - mask?.ref ?? Mat.empty().ref, - seedPoint.ref, - newVal.ref, - loDiff?.ref ?? Scalar().ref, - upDiff?.ref ?? Scalar().ref, - flags, - callback, - ), - (c, prval, prect) { - final rval = prval.cast().value; - calloc.free(prval); - final rect = Rect.fromPointer(prect.cast()); - c.complete((rval, image, mask ?? Mat.empty(), rect)); - }, - ); +}) { + loDiff ??= Scalar(); + upDiff ??= Scalar(); + mask ??= Mat.empty(); + final pRect = calloc(); + final pRval = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_floodFill( + image.ref, + mask!.ref, + seedPoint.ref, + newVal.ref, + pRect, + loDiff!.ref, + upDiff!.ref, + flags, + pRval, + callback, + ), + (c) { + final rval = pRval.value; + calloc.free(pRval); + return c.complete((rval, image, mask!, Rect.fromPointer(pRect))); + }, + ); +} /// BoundingRect calculates the up-right bounding rectangle of a point set. /// /// For further details, please see: /// https:///docs.opencv.org/3.3.0/d3/dc0/group__imgproc__shape.html#gacb413ddce8e48ff3ca61ed7cf626a366 -Future boundingRectAsync(VecPoint points) async => - cvRunAsync((callback) => cimgproc.BoundingRect_Async(points.ref, callback), rectCompleter); +Future boundingRectAsync(VecPoint points) async { + final rect = calloc(); + return cvRunAsync0((callback) => cimgproc.cv_boundingRect(points.ref, rect, callback), (c) { + return c.complete(Rect.fromPointer(rect)); + }); +} /// BoxPoints finds the four vertices of a rotated rect. Useful to draw the rotated rectangle. /// /// return: [bottom left, top left, top right, bottom right] /// For further Details, please see: /// https://docs.opencv.org/4.10.0/d3/dc0/group__imgproc__shape.html#gaf78d467e024b4d7936cf9397185d2f5c -Future boxPointsAsync(RotatedRect rect) async => - cvRunAsync((callback) => cimgproc.BoxPoints_Async(rect.ref, callback), vecPoint2fCompleter); +Future boxPointsAsync(RotatedRect rect, {VecPoint2f? pts}) { + if (pts == null) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_boxPoints(rect.ref, p, callback), + (c) { + return c.complete(VecPoint2f.fromPointer(p)); + }, + ); + } + return cvRunAsync0( + (callback) => cimgproc.cv_boxPoints(rect.ref, pts.ptr, callback), + (c) { + return c.complete(pts); + }, + ); +} /// ContourArea calculates a contour area. /// /// For further details, please see: /// https:///docs.opencv.org/3.3.0/d3/dc0/group__imgproc__shape.html#ga2c759ed9f497d4a618048a2f56dc97f1 -Future contourAreaAsync(VecPoint contour) async => - cvRunAsync((callback) => cimgproc.ContourArea_Async(contour.ref, callback), doubleCompleter); +Future contourAreaAsync(VecPoint contour) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_contourArea(contour.ref, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// MinAreaRect finds a rotated rectangle of the minimum area enclosing the input 2D point set. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga3d476a3417130ae5154aea421ca7ead9 -Future minAreaRectAsync(VecPoint points) async => - cvRunAsync((callback) => cimgproc.MinAreaRect_Async(points.ref, callback), rotatedRectCompleter); +Future minAreaRectAsync(VecPoint points) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_minAreaRect(points.ref, p, callback), + (c) { + return c.complete(RotatedRect.fromPointer(p)); + }, + ); +} /// FitEllipse Fits an ellipse around a set of 2D points. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaf259efaad93098103d6c27b9e4900ffa -Future fitEllipseAsync(VecPoint points) async => - cvRunAsync((callback) => cimgproc.FitEllipse_Async(points.ref, callback), rotatedRectCompleter); +Future fitEllipseAsync(VecPoint points) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_fitEllipse(points.ref, p, callback), + (c) { + return c.complete(RotatedRect.fromPointer(p)); + }, + ); +} /// MinEnclosingCircle finds a circle of the minimum area enclosing the input 2D point set. /// /// For further details, please see: /// https:///docs.opencv.org/3.4/d3/dc0/group__imgproc__shape.html#ga8ce13c24081bbc7151e9326f412190f1 -Future<(Point2f center, double radius)> minEnclosingCircleAsync(VecPoint points) async => - cvRunAsync2((callback) => cimgproc.MinEnclosingCircle_Async(points.ref, callback), (completer, p, p1) { - final radius = p1.cast().value; - calloc.free(p1); - completer.complete((Point2f.fromPointer(p.cast()), radius)); - }); +Future<(Point2f center, double radius)> minEnclosingCircleAsync(VecPoint points) { + final center = calloc(); + final pRadius = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_minEnclosingCircle(points.ref, center, pRadius, callback), + (c) { + final rval = (Point2f.fromPointer(center), pRadius.value); + calloc.free(pRadius); + return c.complete(rval); + }, + ); +} /// FindContours finds contours in a binary image. /// /// For further details, please see: /// https://docs.opencv.org/4.x/d3/dc0/group__imgproc__shape.html#gadf1ad6a0b82947fa1fe3c3d497f260e0 -Future<(Contours contours, Mat hierarchy)> findContoursAsync(Mat src, int mode, int method) async => - cvRunAsync2( - (callback) => cimgproc.FindContours_Async(src.ref, mode, method, callback), - (c, p, p1) => - c.complete((Contours.fromPointer(p.cast()), Mat.fromPointer(p1.cast()))), - ); +Future<(Contours contours, Mat hierarchy)> findContoursAsync(Mat src, int mode, int method) { + final hierarchy = Mat.empty(); + final v = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_findContours(src.ref, hierarchy.ref, mode, method, v, callback), + (c) { + return c.complete((Contours.fromPointer(v), hierarchy)); + }, + ); +} /// PointPolygonTest performs a point-in-contour test. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga1a539e8db2135af2566103705d7a5722 -Future pointPolygonTestAsync(VecPoint points, Point2f pt, bool measureDist) async => cvRunAsync( - (callback) => cimgproc.PointPolygonTest_Async(points.ref, pt.ref, measureDist, callback), - doubleCompleter, - ); +Future pointPolygonTestAsync(VecPoint points, Point2f pt, bool measureDist) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_pointPolygonTest(points.ref, pt.ref, measureDist, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// ConnectedComponents computes the connected components labeled image of boolean image. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaedef8c7340499ca391d459122e51bef5 -Future<(int rval, Mat labels)> connectedComponentsAsync( +Future connectedComponentsAsync( Mat image, + OutputArray labels, int connectivity, int ltype, int ccltype, -) async => - cvRunAsync2( - (callback) => cimgproc.ConnectedComponents_Async(image.ref, connectivity, ltype, ccltype, callback), - (completer, p, p1) { - final rval = p.cast().value; +) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_connectedComponents( + image.ref, + labels.ref, + connectivity, + ltype, + ccltype, + p, + callback, + ), + (c) { + final rval = p.value; calloc.free(p); - completer.complete((rval, Mat.fromPointer(p1.cast()))); - }); + return c.complete(rval); + }, + ); +} /// ConnectedComponentsWithStats computes the connected components labeled image of boolean /// image and also produces a statistics output for each label. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga107a78bf7cd25dec05fb4dfc5c9e765f -Future<(int rval, Mat labels, Mat stats, Mat centroids)> connectedComponentsWithStatsAsync( +Future connectedComponentsWithStatsAsync( Mat src, + Mat labels, + Mat stats, + Mat centroids, int connectivity, int ltype, int ccltype, -) async => - cvRunAsync4( - (callback) => - cimgproc.ConnectedComponentsWithStats_Async(src.ref, connectivity, ltype, ccltype, callback), - (completer, p, p1, p2, p3) { - final rval = p.cast().value; - calloc.free(p); - final labels = Mat.fromPointer(p1.cast()); - final stats = Mat.fromPointer(p2.cast()); - final centroids = Mat.fromPointer(p3.cast()); - completer.complete((rval, labels, stats, centroids)); - }, - ); +) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_connectedComponents_1( + src.ref, + labels.ref, + stats.ref, + centroids.ref, + connectivity, + ltype, + ccltype, + p, + callback, + ), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// MatchTemplate compares a template against overlapped image regions. /// /// For further details, please see: /// https:///docs.opencv.org/master/df/dfb/group__imgproc__object.html#ga586ebfb0a7fb604b35a23d85391329be -Future matchTemplateAsync(Mat image, Mat templ, int method, {Mat? mask}) async => cvRunAsync( - (callback) => - cimgproc.MatchTemplate_Async(image.ref, templ.ref, method, mask?.ref ?? Mat.empty().ref, callback), - matCompleter, - ); +Future matchTemplateAsync(Mat image, Mat templ, int method, {OutputArray? result, Mat? mask}) { + mask ??= Mat.empty(); + result ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_matchTemplate(image.ref, templ.ref, result!.ref, method, mask!.ref, callback), + (c) { + return c.complete(result); + }, + ); +} /// Moments calculates all of the moments up to the third order of a polygon /// or rasterized shape. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga556a180f43cab22649c23ada36a8a139 -Future momentsAsync(Mat src, {bool binaryImage = false}) async => - cvRunAsync((callback) => cimgproc.Moments_Async(src.ref, binaryImage, callback), momentsCompleter); +Future momentsAsync(Mat src, {bool binaryImage = false}) { + final m = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_moments(src.ref, binaryImage, m, callback), + (c) { + return c.complete(Moments.fromPointer(m)); + }, + ); +} /// PyrDown blurs an image and downsamples it. /// @@ -417,13 +670,18 @@ Future momentsAsync(Mat src, {bool binaryImage = false}) async => /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaf9bba239dfca11654cb7f50f889fc2ff Future pyrDownAsync( Mat src, { + Mat? dst, (int, int) dstsize = (0, 0), int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync( - (callback) => cimgproc.PyrDown_Async(src.ref, dstsize.cvd.ref, borderType, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_pyrDown(src.ref, dst!.ref, dstsize.cvd.ref, borderType, callback), + (c) { + return c.complete(dst); + }, + ); +} /// PyrUp upsamples an image and then blurs it. /// @@ -434,19 +692,27 @@ Future pyrUpAsync( Mat? dst, (int, int) dstsize = (0, 0), int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync( - (callback) => cimgproc.PyrUp_Async(src.ref, dstsize.cvd.ref, borderType, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_pyrUp(src.ref, dst!.ref, dstsize.cvd.ref, borderType, callback), + (c) { + return c.complete(dst); + }, + ); +} /// MorphologyDefaultBorder returns "magic" border value for erosion and dilation. /// It is automatically transformed to Scalar::all(-DBL_MAX) for dilation. /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga94756fad83d9d24d29c9bf478558c40a -Future morphologyDefaultBorderValueAsync() async => - cvRunAsync(cimgproc.MorphologyDefaultBorderValue_Async, scalarCompleter); +Future morphologyDefaultBorderValueAsync() async { + final s = calloc(); + return cvRunAsync0((callback) => cimgproc.cv_morphologyDefaultBorderValue(s, callback), (c) { + return c.complete(Scalar.fromPointer(s)); + }); +} /// MorphologyEx performs advanced morphological transformations. /// @@ -461,31 +727,43 @@ Future morphologyExAsync( int iterations = 1, int borderType = BORDER_CONSTANT, Scalar? borderValue, -}) async => - cvRunAsync( - (callback) => cimgproc.MorphologyExWithParams_Async( - src.ref, - op, - kernel.ref, - anchor?.ref ?? Point(-1, -1).ref, - iterations, - borderType, - borderValue?.ref ?? Scalar().ref, - callback, - ), - matCompleter, - ); +}) { + borderValue = borderValue ?? Scalar(); + dst ??= Mat.empty(); + anchor ??= Point(-1, -1); + return cvRunAsync0( + (callback) => cimgproc.cv_morphologyEx_1( + src.ref, + dst!.ref, + op, + kernel.ref, + anchor!.ref, + iterations, + borderType, + borderValue!.ref, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// GetStructuringElement returns a structuring element of the specified size /// and shape for morphological operations. /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gac342a1bb6eabf6f55c803b09268e36dc -Future getStructuringElementAsync(int shape, (int, int) ksize, {Point? anchor}) async => cvRunAsync( - (callback) => cimgproc.GetStructuringElement_Async( - shape, ksize.cvd.ref, anchor?.ref ?? Point(-1, -1).ref, callback), - matCompleter, - ); +Future getStructuringElementAsync(int shape, (int, int) ksize, {Point? anchor}) { + anchor ??= Point(-1, -1); + final mat = Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_getStructuringElement(shape, ksize.cvd.ref, mat.ref, callback), + (c) { + return c.complete(mat); + }, + ); +} /// GaussianBlur blurs an image Mat using a Gaussian filter. /// The function convolves the src Mat image into the dst Mat using @@ -500,18 +778,30 @@ Future gaussianBlurAsync( Mat? dst, double sigmaY = 0, int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync( - (callback) => cimgproc.GaussianBlur_Async(src.ref, ksize.cvd.ref, sigmaX, sigmaY, borderType, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => + cimgproc.cv_GaussianBlur(src.ref, dst!.ref, ksize.cvd.ref, sigmaX, sigmaY, borderType, callback), + (c) { + return c.complete(dst); + }, + ); +} /// GetGaussianKernel returns Gaussian filter coefficients. /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gac05a120c1ae92a6060dd0db190a61afa -Future getGaussianKernelAsync(int ksize, double sigma, {int ktype = 6}) async => - cvRunAsync((callback) => cimgproc.GetGaussianKernel_Async(ksize, sigma, ktype, callback), matCompleter); +Future getGaussianKernelAsync(int ksize, double sigma, {int ktype = 6}) { + final mat = Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_getGaussianKernel(ksize, sigma, ktype, mat.ref, callback), + (c) { + return c.complete(mat); + }, + ); +} /// Sobel calculates the first, second, third, or mixed image derivatives using an extended Sobel operator /// @@ -522,15 +812,21 @@ Future sobelAsync( int ddepth, int dx, int dy, { + Mat? dst, int ksize = 3, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync( - (callback) => cimgproc.Sobel_Async(src.ref, ddepth, dx, dy, ksize, scale, delta, borderType, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => + cimgproc.cv_Sobel(src.ref, dst!.ref, ddepth, dx, dy, ksize, scale, delta, borderType, callback), + (c) { + return c.complete(dst); + }, + ); +} /// SpatialGradient calculates the first order image derivative in both x and y using a Sobel operator. /// @@ -538,13 +834,20 @@ Future sobelAsync( /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga405d03b20c782b65a4daf54d233239a2 Future<(Mat dx, Mat dy)> spatialGradientAsync( Mat src, { + Mat? dx, + Mat? dy, int ksize = 3, int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync2( - (callback) => cimgproc.SpatialGradient_Async(src.ref, ksize, borderType, callback), - matCompleter2, - ); +}) { + dx ??= Mat.empty(); + dy ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_spatialGradient(src.ref, dx!.ref, dy!.ref, ksize, borderType, callback), + (c) { + return c.complete((dx!, dy!)); + }, + ); +} /// Laplacian calculates the Laplacian of an image. /// @@ -553,15 +856,20 @@ Future<(Mat dx, Mat dy)> spatialGradientAsync( Future laplacianAsync( Mat src, int ddepth, { + Mat? dst, int ksize = 1, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync( - (callback) => cimgproc.Laplacian_Async(src.ref, ddepth, ksize, scale, delta, borderType, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_Laplacian(src.ref, dst!.ref, ddepth, ksize, scale, delta, borderType, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Scharr calculates the first x- or y- image derivative using Scharr operator. /// @@ -572,21 +880,33 @@ Future scharrAsync( int ddepth, int dx, int dy, { + Mat? dst, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync( - (callback) => cimgproc.Scharr_Async(src.ref, ddepth, dx, dy, scale, delta, borderType, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_Scharr(src.ref, dst!.ref, ddepth, dx, dy, scale, delta, borderType, callback), + (c) { + return c.complete(dst); + }, + ); +} /// MedianBlur blurs an image using the median filter. /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9 -Future medianBlurAsync(Mat src, int ksize) async => - cvRunAsync((callback) => cimgproc.MedianBlur_Async(src.ref, ksize, callback), matCompleter); +Future medianBlurAsync(Mat src, int ksize, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_medianBlur(src.ref, dst!.ref, ksize, callback), + (c) { + return c.complete(dst); + }, + ); +} /// Canny finds edges in an image using the Canny algorithm. /// The function finds edges in the input image image and marks @@ -602,14 +922,26 @@ Future cannyAsync( Mat image, double threshold1, double threshold2, { + OutputArray? edges, int apertureSize = 3, bool l2gradient = false, -}) async => - cvRunAsync( - (callback) => - cimgproc.Canny_Async(image.ref, threshold1, threshold2, apertureSize, l2gradient, callback), - matCompleter, - ); +}) { + edges ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_canny( + image.ref, + edges!.ref, + threshold1, + threshold2, + apertureSize, + l2gradient, + callback, + ), + (c) { + return c.complete(edges); + }, + ); +} /// CornerSubPix Refines the corner locations. The function iterates to find /// the sub-pixel accurate location of corners or radial saddle points. @@ -622,18 +954,17 @@ Future cornerSubPixAsync( (int, int) winSize, (int, int) zeroZone, [ (int, int, double) criteria = (TERM_COUNT + TERM_EPS, 30, 1e-4), -]) async => - cvRunAsync0( - (callback) => cimgproc.CornerSubPix_Async( - image.ref, - corners.ref, - winSize.cvd.ref, - zeroZone.cvd.ref, - criteria.cvd.ref, - callback, - ), - (completer) => completer.complete(corners), - ); +]) { + final size = winSize.cvd; + final zone = zeroZone.cvd; + final c = criteria.toTermCriteria(); + return cvRunAsync0( + (callback) => cimgproc.cv_cornerSubPix(image.ref, corners.ref, size.ref, zone.ref, c.ref, callback), + (c) { + return c.complete(corners); + }, + ); +} /// GoodFeaturesToTrack determines strong corners on an image. The function /// finds the most prominent corners in the image or in the specified image region. @@ -645,42 +976,53 @@ Future goodFeaturesToTrackAsync( int maxCorners, double qualityLevel, double minDistance, { + VecPoint2f? corners, InputArray? mask, int blockSize = 3, int? gradientSize, bool useHarrisDetector = false, double k = 0.04, -}) async => - gradientSize == null - ? cvRunAsync( - (callback) => cimgproc.GoodFeaturesToTrack_Async( - image.ref, - maxCorners, - qualityLevel, - minDistance, - mask?.ref ?? Mat.empty().ref, - blockSize, - useHarrisDetector, - k, - callback, - ), - vecPoint2fCompleter, - ) - : cvRunAsync( - (callback) => cimgproc.GoodFeaturesToTrackWithGradient_Async( - image.ref, - maxCorners, - qualityLevel, - minDistance, - mask?.ref ?? Mat.empty().ref, - blockSize, - gradientSize, - useHarrisDetector, - k, - callback, - ), - vecPoint2fCompleter, - ); +}) { + final pCorners = corners?.ptr ?? calloc(); + mask ??= Mat.empty(); + if (gradientSize == null) { + return cvRunAsync0( + (callback) => cimgproc.cv_goodFeaturesToTrack( + image.ref, + pCorners, + maxCorners, + qualityLevel, + minDistance, + mask!.ref, + blockSize, + useHarrisDetector, + k, + callback, + ), + (c) { + return c.complete(corners ?? VecPoint2f.fromPointer(pCorners)); + }, + ); + } + return cvRunAsync0( + (callback) => cimgproc.cv_goodFeaturesToTrack_1( + image.ref, + pCorners, + maxCorners, + qualityLevel, + minDistance, + mask!.ref, + blockSize, + gradientSize, + useHarrisDetector, + k, + callback, + ), + (c) { + return c.complete(corners ?? VecPoint2f.fromPointer(pCorners)); + }, + ); +} /// Grabcut runs the GrabCut algorithm. /// The function implements the GrabCut image segmentation algorithm. @@ -694,20 +1036,23 @@ Future<(Mat mask, Mat bgdModel, Mat fgdModel)> grabCutAsync( InputOutputArray fgdModel, int iterCount, { int mode = GC_EVAL, -}) async => - cvRunAsync0( - (callback) => cimgproc.GrabCut_Async( - img.ref, - mask.ref, - rect.ref, - bgdModel.ref, - fgdModel.ref, - iterCount, - mode, - callback, - ), - (completer) => completer.complete((mask, bgdModel, fgdModel)), - ); +}) { + return cvRunAsync0( + (callback) => cimgproc.cv_grabCut( + img.ref, + mask.ref, + rect.ref, + bgdModel.ref, + fgdModel.ref, + iterCount, + mode, + callback, + ), + (c) { + return c.complete((mask, bgdModel, fgdModel)); + }, + ); +} /// HoughCircles finds circles in a grayscale image using the Hough transform. /// The only "method" currently supported is HoughGradient. If you want to pass @@ -720,25 +1065,31 @@ Future HoughCirclesAsync( int method, double dp, double minDist, { + OutputArray? circles, double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0, -}) async => - cvRunAsync( - (callback) => cimgproc.HoughCirclesWithParams_Async( - image.ref, - method, - dp, - minDist, - param1, - param2, - minRadius, - maxRadius, - callback, - ), - matCompleter, - ); +}) { + circles ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_HoughCircles_1( + image.ref, + circles!.ref, + method, + dp, + minDist, + param1, + param2, + minRadius, + maxRadius, + callback, + ), + (c) { + return c.complete(circles); + }, + ); +} /// HoughLines implements the standard or standard multi-scale Hough transform /// algorithm for line detection. For a good explanation of Hough transform, see: @@ -751,16 +1102,31 @@ Future HoughLinesAsync( double rho, double theta, int threshold, { + OutputArray? lines, double srn = 0, double stn = 0, double min_theta = 0, double max_theta = CV_PI, -}) async => - cvRunAsync( - (callback) => cimgproc.HoughLines_Async( - image.ref, rho, theta, threshold, srn, stn, min_theta, max_theta, callback), - matCompleter, - ); +}) { + lines ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_HoughLines( + image.ref, + lines!.ref, + rho, + theta, + threshold, + srn, + stn, + min_theta, + max_theta, + callback, + ), + (c) { + return c.complete(lines); + }, + ); +} /// HoughLinesP implements the probabilistic Hough transform /// algorithm for line detection. For a good explanation of Hough transform, see: @@ -773,21 +1139,27 @@ Future HoughLinesPAsync( double rho, double theta, int threshold, { + OutputArray? lines, double minLineLength = 0, double maxLineGap = 0, -}) async => - cvRunAsync( - (callback) => cimgproc.HoughLinesPWithParams_Async( - image.ref, - rho, - theta, - threshold, - minLineLength, - maxLineGap, - callback, - ), - matCompleter, - ); +}) { + lines ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_HoughLinesP_1( + image.ref, + lines!.ref, + rho, + theta, + threshold, + minLineLength, + maxLineGap, + callback, + ), + (c) { + return c.complete(lines); + }, + ); +} /// HoughLinesPointSet implements the Hough transform algorithm for line /// detection on a set of points. For a good explanation of Hough transform, see: @@ -804,33 +1176,51 @@ Future HoughLinesPointSetAsync( double rho_step, double min_theta, double max_theta, - double theta_step, -) async => - cvRunAsync( - (callback) => cimgproc.HoughLinesPointSet_Async( - point.ref, - lines_max, - threshold, - min_rho, - max_rho, - rho_step, - min_theta, - max_theta, - theta_step, - callback, - ), - matCompleter, - ); + double theta_step, { + OutputArray? lines, +}) { + lines ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_HoughLinesPointSet( + point.ref, + lines!.ref, + lines_max, + threshold, + min_rho, + max_rho, + rho_step, + min_theta, + max_theta, + theta_step, + callback, + ), + (c) { + return c.complete(lines); + }, + ); +} /// Integral calculates one or more integral images for the source image. /// For further details, please see: /// https:///docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#ga97b87bec26908237e8ba0f6e96d23e28 Future<(Mat sum, Mat sqsum, Mat tilted)> integralAsync( InputArray src, { + OutputArray? sum, + OutputArray? sqsum, + OutputArray? tilted, int sdepth = -1, int sqdepth = -1, -}) async => - cvRunAsync3((callback) => cimgproc.Integral_Async(src.ref, sdepth, sqdepth, callback), matCompleter3); +}) { + sum ??= Mat.empty(); + sqsum ??= Mat.empty(); + tilted ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_integral(src.ref, sum!.ref, sqsum!.ref, tilted!.ref, sdepth, sqdepth, callback), + (c) { + return c.complete((sum!, sqsum!, tilted!)); + }, + ); +} /// Threshold applies a fixed-level threshold to each array element. /// @@ -840,14 +1230,20 @@ Future<(double, Mat dst)> thresholdAsync( InputArray src, double thresh, double maxval, - int type, -) async => - cvRunAsync2((callback) => cimgproc.Threshold_Async(src.ref, thresh, maxval, type, callback), - (completer, p, p1) { - final rval = p.cast().value; + int type, { + OutputArray? dst, +}) { + dst ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_threshold(src.ref, dst!.ref, thresh, maxval, type, p, callback), + (c) { + final rval = (p.value, dst!); calloc.free(p); - completer.complete((rval, Mat.fromPointer(p1.cast()))); - }); + return c.complete(rval); + }, + ); +} /// AdaptiveThreshold applies a fixed-level threshold to each array element. /// @@ -859,20 +1255,26 @@ Future adaptiveThresholdAsync( int adaptiveMethod, int thresholdType, int blockSize, - double C, -) async => - cvRunAsync( - (callback) => cimgproc.AdaptiveThreshold_Async( - src.ref, - maxValue, - adaptiveMethod, - thresholdType, - blockSize, - C, - callback, - ), - matCompleter, - ); + double C, { + OutputArray? dst, +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_adaptiveThreshold( + src.ref, + dst!.ref, + maxValue, + adaptiveMethod, + thresholdType, + blockSize, + C, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// ArrowedLine draws a arrow segment pointing from the first point /// to the second one. @@ -888,21 +1290,24 @@ Future arrowedLineAsync( int line_type = 8, int shift = 0, double tipLength = 0.1, -}) async => - cvRunAsync0( - (callback) => cimgproc.ArrowedLine_Async( - img.ref, - pt1.ref, - pt2.ref, - color.ref, - thickness, - line_type, - shift, - tipLength, - callback, - ), - (completer) => completer.complete(img), - ); +}) { + return cvRunAsync0( + (callback) => cimgproc.cv_arrowedLine( + img.ref, + pt1.ref, + pt2.ref, + color.ref, + thickness, + line_type, + shift, + tipLength, + callback, + ), + (c) { + return c.complete(img); + }, + ); +} /// CircleWithParams draws a circle. /// @@ -916,20 +1321,23 @@ Future circleAsync( int thickness = 1, int lineType = LINE_8, int shift = 0, -}) async => - cvRunAsync0( - (callback) => cimgproc.CircleWithParams_Async( - img.ref, - center.ref, - radius, - color.ref, - thickness, - lineType, - shift, - callback, - ), - (completer) => completer.complete(img), - ); +}) { + return cvRunAsync0( + (callback) => cimgproc.cv_circle_1( + img.ref, + center.ref, + radius, + color.ref, + thickness, + lineType, + shift, + callback, + ), + (c) { + return c.complete(img); + }, + ); +} /// Ellipse draws a simple or thick elliptic arc or fills an ellipse sector. /// @@ -946,23 +1354,26 @@ Future ellipseAsync( int thickness = 1, int lineType = LINE_8, int shift = 0, -}) async => - cvRunAsync0( - (callback) => cimgproc.EllipseWithParams_Async( - img.ref, - center.ref, - axes.ref, - angle, - startAngle, - endAngle, - color.ref, - thickness, - lineType, - shift, - callback, - ), - (completer) => completer.complete(img), - ); +}) { + return cvRunAsync0( + (callback) => cimgproc.cv_ellipse_1( + img.ref, + center.ref, + axes.ref, + angle, + startAngle, + endAngle, + color.ref, + thickness, + lineType, + shift, + callback, + ), + (c) { + return c.complete(img); + }, + ); +} /// Line draws a line segment connecting two points. /// @@ -976,12 +1387,15 @@ Future lineAsync( int thickness = 1, int lineType = LINE_8, int shift = 0, -}) async => - cvRunAsync0( - (callback) => - cimgproc.Line_Async(img.ref, pt1.ref, pt2.ref, color.ref, thickness, lineType, shift, callback), - (completer) => completer.complete(img), - ); +}) { + return cvRunAsync0( + (callback) => + cimgproc.cv_line(img.ref, pt1.ref, pt2.ref, color.ref, thickness, lineType, shift, callback), + (c) { + return c.complete(img); + }, + ); +} /// Rectangle draws a simple, thick, or filled up-right rectangle. /// It renders a rectangle with the desired characteristics to the target Mat image. @@ -995,12 +1409,14 @@ Future rectangleAsync( int thickness = 1, int lineType = LINE_8, int shift = 0, -}) async => - cvRunAsync0( - (callback) => cimgproc.RectangleWithParams_Async( - img.ref, rect.ref, color.ref, thickness, lineType, shift, callback), - (completer) => completer.complete(img), - ); +}) { + return cvRunAsync0( + (callback) => cimgproc.cv_rectangle_1(img.ref, rect.ref, color.ref, thickness, lineType, shift, callback), + (c) { + return c.complete(img); + }, + ); +} /// FillPolyWithParams fills the area bounded by one or more polygons. /// @@ -1013,19 +1429,15 @@ Future fillPolyAsync( int lineType = LINE_8, int shift = 0, Point? offset, -}) async => - cvRunAsync0( - (callback) => cimgproc.FillPolyWithParams_Async( - img.ref, - pts.ref, - color.ref, - lineType, - shift, - offset?.ref ?? Point(-1, -1).ref, - callback, - ), - (completer) => completer.complete(img), - ); +}) { + offset ??= Point(0, 0); + return cvRunAsync0( + (callback) => cimgproc.cv_fillPoly_1(img.ref, pts.ref, color.ref, lineType, shift, offset!.ref, callback), + (c) { + return c.complete(img); + }, + ); +} /// Polylines draws several polygonal curves. /// @@ -1039,11 +1451,14 @@ Future polylinesAsync( int thickness = 1, int lineType = LINE_8, int shift = 0, -}) async => - cvRunAsync0( - (callback) => cimgproc.Polylines_Async(img.ref, pts.ref, isClosed, color.ref, thickness, callback), - (completer) => completer.complete(img), - ); +}) { + return cvRunAsync0( + (callback) => cimgproc.cv_polylines(img.ref, pts.ref, isClosed, color.ref, thickness, callback), + (c) { + return c.complete(img); + }, + ); +} /// GetTextSizeWithBaseline calculates the width and height of a text string including the basline of the text. /// It returns an image.Point with the size required to draw text using @@ -1056,18 +1471,26 @@ Future<(Size size, int baseline)> getTextSizeAsync( int fontFace, double fontScale, int thickness, -) async { - final ctext = text.toNativeUtf8().cast(); - final ret = cvRunAsync2<(Size, int)>( - (callback) => cimgproc.GetTextSizeWithBaseline_Async(ctext, fontFace, fontScale, thickness, callback), - (completer, p, p1) { - final size = Size.fromPointer(p.cast()); - final baseline = p1.cast().value; - calloc.free(p1); - completer.complete((size, baseline)); - }); - calloc.free(ctext); - return ret; +) { + final pBaseline = calloc(); + final size = calloc(); + final textPtr = text.toNativeUtf8().cast(); + return cvRunAsync0( + (callback) => cimgproc.cv_getTextSize( + textPtr, + fontFace, + fontScale, + thickness, + pBaseline, + size, + callback, + ), + (c) { + final rval = (Size.fromPointer(size), pBaseline.value); + calloc.free(pBaseline); + return c.complete(rval); + }, + ); } /// PutTextWithParams draws a text string. @@ -1087,10 +1510,10 @@ Future putTextAsync( int thickness = 1, int lineType = LINE_8, bool bottomLeftOrigin = false, -}) async { +}) { final textPtr = text.toNativeUtf8().cast(); - final rval = cvRunAsync0( - (callback) => cimgproc.PutTextWithParams_Async( + return cvRunAsync0( + (callback) => cimgproc.cv_putText_1( img.ref, textPtr, org.ref, @@ -1102,10 +1525,11 @@ Future putTextAsync( bottomLeftOrigin, callback, ), - (completer) => completer.complete(img), + (c) { + calloc.free(textPtr); + return c.complete(img); + }, ); - calloc.free(textPtr); - return rval; } /// Resize resizes an image. @@ -1120,14 +1544,19 @@ Future putTextAsync( Future resizeAsync( InputArray src, (int, int) dsize, { + OutputArray? dst, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR, -}) async => - cvRunAsync( - (callback) => cimgproc.Resize_Async(src.ref, dsize.cvd.ref, fx, fy, interpolation, callback), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_resize(src.ref, dst!.ref, dsize.cvd.ref, fx, fy, interpolation, callback), + (c) { + return c.complete(dst); + }, + ); +} /// GetRectSubPix retrieves a pixel rectangle from an image with sub-pixel accuracy. /// @@ -1137,21 +1566,31 @@ Future getRectSubPixAsync( InputArray image, (int, int) patchSize, Point2f center, { + OutputArray? patch, int patchType = -1, -}) async => - cvRunAsync( - (callback) => cimgproc.GetRectSubPix_Async(image.ref, patchSize.cvd.ref, center.ref, callback), - matCompleter, - ); +}) { + patch ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_getRectSubPix(image.ref, patchSize.cvd.ref, center.ref, patch!.ref, callback), + (c) { + return c.complete(patch); + }, + ); +} /// GetRotationMatrix2D calculates an affine matrix of 2D rotation. /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326 -Future getRotationMatrix2DAsync(Point2f center, double angle, double scale) async => cvRunAsync( - (callback) => cimgproc.GetRotationMatrix2D_Async(center.ref, angle, scale, callback), - matCompleter, - ); +Future getRotationMatrix2DAsync(Point2f center, double angle, double scale) { + final mat = Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_getRotationMatrix2D(center.ref, angle, scale, mat.ref, callback), + (c) { + return c.complete(mat); + }, + ); +} /// WarpAffine applies an affine transformation to an image. /// @@ -1161,22 +1600,29 @@ Future warpAffineAsync( InputArray src, InputArray M, (int, int) dsize, { + OutputArray? dst, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, Scalar? borderValue, -}) async => - cvRunAsync( - (callback) => cimgproc.WarpAffineWithParams_Async( - src.ref, - M.ref, - dsize.cvd.ref, - flags, - borderMode, - borderValue?.ref ?? Scalar().ref, - callback, - ), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + borderValue ??= Scalar(); + return cvRunAsync0( + (callback) => cimgproc.cv_warpAffine_1( + src.ref, + dst!.ref, + M.ref, + dsize.cvd.ref, + flags, + borderMode, + borderValue!.ref, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// WarpPerspective applies a perspective transformation to an image. /// For more parameters please check WarpPerspectiveWithParams. @@ -1187,90 +1633,125 @@ Future warpPerspectiveAsync( InputArray src, InputArray M, (int, int) dsize, { + OutputArray? dst, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, Scalar? borderValue, -}) async => - cvRunAsync( - (callback) => cimgproc.WarpPerspectiveWithParams_Async( - src.ref, - M.ref, - dsize.cvd.ref, - flags, - borderMode, - borderValue?.ref ?? Scalar().ref, - callback, - ), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + borderValue ??= Scalar(); + return cvRunAsync0( + (callback) => cimgproc.cv_warpPerspective_1( + src.ref, + dst!.ref, + M.ref, + dsize.cvd.ref, + flags, + borderMode, + borderValue!.ref, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// Watershed performs a marker-based image segmentation using the watershed algorithm. /// /// For further details, please see: /// https:///docs.opencv.org/4.x/d3/d47/group__imgproc__segmentation.html#ga3267243e4d3f95165d55a618c65ac6e1 -Future watershedAsync(InputArray image, InputOutputArray markers) async => cvRunAsync0( - (callback) => cimgproc.Watershed_Async(image.ref, markers.ref, callback), - (c) => c.complete(markers), - ); +Future watershedAsync(InputArray image, InputOutputArray markers) { + return cvRunAsync0( + (callback) => cimgproc.cv_watershed(image.ref, markers.ref, callback), + (c) { + return c.complete(markers); + }, + ); +} /// ApplyColorMap applies a GNU Octave/MATLAB equivalent colormap on a given image. /// colormap: ColormapTypes /// For further details, please see: /// https:///docs.opencv.org/master/d3/d50/group__imgproc__colormap.html#gadf478a5e5ff49d8aa24e726ea6f65d15 -Future applyColorMapAsync(InputArray src, int colormap) async => cvRunAsync( - (callback) => cimgproc.ApplyColorMap_Async(src.ref, colormap, callback), - matCompleter, - ); +Future applyColorMapAsync(InputArray src, int colormap, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_applyColorMap(src.ref, dst!.ref, colormap, callback), + (c) { + return c.complete(dst); + }, + ); +} /// ApplyCustomColorMap applies a custom defined colormap on a given image. /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/d50/group__imgproc__colormap.html#gacb22288ddccc55f9bd9e6d492b409cae -Future applyCustomColorMapAsync(InputArray src, InputArray userColor) async => cvRunAsync( - (callback) => cimgproc.ApplyCustomColorMap_Async(src.ref, userColor.ref, callback), - matCompleter, - ); +Future applyCustomColorMapAsync(InputArray src, InputArray userColor, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_applyColorMap_1(src.ref, dst!.ref, userColor.ref, callback), + (c) { + return c.complete(dst); + }, + ); +} /// GetPerspectiveTransform returns 3x3 perspective transformation for the /// corresponding 4 point pairs as image.Point. /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8c1ae0e3589a9d77fffc962c49b22043 -Future getPerspectiveTransformAsync(VecPoint src, VecPoint dst, [int solveMethod = DECOMP_LU]) async => - cvRunAsync( - (callback) => cimgproc.GetPerspectiveTransform_Async(src.ref, dst.ref, solveMethod, callback), - matCompleter, - ); +Future getPerspectiveTransformAsync(VecPoint src, VecPoint dst, [int solveMethod = DECOMP_LU]) { + final mat = Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_getPerspectiveTransform(src.ref, dst.ref, mat.ref, solveMethod, callback), + (c) { + return c.complete(mat); + }, + ); +} /// GetPerspectiveTransform2f returns 3x3 perspective transformation for the /// corresponding 4 point pairs as gocv.Point2f. /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8c1ae0e3589a9d77fffc962c49b22043 -Future getPerspectiveTransform2fAsync( - VecPoint2f src, - VecPoint2f dst, [ - int solveMethod = DECOMP_LU, -]) async => - cvRunAsync( - (callback) => cimgproc.GetPerspectiveTransform2f_Async(src.ref, dst.ref, solveMethod, callback), - matCompleter, - ); +Future getPerspectiveTransform2fAsync(VecPoint2f src, VecPoint2f dst, [int solveMethod = DECOMP_LU]) { + final mat = Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_getPerspectiveTransform2f(src.ref, dst.ref, mat.ref, solveMethod, callback), + (c) { + return c.complete(mat); + }, + ); +} /// GetAffineTransform returns a 2x3 affine transformation matrix for the /// corresponding 3 point pairs as image.Point. /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8f6d378f9f8eebb5cb55cd3ae295a999 -Future getAffineTransformAsync(VecPoint src, VecPoint dst) async => cvRunAsync( - (callback) => cimgproc.GetAffineTransform_Async(src.ref, dst.ref, callback), - matCompleter, - ); +Future getAffineTransformAsync(VecPoint src, VecPoint dst) { + final mat = Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_getAffineTransform(src.ref, dst.ref, mat.ref, callback), + (c) { + return c.complete(mat); + }, + ); +} -Future getAffineTransform2fAsync(VecPoint2f src, VecPoint2f dst) async => cvRunAsync( - (callback) => cimgproc.GetAffineTransform2f_Async(src.ref, dst.ref, callback), - matCompleter, - ); +Future getAffineTransform2fAsync(VecPoint2f src, VecPoint2f dst) { + final mat = Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_getAffineTransform2f(src.ref, dst.ref, mat.ref, callback), + (c) { + return c.complete(mat); + }, + ); +} /// DrawContours draws contours outlines or filled contours. /// @@ -1286,22 +1767,27 @@ Future drawContoursAsync( InputArray? hierarchy, // TODO: replace with vec int maxLevel = 0x3f3f3f3f, Point? offset, -}) async => - cvRunAsync0( - (callback) => cimgproc.DrawContoursWithParams_Async( - image.ref, - contours.ref, - contourIdx, - color.ref, - thickness, - lineType, - hierarchy?.ref ?? Mat.empty().ref, - maxLevel, - offset?.ref ?? Point(-1, -1).ref, - callback, - ), - (c) => c.complete(image), - ); +}) { + offset ??= Point(0, 0); + hierarchy ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_drawContours_1( + image.ref, + contours.ref, + contourIdx, + color.ref, + thickness, + lineType, + hierarchy!.ref, + maxLevel, + offset!.ref, + callback, + ), + (c) { + return c.complete(image); + }, + ); +} /// Remap applies a generic geometrical transformation to an image. /// @@ -1312,21 +1798,28 @@ Future remapAsync( InputArray map1, InputArray map2, int interpolation, { + OutputArray? dst, int borderMode = BORDER_CONSTANT, Scalar? borderValue, -}) async => - cvRunAsync( - (callback) => cimgproc.Remap_Async( - src.ref, - map1.ref, - map2.ref, - interpolation, - borderMode, - borderValue?.ref ?? Scalar().ref, - callback, - ), - matCompleter, - ); +}) { + borderValue ??= Scalar(); + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_remap( + src.ref, + dst!.ref, + map1.ref, + map2.ref, + interpolation, + borderMode, + borderValue!.ref, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// Filter2D applies an arbitrary linear filter to an image. /// @@ -1336,22 +1829,29 @@ Future filter2DAsync( InputArray src, int ddepth, InputArray kernel, { + OutputArray? dst, Point? anchor, double delta = 0, int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync( - (callback) => cimgproc.Filter2D_Async( - src.ref, - ddepth, - kernel.ref, - anchor?.ref ?? Point(-1, -1).ref, - delta, - borderType, - callback, - ), - matCompleter, - ); +}) { + dst ??= Mat.empty(); + anchor ??= Point(-1, -1); + return cvRunAsync0( + (callback) => cimgproc.cv_filter2D( + src.ref, + dst!.ref, + ddepth, + kernel.ref, + anchor!.ref, + delta, + borderType, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// SepFilter2D applies a separable linear filter to the image. /// @@ -1362,61 +1862,101 @@ Future sepFilter2DAsync( int ddepth, InputArray kernelX, InputArray kernelY, { + OutputArray? dst, Point? anchor, double delta = 0, int borderType = BORDER_DEFAULT, -}) async => - cvRunAsync( - (callback) => cimgproc.SepFilter2D_Async( - src.ref, - ddepth, - kernelX.ref, - kernelY.ref, - anchor?.ref ?? Point(-1, -1).ref, - delta, - borderType, - callback, - ), - matCompleter, - ); +}) { + anchor ??= Point(-1, -1); + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_sepFilter2D( + src.ref, + dst!.ref, + ddepth, + kernelX.ref, + kernelY.ref, + anchor!.ref, + delta, + borderType, + callback, + ), + (c) { + return c.complete(dst); + }, + ); +} /// LogPolar remaps an image to semilog-polar coordinates space. /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gaec3a0b126a85b5ca2c667b16e0ae022d -Future logPolarAsync(InputArray src, Point2f center, double M, int flags) async => cvRunAsync( - (callback) => cimgproc.LogPolar_Async(src.ref, center.ref, M, flags, callback), - matCompleter, - ); +Future logPolarAsync(InputArray src, Point2f center, double M, int flags, {OutputArray? dst}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_logPolar(src.ref, dst!.ref, center.ref, M, flags, callback), + (c) { + return c.complete(dst); + }, + ); +} /// LinearPolar remaps an image to polar coordinates space. /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gaa38a6884ac8b6e0b9bed47939b5362f3 -Future linearPolarAsync(InputArray src, Point2f center, double maxRadius, int flags) async => cvRunAsync( - (callback) => cimgproc.LinearPolar_Async(src.ref, center.ref, maxRadius, flags, callback), - matCompleter, - ); +Future linearPolarAsync( + InputArray src, + Point2f center, + double maxRadius, + int flags, { + OutputArray? dst, +}) { + dst ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_linearPolar(src.ref, dst!.ref, center.ref, maxRadius, flags, callback), + (c) { + return c.complete(dst); + }, + ); +} /// FitLine fits a line to a 2D or 3D point set. /// distType: DistanceTypes /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaf849da1fdafa67ee84b1e9a23b93f91f -Future fitLineAsync(VecPoint points, int distType, double param, double reps, double aeps) async => - cvRunAsync( - (callback) => cimgproc.FitLine_Async(points.ref, distType, param, reps, aeps, callback), - matCompleter, - ); +Future fitLineAsync( + VecPoint points, + int distType, + double param, + double reps, + double aeps, { + OutputArray? line, +}) { + line ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_fitLine(points.ref, line!.ref, distType, param, reps, aeps, callback), + (c) { + return c.complete(line); + }, + ); +} /// Compares two shapes. /// method: ShapeMatchModes /// For further details, please see: /// https:///docs.opencv.org/4.x/d3/dc0/group__imgproc__shape.html#gaadc90cb16e2362c9bd6e7363e6e4c317 -Future matchShapesAsync(VecPoint contour1, VecPoint contour2, int method, double parameter) async => - cvRunAsync( - (callback) => cimgproc.MatchShapes_Async(contour1.ref, contour2.ref, method, parameter, callback), - doubleCompleter, - ); +Future matchShapesAsync(VecPoint contour1, VecPoint contour2, int method, double parameter) { + final p = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_matchShapes(contour1.ref, contour2.ref, method, parameter, p, callback), + (c) { + final rval = p.value; + calloc.free(p); + return c.complete(rval); + }, + ); +} /// Inverts an affine transformation. /// The function computes an inverse affine transformation represented by 2×3 matrix M: @@ -1424,10 +1964,15 @@ Future matchShapesAsync(VecPoint contour1, VecPoint contour2, int method /// /// For further details, please see: /// https://docs.opencv.org/4.x/da/d54/group__imgproc__transform.html#ga57d3505a878a7e1a636645727ca08f51 -Future invertAffineTransformAsync(InputArray M) async => cvRunAsync( - (callback) => cimgproc.InvertAffineTransform_Async(M.ref, callback), - matCompleter, - ); +Future invertAffineTransformAsync(InputArray M, {OutputArray? iM}) { + iM ??= Mat.empty(); + return cvRunAsync0( + (callback) => cimgproc.cv_invertAffineTransform(M.ref, iM!.ref, callback), + (c) { + return c.complete(iM); + }, + ); +} /// Apply phaseCorrelate. /// @@ -1437,44 +1982,64 @@ Future<(Point2f rval, double response)> phaseCorrelateAsync( InputArray src1, InputArray src2, { InputArray? window, -}) async => - cvRunAsync2( - (callback) => - cimgproc.PhaseCorrelate_Async(src1.ref, src2.ref, window?.ref ?? Mat.empty().ref, callback), - (c, p, p1) { - final response = p1.cast().value; - calloc.free(p1); - c.complete((Point2f.fromPointer(p.cast()), response)); - }, - ); +}) { + window ??= Mat.empty(); + final p = calloc(); + final pp = calloc(); + return cvRunAsync0( + (callback) => cimgproc.cv_phaseCorrelate(src1.ref, src2.ref, window!.ref, p, pp, callback), + (c) { + final rval = (Point2f.fromPointer(pp), p.value); + calloc.free(p); + return c.complete(rval); + }, + ); +} /// Adds the square of a source image to the accumulator image. /// /// For further details, please see: /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#ga1a567a79901513811ff3b9976923b199 /// -Future accumulateAsync(InputArray src, InputOutputArray dst, {InputArray? mask}) async => mask == null - ? cvRunAsync0( - (callback) => cimgproc.Mat_Accumulate_Async(src.ref, dst.ref, callback), (c) => c.complete(dst)) - : cvRunAsync0( - (callback) => cimgproc.Mat_AccumulateWithMask_Async(src.ref, dst.ref, mask.ref, callback), - (c) => c.complete(dst), - ); +Future accumulateAsync(InputArray src, InputOutputArray dst, {InputArray? mask}) { + if (mask == null) { + return cvRunAsync0( + (callback) => cimgproc.cv_accumulate(src.ref, dst.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } else { + return cvRunAsync0( + (callback) => cimgproc.cv_accumulate_1(src.ref, dst.ref, mask.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } +} /// Adds the square of a source image to the accumulator image. /// /// For further details, please see: /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#gacb75e7ffb573227088cef9ceaf80be8c -Future accumulateSquareAsync(InputArray src, InputOutputArray dst, {InputArray? mask}) async => - mask == null - ? cvRunAsync0( - (callback) => cimgproc.Mat_AccumulateSquare_Async(src.ref, dst.ref, callback), - (c) => c.complete(dst), - ) - : cvRunAsync0( - (callback) => cimgproc.Mat_AccumulateSquareWithMask_Async(src.ref, dst.ref, mask.ref, callback), - (c) => c.complete(dst), - ); +Future accumulateSquareAsync(InputArray src, InputOutputArray dst, {InputArray? mask}) { + if (mask == null) { + return cvRunAsync0( + (callback) => cimgproc.cv_accumulateSquare(src.ref, dst.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } else { + return cvRunAsync0( + (callback) => cimgproc.cv_accumulateSquare_1(src.ref, dst.ref, mask.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } +} /// Adds the per-element product of two input images to the accumulator image. /// @@ -1485,35 +2050,42 @@ Future accumulateProductAsync( InputArray src2, InputOutputArray dst, { InputArray? mask, -}) async => - mask == null - ? cvRunAsync0( - (callback) => cimgproc.Mat_AccumulateProduct_Async(src1.ref, src2.ref, dst.ref, callback), - (c) => c.complete(dst), - ) - : cvRunAsync0( - (callback) => - cimgproc.Mat_AccumulateProductWithMask_Async(src1.ref, src2.ref, dst.ref, mask.ref, callback), - (c) => c.complete(dst), - ); +}) { + if (mask == null) { + return cvRunAsync0( + (callback) => cimgproc.cv_accumulateProduct(src1.ref, src2.ref, dst.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } else { + return cvRunAsync0( + (callback) => cimgproc.cv_accumulateProduct_1(src1.ref, src2.ref, dst.ref, mask.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } +} /// Updates a running average. /// /// For further details, please see: /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#ga4f9552b541187f61f6818e8d2d826bc7 -Future accumulateWeightedAsync( - InputArray src, - InputOutputArray dst, - double alpha, { - InputArray? mask, -}) async => - mask == null - ? cvRunAsync0( - (callback) => cimgproc.Mat_AccumulatedWeighted_Async(src.ref, dst.ref, alpha, callback), - (c) => c.complete(dst), - ) - : cvRunAsync0( - (callback) => - cimgproc.Mat_AccumulatedWeightedWithMask_Async(src.ref, dst.ref, alpha, mask.ref, callback), - (c) => c.complete(dst), - ); +Future accumulateWeightedAsync(InputArray src, InputOutputArray dst, double alpha, {InputArray? mask}) { + if (mask == null) { + return cvRunAsync0( + (callback) => cimgproc.cv_accumulatedWeighted(src.ref, dst.ref, alpha, callback), + (c) { + return c.complete(dst); + }, + ); + } else { + return cvRunAsync0( + (callback) => cimgproc.cv_accumulatedWeighted_1(src.ref, dst.ref, alpha, mask.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } +} From 680f5620a9a262e66a66a7b980c590b3beaf95e3 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sun, 20 Oct 2024 21:15:15 +0800 Subject: [PATCH 19/30] finish objdetect --- packages/dartcv/lib/src/g/objdetect.g.dart | 262 ++--- .../dartcv/lib/src/objdetect/objdetect.dart | 262 ++--- .../lib/src/objdetect/objdetect_async.dart | 978 ++++++------------ 3 files changed, 539 insertions(+), 963 deletions(-) diff --git a/packages/dartcv/lib/src/g/objdetect.g.dart b/packages/dartcv/lib/src/g/objdetect.g.dart index 3da666fe..611dd24f 100644 --- a/packages/dartcv/lib/src/g/objdetect.g.dart +++ b/packages/dartcv/lib/src/g/objdetect.g.dart @@ -269,83 +269,64 @@ class CvNativeObjdetect { bool, imp1.CvCallback_0)>(); - ffi.Pointer cv_CascadeClassifier_empty( + bool cv_CascadeClassifier_empty( CascadeClassifier self, - ffi.Pointer rval, ) { return _cv_CascadeClassifier_empty( self, - rval, ); } - late final _cv_CascadeClassifier_emptyPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, - ffi.Pointer)>>('cv_CascadeClassifier_empty'); - late final _cv_CascadeClassifier_empty = - _cv_CascadeClassifier_emptyPtr.asFunction< - ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + late final _cv_CascadeClassifier_emptyPtr = + _lookup>( + 'cv_CascadeClassifier_empty'); + late final _cv_CascadeClassifier_empty = _cv_CascadeClassifier_emptyPtr + .asFunction(); - ffi.Pointer cv_CascadeClassifier_getFeatureType( + int cv_CascadeClassifier_getFeatureType( CascadeClassifier self, - ffi.Pointer rval, ) { return _cv_CascadeClassifier_getFeatureType( self, - rval, ); } - late final _cv_CascadeClassifier_getFeatureTypePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(CascadeClassifier, - ffi.Pointer)>>('cv_CascadeClassifier_getFeatureType'); + late final _cv_CascadeClassifier_getFeatureTypePtr = + _lookup>( + 'cv_CascadeClassifier_getFeatureType'); late final _cv_CascadeClassifier_getFeatureType = - _cv_CascadeClassifier_getFeatureTypePtr.asFunction< - ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + _cv_CascadeClassifier_getFeatureTypePtr + .asFunction(); - ffi.Pointer cv_CascadeClassifier_getOriginalWindowSize( + CvSize cv_CascadeClassifier_getOriginalWindowSize( CascadeClassifier self, - ffi.Pointer rval, ) { return _cv_CascadeClassifier_getOriginalWindowSize( self, - rval, ); } - late final _cv_CascadeClassifier_getOriginalWindowSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>>( - 'cv_CascadeClassifier_getOriginalWindowSize'); + late final _cv_CascadeClassifier_getOriginalWindowSizePtr = + _lookup>( + 'cv_CascadeClassifier_getOriginalWindowSize'); late final _cv_CascadeClassifier_getOriginalWindowSize = - _cv_CascadeClassifier_getOriginalWindowSizePtr.asFunction< - ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + _cv_CascadeClassifier_getOriginalWindowSizePtr + .asFunction(); - ffi.Pointer cv_CascadeClassifier_isOldFormatCascade( + bool cv_CascadeClassifier_isOldFormatCascade( CascadeClassifier self, - ffi.Pointer rval, ) { return _cv_CascadeClassifier_isOldFormatCascade( self, - rval, ); } - late final _cv_CascadeClassifier_isOldFormatCascadePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>>( - 'cv_CascadeClassifier_isOldFormatCascade'); + late final _cv_CascadeClassifier_isOldFormatCascadePtr = + _lookup>( + 'cv_CascadeClassifier_isOldFormatCascade'); late final _cv_CascadeClassifier_isOldFormatCascade = - _cv_CascadeClassifier_isOldFormatCascadePtr.asFunction< - ffi.Pointer Function( - CascadeClassifier, ffi.Pointer)>(); + _cv_CascadeClassifier_isOldFormatCascadePtr + .asFunction(); ffi.Pointer cv_CascadeClassifier_load( CascadeClassifier self, @@ -509,83 +490,66 @@ class CvNativeObjdetect { ffi.Pointer Function( FaceDetectorYN, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer cv_FaceDetectorYN_getInputSize( + CvSize cv_FaceDetectorYN_getInputSize( FaceDetectorYN self, - ffi.Pointer input_size, ) { return _cv_FaceDetectorYN_getInputSize( self, - input_size, ); } - late final _cv_FaceDetectorYN_getInputSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - ffi.Pointer)>>('cv_FaceDetectorYN_getInputSize'); + late final _cv_FaceDetectorYN_getInputSizePtr = + _lookup>( + 'cv_FaceDetectorYN_getInputSize'); late final _cv_FaceDetectorYN_getInputSize = - _cv_FaceDetectorYN_getInputSizePtr.asFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Pointer)>(); + _cv_FaceDetectorYN_getInputSizePtr + .asFunction(); - ffi.Pointer cv_FaceDetectorYN_getNMSThreshold( + double cv_FaceDetectorYN_getNMSThreshold( FaceDetectorYN self, - ffi.Pointer nms_threshold, ) { return _cv_FaceDetectorYN_getNMSThreshold( self, - nms_threshold, ); } - late final _cv_FaceDetectorYN_getNMSThresholdPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - ffi.Pointer)>>('cv_FaceDetectorYN_getNMSThreshold'); + late final _cv_FaceDetectorYN_getNMSThresholdPtr = + _lookup>( + 'cv_FaceDetectorYN_getNMSThreshold'); late final _cv_FaceDetectorYN_getNMSThreshold = - _cv_FaceDetectorYN_getNMSThresholdPtr.asFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Pointer)>(); + _cv_FaceDetectorYN_getNMSThresholdPtr + .asFunction(); - ffi.Pointer cv_FaceDetectorYN_getScoreThreshold( + double cv_FaceDetectorYN_getScoreThreshold( FaceDetectorYN self, - ffi.Pointer score_threshold, ) { return _cv_FaceDetectorYN_getScoreThreshold( self, - score_threshold, ); } - late final _cv_FaceDetectorYN_getScoreThresholdPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - ffi.Pointer)>>('cv_FaceDetectorYN_getScoreThreshold'); + late final _cv_FaceDetectorYN_getScoreThresholdPtr = + _lookup>( + 'cv_FaceDetectorYN_getScoreThreshold'); late final _cv_FaceDetectorYN_getScoreThreshold = - _cv_FaceDetectorYN_getScoreThresholdPtr.asFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Pointer)>(); + _cv_FaceDetectorYN_getScoreThresholdPtr + .asFunction(); - ffi.Pointer cv_FaceDetectorYN_getTopK( + int cv_FaceDetectorYN_getTopK( FaceDetectorYN self, - ffi.Pointer top_k, ) { return _cv_FaceDetectorYN_getTopK( self, - top_k, ); } - late final _cv_FaceDetectorYN_getTopKPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - ffi.Pointer)>>('cv_FaceDetectorYN_getTopK'); + late final _cv_FaceDetectorYN_getTopKPtr = + _lookup>( + 'cv_FaceDetectorYN_getTopK'); late final _cv_FaceDetectorYN_getTopK = - _cv_FaceDetectorYN_getTopKPtr.asFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Pointer)>(); + _cv_FaceDetectorYN_getTopKPtr.asFunction(); - ffi.Pointer cv_FaceDetectorYN_setInputSize( + void cv_FaceDetectorYN_setInputSize( FaceDetectorYN self, CvSize input_size, ) { @@ -595,15 +559,14 @@ class CvNativeObjdetect { ); } - late final _cv_FaceDetectorYN_setInputSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - FaceDetectorYN, CvSize)>>('cv_FaceDetectorYN_setInputSize'); + late final _cv_FaceDetectorYN_setInputSizePtr = + _lookup>( + 'cv_FaceDetectorYN_setInputSize'); late final _cv_FaceDetectorYN_setInputSize = _cv_FaceDetectorYN_setInputSizePtr - .asFunction Function(FaceDetectorYN, CvSize)>(); + .asFunction(); - ffi.Pointer cv_FaceDetectorYN_setNMSThreshold( + void cv_FaceDetectorYN_setNMSThreshold( FaceDetectorYN self, double nms_threshold, ) { @@ -613,15 +576,14 @@ class CvNativeObjdetect { ); } - late final _cv_FaceDetectorYN_setNMSThresholdPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Float)>>('cv_FaceDetectorYN_setNMSThreshold'); + late final _cv_FaceDetectorYN_setNMSThresholdPtr = + _lookup>( + 'cv_FaceDetectorYN_setNMSThreshold'); late final _cv_FaceDetectorYN_setNMSThreshold = _cv_FaceDetectorYN_setNMSThresholdPtr - .asFunction Function(FaceDetectorYN, double)>(); + .asFunction(); - ffi.Pointer cv_FaceDetectorYN_setScoreThreshold( + void cv_FaceDetectorYN_setScoreThreshold( FaceDetectorYN self, double score_threshold, ) { @@ -631,15 +593,14 @@ class CvNativeObjdetect { ); } - late final _cv_FaceDetectorYN_setScoreThresholdPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(FaceDetectorYN, - ffi.Float)>>('cv_FaceDetectorYN_setScoreThreshold'); + late final _cv_FaceDetectorYN_setScoreThresholdPtr = + _lookup>( + 'cv_FaceDetectorYN_setScoreThreshold'); late final _cv_FaceDetectorYN_setScoreThreshold = _cv_FaceDetectorYN_setScoreThresholdPtr - .asFunction Function(FaceDetectorYN, double)>(); + .asFunction(); - ffi.Pointer cv_FaceDetectorYN_setTopK( + void cv_FaceDetectorYN_setTopK( FaceDetectorYN self, int top_k, ) { @@ -649,12 +610,11 @@ class CvNativeObjdetect { ); } - late final _cv_FaceDetectorYN_setTopKPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - FaceDetectorYN, ffi.Int)>>('cv_FaceDetectorYN_setTopK'); + late final _cv_FaceDetectorYN_setTopKPtr = + _lookup>( + 'cv_FaceDetectorYN_setTopK'); late final _cv_FaceDetectorYN_setTopK = _cv_FaceDetectorYN_setTopKPtr - .asFunction Function(FaceDetectorYN, int)>(); + .asFunction(); ffi.Pointer cv_FaceRecognizerSF_alignCrop( FaceRecognizerSF self, @@ -1085,79 +1045,64 @@ class CvNativeObjdetect { ffi.Pointer cv_HOGDescriptor_getDaimlerPeopleDetector( ffi.Pointer rval, - imp1.CvCallback_0 callback, ) { return _cv_HOGDescriptor_getDaimlerPeopleDetector( rval, - callback, ); } late final _cv_HOGDescriptor_getDaimlerPeopleDetectorPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - imp1.CvCallback_0)>>('cv_HOGDescriptor_getDaimlerPeopleDetector'); + ffi + .NativeFunction Function(ffi.Pointer)>>( + 'cv_HOGDescriptor_getDaimlerPeopleDetector'); late final _cv_HOGDescriptor_getDaimlerPeopleDetector = - _cv_HOGDescriptor_getDaimlerPeopleDetectorPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, imp1.CvCallback_0)>(); + _cv_HOGDescriptor_getDaimlerPeopleDetectorPtr + .asFunction Function(ffi.Pointer)>(); ffi.Pointer cv_HOGDescriptor_getDefaultPeopleDetector( ffi.Pointer rval, - imp1.CvCallback_0 callback, ) { return _cv_HOGDescriptor_getDefaultPeopleDetector( rval, - callback, ); } late final _cv_HOGDescriptor_getDefaultPeopleDetectorPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - imp1.CvCallback_0)>>('cv_HOGDescriptor_getDefaultPeopleDetector'); + ffi + .NativeFunction Function(ffi.Pointer)>>( + 'cv_HOGDescriptor_getDefaultPeopleDetector'); late final _cv_HOGDescriptor_getDefaultPeopleDetector = - _cv_HOGDescriptor_getDefaultPeopleDetectorPtr.asFunction< - ffi.Pointer Function( - ffi.Pointer, imp1.CvCallback_0)>(); + _cv_HOGDescriptor_getDefaultPeopleDetectorPtr + .asFunction Function(ffi.Pointer)>(); - ffi.Pointer cv_HOGDescriptor_getDescriptorSize( + int cv_HOGDescriptor_getDescriptorSize( HOGDescriptor self, - ffi.Pointer rval, ) { return _cv_HOGDescriptor_getDescriptorSize( self, - rval, ); } - late final _cv_HOGDescriptor_getDescriptorSizePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, - ffi.Pointer)>>('cv_HOGDescriptor_getDescriptorSize'); + late final _cv_HOGDescriptor_getDescriptorSizePtr = + _lookup>( + 'cv_HOGDescriptor_getDescriptorSize'); late final _cv_HOGDescriptor_getDescriptorSize = - _cv_HOGDescriptor_getDescriptorSizePtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, ffi.Pointer)>(); + _cv_HOGDescriptor_getDescriptorSizePtr + .asFunction(); - ffi.Pointer cv_HOGDescriptor_getWinSigma( + double cv_HOGDescriptor_getWinSigma( HOGDescriptor self, - ffi.Pointer rval, ) { return _cv_HOGDescriptor_getWinSigma( self, - rval, ); } - late final _cv_HOGDescriptor_getWinSigmaPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(HOGDescriptor, - ffi.Pointer)>>('cv_HOGDescriptor_getWinSigma'); - late final _cv_HOGDescriptor_getWinSigma = - _cv_HOGDescriptor_getWinSigmaPtr.asFunction< - ffi.Pointer Function( - HOGDescriptor, ffi.Pointer)>(); + late final _cv_HOGDescriptor_getWinSigmaPtr = + _lookup>( + 'cv_HOGDescriptor_getWinSigma'); + late final _cv_HOGDescriptor_getWinSigma = _cv_HOGDescriptor_getWinSigmaPtr + .asFunction(); ffi.Pointer cv_HOGDescriptor_groupRectangles( HOGDescriptor self, @@ -1514,7 +1459,7 @@ class CvNativeObjdetect { ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer cv_QRCodeDetector_setEpsX( + void cv_QRCodeDetector_setEpsX( QRCodeDetector self, double epsX, ) { @@ -1525,13 +1470,12 @@ class CvNativeObjdetect { } late final _cv_QRCodeDetector_setEpsXPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QRCodeDetector, ffi.Double)>>('cv_QRCodeDetector_setEpsX'); + ffi.NativeFunction>( + 'cv_QRCodeDetector_setEpsX'); late final _cv_QRCodeDetector_setEpsX = _cv_QRCodeDetector_setEpsXPtr - .asFunction Function(QRCodeDetector, double)>(); + .asFunction(); - ffi.Pointer cv_QRCodeDetector_setEpsY( + void cv_QRCodeDetector_setEpsY( QRCodeDetector self, double epsY, ) { @@ -1542,13 +1486,12 @@ class CvNativeObjdetect { } late final _cv_QRCodeDetector_setEpsYPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - QRCodeDetector, ffi.Double)>>('cv_QRCodeDetector_setEpsY'); + ffi.NativeFunction>( + 'cv_QRCodeDetector_setEpsY'); late final _cv_QRCodeDetector_setEpsY = _cv_QRCodeDetector_setEpsYPtr - .asFunction Function(QRCodeDetector, double)>(); + .asFunction(); - ffi.Pointer cv_QRCodeDetector_setUseAlignmentMarkers( + void cv_QRCodeDetector_setUseAlignmentMarkers( QRCodeDetector self, bool useAlignmentMarkers, ) { @@ -1558,13 +1501,12 @@ class CvNativeObjdetect { ); } - late final _cv_QRCodeDetector_setUseAlignmentMarkersPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(QRCodeDetector, - ffi.Bool)>>('cv_QRCodeDetector_setUseAlignmentMarkers'); + late final _cv_QRCodeDetector_setUseAlignmentMarkersPtr = + _lookup>( + 'cv_QRCodeDetector_setUseAlignmentMarkers'); late final _cv_QRCodeDetector_setUseAlignmentMarkers = _cv_QRCodeDetector_setUseAlignmentMarkersPtr - .asFunction Function(QRCodeDetector, bool)>(); + .asFunction(); ffi.Pointer cv_groupRectangles( ffi.Pointer rects, diff --git a/packages/dartcv/lib/src/objdetect/objdetect.dart b/packages/dartcv/lib/src/objdetect/objdetect.dart index 4be3f69e..6a18e387 100644 --- a/packages/dartcv/lib/src/objdetect/objdetect.dart +++ b/packages/dartcv/lib/src/objdetect/objdetect.dart @@ -34,14 +34,14 @@ class CascadeClassifier extends CvStruct { factory CascadeClassifier.empty() { final p = calloc(); - cvRun(() => cobjdetect.CascadeClassifier_New(p)); + cvRun(() => cobjdetect.cv_CascadeClassifier_create(p)); return CascadeClassifier._(p); } factory CascadeClassifier.fromFile(String filename) { final p = calloc(); final cp = filename.toNativeUtf8().cast(); - cvRun(() => cobjdetect.CascadeClassifier_NewFromFile(cp, p)); + cvRun(() => cobjdetect.cv_CascadeClassifier_create_1(cp, p)); calloc.free(cp); return CascadeClassifier._(p); } @@ -53,7 +53,7 @@ class CascadeClassifier extends CvStruct { bool load(String name) { final cname = name.toNativeUtf8().cast(); final p = calloc(); - cvRun(() => cobjdetect.CascadeClassifier_Load(ref, cname, p)); + cvRun(() => cobjdetect.cv_CascadeClassifier_load(ref, cname, p)); calloc.free(cname); return p.value != 0; } @@ -73,7 +73,7 @@ class CascadeClassifier extends CvStruct { }) { final ret = calloc(); cvRun( - () => cobjdetect.CascadeClassifier_DetectMultiScaleWithParams( + () => cobjdetect.cv_CascadeClassifier_detectMultiScale_1( ref, image.ref, ret, @@ -82,6 +82,7 @@ class CascadeClassifier extends CvStruct { flags, minSize.cvd.ref, maxSize.cvd.ref, + ffi.nullptr, ), ); return VecRect.fromPointer(ret); @@ -98,7 +99,7 @@ class CascadeClassifier extends CvStruct { final ret = calloc(); final pnums = calloc(); cvRun( - () => cobjdetect.CascadeClassifier_DetectMultiScale2( + () => cobjdetect.cv_CascadeClassifier_detectMultiScale_2( ref, image.ref, ret, @@ -108,6 +109,7 @@ class CascadeClassifier extends CvStruct { flags, minSize.cvd.ref, maxSize.cvd.ref, + ffi.nullptr, ), ); return (VecRect.fromPointer(ret), VecI32.fromPointer(pnums)); @@ -126,7 +128,7 @@ class CascadeClassifier extends CvStruct { final rejectLevels = calloc(); final levelWeights = calloc(); cvRun( - () => cobjdetect.CascadeClassifier_DetectMultiScale3( + () => cobjdetect.cv_CascadeClassifier_detectMultiScale_3( ref, image.ref, objects, @@ -138,6 +140,7 @@ class CascadeClassifier extends CvStruct { minSize.cvd.ref, maxSize.cvd.ref, outputRejectLevels, + ffi.nullptr, ), ); return (VecRect.fromPointer(objects), VecI32.fromPointer(rejectLevels), VecF64.fromPointer(levelWeights)); @@ -146,49 +149,28 @@ class CascadeClassifier extends CvStruct { /// Checks whether the classifier has been loaded. /// /// https://docs.opencv.org/4.x/d1/de5/classcv_1_1CascadeClassifier.html#a1753ebe58554fe0673ce46cb4e83f08a - bool empty() { - return using((arena) { - final p = arena(); - cvRun(() => cobjdetect.CascadeClassifier_Empty(ref, p)); - return p.value; - }); - } + bool empty() => cobjdetect.cv_CascadeClassifier_empty(ref); /// https://docs.opencv.org/4.x/d1/de5/classcv_1_1CascadeClassifier.html#a0bab6de516c685ba879a4b1f1debdef1 - int getFeatureType() { - return using((arena) { - final p = arena(); - cvRun(() => cobjdetect.CascadeClassifier_getFeatureType(ref, p)); - return p.value; - }); - } + int getFeatureType() => cobjdetect.cv_CascadeClassifier_getFeatureType(ref); /// https://docs.opencv.org/4.x/d1/de5/classcv_1_1CascadeClassifier.html#a7a131d319ab42a444ff2bcbb433b7b41 (int, int) getOriginalWindowSize() { - final p = calloc(); - cvRun(() => cobjdetect.CascadeClassifier_getOriginalWindowSize(ref, p)); - final ret = (p.ref.width, p.ref.height); - calloc.free(p); - return ret; + final p = cobjdetect.cv_CascadeClassifier_getOriginalWindowSize(ref); + return (p.width, p.height); } /// https://docs.opencv.org/4.x/d1/de5/classcv_1_1CascadeClassifier.html#a556bdd8738ba96aac07628ec38ff46da - bool isOldFormatCascade() { - return using((arena) { - final p = arena(); - cvRun(() => cobjdetect.CascadeClassifier_isOldFormatCascade(ref, p)); - return p.value; - }); - } + bool isOldFormatCascade() => cobjdetect.cv_CascadeClassifier_isOldFormatCascade(ref); @override cvg.CascadeClassifier get ref => ptr.ref; static final finalizer = - OcvFinalizer(cobjdetect.addresses.CascadeClassifier_Close); + OcvFinalizer(cobjdetect.addresses.cv_CascadeClassifier_close); void dispose() { finalizer.detach(this); - cobjdetect.CascadeClassifier_Close(ptr); + cobjdetect.cv_CascadeClassifier_close(ptr); } } @@ -206,7 +188,7 @@ class HOGDescriptor extends CvStruct { factory HOGDescriptor.empty() { final p = calloc(); - cvRun(() => cobjdetect.HOGDescriptor_New(p)); + cvRun(() => cobjdetect.cv_HOGDescriptor_create(p)); return HOGDescriptor._(p); } @@ -218,7 +200,7 @@ class HOGDescriptor extends CvStruct { factory HOGDescriptor.fromFile(String filename) { final p = calloc(); final cp = filename.toNativeUtf8().cast(); - cvRun(() => cobjdetect.HOGDescriptor_NewFromFile(cp, p)); + cvRun(() => cobjdetect.cv_HOGDescriptor_create_1(cp, p)); calloc.free(cp); return HOGDescriptor._(p); } @@ -227,7 +209,7 @@ class HOGDescriptor extends CvStruct { return using((arena) { final cname = name.toNativeUtf8(allocator: arena); final p = arena(); - cvRun(() => cobjdetect.HOGDescriptor_Load(ref, cname.cast(), p)); + cvRun(() => cobjdetect.cv_HOGDescriptor_load(ref, cname.cast(), p)); return p.value; }); } @@ -243,13 +225,14 @@ class HOGDescriptor extends CvStruct { final descriptors = calloc(); final locations = calloc(); cvRun( - () => cobjdetect.HOGDescriptor_Compute( + () => cobjdetect.cv_HOGDescriptor_compute( ref, img.ref, descriptors, winStride.cvd.ref, padding.cvd.ref, locations, + ffi.nullptr, ), ); return ( @@ -269,13 +252,14 @@ class HOGDescriptor extends CvStruct { final grad = Mat.empty(); final angleOfs = Mat.empty(); cvRun( - () => cobjdetect.HOGDescriptor_computeGradient( + () => cobjdetect.cv_HOGDescriptor_computeGradient( ref, img.ref, grad.ref, angleOfs.ref, paddingTL.cvd.ref, paddingBR.cvd.ref, + ffi.nullptr, ), ); return (grad, angleOfs); @@ -294,7 +278,7 @@ class HOGDescriptor extends CvStruct { final searchLocations = calloc(); final weights = calloc(); cvRun( - () => cobjdetect.HOGDescriptor_Detect( + () => cobjdetect.cv_HOGDescriptor_detect( ref, img.ref, foundLocations, @@ -303,6 +287,7 @@ class HOGDescriptor extends CvStruct { winStride.cvd.ref, padding.cvd.ref, searchLocations, + ffi.nullptr, ), ); return ( @@ -324,7 +309,7 @@ class HOGDescriptor extends CvStruct { final foundLocations = calloc(); final searchLocations = calloc(); cvRun( - () => cobjdetect.HOGDescriptor_Detect2( + () => cobjdetect.cv_HOGDescriptor_detect2( ref, img.ref, foundLocations, @@ -332,6 +317,7 @@ class HOGDescriptor extends CvStruct { winStride.cvd.ref, padding.cvd.ref, searchLocations, + ffi.nullptr, ), ); return (VecPoint.fromPointer(foundLocations), VecPoint.fromPointer(searchLocations)); @@ -354,7 +340,7 @@ class HOGDescriptor extends CvStruct { }) { final rects = calloc(); cvRun( - () => cobjdetect.HOGDescriptor_DetectMultiScaleWithParams( + () => cobjdetect.cv_HOGDescriptor_detectMultiScale_1( ref, image.ref, hitThreshold, @@ -364,6 +350,7 @@ class HOGDescriptor extends CvStruct { groupThreshold, useMeanshiftGrouping, rects, + ffi.nullptr, ), ); return VecRect.fromPointer(rects); @@ -375,32 +362,20 @@ class HOGDescriptor extends CvStruct { /// https://docs.opencv.org/master/d5/d33/structcv_1_1HOGDescriptor.html#a660e5cd036fd5ddf0f5767b352acd948 static VecF32 getDefaultPeopleDetector() { final v = calloc(); - cvRun(() => cobjdetect.HOG_GetDefaultPeopleDetector(v)); + cvRun(() => cobjdetect.cv_HOGDescriptor_getDefaultPeopleDetector(v)); return VecF32.fromPointer(v); } static VecF32 getDaimlerPeopleDetector() { final v = calloc(); - cvRun(() => cobjdetect.HOGDescriptor_getDaimlerPeopleDetector(v)); + cvRun(() => cobjdetect.cv_HOGDescriptor_getDaimlerPeopleDetector(v)); return VecF32.fromPointer(v); } - int getDescriptorSize() { - return using((arena) { - final p = arena(); // size_t - cvRun(() => cobjdetect.HOGDescriptor_getDescriptorSize(ref, p)); - return p.value; - }); - } + int getDescriptorSize() => cobjdetect.cv_HOGDescriptor_getDescriptorSize(ref); /// Returns winSigma value. - double getWinSigma() { - return using((arena) { - final p = arena(); - cvRun(() => cobjdetect.HOGDescriptor_getWinSigma(ref, p)); - return p.value; - }); - } + double getWinSigma() => cobjdetect.cv_HOGDescriptor_getWinSigma(ref); /// Groups the object candidate rectangles. /// @@ -412,12 +387,13 @@ class HOGDescriptor extends CvStruct { double eps, ) { cvRun( - () => cobjdetect.HOGDescriptor_groupRectangles( + () => cobjdetect.cv_HOGDescriptor_groupRectangles( ref, rectList.ptr, weights.ptr, groupThreshold, eps, + ffi.nullptr, ), ); rectList.reattach(); @@ -430,16 +406,16 @@ class HOGDescriptor extends CvStruct { /// For further details, please see: /// https://docs.opencv.org/master/d5/d33/structcv_1_1HOGDescriptor.html#a09e354ad701f56f9c550dc0385dc36f1 void setSVMDetector(VecF32 det) { - cvRun(() => cobjdetect.HOGDescriptor_SetSVMDetector(ref, det.ref)); + cvRun(() => cobjdetect.cv_HOGDescriptor_setSVMDetector(ref, det.ref)); } @override cvg.HOGDescriptor get ref => ptr.ref; - static final finalizer = OcvFinalizer(cobjdetect.addresses.HOGDescriptor_Close); + static final finalizer = OcvFinalizer(cobjdetect.addresses.cv_HOGDescriptor_close); void dispose() { finalizer.detach(this); - cobjdetect.HOGDescriptor_Close(ptr); + cobjdetect.cv_HOGDescriptor_close(ptr); } } @@ -448,7 +424,7 @@ class HOGDescriptor extends CvStruct { // For further details, please see: // https://docs.opencv.org/master/d5/d54/group__objdetect.html#ga3dba897ade8aa8227edda66508e16ab9 VecRect groupRectangles(VecRect rects, int groupThreshold, double eps) { - cvRun(() => cobjdetect.GroupRectangles(rects.ptr, groupThreshold, eps)); + cvRun(() => cobjdetect.cv_groupRectangles(rects.ptr, groupThreshold, eps, ffi.nullptr)); rects.reattach(); return rects; } @@ -471,7 +447,7 @@ class QRCodeDetector extends CvStruct { factory QRCodeDetector.empty() { final p = calloc(); - cvRun(() => cobjdetect.QRCodeDetector_New(p)); + cvRun(() => cobjdetect.cv_QRCodeDetector_create(p)); return QRCodeDetector._(p); } @@ -487,7 +463,7 @@ class QRCodeDetector extends CvStruct { }) { final s = straightQRcode?.ptr ?? calloc(); final v = calloc>(); - cvRun(() => cobjdetect.QRCodeDetector_decodeCurved(ref, img.ref, points.ref, s, v)); + cvRun(() => cobjdetect.cv_QRCodeDetector_decodeCurved(ref, img.ref, points.ref, s, v, ffi.nullptr)); final ss = v.value.cast().toDartString(); calloc.free(v); return (ss, Mat.fromPointer(s)); @@ -504,7 +480,7 @@ class QRCodeDetector extends CvStruct { final p = points?.ptr ?? calloc(); final s = straightQRcode?.ptr ?? calloc(); final v = calloc>(); - cvRun(() => cobjdetect.QRCodeDetector_detectAndDecodeCurved(ref, img.ref, p, s, v)); + cvRun(() => cobjdetect.cv_QRCodeDetector_detectAndDecodeCurved(ref, img.ref, p, s, v, ffi.nullptr)); final ss = v.value.cast().toDartString(); calloc.free(v); return (ss, points ?? VecPoint.fromPointer(p), Mat.fromPointer(s)); @@ -523,7 +499,7 @@ class QRCodeDetector extends CvStruct { final code = straightCode?.ptr ?? calloc(); final points = calloc(); final v = calloc>(); - cvRun(() => cobjdetect.QRCodeDetector_DetectAndDecode(ref, img.ref, points, code, v)); + cvRun(() => cobjdetect.cv_QRCodeDetector_detectAndDecode(ref, img.ref, points, code, v, ffi.nullptr)); final s = v == ffi.nullptr ? "" : v.value.cast().toDartString(); calloc.free(v); return (s, VecPoint.fromPointer(points), Mat.fromPointer(code)); @@ -534,12 +510,12 @@ class QRCodeDetector extends CvStruct { /// For further details, please see: /// https://docs.opencv.org/master/de/dc3/classcv_1_1QRCodeDetector.html#a64373f7d877d27473f64fe04bb57d22b (bool ret, VecPoint points) detect(InputArray input, {VecPoint? points}) { - return cvRunArena<(bool, VecPoint)>((arena) { - final pts = calloc(); - final ret = arena(); - cvRun(() => cobjdetect.QRCodeDetector_Detect(ref, input.ref, pts, ret)); - return (ret.value, VecPoint.fromPointer(pts)); - }); + final pts = calloc(); + final ret = calloc(); + cvRun(() => cobjdetect.cv_QRCodeDetector_detect(ref, input.ref, pts, ret, ffi.nullptr)); + final rval = (ret.value, VecPoint.fromPointer(pts)); + calloc.free(ret); + return rval; } /// Decode decodes QR code in image once it's found by the detect() method. Returns UTF8-encoded output string or empty string if the code cannot be decoded. @@ -554,7 +530,7 @@ class QRCodeDetector extends CvStruct { final p = points?.ptr ?? calloc(); final ret = calloc>(); straightCode ??= Mat.empty(); - cvRun(() => cobjdetect.QRCodeDetector_Decode(ref, img.ref, p, straightCode!.ref, ret)); + cvRun(() => cobjdetect.cv_QRCodeDetector_decode(ref, img.ref, p, straightCode!.ref, ret, ffi.nullptr)); final info = ret.value.cast().toDartString(); calloc.free(ret); return (info, VecPoint.fromPointer(p), straightCode); @@ -568,12 +544,12 @@ class QRCodeDetector extends CvStruct { /// For further details, please see: /// https://docs.opencv.org/master/de/dc3/classcv_1_1QRCodeDetector.html#aaf2b6b2115b8e8fbc9acf3a8f68872b6 (bool, VecPoint points) detectMulti(InputArray img, {VecPoint? points}) { - return cvRunArena<(bool, VecPoint)>((arena) { - final p = points?.ptr ?? calloc(); - final ret = arena(); - cvRun(() => cobjdetect.QRCodeDetector_DetectMulti(ref, img.ref, p, ret)); - return (ret.value, VecPoint.fromPointer(p)); - }); + final p = points?.ptr ?? calloc(); + final ret = calloc(); + cvRun(() => cobjdetect.cv_QRCodeDetector_detectMulti(ref, img.ref, p, ret, ffi.nullptr)); + final rval = (ret.value, VecPoint.fromPointer(p)); + calloc.free(ret); + return rval; } /// Detects QR codes in image, finds the quadrangles containing the codes, and decodes the QRCodes to strings. @@ -588,7 +564,17 @@ class QRCodeDetector extends CvStruct { final points = calloc(); final codes = calloc(); final rval = calloc(); - cvRun(() => cobjdetect.QRCodeDetector_DetectAndDecodeMulti(ref, img.ref, info, points, codes, rval)); + cvRun( + () => cobjdetect.cv_QRCodeDetector_detectAndDecodeMulti( + ref, + img.ref, + info, + points, + codes, + rval, + ffi.nullptr, + ), + ); final ret = ( rval.value, VecVecChar.fromPointer(info).asStringList(), @@ -599,23 +585,18 @@ class QRCodeDetector extends CvStruct { return ret; } - void setEpsX(double epsX) { - cvRun(() => cobjdetect.QRCodeDetector_setEpsX(ref, epsX)); - } + void setEpsX(double epsX) => cobjdetect.cv_QRCodeDetector_setEpsX(ref, epsX); - void setEpsY(double epsY) { - cvRun(() => cobjdetect.QRCodeDetector_setEpsY(ref, epsY)); - } + void setEpsY(double epsY) => cobjdetect.cv_QRCodeDetector_setEpsY(ref, epsY); - void setUseAlignmentMarkers(bool useAlignmentMarkers) { - cvRun(() => cobjdetect.QRCodeDetector_setUseAlignmentMarkers(ref, useAlignmentMarkers)); - } + void setUseAlignmentMarkers(bool useAlignmentMarkers) => + cobjdetect.cv_QRCodeDetector_setUseAlignmentMarkers(ref, useAlignmentMarkers); - static final finalizer = OcvFinalizer(cobjdetect.addresses.QRCodeDetector_Close); + static final finalizer = OcvFinalizer(cobjdetect.addresses.cv_QRCodeDetector_close); void dispose() { finalizer.detach(this); - cobjdetect.QRCodeDetector_Close(ptr); + cobjdetect.cv_QRCodeDetector_close(ptr); } @override @@ -670,7 +651,7 @@ class FaceDetectorYN extends CvStruct { final cModel = model.toNativeUtf8().cast(); final cConfig = config.toNativeUtf8().cast(); cvRun( - () => cobjdetect.FaceDetectorYN_New( + () => cobjdetect.cv_FaceDetectorYN_create( cModel, cConfig, inputSize.cvd.ref, @@ -724,7 +705,7 @@ class FaceDetectorYN extends CvStruct { final bufM = VecUChar.fromList(bufferModel); final bufC = VecUChar.fromList(bufferConfig); cvRun( - () => cobjdetect.FaceDetectorYN_NewFromBuffer( + () => cobjdetect.cv_FaceDetectorYN_create_1( cFramework, bufM.ref, bufC.ref, @@ -745,39 +726,19 @@ class FaceDetectorYN extends CvStruct { /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#a68b6fb9bffbed0f3d5c104996113f247 (int, int) getInputSize() { - final p = calloc(); - cvRun(() => cobjdetect.FaceDetectorYN_GetInputSize(ref, p)); - final ret = (p.ref.width, p.ref.height); - calloc.free(p); + final p = cobjdetect.cv_FaceDetectorYN_getInputSize(ref); + final ret = (p.width, p.height); return ret; } /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#a5329744e10441e1c01526f1ff10b80de - double getScoreThreshold() { - return using((arena) { - final p = arena(); - cvRun(() => cobjdetect.FaceDetectorYN_GetScoreThreshold(ref, p)); - return p.value; - }); - } + double getScoreThreshold() => cobjdetect.cv_FaceDetectorYN_getScoreThreshold(ref); /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#a40749dc04b9578631d55122be9ab10c3 - double getNmsThreshold() { - return using((arena) { - final p = arena(); - cvRun(() => cobjdetect.FaceDetectorYN_GetNMSThreshold(ref, p)); - return p.value; - }); - } + double getNmsThreshold() => cobjdetect.cv_FaceDetectorYN_getNMSThreshold(ref); /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#acc6139ba763acd67f4aa738cee45b7ec - int getTopK() { - return using((arena) { - final p = arena(); - cvRun(() => cobjdetect.FaceDetectorYN_GetTopK(ref, p)); - return p.value; - }); - } + int getTopK() => cobjdetect.cv_FaceDetectorYN_getTopK(ref); /// Detects faces in the input image. Following is an example output. /// @@ -797,7 +758,7 @@ class FaceDetectorYN extends CvStruct { /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#ac05bd075ca3e6edc0e328927aae6f45b Mat detect(Mat image) { final p = calloc(); - cvRun(() => cobjdetect.FaceDetectorYN_Detect(ref, image.ref, p)); + cvRun(() => cobjdetect.cv_FaceDetectorYN_detect(ref, image.ref, p, ffi.nullptr)); return Mat.fromPointer(p); } @@ -808,9 +769,8 @@ class FaceDetectorYN extends CvStruct { /// [inputSize] the size of the input image /// /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#a072418e5ce7beeb69c41edda75c41d2e - void setInputSize((int, int) inputSize) { - cvRun(() => cobjdetect.FaceDetectorYN_SetInputSize(ref, inputSize.cvd.ref)); - } + void setInputSize((int, int) inputSize) => + cobjdetect.cv_FaceDetectorYN_setInputSize(ref, inputSize.cvd.ref); /// Set the score threshold to filter out bounding boxes of score less than /// the given value. @@ -818,9 +778,8 @@ class FaceDetectorYN extends CvStruct { /// [scoreThreshold] threshold for filtering out bounding boxes /// /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#a37f3c23b82158fac7fdad967d315f85a - void setScoreThreshold(double scoreThreshold) { - cvRun(() => cobjdetect.FaceDetectorYN_SetScoreThreshold(ref, scoreThreshold)); - } + void setScoreThreshold(double scoreThreshold) => + cobjdetect.cv_FaceDetectorYN_setScoreThreshold(ref, scoreThreshold); /// Set the Non-maximum-suppression threshold to suppress /// bounding boxes that have IoU greater than the given value. @@ -828,27 +787,24 @@ class FaceDetectorYN extends CvStruct { /// [nmsThreshold] threshold for NMS operation /// /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#ab6011efee7e12dca3857d82de5269ac5 - void setNMSThreshold(double nmsThreshold) { - cvRun(() => cobjdetect.FaceDetectorYN_SetNMSThreshold(ref, nmsThreshold)); - } + void setNMSThreshold(double nmsThreshold) => + cobjdetect.cv_FaceDetectorYN_setNMSThreshold(ref, nmsThreshold); /// Set the number of bounding boxes preserved before NMS. /// /// [topK] the number of bounding boxes to preserve from top rank based on score /// /// https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetectorYN.html#aa88d20e1e2df75ea36b851534089856a - void setTopK(int topK) { - cvRun(() => cobjdetect.FaceDetectorYN_SetTopK(ref, topK)); - } + void setTopK(int topK) => cobjdetect.cv_FaceDetectorYN_setTopK(ref, topK); @override cvg.FaceDetectorYN get ref => ptr.ref; - static final finalizer = OcvFinalizer(cobjdetect.addresses.FaceDetectorYN_Close); + static final finalizer = OcvFinalizer(cobjdetect.addresses.cv_FaceDetectorYN_close); void dispose() { finalizer.detach(this); - cobjdetect.FaceDetectorYN_Close(ptr); + cobjdetect.cv_FaceDetectorYN_close(ptr); } } @@ -881,7 +837,7 @@ class FaceRecognizerSF extends CvStruct { final p = calloc(); final cModel = model.toNativeUtf8().cast(); final cConfig = config.toNativeUtf8().cast(); - cvRun(() => cobjdetect.FaceRecognizerSF_New(cModel, cConfig, backendId, targetId, p)); + cvRun(() => cobjdetect.cv_FaceRecognizerSF_create(cModel, cConfig, backendId, targetId, p)); calloc.free(cModel); calloc.free(cConfig); return FaceRecognizerSF._(p); @@ -895,7 +851,7 @@ class FaceRecognizerSF extends CvStruct { /// https://docs.opencv.org/4.x/da/d09/classcv_1_1FaceRecognizerSF.html#a84492908abecbc9362b4ddc8d46b8345 Mat alignCrop(Mat srcImg, Mat faceBox) { final p = calloc(); - cvRun(() => cobjdetect.FaceRecognizerSF_AlignCrop(ref, srcImg.ref, faceBox.ref, p)); + cvRun(() => cobjdetect.cv_FaceRecognizerSF_alignCrop(ref, srcImg.ref, faceBox.ref, p, ffi.nullptr)); return Mat.fromPointer(p); } @@ -908,7 +864,7 @@ class FaceRecognizerSF extends CvStruct { /// https://docs.opencv.org/4.x/da/d09/classcv_1_1FaceRecognizerSF.html#ab1b4a3c12213e89091a490c573dc5aba Mat feature(Mat alignedImg, {bool clone = false}) { final p = calloc(); - cvRun(() => cobjdetect.FaceRecognizerSF_Feature(ref, alignedImg.ref, clone, p)); + cvRun(() => cobjdetect.cv_FaceRecognizerSF_feature(ref, alignedImg.ref, clone, p, ffi.nullptr)); return Mat.fromPointer(p); } @@ -921,29 +877,31 @@ class FaceRecognizerSF extends CvStruct { /// /// https://docs.opencv.org/4.x/da/d09/classcv_1_1FaceRecognizerSF.html#a2f0362ca1e64320a1f3ba7e1386d0219 double match(Mat faceFeature1, Mat faceFeature2, {int disType = FR_COSINE}) { - return using((arena) { - final distance = arena(); - cvRun( - () => cobjdetect.FaceRecognizerSF_Match( - ref, - faceFeature1.ref, - faceFeature2.ref, - disType, - distance, - ), - ); - return distance.value; - }); + final distance = calloc(); + cvRun( + () => cobjdetect.cv_FaceRecognizerSF_match( + ref, + faceFeature1.ref, + faceFeature2.ref, + disType, + distance, + ffi.nullptr, + ), + ); + final rval = distance.value; + calloc.free(distance); + return rval; } @override cvg.FaceRecognizerSF get ref => ptr.ref; - static final finalizer = OcvFinalizer(cobjdetect.addresses.FaceRecognizerSF_Close); + static final finalizer = + OcvFinalizer(cobjdetect.addresses.cv_FaceRecognizerSF_close); void dispose() { finalizer.detach(this); - cobjdetect.FaceRecognizerSF_Close(ptr); + cobjdetect.cv_FaceRecognizerSF_close(ptr); } @Deprecated("Use [FR_COSINE] instead.") diff --git a/packages/dartcv/lib/src/objdetect/objdetect_async.dart b/packages/dartcv/lib/src/objdetect/objdetect_async.dart index 4c6b9ffd..f11180ab 100644 --- a/packages/dartcv/lib/src/objdetect/objdetect_async.dart +++ b/packages/dartcv/lib/src/objdetect/objdetect_async.dart @@ -5,7 +5,6 @@ library cv.objdetect; import 'dart:ffi' as ffi; -import 'dart:typed_data'; import 'package:ffi/ffi.dart'; @@ -20,34 +19,6 @@ import '../native_lib.dart' show cobjdetect; import './objdetect.dart'; extension CascadeClassifierAsync on CascadeClassifier { - static Future emptyNewAsync() async => cvRunAsync( - cobjdetect.CascadeClassifier_New_Async, - (c, p) => c.complete(CascadeClassifier.fromPointer(p.cast())), - ); - - static Future fromFileAsync(String filename) async { - final cp = filename.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cobjdetect.CascadeClassifier_NewFromFile_Async(cp, callback), (c, p) { - return c.complete(CascadeClassifier.fromPointer(p.cast())); - }); - calloc.free(cp); - return rval; - } - - Future loadAsync(String name) async { - final cname = name.toNativeUtf8().cast(); - final rval = - cvRunAsync((callback) => cobjdetect.CascadeClassifier_Load_Async(ref, cname, callback), (c, p) { - final rval = p.cast().value != 0; - calloc.free(p); - return c.complete(rval); - }); - calloc.free(cname); - - return rval; - } - Future detectMultiScaleAsync( InputArray image, { double scaleFactor = 1.1, @@ -55,21 +26,24 @@ extension CascadeClassifierAsync on CascadeClassifier { int flags = 0, (int, int) minSize = (0, 0), (int, int) maxSize = (0, 0), - }) async { - final rval = cvRunAsync( - (callback) => cobjdetect.CascadeClassifier_DetectMultiScaleWithParams_Async( - ref, - image.ref, - scaleFactor, - minNeighbors, - flags, - minSize.toSize().ref, - maxSize.toSize().ref, - callback, - ), (c, ret) { - return c.complete(VecRect.fromPointer(ret.cast())); - }); - return rval; + }) { + final ret = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_CascadeClassifier_detectMultiScale_1( + ref, + image.ref, + ret, + scaleFactor, + minNeighbors, + flags, + minSize.cvd.ref, + maxSize.cvd.ref, + callback, + ), + (c) { + return c.complete(VecRect.fromPointer(ret)); + }, + ); } Future<(VecRect objects, VecI32 numDetections)> detectMultiScale2Async( @@ -79,23 +53,26 @@ extension CascadeClassifierAsync on CascadeClassifier { int flags = 0, (int, int) minSize = (0, 0), (int, int) maxSize = (0, 0), - }) async { - final rval = cvRunAsync2<(VecRect, VecI32)>( - (callback) => cobjdetect.CascadeClassifier_DetectMultiScale2_Async( - ref, - image.ref, - scaleFactor, - minNeighbors, - flags, - minSize.cvd.ref, - maxSize.cvd.ref, - callback, - ), (c, ret, pnums) { - return c.complete( - (VecRect.fromPointer(ret.cast()), VecI32.fromPointer(pnums.cast())), - ); - }); - return rval; + }) { + final ret = calloc(); + final pnums = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_CascadeClassifier_detectMultiScale_2( + ref, + image.ref, + ret, + pnums, + scaleFactor, + minNeighbors, + flags, + minSize.cvd.ref, + maxSize.cvd.ref, + callback, + ), + (c) { + return c.complete((VecRect.fromPointer(ret), VecI32.fromPointer(pnums))); + }, + ); } Future<(VecRect objects, VecI32 rejectLevels, VecF64 levelWeights)> detectMultiScale3Async( @@ -106,11 +83,17 @@ extension CascadeClassifierAsync on CascadeClassifier { (int, int) minSize = (0, 0), (int, int) maxSize = (0, 0), bool outputRejectLevels = false, - }) async { - final rval = cvRunAsync3<(VecRect, VecI32, VecF64)>( - (callback) => cobjdetect.CascadeClassifier_DetectMultiScale3_Async( + }) { + final objects = calloc(); + final rejectLevels = calloc(); + final levelWeights = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_CascadeClassifier_detectMultiScale_3( ref, image.ref, + objects, + rejectLevels, + levelWeights, scaleFactor, minNeighbors, flags, @@ -119,131 +102,65 @@ extension CascadeClassifierAsync on CascadeClassifier { outputRejectLevels, callback, ), - (c, p1, p2, p3) => c.complete( - ( - VecRect.fromPointer(p1.cast()), - VecI32.fromPointer(p2.cast()), - VecF64.fromPointer(p3.cast()) - ), - ), + (c) { + return c.complete( + (VecRect.fromPointer(objects), VecI32.fromPointer(rejectLevels), VecF64.fromPointer(levelWeights)), + ); + }, ); - return rval; - } - - Future emptyAsync() async { - final rval = - cvRunAsync((callback) => cobjdetect.CascadeClassifier_Empty_Async(ref, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }); - return rval; - } - - Future getFeatureTypeAsync() async { - final rval = cvRunAsync( - (callback) => cobjdetect.CascadeClassifier_getFeatureType_Async(ref, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - - return c.complete(rval); - }); - return rval; - } - - Future<(int, int)> getOriginalWindowSizeAsync() async { - final rval = cvRunAsync<(int, int)>( - (callback) => cobjdetect.CascadeClassifier_getOriginalWindowSize_Async(ref, callback), (c, p) { - final size = p.cast().ref; - final ret = (size.width, size.height); - return c.complete(ret); - }); - return rval; - } - - Future isOldFormatCascadeAsync() async { - final rval = cvRunAsync( - (callback) => cobjdetect.CascadeClassifier_isOldFormatCascade_Async(ref, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }); - return rval; } } extension HOGDescriptorAsync on HOGDescriptor { - static Future emptyNewAsync() async => cvRunAsync( - cobjdetect.HOGDescriptor_New_Async, - (c, p) => c.complete(HOGDescriptor.fromPointer(p.cast())), - ); - - static Future fromFileAsync(String filename) async { - final cp = filename.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cobjdetect.HOGDescriptor_NewFromFile_Async(cp, callback), (c, p) { - return c.complete(HOGDescriptor.fromPointer(p.cast())); - }); - calloc.free(cp); - return rval; - } - - Future loadAsync(String name) async { - final cname = name.toNativeUtf8().cast(); - final rval = - cvRunAsync((callback) => cobjdetect.HOGDescriptor_Load_Async(ref, cname, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - - return c.complete(rval); - }); - calloc.free(cname); - return rval; - } - Future<(VecF32 descriptors, VecPoint locations)> computeAsync( Mat img, { (int, int) winStride = (0, 0), (int, int) padding = (0, 0), - }) async { - final rval = cvRunAsync2<(VecF32, VecPoint)>( - (callback) => cobjdetect.HOGDescriptor_Compute_Async( - ref, - img.ref, - winStride.cvd.ref, - padding.cvd.ref, - callback, - ), (c, descriptors, locations) { - return c.complete( - ( - VecF32.fromPointer(descriptors.cast()), - VecPoint.fromPointer(locations.cast()) - ), - ); - }); - return rval; + }) { + final descriptors = calloc(); + final locations = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_HOGDescriptor_compute( + ref, + img.ref, + descriptors, + winStride.cvd.ref, + padding.cvd.ref, + locations, + callback, + ), + (c) { + return c.complete( + ( + VecF32.fromPointer(descriptors), + VecPoint.fromPointer(locations), + ), + ); + }, + ); } Future<(Mat grad, Mat angleOfs)> computeGradientAsync( - InputArray img, - Mat grad, - Mat angleOfs, { + InputArray img, { (int, int) paddingTL = (0, 0), (int, int) paddingBR = (0, 0), - }) async { - final rval = cvRunAsync0<(Mat, Mat)>( - (callback) => cobjdetect.HOGDescriptor_computeGradient_Async( - ref, - img.ref, - grad.ref, - angleOfs.ref, - paddingTL.cvd.ref, - paddingBR.cvd.ref, - callback, - ), (c) { - return c.complete((grad, angleOfs)); - }); - return rval; + }) { + final grad = Mat.empty(); + final angleOfs = Mat.empty(); + return cvRunAsync0( + (callback) => cobjdetect.cv_HOGDescriptor_computeGradient( + ref, + img.ref, + grad.ref, + angleOfs.ref, + paddingTL.cvd.ref, + paddingBR.cvd.ref, + callback, + ), + (c) { + return c.complete((grad, angleOfs)); + }, + ); } Future<(VecPoint foundLocations, VecF64 weights, VecPoint searchLocations)> detect2Async( @@ -251,25 +168,32 @@ extension HOGDescriptorAsync on HOGDescriptor { double hitThreshold = 0, (int, int) winStride = (0, 0), (int, int) padding = (0, 0), - }) async { - final rval = cvRunAsync3<(VecPoint, VecF64, VecPoint)>( - (callback) => cobjdetect.HOGDescriptor_Detect_Async( - ref, - img.ref, - hitThreshold, - winStride.cvd.ref, - padding.cvd.ref, - callback, - ), (c, foundLocations, weights, searchLocations) { - return c.complete( - ( - VecPoint.fromPointer(foundLocations.cast()), - VecF64.fromPointer(weights.cast()), - VecPoint.fromPointer(searchLocations.cast()) - ), - ); - }); - return rval; + }) { + final foundLocations = calloc(); + final searchLocations = calloc(); + final weights = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_HOGDescriptor_detect( + ref, + img.ref, + foundLocations, + weights, + hitThreshold, + winStride.cvd.ref, + padding.cvd.ref, + searchLocations, + callback, + ), + (c) { + return c.complete( + ( + VecPoint.fromPointer(foundLocations), + VecF64.fromPointer(weights), + VecPoint.fromPointer(searchLocations), + ), + ); + }, + ); } Future<(VecPoint foundLocations, VecPoint searchLocations)> detectAsync( @@ -277,24 +201,24 @@ extension HOGDescriptorAsync on HOGDescriptor { double hitThreshold = 0, (int, int) winStride = (0, 0), (int, int) padding = (0, 0), - }) async { - final rval = cvRunAsync2<(VecPoint, VecPoint)>( - (callback) => cobjdetect.HOGDescriptor_Detect2_Async( - ref, - img.ref, - hitThreshold, - winStride.cvd.ref, - padding.cvd.ref, - callback, - ), (c, foundLocations, searchLocations) { - return c.complete( - ( - VecPoint.fromPointer(foundLocations.cast()), - VecPoint.fromPointer(searchLocations.cast()) - ), - ); - }); - return rval; + }) { + final foundLocations = calloc(); + final searchLocations = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_HOGDescriptor_detect2( + ref, + img.ref, + foundLocations, + hitThreshold, + winStride.cvd.ref, + padding.cvd.ref, + searchLocations, + callback, + ), + (c) { + return c.complete((VecPoint.fromPointer(foundLocations), VecPoint.fromPointer(searchLocations))); + }, + ); } Future detectMultiScaleAsync( @@ -306,52 +230,25 @@ extension HOGDescriptorAsync on HOGDescriptor { double scale = 1.05, double groupThreshold = 2.0, bool useMeanshiftGrouping = false, - }) async { - final rval = cvRunAsync( - (callback) => cobjdetect.HOGDescriptor_DetectMultiScaleWithParams_Async( - ref, - image.ref, - hitThreshold, - winStride.cvd.ref, - padding.cvd.ref, - scale, - groupThreshold, - useMeanshiftGrouping, - callback, - ), (c, rects) { - return c.complete(VecRect.fromPointer(rects.cast())); - }); - return rval; - } - - static Future getDefaultPeopleDetectorAsync() async => cvRunAsync( - cobjdetect.HOG_GetDefaultPeopleDetector_Async, - (c, v) => c.complete(VecF32.fromPointer(v.cast())), - ); - - static Future getDaimlerPeopleDetectorAsync() async => cvRunAsync( - cobjdetect.HOGDescriptor_getDaimlerPeopleDetector_Async, - (c, v) => c.complete(VecF32.fromPointer(v.cast())), - ); - - Future getDescriptorSizeAsync() async { - final rval = cvRunAsync( - (callback) => cobjdetect.HOGDescriptor_getDescriptorSize_Async(ref, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }); - return rval; - } - - Future getWinSigmaAsync() async { - final rval = - cvRunAsync((callback) => cobjdetect.HOGDescriptor_getWinSigma_Async(ref, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }); - return rval; + }) { + final rects = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_HOGDescriptor_detectMultiScale_1( + ref, + image.ref, + hitThreshold, + winStride.cvd.ref, + padding.cvd.ref, + scale, + groupThreshold, + useMeanshiftGrouping, + rects, + callback, + ), + (c) { + return c.complete(VecRect.fromPointer(rects)); + }, + ); } Future<(VecRect rectList, VecF64 weights)> groupRectanglesAsync( @@ -359,432 +256,211 @@ extension HOGDescriptorAsync on HOGDescriptor { VecF64 weights, int groupThreshold, double eps, - ) async { - final rval = cvRunAsync0<(VecRect, VecF64)>( - (callback) => cobjdetect.HOGDescriptor_groupRectangles_Async( - ref, - rectList.ptr, - weights.ptr, - groupThreshold, - eps, - callback, - ), (c) { - rectList.reattach(); - weights.reattach(); - return c.complete((rectList, weights)); - }); - return rval; + ) { + return cvRunAsync0( + (callback) => cobjdetect.cv_HOGDescriptor_groupRectangles( + ref, + rectList.ptr, + weights.ptr, + groupThreshold, + eps, + callback, + ), + (c) { + rectList.reattach(); + weights.reattach(); + return c.complete((rectList, weights)); + }, + ); } - - Future setSVMDetectorAsync(VecF32 det) async => cvRunAsync0( - (callback) => cobjdetect.HOGDescriptor_SetSVMDetector_Async(ref, det.ref, callback), - (c) => c.complete(), - ); } -Future groupRectanglesAsync( - VecRect rects, - int groupThreshold, - double eps, -) async { - final rval = cvRunAsync0( - (callback) => cobjdetect.GroupRectangles_Async(rects.ptr, groupThreshold, eps, callback), (c) { - rects.reattach(); - return c.complete(rects); - }); - return rval; +Future groupRectanglesAsync(VecRect rects, int groupThreshold, double eps) { + return cvRunAsync0( + (callback) => cobjdetect.cv_groupRectangles(rects.ptr, groupThreshold, eps, callback), + (c) { + rects.reattach(); + return c.complete(rects); + }, + ); } extension QRCodeDetectorAsync on QRCodeDetector { - static Future emptyNewAsync() async => cvRunAsync( - cobjdetect.QRCodeDetector_New_Async, - (c, p) => c.complete(QRCodeDetector.fromPointer(p.cast())), - ); - Future<(String rval, Mat straightQRcode)> decodeCurvedAsync( InputArray img, - VecPoint points, - ) async { - final rval = cvRunAsync2<(String, Mat)>( - (callback) => cobjdetect.QRCodeDetector_decodeCurved_Async( - ref, - img.ref, - points.ref, - callback, - ), (c, prval, pstraightQRcode) { - // prval is a char ** pointer - final rval = prval.cast>().value.toDartString(); - calloc.free(prval); - return c.complete( - (rval, Mat.fromPointer(pstraightQRcode.cast())), - ); - }); - return rval; + VecPoint points, { + OutputArray? straightQRcode, + }) { + final s = straightQRcode?.ptr ?? calloc(); + final v = calloc>(); + return cvRunAsync0( + (callback) => cobjdetect.cv_QRCodeDetector_decodeCurved(ref, img.ref, points.ref, s, v, callback), + (c) { + final ss = v.value.cast().toDartString(); + calloc.free(v); + return c.complete((ss, Mat.fromPointer(s))); + }, + ); } Future<(String rval, VecPoint points, Mat straightQRcode)> detectAndDecodeCurvedAsync( - InputArray img, - ) async { - final rval = cvRunAsync3<(String, VecPoint, Mat)>( - (callback) => cobjdetect.QRCodeDetector_detectAndDecodeCurved_Async( - ref, - img.ref, - callback, - ), (c, prval, points, straightQRcode) { - // prval is a char ** pointer - final rval = prval.cast>().value.toDartString(); - calloc.free(prval); - return c.complete( - ( - rval, - VecPoint.fromPointer(points.cast()), - Mat.fromPointer(straightQRcode.cast()), - ), - ); - }); - return rval; - } - - Future<(String ret, VecPoint points, Mat straightCode)> detectAndDecodeAsync(InputArray img) async { - final rval = cvRunAsync3<(String, VecPoint, Mat)>( - (callback) => cobjdetect.QRCodeDetector_DetectAndDecode_Async(ref, img.ref, callback), - (c, prval, points, straightCode) { - // prval is a char ** pointer - final rval = prval.cast>().value.toDartString(); - calloc.free(prval); - return c.complete( - ( - rval, - VecPoint.fromPointer(points.cast()), - Mat.fromPointer(straightCode.cast()), - ), - ); - }); - return rval; - } - - Future<(bool ret, VecPoint points)> detectAsync( - InputArray input, { + InputArray img, { VecPoint? points, - }) async { - final rval = cvRunAsync2<(bool, VecPoint)>( - (callback) => cobjdetect.QRCodeDetector_Detect_Async(ref, input.ref, callback), (c, ret, points) { - final retValue = ret.cast().value; - calloc.free(ret); - return c.complete( - (retValue, VecPoint.fromPointer(points.cast())), - ); - }); - return rval; - } - - Future<(String ret, VecPoint? points, Mat? straightCode)> decodeAsync( - InputArray img, - ) async { - final rval = cvRunAsync3<(String, VecPoint, Mat)>( - (callback) => cobjdetect.QRCodeDetector_Decode_Async(ref, img.ref, callback), - (c, prval, points, straightCode) { - // prval is a char ** pointer - final rval = prval.cast>().value.toDartString(); - calloc.free(prval); - return c.complete( - ( - rval, - VecPoint.fromPointer(points.cast()), - Mat.fromPointer(straightCode.cast()), - ), - ); - }); - return rval; + Mat? straightQRcode, + }) { + final p = points?.ptr ?? calloc(); + final s = straightQRcode?.ptr ?? calloc(); + final v = calloc>(); + return cvRunAsync0( + (callback) => cobjdetect.cv_QRCodeDetector_detectAndDecodeCurved(ref, img.ref, p, s, v, callback), + (c) { + final ss = v.value.cast().toDartString(); + calloc.free(v); + return c.complete((ss, points ?? VecPoint.fromPointer(p), Mat.fromPointer(s))); + }, + ); } - Future<(bool ret, VecPoint points)> detectMultiAsync( - InputArray img, - ) async { - final rval = cvRunAsync2<(bool, VecPoint)>( - (callback) => cobjdetect.QRCodeDetector_DetectMulti_Async(ref, img.ref, callback), (c, ret, points) { - final retValue = ret.cast().value; - calloc.free(ret); - return c.complete((retValue, VecPoint.fromPointer(points.cast()))); - }); - return rval; + Future<(String ret, VecPoint points, Mat straightCode)> detectAndDecodeAsync( + InputArray img, { + VecPoint? points, + OutputArray? straightCode, + }) { + final code = straightCode?.ptr ?? calloc(); + final points = calloc(); + final v = calloc>(); + return cvRunAsync0( + (callback) => cobjdetect.cv_QRCodeDetector_detectAndDecode(ref, img.ref, points, code, v, callback), + (c) { + final s = v.value.cast().toDartString(); + calloc.free(v); + return c.complete((s, VecPoint.fromPointer(points), Mat.fromPointer(code))); + }, + ); } - Future<(bool, List, VecPoint, VecMat)> detectAndDecodeMultiAsync( - InputArray img, - ) async { - final ret = cvRunAsync4<(bool, List, VecPoint, VecMat)>( - (callback) => cobjdetect.QRCodeDetector_DetectAndDecodeMulti_Async( - ref, - img.ref, - callback, - ), (c, rval, info, points, codes) { - final rvalValue = rval.cast().value; - calloc.free(rval); - final ret = ( - rvalValue, - VecVecChar.fromPointer(info.cast()).asStringList(), - VecPoint.fromPointer(points.cast()), - VecMat.fromPointer(codes.cast()) - ); - return c.complete(ret); - }); - return ret; + Future<(bool ret, VecPoint points)> detectAsync(InputArray input, {VecPoint? points}) { + final pts = calloc(); + final ret = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_QRCodeDetector_detect(ref, input.ref, pts, ret, callback), + (c) { + final rval = (ret.value, VecPoint.fromPointer(pts)); + calloc.free(ret); + return c.complete(rval); + }, + ); } - Future setEpsXAsync(double epsX) async { - await cvRunAsync0((callback) => cobjdetect.QRCodeDetector_setEpsX_Async(ref, epsX, callback), (c) { - return c.complete(); - }); + Future<(String ret, VecPoint? points, Mat? straightCode)> decodeAsync( + InputArray img, { + VecPoint? points, + Mat? straightCode, + }) { + final p = points?.ptr ?? calloc(); + final ret = calloc>(); + straightCode ??= Mat.empty(); + return cvRunAsync0( + (callback) => cobjdetect.cv_QRCodeDetector_decode(ref, img.ref, p, straightCode!.ref, ret, callback), + (c) { + final info = ret.value.cast().toDartString(); + calloc.free(ret); + return c.complete((info, VecPoint.fromPointer(p), straightCode)); + }, + ); } - Future setEpsYAsync(double epsY) async { - await cvRunAsync0((callback) => cobjdetect.QRCodeDetector_setEpsY_Async(ref, epsY, callback), (c) { - return c.complete(); - }); + Future<(bool ret, VecPoint points)> detectMultiAsync(InputArray img, {VecPoint? points}) { + final p = points?.ptr ?? calloc(); + final ret = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_QRCodeDetector_detectMulti(ref, img.ref, p, ret, callback), + (c) { + final rval = (ret.value, VecPoint.fromPointer(p)); + calloc.free(ret); + return c.complete(rval); + }, + ); } - Future setUseAlignmentMarkersAsync(bool useAlignmentMarkers) async { - await cvRunAsync0( - (callback) => cobjdetect.QRCodeDetector_setUseAlignmentMarkers_Async( - ref, - useAlignmentMarkers, - callback, - ), (c) { - return c.complete(); - }); + Future<(bool, List, VecPoint, VecMat)> detectAndDecodeMultiAsync(InputArray img) { + final info = calloc(); + final points = calloc(); + final codes = calloc(); + final rval = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_QRCodeDetector_detectAndDecodeMulti( + ref, + img.ref, + info, + points, + codes, + rval, + callback, + ), + (c) { + final ret = ( + rval.value, + VecVecChar.fromPointer(info).asStringList(), + VecPoint.fromPointer(points), + VecMat.fromPointer(codes), + ); + calloc.free(rval); + return c.complete(ret); + }, + ); } } extension FaceDetectorYNAsync on FaceDetectorYN { - static Future emptyNewAsync() async => cvRunAsync( - cobjdetect.CascadeClassifier_New_Async, - (c, p) => c.complete(CascadeClassifier.fromPointer(p.cast())), - ); - - static Future fromFileAsync( - String model, - String config, - (int, int) inputSize, { - double scoreThreshold = 0.9, - double nmsThreshold = 0.3, - int topK = 5000, - int backendId = 0, - int targetId = 0, - }) async { - final cModel = model.toNativeUtf8().cast(); - final cConfig = config.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cobjdetect.FaceDetectorYN_New_Async( - cModel, - cConfig, - inputSize.cvd.ref, - scoreThreshold, - nmsThreshold, - topK, - backendId, - targetId, - callback, - ), (c, p) { - return c.complete(FaceDetectorYN.fromPointer(p.cast())); - }); - calloc.free(cModel); - calloc.free(cConfig); - return rval; - } - - static Future fromBufferAsync( - String framework, - Uint8List bufferModel, - Uint8List bufferConfig, - (int, int) inputSize, { - double scoreThreshold = 0.9, - double nmsThreshold = 0.3, - int topK = 5000, - int backendId = 0, - int targetId = 0, - }) async { - final cFramework = framework.toNativeUtf8().cast(); - final bufM = VecUChar.fromList(bufferModel); - final bufC = VecUChar.fromList(bufferConfig); - - final rval = await cvRunAsync( - (callback) => cobjdetect.FaceDetectorYN_NewFromBuffer_Async( - cFramework, - bufM.ref, - bufC.ref, - inputSize.cvd.ref, - scoreThreshold, - nmsThreshold, - topK, - backendId, - targetId, - callback, - ), (c, p) { - return c.complete(FaceDetectorYN.fromPointer(p.cast())); - }); - calloc.free(cFramework); - bufM.dispose(); - bufC.dispose(); - - return rval; - } - - Future<(int, int)> getInputSizeAsync() async { - final rval = cvRunAsync<(int, int)>( - (callback) => cobjdetect.FaceDetectorYN_GetInputSize_Async(ref, callback), (c, p) { - final size = p.cast().ref; - final ret = (size.width, size.height); - return c.complete(ret); - }); - return rval; - } - - Future getScoreThresholdAsync() async { - final rval = cvRunAsync( - (callback) => cobjdetect.FaceDetectorYN_GetScoreThreshold_Async(ref, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }); - return rval; - } - - Future getNmsThresholdAsync() async { - final rval = cvRunAsync( - (callback) => cobjdetect.FaceDetectorYN_GetNMSThreshold_Async(ref, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }); - return rval; - } - - Future getTopKAsync() async { - final rval = - cvRunAsync((callback) => cobjdetect.FaceDetectorYN_GetTopK_Async(ref, callback), (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }); - return rval; - } - - Future detectAsync(Mat image) async { - final rval = cvRunAsync( - (callback) => cobjdetect.FaceDetectorYN_Detect_Async(ref, image.ref, callback), (c, p) { - return c.complete(Mat.fromPointer(p.cast())); - }); - return rval; - } - - Future setInputSizeAsync((int, int) inputSize) async { - await cvRunAsync0( - (callback) => cobjdetect.FaceDetectorYN_SetInputSize_Async( - ref, - inputSize.cvd.ref, - callback, - ), (c) { - return c.complete(); - }); - } - - Future setScoreThresholdAsync(double scoreThreshold) async { - await cvRunAsync0( - (callback) => cobjdetect.FaceDetectorYN_SetScoreThreshold_Async( - ref, - scoreThreshold, - callback, - ), (c) { - return c.complete(); - }); - } - - Future setNMSThresholdAsync(double nmsThreshold) async { - await cvRunAsync0( - (callback) => cobjdetect.FaceDetectorYN_SetNMSThreshold_Async( - ref, - nmsThreshold, - callback, - ), (c) { - return c.complete(); - }); - } - - Future setTopKAsync(int topK) async { - await cvRunAsync0((callback) => cobjdetect.FaceDetectorYN_SetTopK_Async(ref, topK, callback), (c) { - return c.complete(); - }); + Future detectAsync(Mat image) { + final p = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_FaceDetectorYN_detect(ref, image.ref, p, callback), + (c) { + return c.complete(Mat.fromPointer(p)); + }, + ); } } extension FaceRecognizerSFAsync on FaceRecognizerSF { - static Future fromFileAsync( - String model, - String config, { - int backendId = 0, - int targetId = 0, - }) async { - final cModel = model.toNativeUtf8().cast(); - final cConfig = config.toNativeUtf8().cast(); - final rval = await cvRunAsync( - (callback) => cobjdetect.FaceRecognizerSF_New_Async( - cModel, - cConfig, - backendId, - targetId, - callback, - ), (c, p) { - return c.complete(FaceRecognizerSF.fromPointer(p.cast())); - }); - calloc.free(cModel); - calloc.free(cConfig); - return rval; - } - - Future alignCropAsync(Mat srcImg, Mat faceBox) async { - final rval = cvRunAsync( - (callback) => cobjdetect.FaceRecognizerSF_AlignCrop_Async( - ref, - srcImg.ref, - faceBox.ref, - callback, - ), (c, p) { - return c.complete(Mat.fromPointer(p.cast())); - }); - return rval; + Future alignCropAsync(Mat srcImg, Mat faceBox) { + final p = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_FaceRecognizerSF_alignCrop(ref, srcImg.ref, faceBox.ref, p, callback), + (c) { + return c.complete(Mat.fromPointer(p)); + }, + ); } - Future featureAsync(Mat alignedImg, {bool clone = false}) async { - final rval = cvRunAsync( - (callback) => cobjdetect.FaceRecognizerSF_Feature_Async( - ref, - alignedImg.ref, - clone, - callback, - ), (c, p) { - return c.complete(Mat.fromPointer(p.cast())); - }); - return rval; + Future featureAsync(Mat alignedImg, {bool clone = false}) { + final p = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_FaceRecognizerSF_feature(ref, alignedImg.ref, clone, p, callback), + (c) { + return c.complete(Mat.fromPointer(p)); + }, + ); } - Future matchAsync( - Mat faceFeature1, - Mat faceFeature2, { - int disType = FaceRecognizerSF.FR_COSINE, - }) async { - final rval = cvRunAsync( - (callback) => cobjdetect.FaceRecognizerSF_Match_Async( - ref, - faceFeature1.ref, - faceFeature2.ref, - disType, - callback, - ), (c, p) { - final rval = p.cast().value; - calloc.free(p); - return c.complete(rval); - }); - return rval; + Future matchAsync(Mat faceFeature1, Mat faceFeature2, {int disType = FaceRecognizerSF.FR_COSINE}) { + final distance = calloc(); + return cvRunAsync0( + (callback) => cobjdetect.cv_FaceRecognizerSF_match( + ref, + faceFeature1.ref, + faceFeature2.ref, + disType, + distance, + callback, + ), + (c) { + final rval = distance.value; + calloc.free(distance); + return c.complete(rval); + }, + ); } } From fd018de855c4bce17bd88aa72f6c56cc5eb037b4 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Sun, 20 Oct 2024 21:29:56 +0800 Subject: [PATCH 20/30] finish photo --- packages/dartcv/lib/src/photo/photo.dart | 53 ++-- .../dartcv/lib/src/photo/photo_async.dart | 232 ++++++++---------- 2 files changed, 132 insertions(+), 153 deletions(-) diff --git a/packages/dartcv/lib/src/photo/photo.dart b/packages/dartcv/lib/src/photo/photo.dart index c4834cb7..319b5843 100644 --- a/packages/dartcv/lib/src/photo/photo.dart +++ b/packages/dartcv/lib/src/photo/photo.dart @@ -10,7 +10,6 @@ import 'package:ffi/ffi.dart'; import '../core/base.dart'; import '../core/mat.dart'; -import '../core/mat_type.dart'; import '../core/point.dart'; import '../g/photo.g.dart' as cvg; import '../native_lib.dart' show cphoto; @@ -34,7 +33,7 @@ class MergeMertens extends CvStruct { MergeMertens._(ptr.cast(), attach); factory MergeMertens.empty() { final p = calloc(); - cvRun(() => cphoto.MergeMertens_Create(p)); + cvRun(() => cphoto.cv_createMergeMertens(p)); return MergeMertens._(p); } @@ -45,7 +44,7 @@ class MergeMertens extends CvStruct { }) { final p = calloc(); cvRun( - () => cphoto.MergeMertens_CreateWithParams( + () => cphoto.cv_createMergeMertens_1( contrastWeight, saturationWeight, exposureWeight, @@ -55,11 +54,11 @@ class MergeMertens extends CvStruct { return MergeMertens._(p); } - static final finalizer = OcvFinalizer(cphoto.addresses.MergeMertens_Close); + static final finalizer = OcvFinalizer(cphoto.addresses.cv_MergeMertens_close); void dispose() { finalizer.detach(this); - cphoto.MergeMertens_Close(ptr); + cphoto.cv_MergeMertens_close(ptr); } /// BalanceWhite computes merge LDR images using the current MergeMertens. @@ -68,8 +67,8 @@ class MergeMertens extends CvStruct { /// https://docs.opencv.org/master/d7/dd6/classcv_1_1MergeMertens.html#a2d2254b2aab722c16954de13a663644d Mat process(VecMat src) { final dst = Mat.empty(); - cphoto.MergeMertens_Process(ref, src.ref, dst.ref); - return dst.convertTo(MatType.CV_8UC3, alpha: 255.0); + cvRun(() => cphoto.cv_MergeMertens_process(ref, src.ref, dst.ref, ffi.nullptr)); + return dst; } @override @@ -106,7 +105,7 @@ class AlignMTB extends CvStruct { /// https://docs.opencv.org/master/d6/df5/group__photo__hdr.html#ga2f1fafc885a5d79dbfb3542e08db0244 factory AlignMTB.empty() { final p = calloc(); - cvRun(() => cphoto.AlignMTB_Create(p)); + cvRun(() => cphoto.cv_createAlignMTB(p)); return AlignMTB._(p); } @@ -124,20 +123,20 @@ class AlignMTB extends CvStruct { bool cut = true, }) { final p = calloc(); - cvRun(() => cphoto.AlignMTB_CreateWithParams(maxBits, excludeRange, cut, p)); + cvRun(() => cphoto.cv_createAlignMTB_1(maxBits, excludeRange, cut, p)); return AlignMTB._(p); } - static final finalizer = OcvFinalizer(cphoto.addresses.AlignMTB_Close); + static final finalizer = OcvFinalizer(cphoto.addresses.cv_AlignMTB_close); void dispose() { finalizer.detach(this); - cphoto.AlignMTB_Close(ptr); + cphoto.cv_AlignMTB_close(ptr); } VecMat process(VecMat src) { final dst = calloc(); - cphoto.AlignMTB_Process(ref, src.ref, dst); + cvRun(()=>cphoto.cv_AlignMTB_process(ref, src.ref, dst, ffi.nullptr)); return VecMat.fromPointer(dst); } @@ -158,7 +157,7 @@ Mat colorChange( }) { final dst = Mat.empty(); cvRun( - () => cphoto.ColorChange(src.ref, mask.ref, dst.ref, redMul, greenMul, blueMul), + () => cphoto.cv_colorChange(src.ref, mask.ref, dst.ref, redMul, greenMul, blueMul, ffi.nullptr), ); return dst; } @@ -176,7 +175,7 @@ Mat seamlessClone( ) { final blend = Mat.empty(); cvRun( - () => cphoto.SeamlessClone(src.ref, dst.ref, mask.ref, p.ref, blend.ref, flags), + () => cphoto.cv_seamlessClone(src.ref, dst.ref, mask.ref, p.ref, blend.ref, flags, ffi.nullptr), ); return blend; } @@ -192,7 +191,7 @@ Mat illuminationChange( double beta = 0.4, }) { final dst = Mat.empty(); - cvRun(() => cphoto.IlluminationChange(src.ref, mask.ref, dst.ref, alpha, beta)); + cvRun(() => cphoto.cv_illuminationChange(src.ref, mask.ref, dst.ref, alpha, beta, ffi.nullptr)); return dst; } @@ -209,13 +208,14 @@ Mat textureFlattening( }) { final dst = Mat.empty(); cvRun( - () => cphoto.TextureFlattening( + () => cphoto.cv_textureFlattening( src.ref, mask.ref, dst.ref, lowThreshold, highThreshold, kernelSize, + ffi.nullptr, ), ); return dst; @@ -234,12 +234,13 @@ Mat fastNlMeansDenoising( }) { final dst = Mat.empty(); cvRun( - () => cphoto.FastNlMeansDenoisingWithParams( + () => cphoto.cv_fastNlMeansDenoising_1( src.ref, dst.ref, h, templateWindowSize, searchWindowSize, + ffi.nullptr, ), ); return dst; @@ -258,13 +259,14 @@ Mat fastNlMeansDenoisingColored( }) { final dst = Mat.empty(); cvRun( - () => cphoto.FastNlMeansDenoisingColoredWithParams( + () => cphoto.cv_fastNlMeansDenoisingColored_1( src.ref, dst.ref, h, hColor, templateWindowSize, searchWindowSize, + ffi.nullptr, ), ); return dst; @@ -285,7 +287,7 @@ Mat fastNlMeansDenoisingColoredMulti( }) { final dst = Mat.empty(); cvRun( - () => cphoto.FastNlMeansDenoisingColoredMultiWithParams( + () => cphoto.cv_fastNlMeansDenoisingColoredMulti_1( srcImgs.ref, dst.ref, imgToDenoiseIndex, @@ -294,6 +296,7 @@ Mat fastNlMeansDenoisingColoredMulti( hColor, templateWindowSize, searchWindowSize, + ffi.nullptr, ), ); return dst; @@ -305,7 +308,7 @@ Mat fastNlMeansDenoisingColoredMulti( /// https://docs.opencv.org/4.x/df/dac/group__photo__render.html#ga0de660cb6f371a464a74c7b651415975 Mat detailEnhance(InputArray src, {double sigmaS = 10, double sigmaR = 0.15}) { final dst = Mat.empty(); - cvRun(() => cphoto.DetailEnhance(src.ref, dst.ref, sigmaS, sigmaR)); + cvRun(() => cphoto.cv_detailEnhance(src.ref, dst.ref, sigmaS, sigmaR, ffi.nullptr)); return dst; } @@ -322,7 +325,7 @@ Mat edgePreservingFilter( }) { final dst = Mat.empty(); cvRun( - () => cphoto.EdgePreservingFilter(src.ref, dst.ref, flags, sigmaS, sigmaR), + () => cphoto.cv_edgePreservingFilter(src.ref, dst.ref, flags, sigmaS, sigmaR, ffi.nullptr), ); return dst; } @@ -340,13 +343,14 @@ Mat edgePreservingFilter( final dst1 = Mat.empty(); final dst2 = Mat.empty(); cvRun( - () => cphoto.PencilSketch( + () => cphoto.cv_pencilSketch( src.ref, dst1.ref, dst2.ref, sigmaS, sigmaR, shadeFactor, + ffi.nullptr, ), ); return (dst1, dst2); @@ -365,7 +369,7 @@ Mat stylization( double sigmaR = 0.45, }) { final dst = Mat.empty(); - cvRun(() => cphoto.Stylization(src.ref, dst.ref, sigmaS, sigmaR)); + cvRun(() => cphoto.cv_stylization(src.ref, dst.ref, sigmaS, sigmaR, ffi.nullptr)); return dst; } @@ -383,12 +387,13 @@ Mat inpaint( ) { final dst = Mat.empty(); cvRun( - () => cphoto.PhotoInpaint( + () => cphoto.cv_inpaint( src.ref, inpaintMask.ref, dst.ref, inpaintRadius, flags, + ffi.nullptr, ), ); return dst; diff --git a/packages/dartcv/lib/src/photo/photo_async.dart b/packages/dartcv/lib/src/photo/photo_async.dart index b99d6bc2..4e7a2501 100644 --- a/packages/dartcv/lib/src/photo/photo_async.dart +++ b/packages/dartcv/lib/src/photo/photo_async.dart @@ -4,6 +4,10 @@ library cv.photo; +import 'dart:ffi' as ffi; + +import 'package:ffi/ffi.dart'; + import '../core/base.dart'; import '../core/mat.dart'; import '../core/point.dart'; @@ -12,61 +16,25 @@ import '../native_lib.dart' show cphoto; import './photo.dart'; extension MergeMertensAsync on MergeMertens { - static Future emptyNewAsync() async => cvRunAsync( - cphoto.MergeMertens_Create_Async, - (c, p) => c.complete(MergeMertens.fromPointer(p.cast())), - ); - - static Future createAsync({ - double contrastWeight = 1.0, - double saturationWeight = 1.0, - double exposureWeight = 0.0, - }) async { - return cvRunAsync( - (callback) => cphoto.MergeMertens_CreateWithParams_Async( - contrastWeight, - saturationWeight, - exposureWeight, - callback, - ), - (c, p) => c.complete(MergeMertens.fromPointer(p.cast())), - ); - } - - Future processAsync(VecMat src) async { - return cvRunAsync( - (callback) => cphoto.MergeMertens_Process_Async(ref, src.ref, callback), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + Future processAsync(VecMat src) { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_MergeMertens_process(ref, src.ref, dst.ref, ffi.nullptr), + (c) { + return c.complete(dst); + }, ); } } extension AlignMTBAsync on AlignMTB { - static Future emptyNewAsync() async => cvRunAsync( - cphoto.AlignMTB_Create_Async, - (c, p) => c.complete(AlignMTB.fromPointer(p.cast())), - ); - - static Future createAsync({ - int maxBits = 6, - int excludeRange = 4, - bool cut = true, - }) async { - return cvRunAsync( - (callback) => cphoto.AlignMTB_CreateWithParams_Async( - maxBits, - excludeRange, - cut, - callback, - ), - (c, p) => c.complete(AlignMTB.fromPointer(p.cast())), - ); - } - Future processAsync(VecMat src) async { - return cvRunAsync( - (callback) => cphoto.AlignMTB_Process_Async(ref, src.ref, callback), - (c, pdst) => c.complete(VecMat.fromPointer(pdst.cast())), + final dst = calloc(); + return cvRunAsync0( + (callback) => cphoto.cv_AlignMTB_process(ref, src.ref, dst, ffi.nullptr), + (c) { + return c.complete(VecMat.fromPointer(dst)); + }, ); } } @@ -78,16 +46,12 @@ Future colorChangeAsync( double greenMul = 1.0, double blueMul = 1.0, }) async { - return cvRunAsync( - (callback) => cphoto.ColorChange_Async( - src.ref, - mask.ref, - redMul, - greenMul, - blueMul, - callback, - ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_colorChange(src.ref, mask.ref, dst.ref, redMul, greenMul, blueMul, ffi.nullptr), + (c) { + return c.complete(dst); + }, ); } @@ -98,16 +62,12 @@ Future seamlessCloneAsync( Point p, int flags, ) async { - return cvRunAsync( - (callback) => cphoto.SeamlessClone_Async( - src.ref, - dst.ref, - mask.ref, - p.ref, - flags, - callback, - ), - matCompleter, + final blend = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_seamlessClone(src.ref, dst.ref, mask.ref, p.ref, blend.ref, flags, ffi.nullptr), + (c) { + return c.complete(blend); + }, ); } @@ -117,15 +77,12 @@ Future illuminationChangeAsync( double alpha = 0.2, double beta = 0.4, }) async { - return cvRunAsync( - (callback) => cphoto.IlluminationChange_Async( - src.ref, - mask.ref, - alpha, - beta, - callback, - ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_illuminationChange(src.ref, mask.ref, dst.ref, alpha, beta, ffi.nullptr), + (c) { + return c.complete(dst); + }, ); } @@ -136,16 +93,20 @@ Future textureFlatteningAsync( double highThreshold = 45, int kernelSize = 3, }) async { - return cvRunAsync( - (callback) => cphoto.TextureFlattening_Async( + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_textureFlattening( src.ref, mask.ref, + dst.ref, lowThreshold, highThreshold, kernelSize, - callback, + ffi.nullptr, ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + (c) { + return c.complete(dst); + }, ); } @@ -155,15 +116,19 @@ Future fastNlMeansDenoisingAsync( int templateWindowSize = 7, int searchWindowSize = 21, }) async { - return cvRunAsync( - (callback) => cphoto.FastNlMeansDenoisingWithParams_Async( + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_fastNlMeansDenoising_1( src.ref, + dst.ref, h, templateWindowSize, searchWindowSize, - callback, + ffi.nullptr, ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + (c) { + return c.complete(dst); + }, ); } @@ -174,16 +139,20 @@ Future fastNlMeansDenoisingColoredAsync( int templateWindowSize = 7, int searchWindowSize = 21, }) async { - return cvRunAsync( - (callback) => cphoto.FastNlMeansDenoisingColoredWithParams_Async( + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_fastNlMeansDenoisingColored_1( src.ref, + dst.ref, h, hColor, templateWindowSize, searchWindowSize, - callback, + ffi.nullptr, ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + (c) { + return c.complete(dst); + }, ); } @@ -196,18 +165,22 @@ Future fastNlMeansDenoisingColoredMultiAsync( int templateWindowSize = 7, int searchWindowSize = 21, }) async { - return cvRunAsync( - (callback) => cphoto.FastNlMeansDenoisingColoredMultiWithParams_Async( + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_fastNlMeansDenoisingColoredMulti_1( srcImgs.ref, + dst.ref, imgToDenoiseIndex, temporalWindowSize, h, hColor, templateWindowSize, searchWindowSize, - callback, + ffi.nullptr, ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + (c) { + return c.complete(dst); + }, ); } @@ -216,14 +189,12 @@ Future detailEnhanceAsync( double sigmaS = 10, double sigmaR = 0.15, }) async { - return cvRunAsync( - (callback) => cphoto.DetailEnhance_Async( - src.ref, - sigmaS, - sigmaR, - callback, - ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_detailEnhance(src.ref, dst.ref, sigmaS, sigmaR, ffi.nullptr), + (c) { + return c.complete(dst); + }, ); } @@ -233,15 +204,12 @@ Future edgePreservingFilterAsync( double sigmaS = 60, double sigmaR = 0.4, }) async { - return cvRunAsync( - (callback) => cphoto.EdgePreservingFilter_Async( - src.ref, - flags, - sigmaS, - sigmaR, - callback, - ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_edgePreservingFilter(src.ref, dst.ref, flags, sigmaS, sigmaR, ffi.nullptr), + (c) { + return c.complete(dst); + }, ); } @@ -251,17 +219,21 @@ Future<(Mat dst1, Mat dst2)> pencilSketchAsync( double sigmaR = 0.07, double shadeFactor = 0.02, }) async { - return cvRunAsync2( - (callback) => cphoto.PencilSketch_Async( + final dst1 = Mat.empty(); + final dst2 = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_pencilSketch( src.ref, + dst1.ref, + dst2.ref, sigmaS, sigmaR, shadeFactor, - callback, - ), - (c, pdst1, pdst2) => c.complete( - (Mat.fromPointer(pdst1.cast()), Mat.fromPointer(pdst2.cast())), + ffi.nullptr, ), + (c) { + return c.complete((dst1, dst2)); + }, ); } @@ -270,14 +242,12 @@ Future stylizationAsync( double sigmaS = 60, double sigmaR = 0.45, }) async { - return cvRunAsync( - (callback) => cphoto.Stylization_Async( - src.ref, - sigmaS, - sigmaR, - callback, - ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_stylization(src.ref, dst.ref, sigmaS, sigmaR, ffi.nullptr), + (c) { + return c.complete(dst); + }, ); } @@ -287,14 +257,18 @@ Future inpaintAsync( double inpaintRadius, int flags, ) async { - return cvRunAsync( - (callback) => cphoto.PhotoInpaint_Async( + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cphoto.cv_inpaint( src.ref, inpaintMask.ref, + dst.ref, inpaintRadius, flags, - callback, + ffi.nullptr, ), - (c, pdst) => c.complete(Mat.fromPointer(pdst.cast())), + (c) { + return c.complete(dst); + }, ); } From c5b8dcb7c901d9491842fb86a0a31a69f3d61062 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Mon, 21 Oct 2024 20:22:28 +0800 Subject: [PATCH 21/30] finish stitching, video, ready for test --- packages/dartcv/lib/src/calib3d/calib3d.dart | 38 +- .../dartcv/lib/src/calib3d/calib3d_async.dart | 24 +- packages/dartcv/lib/src/contrib/aruco.dart | 7 +- .../dartcv/lib/src/contrib/aruco_dict.dart | 53 ++- packages/dartcv/lib/src/contrib/quality.dart | 2 +- packages/dartcv/lib/src/contrib/ximgproc.dart | 21 +- packages/dartcv/lib/src/core/base.dart | 8 +- packages/dartcv/lib/src/core/core.dart | 5 +- packages/dartcv/lib/src/core/core_async.dart | 5 +- packages/dartcv/lib/src/core/mat.dart | 28 +- packages/dartcv/lib/src/core/mat_async.dart | 14 +- packages/dartcv/lib/src/dnn/dnn.dart | 4 +- packages/dartcv/lib/src/dnn/dnn_async.dart | 4 +- .../lib/src/features2d/features2d_async.dart | 34 +- packages/dartcv/lib/src/g/calib3d.g.dart | 69 +-- packages/dartcv/lib/src/g/contrib.g.dart | 263 ++++++++++-- packages/dartcv/lib/src/g/contrib.yaml | 26 +- packages/dartcv/lib/src/g/core.g.dart | 102 +++-- packages/dartcv/lib/src/g/dnn.g.dart | 18 +- packages/dartcv/lib/src/g/highgui.g.dart | 24 +- packages/dartcv/lib/src/g/imgcodecs.g.dart | 17 +- packages/dartcv/lib/src/g/imgproc.g.dart | 56 +-- packages/dartcv/lib/src/g/stitching.g.dart | 209 ++++----- packages/dartcv/lib/src/g/stitching.yaml | 24 +- packages/dartcv/lib/src/g/video.g.dart | 207 ++++----- packages/dartcv/lib/src/g/videoio.g.dart | 6 +- .../dartcv/lib/src/gapi/gcomputation.dart | 2 +- packages/dartcv/lib/src/highgui/highgui.dart | 142 +++---- .../dartcv/lib/src/imgcodecs/imgcodecs.dart | 16 +- packages/dartcv/lib/src/imgproc/imgproc.dart | 14 +- .../dartcv/lib/src/imgproc/imgproc_async.dart | 86 ++-- .../dartcv/lib/src/objdetect/objdetect.dart | 9 +- .../lib/src/objdetect/objdetect_async.dart | 35 +- .../dartcv/lib/src/photo/photo_async.dart | 30 +- .../dartcv/lib/src/stitching/stitching.dart | 140 ++---- .../lib/src/stitching/stitching_async.dart | 200 ++------- packages/dartcv/lib/src/video/video.dart | 215 +++++----- .../dartcv/lib/src/video/video_async.dart | 400 ++++++------------ packages/dartcv/lib/src/videoio/videoio.dart | 123 +++--- .../dartcv/lib/src/videoio/videoio_async.dart | 206 +++++---- packages/dartcv/test/calib3d_test.dart | 36 +- .../dartcv/test/contrib/aruco_async_test.dart | 8 +- packages/dartcv/test/contrib/aruco_test.dart | 19 +- .../test/contrib/img_hash_async_test.dart | 4 +- .../dartcv/test/contrib/img_hash_test.dart | 4 +- .../contrib/wechat_qrcode_async_test.dart | 4 +- .../dartcv/test/contrib/ximgproc_test.dart | 2 +- .../dartcv/test/core/core_async_test.dart | 2 +- packages/dartcv/test/core/core_test.dart | 4 +- packages/dartcv/test/core/mat_async_test.dart | 6 +- packages/dartcv/test/dnn/dnn_async_test.dart | 18 +- packages/dartcv/test/dnn/dnn_test.dart | 10 +- .../features2d/features2d_async_test.dart | 38 +- .../test/features2d/features2d_test.dart | 19 +- packages/dartcv/test/highgui_test.dart | 63 +-- .../dartcv/test/images/calibration_00.jpg | Bin 0 -> 276370 bytes packages/dartcv/test/imgproc/clahe_test.dart | 2 +- .../test/imgproc/imgproc_async_test.dart | 27 +- .../dartcv/test/imgproc/imgproc_test.dart | 11 +- .../dartcv/test/imgproc/subdiv2d_test.dart | 4 +- .../test/objdetect/objdetect_async_test.dart | 76 ++-- .../dartcv/test/objdetect/objdetect_test.dart | 4 +- .../dartcv/test/photo/photo_async_test.dart | 8 +- .../test/stitching/stitching_async_test.dart | 32 +- .../dartcv/test/video/video_async_test.dart | 114 +---- packages/dartcv/test/video/video_test.dart | 62 --- .../test/videoio/videoio_async_test.dart | 16 +- 67 files changed, 1685 insertions(+), 1794 deletions(-) create mode 100644 packages/dartcv/test/images/calibration_00.jpg diff --git a/packages/dartcv/lib/src/calib3d/calib3d.dart b/packages/dartcv/lib/src/calib3d/calib3d.dart index f7cb565a..9373f304 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d.dart @@ -74,7 +74,7 @@ import '../native_lib.dart' show ccalib3d; newImgSize.cvd.ref, validPixROI, centerPrincipalPoint, - rval.ref, + rval.ptr, ffi.nullptr, ), ); @@ -209,46 +209,46 @@ Mat undistortPoints( // Finds the positions of internal corners of the chessboard using a sector based approach. // https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gadc5bcb05cb21cf1e50963df26986d7c9 -(bool, Mat corners) findChessboardCornersSB( +(bool, VecPoint2f corners) findChessboardCornersSB( InputArray image, - (int, int) patternSize, - int flags, { - OutputArray? corners, + (int, int) patternSize, { + int flags = 0, + VecPoint2f? corners, }) { - corners ??= Mat.empty(); - final b = calloc(); + corners ??= VecPoint2f(); + final p = calloc(); cvRun( () => ccalib3d.cv_findChessboardCornersSB( image.ref, - patternSize.cvd.ref, - corners!.ref, + patternSize.toSize().ref, + corners!.ptr, flags, - b, + p, ffi.nullptr, ), ); - final rval = b.value; - calloc.free(b); + final rval = p.value; + calloc.free(p); return (rval, corners); } // Finds the positions of internal corners of the chessboard using a sector based approach. // https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gadc5bcb05cb21cf1e50963df26986d7c9 -(bool, Mat corners, Mat meta) findChessboardCornersSBWithMeta( +(bool, VecPoint2f corners, Mat meta) findChessboardCornersSBWithMeta( InputArray image, (int, int) patternSize, int flags, { - OutputArray? corners, + VecPoint2f? corners, OutputArray? meta, }) { - corners ??= Mat.empty(); + corners ??= VecPoint2f(); meta ??= Mat.empty(); final b = calloc(); cvRun( () => ccalib3d.cv_FindChessboardCornersSB_1( image.ref, patternSize.cvd.ref, - corners!.ref, + corners!.ptr, flags, meta!.ref, b, @@ -309,7 +309,7 @@ Mat drawChessboardCorners( maxIters, confidence, refineIters, - rval.ref, + rval.ptr, ffi.nullptr, ), ); @@ -342,7 +342,7 @@ Mat drawChessboardCorners( maxIters, confidence, refineIters, - rval.ref, + rval.ptr, ffi.nullptr, ), ); @@ -373,7 +373,7 @@ Mat findHomography( mask!.ref, maxIters, confidence, - mat.ref, + mat.ptr, ffi.nullptr, ), ); diff --git a/packages/dartcv/lib/src/calib3d/calib3d_async.dart b/packages/dartcv/lib/src/calib3d/calib3d_async.dart index 663fb4ea..c6caf8d8 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d_async.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d_async.dart @@ -73,7 +73,7 @@ Future<(Mat rval, Rect validPixROI)> getOptimalNewCameraMatrixAsync( newImgSize.cvd.ref, validPixROI, centerPrincipalPoint, - rval.ref, + rval.ptr, callback, ), (c) => c.complete((rval, Rect.fromPointer(validPixROI))), @@ -208,19 +208,19 @@ Future<(bool success, Mat corners)> findChessboardCornersAsync( // Finds the positions of internal corners of the chessboard using a sector based approach. // https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gadc5bcb05cb21cf1e50963df26986d7c9 -Future<(bool, Mat corners)> findChessboardCornersSBAsync( +Future<(bool, VecPoint2f corners)> findChessboardCornersSBAsync( InputArray image, (int, int) patternSize, int flags, { - OutputArray? corners, + VecPoint2f? corners, }) async { - corners ??= Mat.empty(); + corners ??= VecPoint2f(); final b = calloc(); return cvRunAsync0( (callback) => ccalib3d.cv_findChessboardCornersSB( image.ref, patternSize.cvd.ref, - corners!.ref, + corners!.ptr, flags, b, callback, @@ -233,21 +233,21 @@ Future<(bool, Mat corners)> findChessboardCornersSBAsync( // Finds the positions of internal corners of the chessboard using a sector based approach. // https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gadc5bcb05cb21cf1e50963df26986d7c9 -Future<(bool, Mat corners, Mat meta)> findChessboardCornersSBWithMetaAsync( +Future<(bool, VecPoint2f corners, Mat meta)> findChessboardCornersSBWithMetaAsync( InputArray image, (int, int) patternSize, int flags, { - OutputArray? corners, + VecPoint2f? corners, OutputArray? meta, }) async { - corners ??= Mat.empty(); + corners ??= VecPoint2f(); meta ??= Mat.empty(); final b = calloc(); return cvRunAsync0( (callback) => ccalib3d.cv_FindChessboardCornersSB_1( image.ref, patternSize.cvd.ref, - corners!.ref, + corners!.ptr, flags, meta!.ref, b, @@ -308,7 +308,7 @@ Future<(Mat, Mat inliers)> estimateAffinePartial2DAsync( maxIters, confidence, refineIters, - rval.ref, + rval.ptr, callback, ), (c) => c.complete((rval, inliers!)), @@ -341,7 +341,7 @@ Future<(Mat, Mat inliers)> estimateAffine2DAsync( maxIters, confidence, refineIters, - rval.ref, + rval.ptr, callback, ), (c) => c.complete((rval, inliers!)), @@ -372,7 +372,7 @@ Future<(Mat, Mat)> findHomographyAsync( mask!.ref, maxIters, confidence, - mat.ref, + mat.ptr, callback, ), (c) => c.complete((mat, mask!)), diff --git a/packages/dartcv/lib/src/contrib/aruco.dart b/packages/dartcv/lib/src/contrib/aruco.dart index 6c9f93b4..ee0c6d7d 100644 --- a/packages/dartcv/lib/src/contrib/aruco.dart +++ b/packages/dartcv/lib/src/contrib/aruco.dart @@ -35,10 +35,7 @@ class ArucoDetector extends CvStruct { return ArucoDetector._(p); } - factory ArucoDetector.create( - ArucoDictionary dictionary, - ArucoDetectorParameters parameters, - ) { + factory ArucoDetector.create(ArucoDictionary dictionary, ArucoDetectorParameters parameters) { final p = calloc(); cvRun( () => ccontrib.cv_aruco_arucoDetector_create_1( @@ -47,7 +44,7 @@ class ArucoDetector extends CvStruct { p, ), ); - return ArucoDetector._(p); + return ArucoDetector.fromPointer(p); } @override diff --git a/packages/dartcv/lib/src/contrib/aruco_dict.dart b/packages/dartcv/lib/src/contrib/aruco_dict.dart index 51697608..6b34e93c 100644 --- a/packages/dartcv/lib/src/contrib/aruco_dict.dart +++ b/packages/dartcv/lib/src/contrib/aruco_dict.dart @@ -11,6 +11,7 @@ import 'dart:ffi' as ffi; import 'package:ffi/ffi.dart'; import '../core/base.dart'; +import '../core/mat.dart'; import '../g/contrib.g.dart' as cvg; import '../native_lib.dart' show ccontrib; @@ -92,19 +93,65 @@ class ArucoDictionary extends CvStruct { } } + factory ArucoDictionary.empty() { + final p = calloc(); + cvRun(() => ccontrib.cv_aruco_Dictionary_create(p)); + return ArucoDictionary._(p); + } + + factory ArucoDictionary.fromBytesList(Mat bytesList, int markerSize, {int maxCorr = 0}) { + final p = calloc(); + cvRun(() => ccontrib.cv_aruco_Dictionary_create_1(bytesList.ref, markerSize, maxCorr, p)); + return ArucoDictionary._(p); + } + factory ArucoDictionary.predefined(PredefinedDictionaryType type) { final p = calloc(); cvRun(() => ccontrib.cv_aruco_getPredefinedDictionary(type.value, p)); return ArucoDictionary._(p); } + Mat generateImageMarker(int id, int sidePixels, {OutputArray? dst, int borderBits = 1}) { + dst ??= Mat.empty(); + cvRun(() => ccontrib.cv_aruco_Dictionary_generateImageMarker(ref, id, sidePixels, dst!.ref, borderBits)); + return dst; + } + + int getDistanceToId(InputArray bits, int id, {bool allRotations = true}) => + ccontrib.cv_aruco_Dictionary_getDistanceToId(ref, bits.ref, id, allRotations); + + (bool rval, int idx, int rotation) identify(InputArray onlyBits, double maxCorrectionRate) { + final pIdx = calloc(); + final pRotation = calloc(); + final rval = ccontrib.cv_aruco_Dictionary_identify(ref, onlyBits.ref, pIdx, pRotation, maxCorrectionRate); + final ret = (rval, pIdx.value, pRotation.value); + calloc.free(pIdx); + calloc.free(pRotation); + return ret; + } + + Mat get bytesList { + final dst = Mat.empty(); + cvRun(() => ccontrib.cv_aruco_Dictionary_get_bytesList(ref, dst.ptr)); + return dst; + } + + set bytesList(Mat value) => ccontrib.cv_aruco_Dictionary_set_bytesList(ref, value.ref); + + int get markerSize => ccontrib.cv_aruco_Dictionary_get_markerSize(ref); + + set markerSize(int value) => ccontrib.cv_aruco_Dictionary_set_markerSize(ref, value); + + int get maxCorrectionBits => ccontrib.cv_aruco_Dictionary_get_maxCorrectionBits(ref); + + set maxCorrectionBits(int value) => ccontrib.cv_aruco_Dictionary_set_maxCorrectionBits(ref, value); + @override cvg.ArucoDictionary get ref => ptr.ref; - static final finalizer = - OcvFinalizer(ccontrib.addresses.cv_aruco_arucoDictionary_close); + static final finalizer = OcvFinalizer(ccontrib.addresses.cv_aruco_Dictionary_close); void dispose() { finalizer.detach(this); - ccontrib.cv_aruco_arucoDictionary_close(ptr); + ccontrib.cv_aruco_Dictionary_close(ptr); } } diff --git a/packages/dartcv/lib/src/contrib/quality.dart b/packages/dartcv/lib/src/contrib/quality.dart index 78ca171c..702400db 100644 --- a/packages/dartcv/lib/src/contrib/quality.dart +++ b/packages/dartcv/lib/src/contrib/quality.dart @@ -90,7 +90,7 @@ class QualityBRISQUE extends CvStruct { } /// async version of [computeFeatures] - static Future computeFeaturesAsync(Mat img, {Mat? features}) => cvRunAsync0( + static Future computeFeaturesAsync(Mat img, {Mat? features}) async => cvRunAsync0( (callback) { features ??= Mat.empty(); return ccontrib.cv_quality_QualityBRISQUE_computeFeatures_static(img.ref, features!.ref, callback); diff --git a/packages/dartcv/lib/src/contrib/ximgproc.dart b/packages/dartcv/lib/src/contrib/ximgproc.dart index 4f9d9757..dc342e36 100644 --- a/packages/dartcv/lib/src/contrib/ximgproc.dart +++ b/packages/dartcv/lib/src/contrib/ximgproc.dart @@ -83,14 +83,19 @@ class ximgproc { /// DOI: 10.5220/0006509000850094. /// /// https://docs.opencv.org/4.x/df/d2d/group__ximgproc.html#ga86fcda65ced0aafa2741088d82e9161c - static Future edgePreservingFilterAsync(InputArray src, int d, double threshold, - {OutputArray? dst}) async { + static Future edgePreservingFilterAsync( + InputArray src, + int d, + double threshold, { + OutputArray? dst, + }) async { dst ??= Mat.empty(); return cvRunAsync0( - (callback) => ccontrib.cv_ximgproc_edgePreservingFilter(src.ref, dst!.ref, d, threshold, callback), - (c) { - return c.complete(dst); - }); + (callback) => ccontrib.cv_ximgproc_edgePreservingFilter(src.ref, dst!.ref, d, threshold, callback), + (c) { + return c.complete(dst); + }, + ); } /// Finds ellipses fastly in an image using projective invariant pruning. @@ -839,7 +844,7 @@ class ximgproc_rl { /// https://docs.opencv.org/4.x/df/def/group__ximgproc__run__length__morphology.html#ga8a7c10c524fb2572e2eefe0caf0375fc static Mat getStructuringElement(int shape, (int, int) ksize) { final dst = Mat.empty(); - cvRun(() => ccontrib.cv_ximgproc_rl_getStructuringElement(shape, ksize.cvd.ref, dst.ref, ffi.nullptr)); + cvRun(() => ccontrib.cv_ximgproc_rl_getStructuringElement(shape, ksize.cvd.ref, dst.ptr, ffi.nullptr)); return dst; } @@ -849,7 +854,7 @@ class ximgproc_rl { static Future getStructuringElementAsync(int shape, (int, int) ksize) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => ccontrib.cv_ximgproc_rl_getStructuringElement(shape, ksize.cvd.ref, dst.ref, callback), + (callback) => ccontrib.cv_ximgproc_rl_getStructuringElement(shape, ksize.cvd.ref, dst.ptr, callback), (c) { return c.complete(dst); }); diff --git a/packages/dartcv/lib/src/core/base.dart b/packages/dartcv/lib/src/core/base.dart index 86d0deff..e682ae82 100644 --- a/packages/dartcv/lib/src/core/base.dart +++ b/packages/dartcv/lib/src/core/base.dart @@ -87,7 +87,7 @@ typedef VoidPtr = ffi.Pointer; Future cvRunAsync0( ffi.Pointer Function(cvg.CvCallback_0 callback) func, void Function(Completer completer) onComplete, -) { +) async { final completer = Completer(); late final ffi.NativeCallable ccallback; void onResponse() { @@ -100,7 +100,9 @@ Future cvRunAsync0( return completer.future; } -Future cvRunAsync( +const cvRunAsync = cvRunAsync0; + +Future cvRunAsync1( ffi.Pointer Function(cvg.CvCallback_1 callback) func, void Function(Completer completer, VoidPtr p) onComplete, ) { @@ -116,8 +118,6 @@ Future cvRunAsync( return completer.future; } -const cvRunAsync1 = cvRunAsync; - Future cvRunAsync2( ffi.Pointer Function(cvg.CvCallback_2 callback) func, void Function(Completer completer, VoidPtr p, VoidPtr p1) onComplete, diff --git a/packages/dartcv/lib/src/core/core.dart b/packages/dartcv/lib/src/core/core.dart index 558ed22e..c54bb4fd 100644 --- a/packages/dartcv/lib/src/core/core.dart +++ b/packages/dartcv/lib/src/core/core.dart @@ -1094,8 +1094,9 @@ Mat scaleAdd(InputArray src1, double alpha, InputArray src2, {OutputArray? dst}) /// For further details, please see: /// /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga388d7575224a4a277ceb98ccaa327c99 -Mat setIdentity(InputOutputArray mtx, {double s = 1}) { - cvRun(() => ccore.cv_setIdentity(mtx.ref, s, ffi.nullptr)); +Mat setIdentity(InputOutputArray mtx, {Scalar? s}) { + s ??= Scalar.all(1.0); + cvRun(() => ccore.cv_setIdentity(mtx.ref, s!.ref, ffi.nullptr)); return mtx; } diff --git a/packages/dartcv/lib/src/core/core_async.dart b/packages/dartcv/lib/src/core/core_async.dart index ee637895..1eb5e7b1 100644 --- a/packages/dartcv/lib/src/core/core_async.dart +++ b/packages/dartcv/lib/src/core/core_async.dart @@ -1330,9 +1330,10 @@ Future scaleAddAsync(InputArray src1, double alpha, InputArray src2, {Outpu /// For further details, please see: /// /// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga388d7575224a4a277ceb98ccaa327c99 -Future setIdentityAsync(InputOutputArray mtx, {double s = 1}) async { +Future setIdentityAsync(InputOutputArray mtx, {Scalar? s}) async { + s ??= Scalar.all(1.0); return cvRunAsync0( - (callback) => ccore.cv_setIdentity(mtx.ref, s, callback), + (callback) => ccore.cv_setIdentity(mtx.ref, s!.ref, callback), (c) { return c.complete(mtx); }, diff --git a/packages/dartcv/lib/src/core/mat.dart b/packages/dartcv/lib/src/core/mat.dart index 80ce85ac..37641afe 100644 --- a/packages/dartcv/lib/src/core/mat.dart +++ b/packages/dartcv/lib/src/core/mat.dart @@ -1037,7 +1037,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a9e8ea7f2a254814de7713286b6640d77 Mat adjustROI(int dtop, int dbottom, int dleft, int dright) { final p = Mat.empty(); - cvRun(() => ccore.cv_Mat_adjustROI(ref, dtop, dbottom, dleft, dright, p.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_adjustROI(ref, dtop, dbottom, dleft, dright, p.ptr, ffi.nullptr)); return p; } @@ -1069,7 +1069,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a23df02a07ffbfa4aa59c19bc003919fe Mat col(int x) { final dst = Mat.empty(); - cvRun(() => ccore.cv_Mat_col(ref, x, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_col(ref, x, dst.ptr, ffi.nullptr)); return dst; } @@ -1091,19 +1091,19 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a4b22e1c23af7a7f2eef8fa478cfa7434 Mat row(int y) { final dst = Mat.empty(); - cvRun(() => ccore.cv_Mat_row(ref, y, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_row(ref, y, dst.ptr, ffi.nullptr)); return dst; } Mat transpose({bool inplace = false}) { final dst = inplace ? this : Mat.empty(); - cvRun(() => ccore.cv_Mat_t(ref, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_t(ref, dst.ptr, ffi.nullptr)); return dst; } Mat clone() { final dst = Mat.empty(); - cvRun(() => ccore.cv_Mat_clone(ref, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_clone(ref, dst.ptr, ffi.nullptr)); return dst; } @@ -1147,8 +1147,8 @@ class Mat extends CvStruct { /// [beta] optional delta added to the scaled values. /// /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#adf88c60c5b4980e05bb556080916978b - Mat convertTo(MatType type, {double alpha = 1, double beta = 0}) { - final dst = Mat.empty(); + Mat convertTo(MatType type, {bool inplace = false, double alpha = 1, double beta = 0}) { + final dst = inplace ? this : Mat.empty(); cvRun(() => ccore.cv_Mat_convertTo_1(ref, dst.ref, type.value, alpha, beta, ffi.nullptr)); return dst; } @@ -1162,7 +1162,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a385c09827713dc3e6d713bfad8460706 Mat mul(Mat other, {bool inplace = false, double scale = 1.0}) { final dst = inplace ? this : Mat.empty(); - cvRun(() => ccore.cv_Mat_mul(ref, other.ref, dst.ref, scale)); + cvRun(() => ccore.cv_Mat_mul(ref, other.ref, dst.ptr, scale)); return dst; } @@ -1170,7 +1170,7 @@ class Mat extends CvStruct { Mat region(Rect rect) { cvAssert(rect.right <= width && rect.bottom <= height); final dst = Mat.empty(); - cvRun(() => ccore.cv_Mat_region(ref, rect.ref, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_region(ref, rect.ref, dst.ptr, ffi.nullptr)); return dst; } @@ -1188,14 +1188,14 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a4eb96e3251417fa88b78e2abd6cfd7d8 Mat reshape(int cn, [int rows = 0]) { final dst = Mat.empty(); - cvRun(() => ccore.cv_Mat_reshape(ref, cn, rows, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_reshape(ref, cn, rows, dst.ptr, ffi.nullptr)); return dst; } /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#ab2e41a510891e548f744832cf9b8ab89 Mat reshapeTo(int cn, List newshape) { final dst = Mat.empty(); - cvRun(() => ccore.cv_Mat_reshape_1(ref, cn, newshape.i32.ref, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_reshape_1(ref, cn, newshape.i32.ref, dst.ptr, ffi.nullptr)); return dst; } @@ -1213,7 +1213,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#aa6542193430356ad631a9beabc624107 Mat rowRange(int start, int end) { final dst = Mat.empty(); - cvRun(() => ccore.cv_rowRange(ref, start, end, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_rowRange(ref, start, end, dst.ptr, ffi.nullptr)); return dst; } @@ -1225,7 +1225,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#aadc8f9210fe4dec50513746c246fa8d9 Mat colRange(int start, int end) { final dst = Mat.empty(); - cvRun(() => ccore.cv_colRange(ref, start, end, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_colRange(ref, start, end, dst.ptr, ffi.nullptr)); return dst; } @@ -1301,7 +1301,7 @@ class Mat extends CvStruct { /// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#aaa428c60ccb6d8ea5de18f63dfac8e11 Mat t() { final dst = Mat.empty(); - cvRun(() => ccore.cv_Mat_t(ref, dst.ref, ffi.nullptr)); + cvRun(() => ccore.cv_Mat_t(ref, dst.ptr, ffi.nullptr)); return dst; } diff --git a/packages/dartcv/lib/src/core/mat_async.dart b/packages/dartcv/lib/src/core/mat_async.dart index 0d442b34..89bc4575 100644 --- a/packages/dartcv/lib/src/core/mat_async.dart +++ b/packages/dartcv/lib/src/core/mat_async.dart @@ -18,7 +18,7 @@ import 'scalar.dart'; extension MatAsync on Mat { static Future emptyAsync() async => Mat.empty(); - static Future fromScalarAsync(int rows, int cols, MatType type, Scalar s) { + static Future fromScalarAsync(int rows, int cols, MatType type, Scalar s) async { final p = calloc(); return cvRunAsync0( (callback) => ccore.cv_Mat_create_5(s.ref, rows, cols, type.value, p, callback), @@ -68,7 +68,7 @@ extension MatAsync on Mat { Future cloneAsync() async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => ccore.cv_Mat_clone(ref, dst.ref, callback), + (callback) => ccore.cv_Mat_clone(ref, dst.ptr, callback), (c) => c.complete(dst), ); } @@ -91,7 +91,7 @@ extension MatAsync on Mat { Future regionAsync(Rect rect) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => ccore.cv_Mat_region(ref, rect.ref, dst.ref, callback), + (callback) => ccore.cv_Mat_region(ref, rect.ref, dst.ptr, callback), (c) => c.complete(dst), ); } @@ -99,7 +99,7 @@ extension MatAsync on Mat { Future reshapeAsync(int cn, [int rows = 0]) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => ccore.cv_Mat_reshape(ref, cn, rows, dst.ref, callback), + (callback) => ccore.cv_Mat_reshape(ref, cn, rows, dst.ptr, callback), (c) => c.complete(dst), ); } @@ -115,7 +115,7 @@ extension MatAsync on Mat { Future rowRangeAsync(int start, int end) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => ccore.cv_rowRange(ref, start, end, dst.ref, callback), + (callback) => ccore.cv_rowRange(ref, start, end, dst.ptr, callback), (c) => c.complete(dst), ); } @@ -123,12 +123,12 @@ extension MatAsync on Mat { Future colRangeAsync(int start, int end) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => ccore.cv_colRange(ref, start, end, dst.ref, callback), + (callback) => ccore.cv_colRange(ref, start, end, dst.ptr, callback), (c) => c.complete(dst), ); } - Future meanAsync({Mat? mask}) { + Future meanAsync({Mat? mask}) async { final s = calloc(); return cvRunAsync0( (callback) { diff --git a/packages/dartcv/lib/src/dnn/dnn.dart b/packages/dartcv/lib/src/dnn/dnn.dart index 1624c2a2..3d071e45 100644 --- a/packages/dartcv/lib/src/dnn/dnn.dart +++ b/packages/dartcv/lib/src/dnn/dnn.dart @@ -281,7 +281,7 @@ class Net extends CvStruct { Mat forward({String outputName = ""}) { final m = Mat.empty(); final cOutName = outputName.toNativeUtf8().cast(); - cvRun(() => cdnn.cv_dnn_Net_forward(ref, cOutName, m.ref, ffi.nullptr)); + cvRun(() => cdnn.cv_dnn_Net_forward(ref, cOutName, m.ptr, ffi.nullptr)); calloc.free(cOutName); return m; } @@ -471,7 +471,7 @@ List imagesFromBlob(Mat blob) { /// a bones structure from pose detection, or a color plane from Colorization) Mat getBlobChannel(Mat blob, int imgidx, int chnidx) { final m = Mat.empty(); - cvRun(() => cdnn.cv_dnn_Net_getBlobChannel(blob.ref, imgidx, chnidx, m.ref, ffi.nullptr)); + cvRun(() => cdnn.cv_dnn_Net_getBlobChannel(blob.ref, imgidx, chnidx, m.ptr, ffi.nullptr)); return m; } diff --git a/packages/dartcv/lib/src/dnn/dnn_async.dart b/packages/dartcv/lib/src/dnn/dnn_async.dart index 527d1820..d5c33be5 100644 --- a/packages/dartcv/lib/src/dnn/dnn_async.dart +++ b/packages/dartcv/lib/src/dnn/dnn_async.dart @@ -170,7 +170,7 @@ extension NetAsync on Net { Future forwardAsync({String outputName = ""}) async { final m = Mat.empty(); final cOutName = outputName.toNativeUtf8().cast(); - return cvRunAsync0((callback) => cdnn.cv_dnn_Net_forward(ref, cOutName, m.ref, callback), (c) { + return cvRunAsync0((callback) => cdnn.cv_dnn_Net_forward(ref, cOutName, m.ptr, callback), (c) { calloc.free(cOutName); return c.complete(m); }); @@ -299,7 +299,7 @@ Future> imagesFromBlobAsync(Mat blob) async { Future getBlobChannelAsync(Mat blob, int imgidx, int chnidx) async { final m = Mat.empty(); return cvRunAsync0( - (callback) => cdnn.cv_dnn_Net_getBlobChannel(blob.ref, imgidx, chnidx, m.ref, callback), + (callback) => cdnn.cv_dnn_Net_getBlobChannel(blob.ref, imgidx, chnidx, m.ptr, callback), (c) { return c.complete(m); }, diff --git a/packages/dartcv/lib/src/features2d/features2d_async.dart b/packages/dartcv/lib/src/features2d/features2d_async.dart index 5bc4ba78..4f1a3b7e 100644 --- a/packages/dartcv/lib/src/features2d/features2d_async.dart +++ b/packages/dartcv/lib/src/features2d/features2d_async.dart @@ -27,8 +27,8 @@ extension AKAZEAsync on AKAZE { /// https://docs.opencv.org/master/d0/d13/classcv_1_1Feature2D.html#aa4e9a7082ec61ebc108806704fbd7887 Future detectAsync(Mat src) async { final ret = calloc(); - return cvRunAsync0( - (callback) => cfeatures2d.cv_AKAZE_detect(ref, src.ref, ret, ffi.nullptr), + return cvRunAsync0( + (callback) => cfeatures2d.cv_AKAZE_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -43,7 +43,7 @@ extension AKAZEAsync on AKAZE { final desc = Mat.empty(); final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_AKAZE_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_AKAZE_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, callback), (c) { return c.complete((VecKeyPoint.fromPointer(ret), desc)); }, @@ -59,7 +59,7 @@ extension AgastFeatureDetectorAsync on AgastFeatureDetector { Future detectAsync(Mat src) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_AgastFeatureDetector_detect(ref, src.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_AgastFeatureDetector_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -75,7 +75,7 @@ extension BRISKAsync on BRISK { Future detectAsync(Mat src) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_BRISK_detect(ref, src.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_BRISK_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -90,7 +90,7 @@ extension BRISKAsync on BRISK { final desc = Mat.empty(); final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_BRISK_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_BRISK_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, callback), (c) { return c.complete((VecKeyPoint.fromPointer(ret), desc)); }, @@ -106,7 +106,7 @@ extension FastFeatureDetectorAsync on FastFeatureDetector { Future detectAsync(Mat src) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_FastFeatureDetector_detect(ref, src.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_FastFeatureDetector_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -122,7 +122,7 @@ extension GFTTDetectorAsync on GFTTDetector { Future detectAsync(Mat src) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_GFTTDetector_detect(ref, src.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_GFTTDetector_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -138,7 +138,7 @@ extension KAZEAsync on KAZE { Future detectAsync(Mat src) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_KAZE_detect(ref, src.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_KAZE_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -153,7 +153,7 @@ extension KAZEAsync on KAZE { final desc = Mat.empty(); final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_KAZE_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_KAZE_detectAndCompute(ref, src.ref, mask.ref, desc.ref, ret, callback), (c) { return c.complete((VecKeyPoint.fromPointer(ret), desc)); }, @@ -169,7 +169,7 @@ extension MSERAsync on MSER { Future detectAsync(Mat src) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_MSER_detect(ref, src.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_MSER_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -185,7 +185,7 @@ extension ORBAsync on ORB { Future detectAsync(Mat src) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_ORB_detect(ref, src.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_ORB_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -200,7 +200,7 @@ extension ORBAsync on ORB { final pdesc = calloc(); final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_ORB_detectAndCompute(ref, src.ref, mask.ref, pdesc, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_ORB_detectAndCompute(ref, src.ref, mask.ref, pdesc, ret, callback), (c) { return c.complete((VecKeyPoint.fromPointer(ret), Mat.fromPointer(pdesc))); }, @@ -216,7 +216,7 @@ extension SimpleBlobDetectorAsync on SimpleBlobDetector { Future detectAsync(Mat src) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_SimpleBlobDetector_detect(ref, src.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_SimpleBlobDetector_detect(ref, src.ref, ret, callback), (c) { return c.complete(VecKeyPoint.fromPointer(ret)); }, @@ -232,7 +232,7 @@ extension BFMatcherAsync on BFMatcher { Future matchAsync(Mat query, Mat train) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_BFMatcher_match(ref, query.ref, train.ref, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_BFMatcher_match(ref, query.ref, train.ref, ret, callback), (c) { return c.complete(VecDMatch.fromPointer(ret)); }, @@ -246,7 +246,7 @@ extension BFMatcherAsync on BFMatcher { Future knnMatchAsync(Mat query, Mat train, int k) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_BFMatcher_knnMatch(ref, query.ref, train.ref, k, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_BFMatcher_knnMatch(ref, query.ref, train.ref, k, ret, callback), (c) { return c.complete(VecVecDMatch.fromPointer(ret)); }, @@ -262,7 +262,7 @@ extension FlannBasedMatcherAsync on FlannBasedMatcher { Future knnMatchAsync(Mat query, Mat train, int k) async { final ret = calloc(); return cvRunAsync0( - (callback) => cfeatures2d.cv_FlannBasedMatcher_knnMatch(ref, query.ref, train.ref, k, ret, ffi.nullptr), + (callback) => cfeatures2d.cv_FlannBasedMatcher_knnMatch(ref, query.ref, train.ref, k, ret, callback), (c) { return c.complete(VecVecDMatch.fromPointer(ret)); }, diff --git a/packages/dartcv/lib/src/g/calib3d.g.dart b/packages/dartcv/lib/src/g/calib3d.g.dart index f4be06c4..c2f1a8ef 100644 --- a/packages/dartcv/lib/src/g/calib3d.g.dart +++ b/packages/dartcv/lib/src/g/calib3d.g.dart @@ -33,7 +33,7 @@ class CvNativeCalib3d { ffi.Pointer cv_FindChessboardCornersSB_1( Mat image, CvSize patternSize, - Mat corners, + ffi.Pointer corners, int flags, Mat meta, ffi.Pointer rval, @@ -55,15 +55,15 @@ class CvNativeCalib3d { ffi.Pointer Function( Mat, CvSize, - Mat, + ffi.Pointer, ffi.Int, Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_FindChessboardCornersSB_1'); late final _cv_FindChessboardCornersSB_1 = _cv_FindChessboardCornersSB_1Ptr.asFunction< - ffi.Pointer Function(Mat, CvSize, Mat, int, Mat, - ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, CvSize, ffi.Pointer, + int, Mat, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_calibrateCamera( VecVecPoint3f objectPoints, @@ -149,7 +149,7 @@ class CvNativeCalib3d { ffi.Pointer cv_estimateAffine2D( VecPoint2f from, VecPoint2f to, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_estimateAffine2D( @@ -162,11 +162,11 @@ class CvNativeCalib3d { late final _cv_estimateAffine2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, - imp1.CvCallback_0)>>('cv_estimateAffine2D'); + ffi.Pointer Function(VecPoint2f, VecPoint2f, + ffi.Pointer, imp1.CvCallback_0)>>('cv_estimateAffine2D'); late final _cv_estimateAffine2D = _cv_estimateAffine2DPtr.asFunction< ffi.Pointer Function( - VecPoint2f, VecPoint2f, Mat, imp1.CvCallback_0)>(); + VecPoint2f, VecPoint2f, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_estimateAffine2D_1( VecPoint2f from, @@ -177,7 +177,7 @@ class CvNativeCalib3d { int maxIters, double confidence, int refineIters, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_estimateAffine2D_1( @@ -205,16 +205,16 @@ class CvNativeCalib3d { ffi.Size, ffi.Double, ffi.Size, - Mat, + ffi.Pointer, imp1.CvCallback_0)>>('cv_estimateAffine2D_1'); late final _cv_estimateAffine2D_1 = _cv_estimateAffine2D_1Ptr.asFunction< ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, int, double, - int, double, int, Mat, imp1.CvCallback_0)>(); + int, double, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_estimateAffinePartial2D( VecPoint2f from, VecPoint2f to, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_estimateAffinePartial2D( @@ -227,12 +227,15 @@ class CvNativeCalib3d { late final _cv_estimateAffinePartial2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, + ffi.Pointer Function( + VecPoint2f, + VecPoint2f, + ffi.Pointer, imp1.CvCallback_0)>>('cv_estimateAffinePartial2D'); late final _cv_estimateAffinePartial2D = _cv_estimateAffinePartial2DPtr.asFunction< ffi.Pointer Function( - VecPoint2f, VecPoint2f, Mat, imp1.CvCallback_0)>(); + VecPoint2f, VecPoint2f, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_estimateAffinePartial2D_1( VecPoint2f from, @@ -243,7 +246,7 @@ class CvNativeCalib3d { int maxIters, double confidence, int refineIters, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_estimateAffinePartial2D_1( @@ -271,12 +274,12 @@ class CvNativeCalib3d { ffi.Size, ffi.Double, ffi.Size, - Mat, + ffi.Pointer, imp1.CvCallback_0)>>('cv_estimateAffinePartial2D_1'); late final _cv_estimateAffinePartial2D_1 = _cv_estimateAffinePartial2D_1Ptr.asFunction< ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, int, - double, int, double, int, Mat, imp1.CvCallback_0)>(); + double, int, double, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_findChessboardCorners( Mat image, @@ -313,7 +316,7 @@ class CvNativeCalib3d { ffi.Pointer cv_findChessboardCornersSB( Mat image, CvSize patternSize, - Mat corners, + ffi.Pointer corners, int flags, ffi.Pointer rval, imp1.CvCallback_0 callback, @@ -333,14 +336,14 @@ class CvNativeCalib3d { ffi.Pointer Function( Mat, CvSize, - Mat, + ffi.Pointer, ffi.Int, ffi.Pointer, imp1.CvCallback_0)>>('cv_findChessboardCornersSB'); late final _cv_findChessboardCornersSB = _cv_findChessboardCornersSBPtr.asFunction< - ffi.Pointer Function(Mat, CvSize, Mat, int, - ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, CvSize, ffi.Pointer, + int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_findHomography( Mat src, @@ -350,7 +353,7 @@ class CvNativeCalib3d { Mat mask, int maxIters, double confidence, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_findHomography( @@ -376,11 +379,11 @@ class CvNativeCalib3d { Mat, ffi.Int, ffi.Double, - Mat, + ffi.Pointer, imp1.CvCallback_0)>>('cv_findHomography'); late final _cv_findHomography = _cv_findHomographyPtr.asFunction< - ffi.Pointer Function( - Mat, Mat, int, double, Mat, int, double, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, Mat, int, double, Mat, int, double, + ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_fisheye_estimateNewCameraMatrixForUndistortRectify( Mat k, @@ -508,7 +511,7 @@ class CvNativeCalib3d { CvSize newImgSize, ffi.Pointer validPixROI, bool centerPrincipalPoint, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_getOptimalNewCameraMatrix( @@ -534,12 +537,20 @@ class CvNativeCalib3d { CvSize, ffi.Pointer, ffi.Bool, - Mat, + ffi.Pointer, imp1.CvCallback_0)>>('cv_getOptimalNewCameraMatrix'); late final _cv_getOptimalNewCameraMatrix = _cv_getOptimalNewCameraMatrixPtr.asFunction< - ffi.Pointer Function(Mat, Mat, CvSize, double, CvSize, - ffi.Pointer, bool, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, + Mat, + CvSize, + double, + CvSize, + ffi.Pointer, + bool, + ffi.Pointer, + imp1.CvCallback_0)>(); ffi.Pointer cv_initUndistortRectifyMap( Mat cameraMatrix, diff --git a/packages/dartcv/lib/src/g/contrib.g.dart b/packages/dartcv/lib/src/g/contrib.g.dart index 5f1db29f..0ce33b3a 100644 --- a/packages/dartcv/lib/src/g/contrib.g.dart +++ b/packages/dartcv/lib/src/g/contrib.g.dart @@ -30,11 +30,240 @@ class CvNativeContrib { lookup) : _lookup = lookup; + void cv_aruco_Dictionary_close( + ArucoDictionaryPtr self, + ) { + return _cv_aruco_Dictionary_close( + self, + ); + } + + late final _cv_aruco_Dictionary_closePtr = + _lookup>( + 'cv_aruco_Dictionary_close'); + late final _cv_aruco_Dictionary_close = _cv_aruco_Dictionary_closePtr + .asFunction(); + + ffi.Pointer cv_aruco_Dictionary_create( + ffi.Pointer rval, + ) { + return _cv_aruco_Dictionary_create( + rval, + ); + } + + late final _cv_aruco_Dictionary_createPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('cv_aruco_Dictionary_create'); + late final _cv_aruco_Dictionary_create = + _cv_aruco_Dictionary_createPtr.asFunction< + ffi.Pointer Function(ffi.Pointer)>(); + + ffi.Pointer cv_aruco_Dictionary_create_1( + Mat bytesList, + int markerSize, + int maxCorr, + ffi.Pointer rval, + ) { + return _cv_aruco_Dictionary_create_1( + bytesList, + markerSize, + maxCorr, + rval, + ); + } + + late final _cv_aruco_Dictionary_create_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Mat, ffi.Int, ffi.Int, + ffi.Pointer)>>('cv_aruco_Dictionary_create_1'); + late final _cv_aruco_Dictionary_create_1 = + _cv_aruco_Dictionary_create_1Ptr.asFunction< + ffi.Pointer Function( + Mat, int, int, ffi.Pointer)>(); + + ffi.Pointer cv_aruco_Dictionary_generateImageMarker( + ArucoDictionary self, + int id, + int sidePixels, + Mat _img, + int borderBits, + ) { + return _cv_aruco_Dictionary_generateImageMarker( + self, + id, + sidePixels, + _img, + borderBits, + ); + } + + late final _cv_aruco_Dictionary_generateImageMarkerPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ArucoDictionary, ffi.Int, ffi.Int, Mat, + ffi.Int)>>('cv_aruco_Dictionary_generateImageMarker'); + late final _cv_aruco_Dictionary_generateImageMarker = + _cv_aruco_Dictionary_generateImageMarkerPtr.asFunction< + ffi.Pointer Function( + ArucoDictionary, int, int, Mat, int)>(); + + int cv_aruco_Dictionary_getDistanceToId( + ArucoDictionary self, + Mat bits, + int id, + bool allRotations, + ) { + return _cv_aruco_Dictionary_getDistanceToId( + self, + bits, + id, + allRotations, + ); + } + + late final _cv_aruco_Dictionary_getDistanceToIdPtr = _lookup< + ffi.NativeFunction< + ffi.Int Function(ArucoDictionary, Mat, ffi.Int, + ffi.Bool)>>('cv_aruco_Dictionary_getDistanceToId'); + late final _cv_aruco_Dictionary_getDistanceToId = + _cv_aruco_Dictionary_getDistanceToIdPtr + .asFunction(); + + ffi.Pointer cv_aruco_Dictionary_get_bytesList( + ArucoDictionary self, + ffi.Pointer rval, + ) { + return _cv_aruco_Dictionary_get_bytesList( + self, + rval, + ); + } + + late final _cv_aruco_Dictionary_get_bytesListPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ArucoDictionary, + ffi.Pointer)>>('cv_aruco_Dictionary_get_bytesList'); + late final _cv_aruco_Dictionary_get_bytesList = + _cv_aruco_Dictionary_get_bytesListPtr.asFunction< + ffi.Pointer Function(ArucoDictionary, ffi.Pointer)>(); + + int cv_aruco_Dictionary_get_markerSize( + ArucoDictionary self, + ) { + return _cv_aruco_Dictionary_get_markerSize( + self, + ); + } + + late final _cv_aruco_Dictionary_get_markerSizePtr = + _lookup>( + 'cv_aruco_Dictionary_get_markerSize'); + late final _cv_aruco_Dictionary_get_markerSize = + _cv_aruco_Dictionary_get_markerSizePtr + .asFunction(); + + int cv_aruco_Dictionary_get_maxCorrectionBits( + ArucoDictionary self, + ) { + return _cv_aruco_Dictionary_get_maxCorrectionBits( + self, + ); + } + + late final _cv_aruco_Dictionary_get_maxCorrectionBitsPtr = + _lookup>( + 'cv_aruco_Dictionary_get_maxCorrectionBits'); + late final _cv_aruco_Dictionary_get_maxCorrectionBits = + _cv_aruco_Dictionary_get_maxCorrectionBitsPtr + .asFunction(); + + bool cv_aruco_Dictionary_identify( + ArucoDictionary self, + Mat onlyBits, + ffi.Pointer idx, + ffi.Pointer rotation, + double maxCorrectionRate, + ) { + return _cv_aruco_Dictionary_identify( + self, + onlyBits, + idx, + rotation, + maxCorrectionRate, + ); + } + + late final _cv_aruco_Dictionary_identifyPtr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ArucoDictionary, + Mat, + ffi.Pointer, + ffi.Pointer, + ffi.Double)>>('cv_aruco_Dictionary_identify'); + late final _cv_aruco_Dictionary_identify = + _cv_aruco_Dictionary_identifyPtr.asFunction< + bool Function(ArucoDictionary, Mat, ffi.Pointer, + ffi.Pointer, double)>(); + + ffi.Pointer cv_aruco_Dictionary_set_bytesList( + ArucoDictionary self, + Mat value, + ) { + return _cv_aruco_Dictionary_set_bytesList( + self, + value, + ); + } + + late final _cv_aruco_Dictionary_set_bytesListPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ArucoDictionary, Mat)>>('cv_aruco_Dictionary_set_bytesList'); + late final _cv_aruco_Dictionary_set_bytesList = + _cv_aruco_Dictionary_set_bytesListPtr + .asFunction Function(ArucoDictionary, Mat)>(); + + void cv_aruco_Dictionary_set_markerSize( + ArucoDictionary self, + int value, + ) { + return _cv_aruco_Dictionary_set_markerSize( + self, + value, + ); + } + + late final _cv_aruco_Dictionary_set_markerSizePtr = + _lookup>( + 'cv_aruco_Dictionary_set_markerSize'); + late final _cv_aruco_Dictionary_set_markerSize = + _cv_aruco_Dictionary_set_markerSizePtr + .asFunction(); + + void cv_aruco_Dictionary_set_maxCorrectionBits( + ArucoDictionary self, + int value, + ) { + return _cv_aruco_Dictionary_set_maxCorrectionBits( + self, + value, + ); + } + + late final _cv_aruco_Dictionary_set_maxCorrectionBitsPtr = + _lookup>( + 'cv_aruco_Dictionary_set_maxCorrectionBits'); + late final _cv_aruco_Dictionary_set_maxCorrectionBits = + _cv_aruco_Dictionary_set_maxCorrectionBitsPtr + .asFunction(); + void cv_aruco_arucoDetector_close( - ArucoDetectorPtr ad, + ArucoDetectorPtr self, ) { return _cv_aruco_arucoDetector_close( - ad, + self, ); } @@ -81,7 +310,7 @@ class CvNativeContrib { ffi.Pointer)>(); ffi.Pointer cv_aruco_arucoDetector_detectMarkers( - ArucoDetector ad, + ArucoDetector self, Mat inputArr, ffi.Pointer markerCorners, ffi.Pointer markerIds, @@ -89,7 +318,7 @@ class CvNativeContrib { imp1.CvCallback_0 callback, ) { return _cv_aruco_arucoDetector_detectMarkers( - ad, + self, inputArr, markerCorners, markerIds, @@ -117,21 +346,6 @@ class CvNativeContrib { ffi.Pointer, imp1.CvCallback_0)>(); - void cv_aruco_arucoDictionary_close( - ArucoDictionaryPtr self, - ) { - return _cv_aruco_arucoDictionary_close( - self, - ); - } - - late final _cv_aruco_arucoDictionary_closePtr = - _lookup>( - 'cv_aruco_arucoDictionary_close'); - late final _cv_aruco_arucoDictionary_close = - _cv_aruco_arucoDictionary_closePtr - .asFunction(); - void cv_aruco_detectorParameters_close( ArucoDetectorParamsPtr ap, ) { @@ -3542,7 +3756,7 @@ class CvNativeContrib { ffi.Pointer cv_ximgproc_rl_getStructuringElement( int shape, CvSize ksize, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_ximgproc_rl_getStructuringElement( @@ -3555,12 +3769,12 @@ class CvNativeContrib { late final _cv_ximgproc_rl_getStructuringElementPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, CvSize, Mat, + ffi.Pointer Function(ffi.Int, CvSize, ffi.Pointer, imp1.CvCallback_0)>>('cv_ximgproc_rl_getStructuringElement'); late final _cv_ximgproc_rl_getStructuringElement = _cv_ximgproc_rl_getStructuringElementPtr.asFunction< ffi.Pointer Function( - int, CvSize, Mat, imp1.CvCallback_0)>(); + int, CvSize, ffi.Pointer, imp1.CvCallback_0)>(); bool cv_ximgproc_rl_isRLMorphologyPossible( Mat rlStructuringElement, @@ -3795,12 +4009,11 @@ class CvNativeContrib { class _SymbolAddresses { final CvNativeContrib _library; _SymbolAddresses(this._library); + ffi.Pointer> + get cv_aruco_Dictionary_close => _library._cv_aruco_Dictionary_closePtr; ffi.Pointer> get cv_aruco_arucoDetector_close => _library._cv_aruco_arucoDetector_closePtr; - ffi.Pointer> - get cv_aruco_arucoDictionary_close => - _library._cv_aruco_arucoDictionary_closePtr; ffi.Pointer> get cv_aruco_detectorParameters_close => _library._cv_aruco_detectorParameters_closePtr; diff --git a/packages/dartcv/lib/src/g/contrib.yaml b/packages/dartcv/lib/src/g/contrib.yaml index c5f79511..3b020909 100644 --- a/packages/dartcv/lib/src/g/contrib.yaml +++ b/packages/dartcv/lib/src/g/contrib.yaml @@ -8,6 +8,30 @@ files: name: BLOCK_MEAN_HASH_MODE_0 c:@Ea@BLOCK_MEAN_HASH_MODE_0@BLOCK_MEAN_HASH_MODE_1: name: BLOCK_MEAN_HASH_MODE_1 + c:@F@cv_aruco_Dictionary_close: + name: cv_aruco_Dictionary_close + c:@F@cv_aruco_Dictionary_create: + name: cv_aruco_Dictionary_create + c:@F@cv_aruco_Dictionary_create_1: + name: cv_aruco_Dictionary_create_1 + c:@F@cv_aruco_Dictionary_generateImageMarker: + name: cv_aruco_Dictionary_generateImageMarker + c:@F@cv_aruco_Dictionary_getDistanceToId: + name: cv_aruco_Dictionary_getDistanceToId + c:@F@cv_aruco_Dictionary_get_bytesList: + name: cv_aruco_Dictionary_get_bytesList + c:@F@cv_aruco_Dictionary_get_markerSize: + name: cv_aruco_Dictionary_get_markerSize + c:@F@cv_aruco_Dictionary_get_maxCorrectionBits: + name: cv_aruco_Dictionary_get_maxCorrectionBits + c:@F@cv_aruco_Dictionary_identify: + name: cv_aruco_Dictionary_identify + c:@F@cv_aruco_Dictionary_set_bytesList: + name: cv_aruco_Dictionary_set_bytesList + c:@F@cv_aruco_Dictionary_set_markerSize: + name: cv_aruco_Dictionary_set_markerSize + c:@F@cv_aruco_Dictionary_set_maxCorrectionBits: + name: cv_aruco_Dictionary_set_maxCorrectionBits c:@F@cv_aruco_arucoDetector_close: name: cv_aruco_arucoDetector_close c:@F@cv_aruco_arucoDetector_create: @@ -16,8 +40,6 @@ files: name: cv_aruco_arucoDetector_create_1 c:@F@cv_aruco_arucoDetector_detectMarkers: name: cv_aruco_arucoDetector_detectMarkers - c:@F@cv_aruco_arucoDictionary_close: - name: cv_aruco_arucoDictionary_close c:@F@cv_aruco_detectorParameters_close: name: cv_aruco_detectorParameters_close c:@F@cv_aruco_detectorParameters_create: diff --git a/packages/dartcv/lib/src/g/core.g.dart b/packages/dartcv/lib/src/g/core.g.dart index cd41a459..c70148b3 100644 --- a/packages/dartcv/lib/src/g/core.g.dart +++ b/packages/dartcv/lib/src/g/core.g.dart @@ -71,7 +71,7 @@ class CvNativeCore { int dbottom, int dleft, int dright, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_Mat_adjustROI( @@ -87,11 +87,17 @@ class CvNativeCore { late final _cv_Mat_adjustROIPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, ffi.Int, - ffi.Int, Mat, imp1.CvCallback_0)>>('cv_Mat_adjustROI'); + ffi.Pointer Function( + Mat, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Int, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_adjustROI'); late final _cv_Mat_adjustROI = _cv_Mat_adjustROIPtr.asFunction< ffi.Pointer Function( - Mat, int, int, int, int, Mat, imp1.CvCallback_0)>(); + Mat, int, int, int, int, ffi.Pointer, imp1.CvCallback_0)>(); int cv_Mat_channels( Mat self, @@ -108,7 +114,7 @@ class CvNativeCore { ffi.Pointer cv_Mat_clone( Mat self, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_Mat_clone( @@ -121,9 +127,10 @@ class CvNativeCore { late final _cv_Mat_clonePtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_0)>>('cv_Mat_clone'); + Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_clone'); late final _cv_Mat_clone = _cv_Mat_clonePtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); void cv_Mat_close( imp1.MatPtr self, @@ -156,7 +163,7 @@ class CvNativeCore { ffi.Pointer cv_Mat_col( Mat self, int x, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_Mat_col( @@ -169,10 +176,11 @@ class CvNativeCore { late final _cv_Mat_colPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_Mat_col'); + ffi.Pointer Function(Mat, ffi.Int, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_col'); late final _cv_Mat_col = _cv_Mat_colPtr.asFunction< - ffi.Pointer Function(Mat, int, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, int, ffi.Pointer, imp1.CvCallback_0)>(); int cv_Mat_cols( Mat self, @@ -1667,7 +1675,7 @@ class CvNativeCore { ffi.Pointer cv_Mat_mul( Mat self, Mat val, - Mat dst, + ffi.Pointer dst, double scale, ) { return _cv_Mat_mul( @@ -1681,9 +1689,9 @@ class CvNativeCore { late final _cv_Mat_mulPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, Mat, ffi.Double)>>('cv_Mat_mul'); - late final _cv_Mat_mul = _cv_Mat_mulPtr - .asFunction Function(Mat, Mat, Mat, double)>(); + Mat, Mat, ffi.Pointer, ffi.Double)>>('cv_Mat_mul'); + late final _cv_Mat_mul = _cv_Mat_mulPtr.asFunction< + ffi.Pointer Function(Mat, Mat, ffi.Pointer, double)>(); ffi.Pointer cv_Mat_ones( int rows, @@ -2299,7 +2307,7 @@ class CvNativeCore { ffi.Pointer cv_Mat_region( Mat self, CvRect r, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_Mat_region( @@ -2312,10 +2320,11 @@ class CvNativeCore { late final _cv_Mat_regionPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, CvRect, Mat, imp1.CvCallback_0)>>('cv_Mat_region'); + ffi.Pointer Function(Mat, CvRect, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_region'); late final _cv_Mat_region = _cv_Mat_regionPtr.asFunction< - ffi.Pointer Function(Mat, CvRect, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, CvRect, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_Mat_release( Mat self, @@ -2335,7 +2344,7 @@ class CvNativeCore { Mat self, int cn, int rows, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_Mat_reshape( @@ -2349,16 +2358,17 @@ class CvNativeCore { late final _cv_Mat_reshapePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, Mat, - imp1.CvCallback_0)>>('cv_Mat_reshape'); + ffi.Pointer Function(Mat, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_reshape'); late final _cv_Mat_reshape = _cv_Mat_reshapePtr.asFunction< - ffi.Pointer Function(Mat, int, int, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, int, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_Mat_reshape_1( Mat self, int cn, VecI32 newshape, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_Mat_reshape_1( @@ -2372,16 +2382,16 @@ class CvNativeCore { late final _cv_Mat_reshape_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, VecI32, Mat, + ffi.Pointer Function(Mat, ffi.Int, VecI32, ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_reshape_1'); late final _cv_Mat_reshape_1 = _cv_Mat_reshape_1Ptr.asFunction< ffi.Pointer Function( - Mat, int, VecI32, Mat, imp1.CvCallback_0)>(); + Mat, int, VecI32, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_Mat_row( Mat self, int y, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_Mat_row( @@ -2394,10 +2404,11 @@ class CvNativeCore { late final _cv_Mat_rowPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_Mat_row'); + ffi.Pointer Function(Mat, ffi.Int, ffi.Pointer, + imp1.CvCallback_0)>>('cv_Mat_row'); late final _cv_Mat_row = _cv_Mat_rowPtr.asFunction< - ffi.Pointer Function(Mat, int, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, int, ffi.Pointer, imp1.CvCallback_0)>(); int cv_Mat_rows( Mat self, @@ -3356,7 +3367,7 @@ class CvNativeCore { ffi.Pointer cv_Mat_t( Mat self, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_Mat_t( @@ -3369,9 +3380,10 @@ class CvNativeCore { late final _cv_Mat_tPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, Mat, imp1.CvCallback_0)>>('cv_Mat_t'); + Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_Mat_t'); late final _cv_Mat_t = _cv_Mat_tPtr.asFunction< - ffi.Pointer Function(Mat, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_Mat_toFmtString( Mat self, @@ -4421,7 +4433,7 @@ class CvNativeCore { Mat self, int start, int end, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_colRange( @@ -4435,10 +4447,11 @@ class CvNativeCore { late final _cv_colRangePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_colRange'); + ffi.Pointer Function(Mat, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_colRange'); late final _cv_colRange = _cv_colRangePtr.asFunction< - ffi.Pointer Function(Mat, int, int, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, int, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_compare( Mat src1, @@ -5904,7 +5917,7 @@ class CvNativeCore { Mat self, int start, int end, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_rowRange( @@ -5918,10 +5931,11 @@ class CvNativeCore { late final _cv_rowRangePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - Mat, ffi.Int, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_rowRange'); + ffi.Pointer Function(Mat, ffi.Int, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_rowRange'); late final _cv_rowRange = _cv_rowRangePtr.asFunction< - ffi.Pointer Function(Mat, int, int, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + Mat, int, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_scaleAdd( Mat src1, @@ -5949,7 +5963,7 @@ class CvNativeCore { ffi.Pointer cv_setIdentity( Mat src, - double scalar, + Scalar scalar, imp1.CvCallback_0 callback, ) { return _cv_setIdentity( @@ -5962,9 +5976,9 @@ class CvNativeCore { late final _cv_setIdentityPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Mat, ffi.Double, imp1.CvCallback_0)>>('cv_setIdentity'); + Mat, Scalar, imp1.CvCallback_0)>>('cv_setIdentity'); late final _cv_setIdentity = _cv_setIdentityPtr.asFunction< - ffi.Pointer Function(Mat, double, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, Scalar, imp1.CvCallback_0)>(); void cv_setNumThreads( int n, diff --git a/packages/dartcv/lib/src/g/dnn.g.dart b/packages/dartcv/lib/src/g/dnn.g.dart index cce807d0..13c3af21 100644 --- a/packages/dartcv/lib/src/g/dnn.g.dart +++ b/packages/dartcv/lib/src/g/dnn.g.dart @@ -374,7 +374,7 @@ class CvNativeDnn { ffi.Pointer cv_dnn_Net_forward( Net net, ffi.Pointer outputName, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_dnn_Net_forward( @@ -387,11 +387,11 @@ class CvNativeDnn { late final _cv_dnn_Net_forwardPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Net, ffi.Pointer, Mat, - imp1.CvCallback_0)>>('cv_dnn_Net_forward'); + ffi.Pointer Function(Net, ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>>('cv_dnn_Net_forward'); late final _cv_dnn_Net_forward = _cv_dnn_Net_forwardPtr.asFunction< ffi.Pointer Function( - Net, ffi.Pointer, Mat, imp1.CvCallback_0)>(); + Net, ffi.Pointer, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_dnn_Net_forwardAsync( Net net, @@ -460,7 +460,7 @@ class CvNativeDnn { Mat blob, int imgidx, int chnidx, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_dnn_Net_getBlobChannel( @@ -474,12 +474,16 @@ class CvNativeDnn { late final _cv_dnn_Net_getBlobChannelPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Int, ffi.Int, Mat, + ffi.Pointer Function( + Mat, + ffi.Int, + ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_dnn_Net_getBlobChannel'); late final _cv_dnn_Net_getBlobChannel = _cv_dnn_Net_getBlobChannelPtr.asFunction< ffi.Pointer Function( - Mat, int, int, Mat, imp1.CvCallback_0)>(); + Mat, int, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_dnn_Net_getBlobSize( Mat blob, diff --git a/packages/dartcv/lib/src/g/highgui.g.dart b/packages/dartcv/lib/src/g/highgui.g.dart index de5b27f6..c224a902 100644 --- a/packages/dartcv/lib/src/g/highgui.g.dart +++ b/packages/dartcv/lib/src/g/highgui.g.dart @@ -31,13 +31,13 @@ class CvNativeHighgui { : _lookup = lookup; ffi.Pointer cv_createTrackbar( - ffi.Pointer winname, ffi.Pointer trackname, + ffi.Pointer winname, int max, ) { return _cv_createTrackbar( - winname, trackname, + winname, max, ); } @@ -51,16 +51,16 @@ class CvNativeHighgui { ffi.Pointer, ffi.Pointer, int)>(); ffi.Pointer cv_createTrackbar_1( - ffi.Pointer winname, ffi.Pointer trackname, + ffi.Pointer winname, ffi.Pointer value, int max, cv_TrackbarCallback onChange, ffi.Pointer userdata, ) { return _cv_createTrackbar_1( - winname, trackname, + winname, value, max, onChange, @@ -136,13 +136,13 @@ class CvNativeHighgui { _cv_getMouseWheelDeltaPtr.asFunction(); ffi.Pointer cv_getTrackbarPos( - ffi.Pointer winname, ffi.Pointer trackname, + ffi.Pointer winname, ffi.Pointer rval, ) { return _cv_getTrackbarPos( - winname, trackname, + winname, rval, ); } @@ -377,13 +377,13 @@ class CvNativeHighgui { ffi.Pointer, cv_MouseCallback, ffi.Pointer)>(); ffi.Pointer cv_setTrackbarMax( - ffi.Pointer winname, ffi.Pointer trackname, + ffi.Pointer winname, int val, ) { return _cv_setTrackbarMax( - winname, trackname, + winname, val, ); } @@ -397,13 +397,13 @@ class CvNativeHighgui { ffi.Pointer, ffi.Pointer, int)>(); ffi.Pointer cv_setTrackbarMin( - ffi.Pointer winname, ffi.Pointer trackname, + ffi.Pointer winname, int val, ) { return _cv_setTrackbarMin( - winname, trackname, + winname, val, ); } @@ -417,13 +417,13 @@ class CvNativeHighgui { ffi.Pointer, ffi.Pointer, int)>(); ffi.Pointer cv_setTrackbarPos( - ffi.Pointer winname, ffi.Pointer trackname, + ffi.Pointer winname, int pos, ) { return _cv_setTrackbarPos( - winname, trackname, + winname, pos, ); } diff --git a/packages/dartcv/lib/src/g/imgcodecs.g.dart b/packages/dartcv/lib/src/g/imgcodecs.g.dart index 8d217ffb..9a7735d3 100644 --- a/packages/dartcv/lib/src/g/imgcodecs.g.dart +++ b/packages/dartcv/lib/src/g/imgcodecs.g.dart @@ -77,7 +77,7 @@ class CvNativeImgcodecs { ffi.Pointer cv_imdecode( VecUChar buf, int flags, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_imdecode( @@ -90,10 +90,11 @@ class CvNativeImgcodecs { late final _cv_imdecodePtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function( - VecUChar, ffi.Int, Mat, imp1.CvCallback_0)>>('cv_imdecode'); + ffi.Pointer Function(VecUChar, ffi.Int, ffi.Pointer, + imp1.CvCallback_0)>>('cv_imdecode'); late final _cv_imdecode = _cv_imdecodePtr.asFunction< - ffi.Pointer Function(VecUChar, int, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + VecUChar, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_imencode( ffi.Pointer fileExt, @@ -157,7 +158,7 @@ class CvNativeImgcodecs { ffi.Pointer cv_imread( ffi.Pointer filename, int flags, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_imread( @@ -170,11 +171,11 @@ class CvNativeImgcodecs { late final _cv_imreadPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, ffi.Int, Mat, - imp1.CvCallback_0)>>('cv_imread'); + ffi.Pointer Function(ffi.Pointer, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_imread'); late final _cv_imread = _cv_imreadPtr.asFunction< ffi.Pointer Function( - ffi.Pointer, int, Mat, imp1.CvCallback_0)>(); + ffi.Pointer, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_imwrite( ffi.Pointer filename, diff --git a/packages/dartcv/lib/src/g/imgproc.g.dart b/packages/dartcv/lib/src/g/imgproc.g.dart index 205c78cf..d71616b4 100644 --- a/packages/dartcv/lib/src/g/imgproc.g.dart +++ b/packages/dartcv/lib/src/g/imgproc.g.dart @@ -2332,7 +2332,7 @@ class CvNativeImgproc { ffi.Pointer cv_getAffineTransform( VecPoint src, VecPoint dst, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_getAffineTransform( @@ -2345,16 +2345,16 @@ class CvNativeImgproc { late final _cv_getAffineTransformPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint, VecPoint, Mat, + ffi.Pointer Function(VecPoint, VecPoint, ffi.Pointer, imp1.CvCallback_0)>>('cv_getAffineTransform'); late final _cv_getAffineTransform = _cv_getAffineTransformPtr.asFunction< ffi.Pointer Function( - VecPoint, VecPoint, Mat, imp1.CvCallback_0)>(); + VecPoint, VecPoint, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_getAffineTransform2f( VecPoint2f src, VecPoint2f dst, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_getAffineTransform2f( @@ -2367,17 +2367,17 @@ class CvNativeImgproc { late final _cv_getAffineTransform2fPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, - imp1.CvCallback_0)>>('cv_getAffineTransform2f'); + ffi.Pointer Function(VecPoint2f, VecPoint2f, + ffi.Pointer, imp1.CvCallback_0)>>('cv_getAffineTransform2f'); late final _cv_getAffineTransform2f = _cv_getAffineTransform2fPtr.asFunction< ffi.Pointer Function( - VecPoint2f, VecPoint2f, Mat, imp1.CvCallback_0)>(); + VecPoint2f, VecPoint2f, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_getGaussianKernel( int ksize, double sigma, int ktype, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_getGaussianKernel( @@ -2391,16 +2391,16 @@ class CvNativeImgproc { late final _cv_getGaussianKernelPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Int, Mat, - imp1.CvCallback_0)>>('cv_getGaussianKernel'); + ffi.Pointer Function(ffi.Int, ffi.Double, ffi.Int, + ffi.Pointer, imp1.CvCallback_0)>>('cv_getGaussianKernel'); late final _cv_getGaussianKernel = _cv_getGaussianKernelPtr.asFunction< ffi.Pointer Function( - int, double, int, Mat, imp1.CvCallback_0)>(); + int, double, int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_getPerspectiveTransform( VecPoint src, VecPoint dst, - Mat rval, + ffi.Pointer rval, int solveMethod, imp1.CvCallback_0 callback, ) { @@ -2415,17 +2415,17 @@ class CvNativeImgproc { late final _cv_getPerspectiveTransformPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint, VecPoint, Mat, ffi.Int, - imp1.CvCallback_0)>>('cv_getPerspectiveTransform'); + ffi.Pointer Function(VecPoint, VecPoint, ffi.Pointer, + ffi.Int, imp1.CvCallback_0)>>('cv_getPerspectiveTransform'); late final _cv_getPerspectiveTransform = _cv_getPerspectiveTransformPtr.asFunction< ffi.Pointer Function( - VecPoint, VecPoint, Mat, int, imp1.CvCallback_0)>(); + VecPoint, VecPoint, ffi.Pointer, int, imp1.CvCallback_0)>(); ffi.Pointer cv_getPerspectiveTransform2f( VecPoint2f src, VecPoint2f dst, - Mat rval, + ffi.Pointer rval, int solveMethod, imp1.CvCallback_0 callback, ) { @@ -2440,12 +2440,16 @@ class CvNativeImgproc { late final _cv_getPerspectiveTransform2fPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(VecPoint2f, VecPoint2f, Mat, ffi.Int, + ffi.Pointer Function( + VecPoint2f, + VecPoint2f, + ffi.Pointer, + ffi.Int, imp1.CvCallback_0)>>('cv_getPerspectiveTransform2f'); late final _cv_getPerspectiveTransform2f = _cv_getPerspectiveTransform2fPtr.asFunction< - ffi.Pointer Function( - VecPoint2f, VecPoint2f, Mat, int, imp1.CvCallback_0)>(); + ffi.Pointer Function(VecPoint2f, VecPoint2f, + ffi.Pointer, int, imp1.CvCallback_0)>(); ffi.Pointer cv_getRectSubPix( Mat src, @@ -2475,7 +2479,7 @@ class CvNativeImgproc { CvPoint2f center, double angle, double scale, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_getRotationMatrix2D( @@ -2489,16 +2493,16 @@ class CvNativeImgproc { late final _cv_getRotationMatrix2DPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(CvPoint2f, ffi.Double, ffi.Double, Mat, - imp1.CvCallback_0)>>('cv_getRotationMatrix2D'); + ffi.Pointer Function(CvPoint2f, ffi.Double, ffi.Double, + ffi.Pointer, imp1.CvCallback_0)>>('cv_getRotationMatrix2D'); late final _cv_getRotationMatrix2D = _cv_getRotationMatrix2DPtr.asFunction< ffi.Pointer Function( - CvPoint2f, double, double, Mat, imp1.CvCallback_0)>(); + CvPoint2f, double, double, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_getStructuringElement( int shape, CvSize ksize, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_getStructuringElement( @@ -2511,12 +2515,12 @@ class CvNativeImgproc { late final _cv_getStructuringElementPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Int, CvSize, Mat, + ffi.Pointer Function(ffi.Int, CvSize, ffi.Pointer, imp1.CvCallback_0)>>('cv_getStructuringElement'); late final _cv_getStructuringElement = _cv_getStructuringElementPtr.asFunction< ffi.Pointer Function( - int, CvSize, Mat, imp1.CvCallback_0)>(); + int, CvSize, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_getTextSize( ffi.Pointer text, diff --git a/packages/dartcv/lib/src/g/stitching.g.dart b/packages/dartcv/lib/src/g/stitching.g.dart index 035df999..cd4e0ccc 100644 --- a/packages/dartcv/lib/src/g/stitching.g.dart +++ b/packages/dartcv/lib/src/g/stitching.g.dart @@ -30,33 +30,47 @@ class CvNativeStitching { lookup) : _lookup = lookup; - ffi.Pointer Stitcher_Component( + void cv_Stitcher_close( + StitcherPtr stitcher, + ) { + return _cv_Stitcher_close( + stitcher, + ); + } + + late final _cv_Stitcher_closePtr = + _lookup>( + 'cv_Stitcher_close'); + late final _cv_Stitcher_close = + _cv_Stitcher_closePtr.asFunction(); + + ffi.Pointer cv_Stitcher_component( Stitcher self, ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _Stitcher_Component( + return _cv_Stitcher_component( self, rval, callback, ); } - late final _Stitcher_ComponentPtr = _lookup< + late final _cv_Stitcher_componentPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Stitcher, ffi.Pointer, - imp1.CvCallback_0)>>('Stitcher_Component'); - late final _Stitcher_Component = _Stitcher_ComponentPtr.asFunction< + imp1.CvCallback_0)>>('cv_Stitcher_component'); + late final _cv_Stitcher_component = _cv_Stitcher_componentPtr.asFunction< ffi.Pointer Function( Stitcher, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Stitcher_ComposePanorama( + ffi.Pointer cv_Stitcher_composePanorama( Stitcher self, Mat rpano, ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _Stitcher_ComposePanorama( + return _cv_Stitcher_composePanorama( self, rpano, rval, @@ -64,23 +78,23 @@ class CvNativeStitching { ); } - late final _Stitcher_ComposePanoramaPtr = _lookup< + late final _cv_Stitcher_composePanoramaPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function(Stitcher, Mat, ffi.Pointer, - imp1.CvCallback_0)>>('Stitcher_ComposePanorama'); - late final _Stitcher_ComposePanorama = - _Stitcher_ComposePanoramaPtr.asFunction< + imp1.CvCallback_0)>>('cv_Stitcher_composePanorama'); + late final _cv_Stitcher_composePanorama = + _cv_Stitcher_composePanoramaPtr.asFunction< ffi.Pointer Function( Stitcher, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Stitcher_ComposePanorama_1( + ffi.Pointer cv_Stitcher_composePanorama_1( Stitcher self, VecMat mats, Mat rpano, ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _Stitcher_ComposePanorama_1( + return _cv_Stitcher_composePanorama_1( self, mats, rpano, @@ -89,128 +103,64 @@ class CvNativeStitching { ); } - late final _Stitcher_ComposePanorama_1Ptr = _lookup< + late final _cv_Stitcher_composePanorama_1Ptr = _lookup< ffi.NativeFunction< ffi.Pointer Function( Stitcher, VecMat, Mat, ffi.Pointer, - imp1.CvCallback_0)>>('Stitcher_ComposePanorama_1'); - late final _Stitcher_ComposePanorama_1 = - _Stitcher_ComposePanorama_1Ptr.asFunction< + imp1.CvCallback_0)>>('cv_Stitcher_composePanorama_1'); + late final _cv_Stitcher_composePanorama_1 = + _cv_Stitcher_composePanorama_1Ptr.asFunction< ffi.Pointer Function(Stitcher, VecMat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer Stitcher_EstimateTransform( - Stitcher self, - VecMat mats, - VecMat masks, - ffi.Pointer rval, - imp1.CvCallback_0 callback, + ffi.Pointer cv_Stitcher_create( + int mode, + ffi.Pointer rval, ) { - return _Stitcher_EstimateTransform( - self, - mats, - masks, + return _cv_Stitcher_create( + mode, rval, - callback, ); } - late final _Stitcher_EstimateTransformPtr = _lookup< + late final _cv_Stitcher_createPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - Stitcher, - VecMat, - VecMat, - ffi.Pointer, - imp1.CvCallback_0)>>('Stitcher_EstimateTransform'); - late final _Stitcher_EstimateTransform = - _Stitcher_EstimateTransformPtr.asFunction< - ffi.Pointer Function(Stitcher, VecMat, VecMat, - ffi.Pointer, imp1.CvCallback_0)>(); - - ffi.Pointer Stitcher_Stitch( - Stitcher self, - VecMat mats, - Mat rpano, - ffi.Pointer rval, - imp1.CvCallback_0 callback, - ) { - return _Stitcher_Stitch( - self, - mats, - rpano, - rval, - callback, - ); - } - - late final _Stitcher_StitchPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, VecMat, Mat, - ffi.Pointer, imp1.CvCallback_0)>>('Stitcher_Stitch'); - late final _Stitcher_Stitch = _Stitcher_StitchPtr.asFunction< - ffi.Pointer Function( - Stitcher, VecMat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Int, ffi.Pointer)>>('cv_Stitcher_create'); + late final _cv_Stitcher_create = _cv_Stitcher_createPtr + .asFunction Function(int, ffi.Pointer)>(); - ffi.Pointer Stitcher_Stitch_1( + ffi.Pointer cv_Stitcher_estimateTransform( Stitcher self, VecMat mats, VecMat masks, - Mat rpano, ffi.Pointer rval, imp1.CvCallback_0 callback, ) { - return _Stitcher_Stitch_1( + return _cv_Stitcher_estimateTransform( self, mats, masks, - rpano, rval, callback, ); } - late final _Stitcher_Stitch_1Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(Stitcher, VecMat, VecMat, Mat, - ffi.Pointer, imp1.CvCallback_0)>>('Stitcher_Stitch_1'); - late final _Stitcher_Stitch_1 = _Stitcher_Stitch_1Ptr.asFunction< - ffi.Pointer Function(Stitcher, VecMat, VecMat, Mat, - ffi.Pointer, imp1.CvCallback_0)>(); - - void cv_Stitcher_close( - StitcherPtr stitcher, - ) { - return _cv_Stitcher_close( - stitcher, - ); - } - - late final _cv_Stitcher_closePtr = - _lookup>( - 'cv_Stitcher_close'); - late final _cv_Stitcher_close = - _cv_Stitcher_closePtr.asFunction(); - - ffi.Pointer cv_Stitcher_create( - int mode, - ffi.Pointer rval, - ) { - return _cv_Stitcher_create( - mode, - rval, - ); - } - - late final _cv_Stitcher_createPtr = _lookup< + late final _cv_Stitcher_estimateTransformPtr = _lookup< ffi.NativeFunction< ffi.Pointer Function( - ffi.Int, ffi.Pointer)>>('cv_Stitcher_create'); - late final _cv_Stitcher_create = _cv_Stitcher_createPtr - .asFunction Function(int, ffi.Pointer)>(); + Stitcher, + VecMat, + VecMat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Stitcher_estimateTransform'); + late final _cv_Stitcher_estimateTransform = + _cv_Stitcher_estimateTransformPtr.asFunction< + ffi.Pointer Function(Stitcher, VecMat, VecMat, + ffi.Pointer, imp1.CvCallback_0)>(); double cv_Stitcher_get_compositingResol( Stitcher self, @@ -434,6 +384,61 @@ class CvNativeStitching { _cv_Stitcher_set_waveCorrectionPtr .asFunction(); + ffi.Pointer cv_Stitcher_stitch( + Stitcher self, + VecMat mats, + Mat rpano, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_Stitcher_stitch( + self, + mats, + rpano, + rval, + callback, + ); + } + + late final _cv_Stitcher_stitchPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(Stitcher, VecMat, Mat, + ffi.Pointer, imp1.CvCallback_0)>>('cv_Stitcher_stitch'); + late final _cv_Stitcher_stitch = _cv_Stitcher_stitchPtr.asFunction< + ffi.Pointer Function( + Stitcher, VecMat, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + + ffi.Pointer cv_Stitcher_stitch_1( + Stitcher self, + VecMat mats, + VecMat masks, + Mat rpano, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_Stitcher_stitch_1( + self, + mats, + masks, + rpano, + rval, + callback, + ); + } + + late final _cv_Stitcher_stitch_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Stitcher, + VecMat, + VecMat, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_Stitcher_stitch_1'); + late final _cv_Stitcher_stitch_1 = _cv_Stitcher_stitch_1Ptr.asFunction< + ffi.Pointer Function(Stitcher, VecMat, VecMat, Mat, + ffi.Pointer, imp1.CvCallback_0)>(); + late final addresses = _SymbolAddresses(this); } diff --git a/packages/dartcv/lib/src/g/stitching.yaml b/packages/dartcv/lib/src/g/stitching.yaml index 74f0584b..78f21f77 100644 --- a/packages/dartcv/lib/src/g/stitching.yaml +++ b/packages/dartcv/lib/src/g/stitching.yaml @@ -16,22 +16,18 @@ files: name: STITCHING_PANORAMA c:@Ea@STITCHING_PANORAMA@STITCHING_SCANS: name: STITCHING_SCANS - c:@F@Stitcher_Component: - name: Stitcher_Component - c:@F@Stitcher_ComposePanorama: - name: Stitcher_ComposePanorama - c:@F@Stitcher_ComposePanorama_1: - name: Stitcher_ComposePanorama_1 - c:@F@Stitcher_EstimateTransform: - name: Stitcher_EstimateTransform - c:@F@Stitcher_Stitch: - name: Stitcher_Stitch - c:@F@Stitcher_Stitch_1: - name: Stitcher_Stitch_1 c:@F@cv_Stitcher_close: name: cv_Stitcher_close + c:@F@cv_Stitcher_component: + name: cv_Stitcher_component + c:@F@cv_Stitcher_composePanorama: + name: cv_Stitcher_composePanorama + c:@F@cv_Stitcher_composePanorama_1: + name: cv_Stitcher_composePanorama_1 c:@F@cv_Stitcher_create: name: cv_Stitcher_create + c:@F@cv_Stitcher_estimateTransform: + name: cv_Stitcher_estimateTransform c:@F@cv_Stitcher_get_compositingResol: name: cv_Stitcher_get_compositingResol c:@F@cv_Stitcher_get_interpolationFlags: @@ -60,6 +56,10 @@ files: name: cv_Stitcher_set_waveCorrectKind c:@F@cv_Stitcher_set_waveCorrection: name: cv_Stitcher_set_waveCorrection + c:@F@cv_Stitcher_stitch: + name: cv_Stitcher_stitch + c:@F@cv_Stitcher_stitch_1: + name: cv_Stitcher_stitch_1 c:@S@Stitcher: name: Stitcher c:stitching.h@T@StitcherPtr: diff --git a/packages/dartcv/lib/src/g/video.g.dart b/packages/dartcv/lib/src/g/video.g.dart index ef5fa92c..3b55afa3 100644 --- a/packages/dartcv/lib/src/g/video.g.dart +++ b/packages/dartcv/lib/src/g/video.g.dart @@ -207,7 +207,7 @@ class CvNativeVideo { ffi.Pointer cv_KalmanFilter_correct( KalmanFilter self, Mat measurement, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_KalmanFilter_correct( @@ -220,11 +220,11 @@ class CvNativeVideo { late final _cv_KalmanFilter_correctPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, Mat, + ffi.Pointer Function(KalmanFilter, Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_KalmanFilter_correct'); late final _cv_KalmanFilter_correct = _cv_KalmanFilter_correctPtr.asFunction< ffi.Pointer Function( - KalmanFilter, Mat, Mat, imp1.CvCallback_0)>(); + KalmanFilter, Mat, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_KalmanFilter_create( int dynamParams, @@ -252,7 +252,7 @@ class CvNativeVideo { ffi.Pointer cv_KalmanFilter_get_controlMatrix( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_controlMatrix( self, @@ -261,16 +261,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_controlMatrixPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_controlMatrix'); + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, + ffi.Pointer)>>('cv_KalmanFilter_get_controlMatrix'); late final _cv_KalmanFilter_get_controlMatrix = - _cv_KalmanFilter_get_controlMatrixPtr - .asFunction Function(KalmanFilter, Mat)>(); + _cv_KalmanFilter_get_controlMatrixPtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_errorCovPost( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_errorCovPost( self, @@ -279,16 +279,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_errorCovPostPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_errorCovPost'); + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, + ffi.Pointer)>>('cv_KalmanFilter_get_errorCovPost'); late final _cv_KalmanFilter_get_errorCovPost = - _cv_KalmanFilter_get_errorCovPostPtr - .asFunction Function(KalmanFilter, Mat)>(); + _cv_KalmanFilter_get_errorCovPostPtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_errorCovPre( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_errorCovPre( self, @@ -297,16 +297,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_errorCovPrePtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_errorCovPre'); + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, + ffi.Pointer)>>('cv_KalmanFilter_get_errorCovPre'); late final _cv_KalmanFilter_get_errorCovPre = - _cv_KalmanFilter_get_errorCovPrePtr - .asFunction Function(KalmanFilter, Mat)>(); + _cv_KalmanFilter_get_errorCovPrePtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_gain( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_gain( self, @@ -315,15 +315,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_gainPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_gain'); - late final _cv_KalmanFilter_get_gain = _cv_KalmanFilter_get_gainPtr - .asFunction Function(KalmanFilter, Mat)>(); + ffi.NativeFunction< + ffi.Pointer Function( + KalmanFilter, ffi.Pointer)>>('cv_KalmanFilter_get_gain'); + late final _cv_KalmanFilter_get_gain = + _cv_KalmanFilter_get_gainPtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_measurementMatrix( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_measurementMatrix( self, @@ -332,16 +333,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_measurementMatrixPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_measurementMatrix'); + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, + ffi.Pointer)>>('cv_KalmanFilter_get_measurementMatrix'); late final _cv_KalmanFilter_get_measurementMatrix = - _cv_KalmanFilter_get_measurementMatrixPtr - .asFunction Function(KalmanFilter, Mat)>(); + _cv_KalmanFilter_get_measurementMatrixPtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_measurementNoiseCov( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_measurementNoiseCov( self, @@ -350,16 +351,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_measurementNoiseCovPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_measurementNoiseCov'); + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, + ffi.Pointer)>>('cv_KalmanFilter_get_measurementNoiseCov'); late final _cv_KalmanFilter_get_measurementNoiseCov = - _cv_KalmanFilter_get_measurementNoiseCovPtr - .asFunction Function(KalmanFilter, Mat)>(); + _cv_KalmanFilter_get_measurementNoiseCovPtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_processNoiseCov( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_processNoiseCov( self, @@ -368,16 +369,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_processNoiseCovPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_processNoiseCov'); + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, + ffi.Pointer)>>('cv_KalmanFilter_get_processNoiseCov'); late final _cv_KalmanFilter_get_processNoiseCov = - _cv_KalmanFilter_get_processNoiseCovPtr - .asFunction Function(KalmanFilter, Mat)>(); + _cv_KalmanFilter_get_processNoiseCovPtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_statePost( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_statePost( self, @@ -386,15 +387,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_statePostPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_statePost'); - late final _cv_KalmanFilter_get_statePost = _cv_KalmanFilter_get_statePostPtr - .asFunction Function(KalmanFilter, Mat)>(); + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, + ffi.Pointer)>>('cv_KalmanFilter_get_statePost'); + late final _cv_KalmanFilter_get_statePost = + _cv_KalmanFilter_get_statePostPtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_statePre( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_statePre( self, @@ -403,15 +405,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_statePrePtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_statePre'); - late final _cv_KalmanFilter_get_statePre = _cv_KalmanFilter_get_statePrePtr - .asFunction Function(KalmanFilter, Mat)>(); + ffi.NativeFunction< + ffi.Pointer Function( + KalmanFilter, ffi.Pointer)>>('cv_KalmanFilter_get_statePre'); + late final _cv_KalmanFilter_get_statePre = + _cv_KalmanFilter_get_statePrePtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_temp1( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_temp1( self, @@ -420,15 +423,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_temp1Ptr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_temp1'); - late final _cv_KalmanFilter_get_temp1 = _cv_KalmanFilter_get_temp1Ptr - .asFunction Function(KalmanFilter, Mat)>(); + ffi.NativeFunction< + ffi.Pointer Function( + KalmanFilter, ffi.Pointer)>>('cv_KalmanFilter_get_temp1'); + late final _cv_KalmanFilter_get_temp1 = + _cv_KalmanFilter_get_temp1Ptr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_temp2( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_temp2( self, @@ -437,15 +441,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_temp2Ptr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_temp2'); - late final _cv_KalmanFilter_get_temp2 = _cv_KalmanFilter_get_temp2Ptr - .asFunction Function(KalmanFilter, Mat)>(); + ffi.NativeFunction< + ffi.Pointer Function( + KalmanFilter, ffi.Pointer)>>('cv_KalmanFilter_get_temp2'); + late final _cv_KalmanFilter_get_temp2 = + _cv_KalmanFilter_get_temp2Ptr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_temp3( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_temp3( self, @@ -454,15 +459,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_temp3Ptr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_temp3'); - late final _cv_KalmanFilter_get_temp3 = _cv_KalmanFilter_get_temp3Ptr - .asFunction Function(KalmanFilter, Mat)>(); + ffi.NativeFunction< + ffi.Pointer Function( + KalmanFilter, ffi.Pointer)>>('cv_KalmanFilter_get_temp3'); + late final _cv_KalmanFilter_get_temp3 = + _cv_KalmanFilter_get_temp3Ptr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_temp4( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_temp4( self, @@ -471,15 +477,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_temp4Ptr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_temp4'); - late final _cv_KalmanFilter_get_temp4 = _cv_KalmanFilter_get_temp4Ptr - .asFunction Function(KalmanFilter, Mat)>(); + ffi.NativeFunction< + ffi.Pointer Function( + KalmanFilter, ffi.Pointer)>>('cv_KalmanFilter_get_temp4'); + late final _cv_KalmanFilter_get_temp4 = + _cv_KalmanFilter_get_temp4Ptr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_temp5( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_temp5( self, @@ -488,15 +495,16 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_temp5Ptr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_temp5'); - late final _cv_KalmanFilter_get_temp5 = _cv_KalmanFilter_get_temp5Ptr - .asFunction Function(KalmanFilter, Mat)>(); + ffi.NativeFunction< + ffi.Pointer Function( + KalmanFilter, ffi.Pointer)>>('cv_KalmanFilter_get_temp5'); + late final _cv_KalmanFilter_get_temp5 = + _cv_KalmanFilter_get_temp5Ptr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_get_transitionMatrix( KalmanFilter self, - Mat rval, + ffi.Pointer rval, ) { return _cv_KalmanFilter_get_transitionMatrix( self, @@ -505,12 +513,12 @@ class CvNativeVideo { } late final _cv_KalmanFilter_get_transitionMatrixPtr = _lookup< - ffi - .NativeFunction Function(KalmanFilter, Mat)>>( - 'cv_KalmanFilter_get_transitionMatrix'); + ffi.NativeFunction< + ffi.Pointer Function(KalmanFilter, + ffi.Pointer)>>('cv_KalmanFilter_get_transitionMatrix'); late final _cv_KalmanFilter_get_transitionMatrix = - _cv_KalmanFilter_get_transitionMatrixPtr - .asFunction Function(KalmanFilter, Mat)>(); + _cv_KalmanFilter_get_transitionMatrixPtr.asFunction< + ffi.Pointer Function(KalmanFilter, ffi.Pointer)>(); ffi.Pointer cv_KalmanFilter_init( KalmanFilter self, @@ -562,7 +570,7 @@ class CvNativeVideo { ffi.Pointer cv_KalmanFilter_predict( KalmanFilter self, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_KalmanFilter_predict( @@ -574,15 +582,16 @@ class CvNativeVideo { late final _cv_KalmanFilter_predictPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, + ffi.Pointer Function(KalmanFilter, ffi.Pointer, imp1.CvCallback_0)>>('cv_KalmanFilter_predict'); late final _cv_KalmanFilter_predict = _cv_KalmanFilter_predictPtr.asFunction< - ffi.Pointer Function(KalmanFilter, Mat, imp1.CvCallback_0)>(); + ffi.Pointer Function( + KalmanFilter, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_KalmanFilter_predict_1( KalmanFilter self, Mat control, - Mat rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_KalmanFilter_predict_1( @@ -595,12 +604,12 @@ class CvNativeVideo { late final _cv_KalmanFilter_predict_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(KalmanFilter, Mat, Mat, + ffi.Pointer Function(KalmanFilter, Mat, ffi.Pointer, imp1.CvCallback_0)>>('cv_KalmanFilter_predict_1'); late final _cv_KalmanFilter_predict_1 = _cv_KalmanFilter_predict_1Ptr.asFunction< ffi.Pointer Function( - KalmanFilter, Mat, Mat, imp1.CvCallback_0)>(); + KalmanFilter, Mat, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_KalmanFilter_set_controlMatrix( KalmanFilter self, diff --git a/packages/dartcv/lib/src/g/videoio.g.dart b/packages/dartcv/lib/src/g/videoio.g.dart index 83a1cba5..a4657faf 100644 --- a/packages/dartcv/lib/src/g/videoio.g.dart +++ b/packages/dartcv/lib/src/g/videoio.g.dart @@ -282,7 +282,7 @@ class CvNativeVideoIO { ffi.Pointer cv_VideoCapture_read( VideoCapture self, Mat buf, - ffi.Pointer rval, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_VideoCapture_read( @@ -298,11 +298,11 @@ class CvNativeVideoIO { ffi.Pointer Function( VideoCapture, Mat, - ffi.Pointer, + ffi.Pointer, imp1.CvCallback_0)>>('cv_VideoCapture_read'); late final _cv_VideoCapture_read = _cv_VideoCapture_readPtr.asFunction< ffi.Pointer Function( - VideoCapture, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + VideoCapture, Mat, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_VideoCapture_release( VideoCapture self, diff --git a/packages/dartcv/lib/src/gapi/gcomputation.dart b/packages/dartcv/lib/src/gapi/gcomputation.dart index d900a7d5..5d6e3a1c 100644 --- a/packages/dartcv/lib/src/gapi/gcomputation.dart +++ b/packages/dartcv/lib/src/gapi/gcomputation.dart @@ -50,7 +50,7 @@ class GComputation extends CvStruct { } Future apply(Mat inMat) async => - cvRunAsync((callback) => cgapi.gapi_GComputation_apply(ref, inMat.ref, callback), matCompleter); + cvRunAsync1((callback) => cgapi.gapi_GComputation_apply(ref, inMat.ref, callback), matCompleter); // Mat applyMIMO(Mat inMat) => apply(inMat); diff --git a/packages/dartcv/lib/src/highgui/highgui.dart b/packages/dartcv/lib/src/highgui/highgui.dart index 0d24d093..03d27fd4 100644 --- a/packages/dartcv/lib/src/highgui/highgui.dart +++ b/packages/dartcv/lib/src/highgui/highgui.dart @@ -36,14 +36,14 @@ int waitKeyEx(int delay) => chighgui.cv_waitKeyEx(delay); /// /// For further details, please see: /// http://docs.opencv.org/master/d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b -void namedWindow(String name, [int flags = 0]) { - final cname = name.toNativeUtf8().cast(); +void namedWindow(String winName, [int flags = 0]) { + final cname = winName.toNativeUtf8().cast(); cvRun(() => chighgui.cv_namedWindow(cname, flags)); calloc.free(cname); } -void destroyWindow(String name) { - final cname = name.toNativeUtf8().cast(); +void destroyWindow(String winName) { + final cname = winName.toNativeUtf8().cast(); cvRun(() => chighgui.cv_destroyWindow(cname)); calloc.free(cname); } @@ -59,17 +59,17 @@ void destroyAllWindows() { /// /// For further details, please see: /// http://docs.opencv.org/master/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563 -void imshow(String name, Mat img) { - final cname = name.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_imshow(cname, img.ref)); - calloc.free(cname); +void imshow(String winName, Mat img) { + final cWinName = winName.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_imshow(cWinName, img.ref)); + calloc.free(cWinName); } -Rect getWindowImageRect(String name) { - final cname = name.toNativeUtf8().cast(); +Rect getWindowImageRect(String winName) { + final cWinName = winName.toNativeUtf8().cast(); final p = calloc(); - cvRun(() => chighgui.cv_getWindowImageRect(cname, p)); - calloc.free(cname); + cvRun(() => chighgui.cv_getWindowImageRect(cWinName, p)); + calloc.free(cWinName); return Rect.fromPointer(p); } @@ -77,13 +77,13 @@ Rect getWindowImageRect(String name) { /// /// For further details, please see: /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#gaaf9504b8f9cf19024d9d44a14e461656 -double getWindowProperty(String name, WindowPropertyFlags flag) { - final cname = name.toNativeUtf8().cast(); +double getWindowProperty(String winName, WindowPropertyFlags flag) { + final cWinName = winName.toNativeUtf8().cast(); final p = calloc(); - cvRun(() => chighgui.cv_getWindowProperty(cname, flag.value, p)); + cvRun(() => chighgui.cv_getWindowProperty(cWinName, flag.value, p)); final rval = p.value; calloc.free(p); - calloc.free(cname); + calloc.free(cWinName); return rval; } @@ -91,42 +91,42 @@ double getWindowProperty(String name, WindowPropertyFlags flag) { /// /// For further details, please see: /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga66e4a6db4d4e06148bcdfe0d70a5df27 -void setWindowProperty(String name, WindowPropertyFlags flag, double value) { - final cname = name.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_setWindowProperty(cname, flag.value, value)); - calloc.free(cname); +void setWindowProperty(String winName, WindowPropertyFlags flag, double value) { + final cWinName = winName.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setWindowProperty(cWinName, flag.value, value)); + calloc.free(cWinName); } /// SetWindowTitle updates window title. /// /// For further details, please see: /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga56f8849295fd10d0c319724ddb773d96 -void setWindowTitle(String name, String title) { - final cname = name.toNativeUtf8().cast(); +void setWindowTitle(String winName, String title) { + final cWinName = winName.toNativeUtf8().cast(); final ctitle = title.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_setWindowTitle(cname, ctitle)); + cvRun(() => chighgui.cv_setWindowTitle(cWinName, ctitle)); calloc.free(ctitle); - calloc.free(cname); + calloc.free(cWinName); } /// MoveWindow moves window to the specified position. /// /// For further details, please see: /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga8d86b207f7211250dbe6e28f76307ffb -void moveWindow(String name, int x, int y) { - final cname = name.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_moveWindow(cname, x, y)); - calloc.free(cname); +void moveWindow(String winName, int x, int y) { + final cWinName = winName.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_moveWindow(cWinName, x, y)); + calloc.free(cWinName); } /// ResizeWindow resizes window to the specified size. /// /// For further details, please see: /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga9e80e080f7ef33f897e415358aee7f7e -void resizeWindow(String name, int width, int height) { - final cname = name.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_resizeWindow(cname, width, height)); - calloc.free(cname); +void resizeWindow(String winName, int width, int height) { + final cWinName = winName.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_resizeWindow(cWinName, width, height)); + calloc.free(cWinName); } /// SelectROI selects a Region Of Interest (ROI) on the given image. @@ -139,16 +139,16 @@ void resizeWindow(String name, int width, int height) { /// For further details, please see: /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga8daf4730d3adf7035b6de9be4c469af5 Rect selectROI( - String name, + String winName, Mat img, { bool showCrosshair = true, bool fromCenter = false, bool printNotice = true, }) { - final cname = name.toNativeUtf8().cast(); + final cWinName = winName.toNativeUtf8().cast(); final p = calloc(); - cvRun(() => chighgui.cv_selectROI(cname, img.ref, showCrosshair, fromCenter, printNotice, p)); - calloc.free(cname); + cvRun(() => chighgui.cv_selectROI(cWinName, img.ref, showCrosshair, fromCenter, printNotice, p)); + calloc.free(cWinName); return Rect.fromPointer(p); } @@ -162,41 +162,41 @@ Rect selectROI( /// For further details, please see: /// https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga0f11fad74a6432b8055fb21621a0f893 VecRect selectROIs( - String name, + String winName, Mat img, { bool showCrosshair = true, bool fromCenter = false, bool printNotice = true, }) { final p = calloc(); - final cname = name.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_selectROIs(cname, img.ref, p, showCrosshair, fromCenter, printNotice)); - calloc.free(cname); + final cWinName = winName.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_selectROIs(cWinName, img.ref, p, showCrosshair, fromCenter, printNotice)); + calloc.free(cWinName); return VecRect.fromPointer(p); } // https://stackoverflow.com/a/48055987/18539998 -bool isWindowOpen(String name) { - final ret = getWindowProperty(name, WindowPropertyFlags.WND_PROP_VISIBLE).toInt(); +bool isWindowOpen(String winName) { + final ret = getWindowProperty(winName, WindowPropertyFlags.WND_PROP_VISIBLE).toInt(); return ret != 0; } void createTrackbar( - String name, - String winname, + String trackbarName, + String winName, int maxval, { cvg.Dartcv_TrackbarCallbackFunction? onChange, }) { - final cname = name.toNativeUtf8().cast(); - final cwinname = winname.toNativeUtf8().cast(); + final cTrackName = trackbarName.toNativeUtf8().cast(); + final cWinName = winName.toNativeUtf8().cast(); if (onChange == null) { - cvRun(() => chighgui.cv_createTrackbar(cname, cwinname, maxval)); + cvRun(() => chighgui.cv_createTrackbar(cTrackName, cWinName, maxval)); } else { final funcPointer = ffi.NativeCallable.isolateLocal(onChange); cvRun( () => chighgui.cv_createTrackbar_1( - cname, - cwinname, + cTrackName, + cWinName, ffi.nullptr, maxval, funcPointer.nativeFunction, @@ -204,43 +204,43 @@ void createTrackbar( ), ); } - calloc.free(cname); - calloc.free(cwinname); + calloc.free(cTrackName); + calloc.free(cWinName); } -int getTrackbarPos(String name, String winname) { - final cname = name.toNativeUtf8().cast(); - final cwinname = winname.toNativeUtf8().cast(); +int getTrackbarPos(String trackbarName, String winName) { + final cTrackName = trackbarName.toNativeUtf8().cast(); + final cwinname = winName.toNativeUtf8().cast(); final p = calloc(); - cvRun(() => chighgui.cv_getTrackbarPos(cname, cwinname, p)); + cvRun(() => chighgui.cv_getTrackbarPos(cTrackName, cwinname, p)); final rval = p.value; calloc.free(p); - calloc.free(cname); + calloc.free(cTrackName); calloc.free(cwinname); return rval; } -void setTrackbarPos(String name, String winname, int pos) { - final cname = name.toNativeUtf8().cast(); - final cwinname = winname.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_setTrackbarPos(cname, cwinname, pos)); - calloc.free(cname); +void setTrackbarPos(String trackbarName, String winName, int pos) { + final cTrackName = trackbarName.toNativeUtf8().cast(); + final cwinname = winName.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setTrackbarPos(cTrackName, cwinname, pos)); + calloc.free(cTrackName); calloc.free(cwinname); } -void setTrackbarMin(String name, String winname, int minval) { - final cname = name.toNativeUtf8().cast(); - final cwinname = winname.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_setTrackbarMin(cname, cwinname, minval)); - calloc.free(cname); +void setTrackbarMin(String trackbarName, String winName, int minval) { + final cTrackName = trackbarName.toNativeUtf8().cast(); + final cwinname = winName.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setTrackbarMin(cTrackName, cwinname, minval)); + calloc.free(cTrackName); calloc.free(cwinname); } -void setTrackbarMax(String name, String winname, int maxval) { - final cname = name.toNativeUtf8().cast(); - final cwinname = winname.toNativeUtf8().cast(); - cvRun(() => chighgui.cv_setTrackbarMax(cname, cwinname, maxval)); - calloc.free(cname); +void setTrackbarMax(String trackbarName, String winName, int maxval) { + final cTrackName = trackbarName.toNativeUtf8().cast(); + final cwinname = winName.toNativeUtf8().cast(); + cvRun(() => chighgui.cv_setTrackbarMax(cTrackName, cwinname, maxval)); + calloc.free(cTrackName); calloc.free(cwinname); } diff --git a/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart b/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart index c565071f..e7b6e836 100644 --- a/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart +++ b/packages/dartcv/lib/src/imgcodecs/imgcodecs.dart @@ -27,16 +27,16 @@ import '../native_lib.dart' show cimgcodecs; Mat imread(String filename, {int flags = IMREAD_COLOR}) { final dst = Mat.empty(); final cname = filename.toNativeUtf8().cast(); - cvRun(() => cimgcodecs.cv_imread(cname, flags, dst.ref, ffi.nullptr)); + cvRun(() => cimgcodecs.cv_imread(cname, flags, dst.ptr, ffi.nullptr)); calloc.free(cname); return dst; } -Future imreadAsync(String filename, {int flags = IMREAD_COLOR}) { +Future imreadAsync(String filename, {int flags = IMREAD_COLOR}) async { final dst = Mat.empty(); final cname = filename.toNativeUtf8().cast(); return cvRunAsync0( - (callback) => cimgcodecs.cv_imread(cname, flags, dst.ref, callback), + (callback) => cimgcodecs.cv_imread(cname, flags, dst.ptr, callback), (c) { calloc.free(cname); return c.complete(dst); @@ -61,7 +61,7 @@ bool imwrite(String filename, InputArray img, {VecI32? params}) { return rval; } -Future imwriteAsync(String filename, InputArray img, {VecI32? params}) { +Future imwriteAsync(String filename, InputArray img, {VecI32? params}) async { final fname = filename.toNativeUtf8().cast(); final p = calloc(); void completeFunc(Completer c) { @@ -114,7 +114,7 @@ Future<(bool, Uint8List)> imencodeAsync( String ext, InputArray img, { VecI32? params, -}) { +}) async { final buffer = calloc(); final pSuccess = calloc(); final cExt = ext.toNativeUtf8().cast(); @@ -153,15 +153,15 @@ Future<(bool, Uint8List)> imencodeAsync( Mat imdecode(Uint8List buf, int flags, {Mat? dst}) { final vec = VecUChar.fromList(buf); dst ??= Mat.empty(); - cvRun(() => cimgcodecs.cv_imdecode(vec.ref, flags, dst!.ref, ffi.nullptr)); + cvRun(() => cimgcodecs.cv_imdecode(vec.ref, flags, dst!.ptr, ffi.nullptr)); return dst; } -Future imdecodeAsync(Uint8List buf, int flags, {Mat? dst}) { +Future imdecodeAsync(Uint8List buf, int flags, {Mat? dst}) async { final vec = VecUChar.fromList(buf); dst ??= Mat.empty(); return cvRunAsync0( - (callback) => cimgcodecs.cv_imdecode(vec.ref, flags, dst!.ref, callback), + (callback) => cimgcodecs.cv_imdecode(vec.ref, flags, dst!.ptr, callback), (c) { return c.complete(dst); }, diff --git a/packages/dartcv/lib/src/imgproc/imgproc.dart b/packages/dartcv/lib/src/imgproc/imgproc.dart index 3a25fcbd..2b6b10d5 100644 --- a/packages/dartcv/lib/src/imgproc/imgproc.dart +++ b/packages/dartcv/lib/src/imgproc/imgproc.dart @@ -641,7 +641,7 @@ Mat morphologyEx( Mat getStructuringElement(int shape, (int, int) ksize, {Point? anchor}) { anchor ??= Point(-1, -1); final mat = Mat.empty(); - cvRun(() => cimgproc.cv_getStructuringElement(shape, ksize.cvd.ref, mat.ref, ffi.nullptr)); + cvRun(() => cimgproc.cv_getStructuringElement(shape, ksize.cvd.ref, mat.ptr, ffi.nullptr)); return mat; } @@ -672,7 +672,7 @@ Mat gaussianBlur( /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gac05a120c1ae92a6060dd0db190a61afa Mat getGaussianKernel(int ksize, double sigma, {int ktype = 6}) { final mat = Mat.empty(); - cvRun(() => cimgproc.cv_getGaussianKernel(ksize, sigma, ktype, mat.ref, ffi.nullptr)); + cvRun(() => cimgproc.cv_getGaussianKernel(ksize, sigma, ktype, mat.ptr, ffi.nullptr)); return mat; } @@ -1379,7 +1379,7 @@ Mat getRectSubPix( /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326 Mat getRotationMatrix2D(Point2f center, double angle, double scale) { final mat = Mat.empty(); - cvRun(() => cimgproc.cv_getRotationMatrix2D(center.ref, angle, scale, mat.ref, ffi.nullptr)); + cvRun(() => cimgproc.cv_getRotationMatrix2D(center.ref, angle, scale, mat.ptr, ffi.nullptr)); return mat; } @@ -1480,7 +1480,7 @@ Mat applyCustomColorMap(InputArray src, InputArray userColor, {OutputArray? dst} /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8c1ae0e3589a9d77fffc962c49b22043 Mat getPerspectiveTransform(VecPoint src, VecPoint dst, [int solveMethod = DECOMP_LU]) { final mat = Mat.empty(); - cvRun(() => cimgproc.cv_getPerspectiveTransform(src.ref, dst.ref, mat.ref, solveMethod, ffi.nullptr)); + cvRun(() => cimgproc.cv_getPerspectiveTransform(src.ref, dst.ref, mat.ptr, solveMethod, ffi.nullptr)); return mat; } @@ -1491,7 +1491,7 @@ Mat getPerspectiveTransform(VecPoint src, VecPoint dst, [int solveMethod = DECOM /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8c1ae0e3589a9d77fffc962c49b22043 Mat getPerspectiveTransform2f(VecPoint2f src, VecPoint2f dst, [int solveMethod = DECOMP_LU]) { final mat = Mat.empty(); - cvRun(() => cimgproc.cv_getPerspectiveTransform2f(src.ref, dst.ref, mat.ref, solveMethod, ffi.nullptr)); + cvRun(() => cimgproc.cv_getPerspectiveTransform2f(src.ref, dst.ref, mat.ptr, solveMethod, ffi.nullptr)); return mat; } @@ -1502,13 +1502,13 @@ Mat getPerspectiveTransform2f(VecPoint2f src, VecPoint2f dst, [int solveMethod = /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8f6d378f9f8eebb5cb55cd3ae295a999 Mat getAffineTransform(VecPoint src, VecPoint dst) { final mat = Mat.empty(); - cvRun(() => cimgproc.cv_getAffineTransform(src.ref, dst.ref, mat.ref, ffi.nullptr)); + cvRun(() => cimgproc.cv_getAffineTransform(src.ref, dst.ref, mat.ptr, ffi.nullptr)); return mat; } Mat getAffineTransform2f(VecPoint2f src, VecPoint2f dst) { final mat = Mat.empty(); - cvRun(() => cimgproc.cv_getAffineTransform2f(src.ref, dst.ref, mat.ref, ffi.nullptr)); + cvRun(() => cimgproc.cv_getAffineTransform2f(src.ref, dst.ref, mat.ptr, ffi.nullptr)); return mat; } diff --git a/packages/dartcv/lib/src/imgproc/imgproc_async.dart b/packages/dartcv/lib/src/imgproc/imgproc_async.dart index f171a32b..1ccba7ed 100644 --- a/packages/dartcv/lib/src/imgproc/imgproc_async.dart +++ b/packages/dartcv/lib/src/imgproc/imgproc_async.dart @@ -30,7 +30,7 @@ import '../native_lib.dart' show cimgproc; /// For further details, please see: /// /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga0012a5fdaea70b8a9970165d98722b4c -Future approxPolyDPAsync(VecPoint curve, double epsilon, bool closed) { +Future approxPolyDPAsync(VecPoint curve, double epsilon, bool closed) async { final vec = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_approxPolyDP(curve.ref, epsilon, closed, vec, callback), @@ -45,7 +45,7 @@ Future approxPolyDPAsync(VecPoint curve, double epsilon, bool closed) /// For further details, please see: /// /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga8d26483c636be6b35c3ec6335798a47c -Future arcLengthAsync(VecPoint curve, bool closed) { +Future arcLengthAsync(VecPoint curve, bool closed) async { final p = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_arcLength(curve.ref, closed, p, callback), @@ -61,7 +61,7 @@ Future arcLengthAsync(VecPoint curve, bool closed) { /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga014b28e56cb8854c0de4a211cb2be656 -Future convexHullAsync(VecPoint points, {Mat? hull, bool clockwise = false, bool returnPoints = true}) { +Future convexHullAsync(VecPoint points, {Mat? hull, bool clockwise = false, bool returnPoints = true}) async { hull ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_convexHull(points.ref, hull!.ref, clockwise, returnPoints, callback), @@ -75,7 +75,7 @@ Future convexHullAsync(VecPoint points, {Mat? hull, bool clockwise = false, /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gada4437098113fd8683c932e0567f47ba -Future convexityDefectsAsync(VecPoint contour, Mat hull, {Mat? convexityDefects}) { +Future convexityDefectsAsync(VecPoint contour, Mat hull, {Mat? convexityDefects}) async { convexityDefects ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_convexityDefects(contour.ref, hull.ref, convexityDefects!.ref, callback), @@ -91,7 +91,7 @@ Future convexityDefectsAsync(VecPoint contour, Mat hull, {Mat? convexityDef /// /// For further details, please see: /// http:///docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#ga4e0972be5de079fed4e3a10e24ef5ef0 -Future cvtColorAsync(Mat src, int code, {Mat? dst}) { +Future cvtColorAsync(Mat src, int code, {Mat? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_cvtColor(src.ref, dst!.ref, code, callback), @@ -105,7 +105,7 @@ Future cvtColorAsync(Mat src, int code, {Mat? dst}) { /// /// For further details, please see: /// https:///docs.opencv.org/master/d6/dc7/group__imgproc__hist.html#ga7e54091f0c937d49bf84152a16f76d6e -Future equalizeHistAsync(Mat src, {Mat? dst}) { +Future equalizeHistAsync(Mat src, {Mat? dst}) async { cvAssert(src.channels == 1, "src must be grayscale"); dst ??= Mat.empty(); return cvRunAsync0( @@ -180,7 +180,7 @@ Future calcBackProjectAsync( /// mode: HistCompMethods /// For further details, please see: /// https:///docs.opencv.org/master/d6/dc7/group__imgproc__hist.html#gaf4190090efa5c47cb367cf97a9a519bd -Future compareHistAsync(Mat hist1, Mat hist2, {int method = 0}) { +Future compareHistAsync(Mat hist1, Mat hist2, {int method = 0}) async { final p = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_compareHist(hist1.ref, hist2.ref, method, p, callback), @@ -195,7 +195,7 @@ Future compareHistAsync(Mat hist1, Mat hist2, {int method = 0}) { /// ClipLine clips the line against the image rectangle. /// For further details, please see: /// https:///docs.opencv.org/master/d6/d6e/group__imgproc__draw.html#gaf483cb46ad6b049bc35ec67052ef1c2c -Future<(bool, Point, Point)> clipLineAsync(Rect imgRect, Point pt1, Point pt2) { +Future<(bool, Point, Point)> clipLineAsync(Rect imgRect, Point pt1, Point pt2) async { final p = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_clipLine(imgRect.ref, pt1.ref, pt2.ref, p, callback), @@ -217,7 +217,7 @@ Future<(bool, Point, Point)> clipLineAsync(Rect imgRect, Point pt1, Point pt2) { /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga9d7064d478c95d60003cf839430737ed -Future bilateralFilterAsync(Mat src, int diameter, double sigmaColor, double sigmaSpace, {Mat? dst}) { +Future bilateralFilterAsync(Mat src, int diameter, double sigmaColor, double sigmaSpace, {Mat? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_bilateralFilter(src.ref, dst!.ref, diameter, sigmaColor, sigmaSpace, callback), @@ -231,7 +231,7 @@ Future bilateralFilterAsync(Mat src, int diameter, double sigmaColor, doubl /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37 -Future blurAsync(Mat src, (int, int) ksize, {Mat? dst}) { +Future blurAsync(Mat src, (int, int) ksize, {Mat? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_blur(src.ref, dst!.ref, ksize.cvd.ref, callback), @@ -459,7 +459,7 @@ Future boundingRectAsync(VecPoint points) async { /// return: [bottom left, top left, top right, bottom right] /// For further Details, please see: /// https://docs.opencv.org/4.10.0/d3/dc0/group__imgproc__shape.html#gaf78d467e024b4d7936cf9397185d2f5c -Future boxPointsAsync(RotatedRect rect, {VecPoint2f? pts}) { +Future boxPointsAsync(RotatedRect rect, {VecPoint2f? pts}) async { if (pts == null) { final p = calloc(); return cvRunAsync0( @@ -481,7 +481,7 @@ Future boxPointsAsync(RotatedRect rect, {VecPoint2f? pts}) { /// /// For further details, please see: /// https:///docs.opencv.org/3.3.0/d3/dc0/group__imgproc__shape.html#ga2c759ed9f497d4a618048a2f56dc97f1 -Future contourAreaAsync(VecPoint contour) { +Future contourAreaAsync(VecPoint contour) async { final p = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_contourArea(contour.ref, p, callback), @@ -497,7 +497,7 @@ Future contourAreaAsync(VecPoint contour) { /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga3d476a3417130ae5154aea421ca7ead9 -Future minAreaRectAsync(VecPoint points) { +Future minAreaRectAsync(VecPoint points) async { final p = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_minAreaRect(points.ref, p, callback), @@ -511,7 +511,7 @@ Future minAreaRectAsync(VecPoint points) { /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gaf259efaad93098103d6c27b9e4900ffa -Future fitEllipseAsync(VecPoint points) { +Future fitEllipseAsync(VecPoint points) async { final p = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_fitEllipse(points.ref, p, callback), @@ -525,7 +525,7 @@ Future fitEllipseAsync(VecPoint points) { /// /// For further details, please see: /// https:///docs.opencv.org/3.4/d3/dc0/group__imgproc__shape.html#ga8ce13c24081bbc7151e9326f412190f1 -Future<(Point2f center, double radius)> minEnclosingCircleAsync(VecPoint points) { +Future<(Point2f center, double radius)> minEnclosingCircleAsync(VecPoint points) async { final center = calloc(); final pRadius = calloc(); return cvRunAsync0( @@ -542,7 +542,7 @@ Future<(Point2f center, double radius)> minEnclosingCircleAsync(VecPoint points) /// /// For further details, please see: /// https://docs.opencv.org/4.x/d3/dc0/group__imgproc__shape.html#gadf1ad6a0b82947fa1fe3c3d497f260e0 -Future<(Contours contours, Mat hierarchy)> findContoursAsync(Mat src, int mode, int method) { +Future<(Contours contours, Mat hierarchy)> findContoursAsync(Mat src, int mode, int method) async { final hierarchy = Mat.empty(); final v = calloc(); return cvRunAsync0( @@ -557,7 +557,7 @@ Future<(Contours contours, Mat hierarchy)> findContoursAsync(Mat src, int mode, /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga1a539e8db2135af2566103705d7a5722 -Future pointPolygonTestAsync(VecPoint points, Point2f pt, bool measureDist) { +Future pointPolygonTestAsync(VecPoint points, Point2f pt, bool measureDist) async { final p = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_pointPolygonTest(points.ref, pt.ref, measureDist, p, callback), @@ -638,7 +638,7 @@ Future connectedComponentsWithStatsAsync( /// /// For further details, please see: /// https:///docs.opencv.org/master/df/dfb/group__imgproc__object.html#ga586ebfb0a7fb604b35a23d85391329be -Future matchTemplateAsync(Mat image, Mat templ, int method, {OutputArray? result, Mat? mask}) { +Future matchTemplateAsync(Mat image, Mat templ, int method, {OutputArray? result, Mat? mask}) async { mask ??= Mat.empty(); result ??= Mat.empty(); return cvRunAsync0( @@ -654,7 +654,7 @@ Future matchTemplateAsync(Mat image, Mat templ, int method, {OutputArray? r /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#ga556a180f43cab22649c23ada36a8a139 -Future momentsAsync(Mat src, {bool binaryImage = false}) { +Future momentsAsync(Mat src, {bool binaryImage = false}) async { final m = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_moments(src.ref, binaryImage, m, callback), @@ -754,11 +754,11 @@ Future morphologyExAsync( /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gac342a1bb6eabf6f55c803b09268e36dc -Future getStructuringElementAsync(int shape, (int, int) ksize, {Point? anchor}) { +Future getStructuringElementAsync(int shape, (int, int) ksize, {Point? anchor}) async { anchor ??= Point(-1, -1); final mat = Mat.empty(); return cvRunAsync0( - (callback) => cimgproc.cv_getStructuringElement(shape, ksize.cvd.ref, mat.ref, callback), + (callback) => cimgproc.cv_getStructuringElement(shape, ksize.cvd.ref, mat.ptr, callback), (c) { return c.complete(mat); }, @@ -793,10 +793,10 @@ Future gaussianBlurAsync( /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gac05a120c1ae92a6060dd0db190a61afa -Future getGaussianKernelAsync(int ksize, double sigma, {int ktype = 6}) { +Future getGaussianKernelAsync(int ksize, double sigma, {int ktype = 6}) async { final mat = Mat.empty(); return cvRunAsync0( - (callback) => cimgproc.cv_getGaussianKernel(ksize, sigma, ktype, mat.ref, callback), + (callback) => cimgproc.cv_getGaussianKernel(ksize, sigma, ktype, mat.ptr, callback), (c) { return c.complete(mat); }, @@ -898,7 +898,7 @@ Future scharrAsync( /// /// For further details, please see: /// https:///docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9 -Future medianBlurAsync(Mat src, int ksize, {OutputArray? dst}) { +Future medianBlurAsync(Mat src, int ksize, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_medianBlur(src.ref, dst!.ref, ksize, callback), @@ -1582,10 +1582,10 @@ Future getRectSubPixAsync( /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326 -Future getRotationMatrix2DAsync(Point2f center, double angle, double scale) { +Future getRotationMatrix2DAsync(Point2f center, double angle, double scale) async { final mat = Mat.empty(); return cvRunAsync0( - (callback) => cimgproc.cv_getRotationMatrix2D(center.ref, angle, scale, mat.ref, callback), + (callback) => cimgproc.cv_getRotationMatrix2D(center.ref, angle, scale, mat.ptr, callback), (c) { return c.complete(mat); }, @@ -1661,7 +1661,7 @@ Future warpPerspectiveAsync( /// /// For further details, please see: /// https:///docs.opencv.org/4.x/d3/d47/group__imgproc__segmentation.html#ga3267243e4d3f95165d55a618c65ac6e1 -Future watershedAsync(InputArray image, InputOutputArray markers) { +Future watershedAsync(InputArray image, InputOutputArray markers) async { return cvRunAsync0( (callback) => cimgproc.cv_watershed(image.ref, markers.ref, callback), (c) { @@ -1674,7 +1674,7 @@ Future watershedAsync(InputArray image, InputOutputArray markers) { /// colormap: ColormapTypes /// For further details, please see: /// https:///docs.opencv.org/master/d3/d50/group__imgproc__colormap.html#gadf478a5e5ff49d8aa24e726ea6f65d15 -Future applyColorMapAsync(InputArray src, int colormap, {OutputArray? dst}) { +Future applyColorMapAsync(InputArray src, int colormap, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_applyColorMap(src.ref, dst!.ref, colormap, callback), @@ -1688,7 +1688,7 @@ Future applyColorMapAsync(InputArray src, int colormap, {OutputArray? dst}) /// /// For further details, please see: /// https:///docs.opencv.org/master/d3/d50/group__imgproc__colormap.html#gacb22288ddccc55f9bd9e6d492b409cae -Future applyCustomColorMapAsync(InputArray src, InputArray userColor, {OutputArray? dst}) { +Future applyCustomColorMapAsync(InputArray src, InputArray userColor, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_applyColorMap_1(src.ref, dst!.ref, userColor.ref, callback), @@ -1703,10 +1703,10 @@ Future applyCustomColorMapAsync(InputArray src, InputArray userColor, {Outp /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8c1ae0e3589a9d77fffc962c49b22043 -Future getPerspectiveTransformAsync(VecPoint src, VecPoint dst, [int solveMethod = DECOMP_LU]) { +Future getPerspectiveTransformAsync(VecPoint src, VecPoint dst, [int solveMethod = DECOMP_LU]) async { final mat = Mat.empty(); return cvRunAsync0( - (callback) => cimgproc.cv_getPerspectiveTransform(src.ref, dst.ref, mat.ref, solveMethod, callback), + (callback) => cimgproc.cv_getPerspectiveTransform(src.ref, dst.ref, mat.ptr, solveMethod, callback), (c) { return c.complete(mat); }, @@ -1718,10 +1718,10 @@ Future getPerspectiveTransformAsync(VecPoint src, VecPoint dst, [int solveM /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8c1ae0e3589a9d77fffc962c49b22043 -Future getPerspectiveTransform2fAsync(VecPoint2f src, VecPoint2f dst, [int solveMethod = DECOMP_LU]) { +Future getPerspectiveTransform2fAsync(VecPoint2f src, VecPoint2f dst, [int solveMethod = DECOMP_LU]) async { final mat = Mat.empty(); return cvRunAsync0( - (callback) => cimgproc.cv_getPerspectiveTransform2f(src.ref, dst.ref, mat.ref, solveMethod, callback), + (callback) => cimgproc.cv_getPerspectiveTransform2f(src.ref, dst.ref, mat.ptr, solveMethod, callback), (c) { return c.complete(mat); }, @@ -1733,20 +1733,20 @@ Future getPerspectiveTransform2fAsync(VecPoint2f src, VecPoint2f dst, [int /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#ga8f6d378f9f8eebb5cb55cd3ae295a999 -Future getAffineTransformAsync(VecPoint src, VecPoint dst) { +Future getAffineTransformAsync(VecPoint src, VecPoint dst) async { final mat = Mat.empty(); return cvRunAsync0( - (callback) => cimgproc.cv_getAffineTransform(src.ref, dst.ref, mat.ref, callback), + (callback) => cimgproc.cv_getAffineTransform(src.ref, dst.ref, mat.ptr, callback), (c) { return c.complete(mat); }, ); } -Future getAffineTransform2fAsync(VecPoint2f src, VecPoint2f dst) { +Future getAffineTransform2fAsync(VecPoint2f src, VecPoint2f dst) async { final mat = Mat.empty(); return cvRunAsync0( - (callback) => cimgproc.cv_getAffineTransform2f(src.ref, dst.ref, mat.ref, callback), + (callback) => cimgproc.cv_getAffineTransform2f(src.ref, dst.ref, mat.ptr, callback), (c) { return c.complete(mat); }, @@ -1891,7 +1891,7 @@ Future sepFilter2DAsync( /// /// For further details, please see: /// https:///docs.opencv.org/master/da/d54/group__imgproc__transform.html#gaec3a0b126a85b5ca2c667b16e0ae022d -Future logPolarAsync(InputArray src, Point2f center, double M, int flags, {OutputArray? dst}) { +Future logPolarAsync(InputArray src, Point2f center, double M, int flags, {OutputArray? dst}) async { dst ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_logPolar(src.ref, dst!.ref, center.ref, M, flags, callback), @@ -1946,7 +1946,7 @@ Future fitLineAsync( /// method: ShapeMatchModes /// For further details, please see: /// https:///docs.opencv.org/4.x/d3/dc0/group__imgproc__shape.html#gaadc90cb16e2362c9bd6e7363e6e4c317 -Future matchShapesAsync(VecPoint contour1, VecPoint contour2, int method, double parameter) { +Future matchShapesAsync(VecPoint contour1, VecPoint contour2, int method, double parameter) async { final p = calloc(); return cvRunAsync0( (callback) => cimgproc.cv_matchShapes(contour1.ref, contour2.ref, method, parameter, p, callback), @@ -1964,7 +1964,7 @@ Future matchShapesAsync(VecPoint contour1, VecPoint contour2, int method /// /// For further details, please see: /// https://docs.opencv.org/4.x/da/d54/group__imgproc__transform.html#ga57d3505a878a7e1a636645727ca08f51 -Future invertAffineTransformAsync(InputArray M, {OutputArray? iM}) { +Future invertAffineTransformAsync(InputArray M, {OutputArray? iM}) async { iM ??= Mat.empty(); return cvRunAsync0( (callback) => cimgproc.cv_invertAffineTransform(M.ref, iM!.ref, callback), @@ -2001,7 +2001,7 @@ Future<(Point2f rval, double response)> phaseCorrelateAsync( /// For further details, please see: /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#ga1a567a79901513811ff3b9976923b199 /// -Future accumulateAsync(InputArray src, InputOutputArray dst, {InputArray? mask}) { +Future accumulateAsync(InputArray src, InputOutputArray dst, {InputArray? mask}) async { if (mask == null) { return cvRunAsync0( (callback) => cimgproc.cv_accumulate(src.ref, dst.ref, callback), @@ -2023,7 +2023,7 @@ Future accumulateAsync(InputArray src, InputOutputArray dst, {InputArray? m /// /// For further details, please see: /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#gacb75e7ffb573227088cef9ceaf80be8c -Future accumulateSquareAsync(InputArray src, InputOutputArray dst, {InputArray? mask}) { +Future accumulateSquareAsync(InputArray src, InputOutputArray dst, {InputArray? mask}) async { if (mask == null) { return cvRunAsync0( (callback) => cimgproc.cv_accumulateSquare(src.ref, dst.ref, callback), @@ -2072,7 +2072,7 @@ Future accumulateProductAsync( /// /// For further details, please see: /// https:///docs.opencv.org/master/d7/df3/group__imgproc__motion.html#ga4f9552b541187f61f6818e8d2d826bc7 -Future accumulateWeightedAsync(InputArray src, InputOutputArray dst, double alpha, {InputArray? mask}) { +Future accumulateWeightedAsync(InputArray src, InputOutputArray dst, double alpha, {InputArray? mask}) async { if (mask == null) { return cvRunAsync0( (callback) => cimgproc.cv_accumulatedWeighted(src.ref, dst.ref, alpha, callback), diff --git a/packages/dartcv/lib/src/objdetect/objdetect.dart b/packages/dartcv/lib/src/objdetect/objdetect.dart index 6a18e387..3be2b197 100644 --- a/packages/dartcv/lib/src/objdetect/objdetect.dart +++ b/packages/dartcv/lib/src/objdetect/objdetect.dart @@ -244,13 +244,13 @@ class HOGDescriptor extends CvStruct { /// Computes gradients and quantized gradient orientations. /// /// https://docs.opencv.org/4.x/d5/d33/structcv_1_1HOGDescriptor.html#a1f76c51c08d69f2b8a0f079efc4bd093 - (Mat grad, Mat angleOfs) computeGradient( - InputArray img, { + void computeGradient( + InputArray img, + InputOutputArray grad, + InputOutputArray angleOfs, { (int, int) paddingTL = (0, 0), (int, int) paddingBR = (0, 0), }) { - final grad = Mat.empty(); - final angleOfs = Mat.empty(); cvRun( () => cobjdetect.cv_HOGDescriptor_computeGradient( ref, @@ -262,7 +262,6 @@ class HOGDescriptor extends CvStruct { ffi.nullptr, ), ); - return (grad, angleOfs); } /// Performs object detection without a multi-scale window. diff --git a/packages/dartcv/lib/src/objdetect/objdetect_async.dart b/packages/dartcv/lib/src/objdetect/objdetect_async.dart index f11180ab..ed4484c2 100644 --- a/packages/dartcv/lib/src/objdetect/objdetect_async.dart +++ b/packages/dartcv/lib/src/objdetect/objdetect_async.dart @@ -27,12 +27,12 @@ extension CascadeClassifierAsync on CascadeClassifier { (int, int) minSize = (0, 0), (int, int) maxSize = (0, 0), }) { - final ret = calloc(); - return cvRunAsync0( + final pObjects = calloc(); + return cvRunAsync0( (callback) => cobjdetect.cv_CascadeClassifier_detectMultiScale_1( ref, image.ref, - ret, + pObjects, scaleFactor, minNeighbors, flags, @@ -41,7 +41,7 @@ extension CascadeClassifierAsync on CascadeClassifier { callback, ), (c) { - return c.complete(VecRect.fromPointer(ret)); + return c.complete(VecRect()); }, ); } @@ -140,13 +140,13 @@ extension HOGDescriptorAsync on HOGDescriptor { ); } - Future<(Mat grad, Mat angleOfs)> computeGradientAsync( - InputArray img, { + Future computeGradientAsync( + InputArray img, + InputOutputArray grad, + InputOutputArray angleOfs, { (int, int) paddingTL = (0, 0), (int, int) paddingBR = (0, 0), }) { - final grad = Mat.empty(); - final angleOfs = Mat.empty(); return cvRunAsync0( (callback) => cobjdetect.cv_HOGDescriptor_computeGradient( ref, @@ -158,7 +158,7 @@ extension HOGDescriptorAsync on HOGDescriptor { callback, ), (c) { - return c.complete((grad, angleOfs)); + return c.complete(); }, ); } @@ -275,7 +275,7 @@ extension HOGDescriptorAsync on HOGDescriptor { } } -Future groupRectanglesAsync(VecRect rects, int groupThreshold, double eps) { +Future groupRectanglesAsync(VecRect rects, int groupThreshold, double eps) async { return cvRunAsync0( (callback) => cobjdetect.cv_groupRectangles(rects.ptr, groupThreshold, eps, callback), (c) { @@ -339,7 +339,7 @@ extension QRCodeDetectorAsync on QRCodeDetector { ); } - Future<(bool ret, VecPoint points)> detectAsync(InputArray input, {VecPoint? points}) { + Future<(bool ret, VecPoint points)> detectAsync(InputArray input, {VecPoint? points}) async { final pts = calloc(); final ret = calloc(); return cvRunAsync0( @@ -370,7 +370,7 @@ extension QRCodeDetectorAsync on QRCodeDetector { ); } - Future<(bool ret, VecPoint points)> detectMultiAsync(InputArray img, {VecPoint? points}) { + Future<(bool ret, VecPoint points)> detectMultiAsync(InputArray img, {VecPoint? points}) async { final p = points?.ptr ?? calloc(); final ret = calloc(); return cvRunAsync0( @@ -383,7 +383,7 @@ extension QRCodeDetectorAsync on QRCodeDetector { ); } - Future<(bool, List, VecPoint, VecMat)> detectAndDecodeMultiAsync(InputArray img) { + Future<(bool, List, VecPoint, VecMat)> detectAndDecodeMultiAsync(InputArray img) async { final info = calloc(); final points = calloc(); final codes = calloc(); @@ -413,7 +413,7 @@ extension QRCodeDetectorAsync on QRCodeDetector { } extension FaceDetectorYNAsync on FaceDetectorYN { - Future detectAsync(Mat image) { + Future detectAsync(Mat image) async { final p = calloc(); return cvRunAsync0( (callback) => cobjdetect.cv_FaceDetectorYN_detect(ref, image.ref, p, callback), @@ -425,7 +425,7 @@ extension FaceDetectorYNAsync on FaceDetectorYN { } extension FaceRecognizerSFAsync on FaceRecognizerSF { - Future alignCropAsync(Mat srcImg, Mat faceBox) { + Future alignCropAsync(Mat srcImg, Mat faceBox) async { final p = calloc(); return cvRunAsync0( (callback) => cobjdetect.cv_FaceRecognizerSF_alignCrop(ref, srcImg.ref, faceBox.ref, p, callback), @@ -435,7 +435,7 @@ extension FaceRecognizerSFAsync on FaceRecognizerSF { ); } - Future featureAsync(Mat alignedImg, {bool clone = false}) { + Future featureAsync(Mat alignedImg, {bool clone = false}) async { final p = calloc(); return cvRunAsync0( (callback) => cobjdetect.cv_FaceRecognizerSF_feature(ref, alignedImg.ref, clone, p, callback), @@ -445,7 +445,8 @@ extension FaceRecognizerSFAsync on FaceRecognizerSF { ); } - Future matchAsync(Mat faceFeature1, Mat faceFeature2, {int disType = FaceRecognizerSF.FR_COSINE}) { + Future matchAsync(Mat faceFeature1, Mat faceFeature2, + {int disType = FaceRecognizerSF.FR_COSINE}) async { final distance = calloc(); return cvRunAsync0( (callback) => cobjdetect.cv_FaceRecognizerSF_match( diff --git a/packages/dartcv/lib/src/photo/photo_async.dart b/packages/dartcv/lib/src/photo/photo_async.dart index 4e7a2501..642fbe27 100644 --- a/packages/dartcv/lib/src/photo/photo_async.dart +++ b/packages/dartcv/lib/src/photo/photo_async.dart @@ -16,10 +16,10 @@ import '../native_lib.dart' show cphoto; import './photo.dart'; extension MergeMertensAsync on MergeMertens { - Future processAsync(VecMat src) { + Future processAsync(VecMat src) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => cphoto.cv_MergeMertens_process(ref, src.ref, dst.ref, ffi.nullptr), + (callback) => cphoto.cv_MergeMertens_process(ref, src.ref, dst.ref, callback), (c) { return c.complete(dst); }, @@ -31,7 +31,7 @@ extension AlignMTBAsync on AlignMTB { Future processAsync(VecMat src) async { final dst = calloc(); return cvRunAsync0( - (callback) => cphoto.cv_AlignMTB_process(ref, src.ref, dst, ffi.nullptr), + (callback) => cphoto.cv_AlignMTB_process(ref, src.ref, dst, callback), (c) { return c.complete(VecMat.fromPointer(dst)); }, @@ -48,7 +48,7 @@ Future colorChangeAsync( }) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => cphoto.cv_colorChange(src.ref, mask.ref, dst.ref, redMul, greenMul, blueMul, ffi.nullptr), + (callback) => cphoto.cv_colorChange(src.ref, mask.ref, dst.ref, redMul, greenMul, blueMul, callback), (c) { return c.complete(dst); }, @@ -64,7 +64,7 @@ Future seamlessCloneAsync( ) async { final blend = Mat.empty(); return cvRunAsync0( - (callback) => cphoto.cv_seamlessClone(src.ref, dst.ref, mask.ref, p.ref, blend.ref, flags, ffi.nullptr), + (callback) => cphoto.cv_seamlessClone(src.ref, dst.ref, mask.ref, p.ref, blend.ref, flags, callback), (c) { return c.complete(blend); }, @@ -79,7 +79,7 @@ Future illuminationChangeAsync( }) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => cphoto.cv_illuminationChange(src.ref, mask.ref, dst.ref, alpha, beta, ffi.nullptr), + (callback) => cphoto.cv_illuminationChange(src.ref, mask.ref, dst.ref, alpha, beta, callback), (c) { return c.complete(dst); }, @@ -102,7 +102,7 @@ Future textureFlatteningAsync( lowThreshold, highThreshold, kernelSize, - ffi.nullptr, + callback, ), (c) { return c.complete(dst); @@ -124,7 +124,7 @@ Future fastNlMeansDenoisingAsync( h, templateWindowSize, searchWindowSize, - ffi.nullptr, + callback, ), (c) { return c.complete(dst); @@ -148,7 +148,7 @@ Future fastNlMeansDenoisingColoredAsync( hColor, templateWindowSize, searchWindowSize, - ffi.nullptr, + callback, ), (c) { return c.complete(dst); @@ -176,7 +176,7 @@ Future fastNlMeansDenoisingColoredMultiAsync( hColor, templateWindowSize, searchWindowSize, - ffi.nullptr, + callback, ), (c) { return c.complete(dst); @@ -191,7 +191,7 @@ Future detailEnhanceAsync( }) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => cphoto.cv_detailEnhance(src.ref, dst.ref, sigmaS, sigmaR, ffi.nullptr), + (callback) => cphoto.cv_detailEnhance(src.ref, dst.ref, sigmaS, sigmaR, callback), (c) { return c.complete(dst); }, @@ -206,7 +206,7 @@ Future edgePreservingFilterAsync( }) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => cphoto.cv_edgePreservingFilter(src.ref, dst.ref, flags, sigmaS, sigmaR, ffi.nullptr), + (callback) => cphoto.cv_edgePreservingFilter(src.ref, dst.ref, flags, sigmaS, sigmaR, callback), (c) { return c.complete(dst); }, @@ -229,7 +229,7 @@ Future<(Mat dst1, Mat dst2)> pencilSketchAsync( sigmaS, sigmaR, shadeFactor, - ffi.nullptr, + callback, ), (c) { return c.complete((dst1, dst2)); @@ -244,7 +244,7 @@ Future stylizationAsync( }) async { final dst = Mat.empty(); return cvRunAsync0( - (callback) => cphoto.cv_stylization(src.ref, dst.ref, sigmaS, sigmaR, ffi.nullptr), + (callback) => cphoto.cv_stylization(src.ref, dst.ref, sigmaS, sigmaR, callback), (c) { return c.complete(dst); }, @@ -265,7 +265,7 @@ Future inpaintAsync( dst.ref, inpaintRadius, flags, - ffi.nullptr, + callback, ), (c) { return c.complete(dst); diff --git a/packages/dartcv/lib/src/stitching/stitching.dart b/packages/dartcv/lib/src/stitching/stitching.dart index 0f6f9809..6bbae58e 100644 --- a/packages/dartcv/lib/src/stitching/stitching.dart +++ b/packages/dartcv/lib/src/stitching/stitching.dart @@ -35,117 +35,61 @@ class Stitcher extends CvStruct { /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a308a47865a1f381e4429c8ec5e99549f factory Stitcher.create({StitcherMode mode = StitcherMode.PANORAMA}) { final ptr_ = calloc(); - cvRun(() => cstitching.Stitcher_Create(mode.index, ptr_)); + cvRun(() => cstitching.cv_Stitcher_create(mode.index, ptr_)); return Stitcher._(ptr_); } /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a9b90774eabdf68c9ee864918d620538d - double get registrationResol { - return using((arena) { - final rptr = arena(); - cvRun(() => cstitching.Stitcher_GetRegistrationResol(ref, rptr)); - return rptr.value; - }); - } + double get registrationResol => cstitching.cv_Stitcher_get_registrationResol(ref); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a9912fe8c095b8385267908e5ef707439 - set registrationResol(double value) { - cvRun(() => cstitching.Stitcher_SetRegistrationResol(ref, value)); - } + set registrationResol(double value) => cstitching.cv_Stitcher_set_registrationResol(ref, value); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#ac559c3eb228614f9402ff3eba23a08f5 - double get seamEstimationResol { - return using((arena) { - final rptr = arena(); - cvRun(() => cstitching.Stitcher_GetSeamEstimationResol(ref, rptr)); - return rptr.value; - }); - } + double get seamEstimationResol => cstitching.cv_Stitcher_get_seamEstimationResol(ref); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#ad0fcef52b2fedda1dbb90ea780cd7979 - set seamEstimationResol(double value) { - cvRun(() => cstitching.Stitcher_SetSeamEstimationResol(ref, value)); - } + set seamEstimationResol(double value) => cstitching.cv_Stitcher_set_seamEstimationResol(ref, value); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#ad13d2d50b253e471fbaf041b9a044571 - double get compositingResol { - return using((arena) { - final rptr = arena(); - cvRun(() => cstitching.Stitcher_GetCompositingResol(ref, rptr)); - return rptr.value; - }); - } + double get compositingResol => cstitching.cv_Stitcher_get_compositingResol(ref); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#afe927e80fcb2ca2061630ddd98eebba8 - set compositingResol(double value) { - cvRun(() => cstitching.Stitcher_SetCompositingResol(ref, value)); - } + set compositingResol(double value) => cstitching.cv_Stitcher_set_compositingResol(ref, value); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a3755bbeca7f4c80dc42af034f7621568 - double get panoConfidenceThresh { - return using((arena) { - final rptr = arena(); - cvRun(() => cstitching.Stitcher_GetPanoConfidenceThresh(ref, rptr)); - return rptr.value; - }); - } + double get panoConfidenceThresh => cstitching.cv_Stitcher_get_panoConfidenceThresh(ref); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a6f5e62bc1dd5d7bdb5f9313a2c21c558 - set panoConfidenceThresh(double value) { - cvRun(() => cstitching.Stitcher_SetPanoConfidenceThresh(ref, value)); - } + set panoConfidenceThresh(double value) => cstitching.cv_Stitcher_set_panoConfidenceThresh(ref, value); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#af6a51e0b23dac119a3612d57345f9a7f - bool get waveCorrection { - return using((arena) { - final rptr = arena(); - cvRun(() => cstitching.Stitcher_GetWaveCorrection(ref, rptr)); - return rptr.value; - }); - } + bool get waveCorrection => cstitching.cv_Stitcher_get_waveCorrection(ref); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a968a2f4a1faddfdacbcfce54b44bab70 - set waveCorrection(bool value) { - cvRun(() => cstitching.Stitcher_SetWaveCorrection(ref, value)); - } + set waveCorrection(bool value) => cstitching.cv_Stitcher_set_waveCorrection(ref, value); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#abc0c8f54a1d223a1098206654813d973 - int get interpolationFlags { - return using((arena) { - final rptr = arena(); - cvRun(() => cstitching.Stitcher_GetInterpolationFlags(ref, rptr)); - return rptr.value; - }); - } + int get interpolationFlags => cstitching.cv_Stitcher_get_interpolationFlags(ref); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a253d04b8dcd3c674321b29139c769873 - set interpolationFlags(int value) { - cvRun(() => cstitching.Stitcher_SetInterpolationFlags(ref, value)); - } + set interpolationFlags(int value) => cstitching.cv_Stitcher_set_interpolationFlags(ref, value); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#ad9c9c9b8a97b686ad3b93f7918c4c6de - int get waveCorrectKind { - return using((arena) { - final rptr = arena(); - cvRun(() => cstitching.Stitcher_GetWaveCorrectKind(ref, rptr)); - return rptr.value; - }); - } + int get waveCorrectKind => cstitching.cv_Stitcher_get_waveCorrectKind(ref); /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a17413f5c06e4e569bfd45e01d4e8ff4a - set waveCorrectKind(int value) { - cvRun(() => cstitching.Stitcher_SetWaveCorrectKind(ref, value)); - } + set waveCorrectKind(int value) => cstitching.cv_Stitcher_set_waveCorrectKind(ref, value); /// These functions try to match the given images and to estimate rotations of each camera. /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a4c25557af4d40a79a4d1f23d9548131d StitcherStatus estimateTransform(VecMat images, {VecMat? masks}) { - return using((arena) { - final rptr = arena(); - masks ??= VecMat.fromList([]); - cvRun(() => cstitching.Stitcher_EstimateTransform(ref, images.ref, masks!.ref, rptr)); - return StitcherStatus.fromInt(rptr.value); - }); + final rptr = calloc(); + masks ??= VecMat.fromList([]); + cvRun(() => cstitching.cv_Stitcher_estimateTransform(ref, images.ref, masks!.ref, rptr, ffi.nullptr)); + final rval = StitcherStatus.fromInt(rptr.value); + calloc.free(rptr); + return rval; } /// These functions try to compose the given images (or images stored internally @@ -153,42 +97,46 @@ class Stitcher extends CvStruct { /// that the image transformations were estimated before. /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#acc8409a6b2e548de1653f0dc5c2ccb02 (StitcherStatus, Mat pano) composePanorama({VecMat? images}) { - return using<(StitcherStatus, Mat)>((arena) { - final rptr = arena(); - final rpano = Mat.empty(); - images == null - ? cvRun(() => cstitching.Stitcher_ComposePanorama(ref, rpano.ref, rptr)) - : cvRun(() => cstitching.Stitcher_ComposePanorama_1(ref, images.ref, rpano.ref, rptr)); - return (StitcherStatus.fromInt(rptr.value), rpano); - }); + final rptr = calloc(); + final rpano = Mat.empty(); + images == null + ? cvRun(() => cstitching.cv_Stitcher_composePanorama(ref, rpano.ref, rptr, ffi.nullptr)) + : cvRun( + () => cstitching.cv_Stitcher_composePanorama_1(ref, images.ref, rpano.ref, rptr, ffi.nullptr), + ); + final rval = (StitcherStatus.fromInt(rptr.value), rpano); + calloc.free(rptr); + return rval; } /// This is an overloaded member function, provided for convenience. /// It differs from the above function only in what argument(s) it accepts. /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a37ee5bacf229e9d0fb9f97c8f5ed1acd (StitcherStatus, Mat pano) stitch(VecMat images, {VecMat? masks}) { - return using<(StitcherStatus, Mat)>((arena) { - final rptr = arena(); - final rpano = Mat.empty(); - masks == null - ? cvRun(() => cstitching.Stitcher_Stitch(ref, images.ref, rpano.ref, rptr)) - : cvRun(() => cstitching.Stitcher_Stitch_1(ref, images.ref, masks.ref, rpano.ref, rptr)); - return (StitcherStatus.fromInt(rptr.value), rpano); - }); + final rptr = calloc(); + final rpano = Mat.empty(); + masks == null + ? cvRun(() => cstitching.cv_Stitcher_stitch(ref, images.ref, rpano.ref, rptr, ffi.nullptr)) + : cvRun( + () => cstitching.cv_Stitcher_stitch_1(ref, images.ref, masks.ref, rpano.ref, rptr, ffi.nullptr), + ); + final rval = (StitcherStatus.fromInt(rptr.value), rpano); + calloc.free(rptr); + return rval; } /// https://docs.opencv.org/4.x/d2/d8d/classcv_1_1Stitcher.html#a7fed80561a9b46a1a924ac6cb334ac85 VecI32 get component { final rptr = calloc(); - cvRun(() => cstitching.Stitcher_Component(ref, rptr)); + cvRun(() => cstitching.cv_Stitcher_component(ref, rptr, ffi.nullptr)); return VecI32.fromPointer(rptr); } - static final finalizer = OcvFinalizer(cstitching.addresses.Stitcher_Close); + static final finalizer = OcvFinalizer(cstitching.addresses.cv_Stitcher_close); void dispose() { finalizer.detach(this); - cstitching.Stitcher_Close(ptr); + cstitching.cv_Stitcher_close(ptr); } @override diff --git a/packages/dartcv/lib/src/stitching/stitching_async.dart b/packages/dartcv/lib/src/stitching/stitching_async.dart index 7003e54c..fcde1efb 100644 --- a/packages/dartcv/lib/src/stitching/stitching_async.dart +++ b/packages/dartcv/lib/src/stitching/stitching_async.dart @@ -4,179 +4,69 @@ library cv.stitching; +import 'dart:async'; import 'dart:ffi' as ffi; import 'package:ffi/ffi.dart'; import '../core/base.dart'; import '../core/mat.dart'; -import '../core/vec.dart'; -import '../g/stitching.g.dart' as cvg; import '../native_lib.dart' show cstitching; import './stitching.dart'; extension StitcherAsync on Stitcher { - static Future createAsync({ - StitcherMode mode = StitcherMode.PANORAMA, - }) async => - cvRunAsync( - (callback) => cstitching.Stitcher_Create_Async(mode.index, callback), - (c, p) => c.complete(Stitcher.fromPointer(p.cast())), - ); - - Future getRegistrationResolAsync() async => cvRunAsync( - (callback) => cstitching.Stitcher_GetRegistrationResol_Async(ref, callback), - doubleCompleter, - ); - - Future setRegistrationResolAsync(double value) async => cvRunAsync0( - (callback) => cstitching.Stitcher_SetRegistrationResol_Async(ref, value, callback), - (c) => c.complete(), - ); - - Future getSeamEstimationResolAsync() async { - return cvRunAsync( - (callback) => cstitching.Stitcher_GetSeamEstimationResol_Async(ref, callback), - doubleCompleter, - ); - } - - Future setSeamEstimationResolAsync(double value) async => cvRunAsync0( - (callback) => cstitching.Stitcher_SetSeamEstimationResol_Async(ref, value, callback), - (c) => c.complete(), - ); - - Future getCompositingResolAsync() async { - return cvRunAsync( - (callback) => cstitching.Stitcher_GetCompositingResol_Async(ref, callback), - doubleCompleter, - ); - } - - Future setCompositingResolAsync(double value) async => cvRunAsync0( - (callback) => cstitching.Stitcher_SetCompositingResol_Async(ref, value, callback), - (c) => c.complete(), - ); - - Future getPanoConfidenceThreshAsync() async { - return cvRunAsync( - (callback) => cstitching.Stitcher_GetPanoConfidenceThresh_Async(ref, callback), - doubleCompleter, - ); - } - - Future setPanoConfidenceThreshAsync(double value) async => cvRunAsync0( - (callback) => cstitching.Stitcher_SetPanoConfidenceThresh_Async( - ref, - value, - callback, - ), - (c) => c.complete(), - ); - - Future getWaveCorrectionAsync() async { - return cvRunAsync( - (callback) => cstitching.Stitcher_GetWaveCorrection_Async(ref, callback), - boolCompleter, - ); - } - - Future setWaveCorrectionAsync(bool value) async => cvRunAsync0( - (callback) => cstitching.Stitcher_SetWaveCorrection_Async(ref, value, callback), - (c) => c.complete(), - ); - - Future getInterpolationFlagsAsync() async { - return cvRunAsync( - (callback) => cstitching.Stitcher_GetInterpolationFlags_Async(ref, callback), - intCompleter, - ); - } - - Future setInterpolationFlagsAsync(int value) async => cvRunAsync0( - (callback) => cstitching.Stitcher_SetInterpolationFlags_Async(ref, value, callback), - (c) => c.complete(), - ); - - Future getWaveCorrectKindAsync() async { - return cvRunAsync( - (callback) => cstitching.Stitcher_GetWaveCorrectKind_Async(ref, callback), - intCompleter, - ); - } - - Future setWaveCorrectKindAsync(int value) async => cvRunAsync0( - (callback) => cstitching.Stitcher_SetWaveCorrectKind_Async(ref, value, callback), - (c) => c.complete(), - ); - - Future estimateTransformAsync( - VecMat images, { - VecMat? masks, - }) async { + Future estimateTransformAsync(VecMat images, {VecMat? masks}) async { + final rptr = calloc(); masks ??= VecMat.fromList([]); - return cvRunAsync( - (callback) => cstitching.Stitcher_EstimateTransform_Async( - ref, - images.ref, - masks!.ref, - callback, - ), (c, p) { - final value = p.cast().value; - calloc.free(p); - return c.complete(StitcherStatus.fromInt(value)); - }); + return cvRunAsync0( + (callback) => cstitching.cv_Stitcher_estimateTransform(ref, images.ref, masks!.ref, rptr, callback), + (c) { + final rval = StitcherStatus.fromInt(rptr.value); + calloc.free(rptr); + return c.complete(rval); + }, + ); } Future<(StitcherStatus, Mat)> composePanoramaAsync({VecMat? images}) async { - return cvRunAsync2( - (callback) => images == null - ? cstitching.Stitcher_ComposePanorama_Async( - ref, - callback, - ) - : cstitching.Stitcher_ComposePanorama_1_Async( - ref, - images.ref, - callback, - ), (c, status, pano) { - final value = status.cast().value; - calloc.free(status); - return c.complete( - (StitcherStatus.fromInt(value), Mat.fromPointer(pano.cast())), + final rptr = calloc(); + final rpano = Mat.empty(); + void completeFunc(Completer c) { + final rval = (StitcherStatus.fromInt(rptr.value), rpano); + calloc.free(rptr); + return c.complete(rval); + } + + if (images == null) { + return cvRunAsync0( + (callback) => cstitching.cv_Stitcher_composePanorama(ref, rpano.ref, rptr, callback), + completeFunc, ); - }); + } + return cvRunAsync0( + (callback) => cstitching.cv_Stitcher_composePanorama_1(ref, images.ref, rpano.ref, rptr, callback), + completeFunc, + ); } - Future<(StitcherStatus, Mat)> stitchAsync( - VecMat images, { - VecMat? masks, - }) async { - return cvRunAsync2( - (callback) => masks == null - ? cstitching.Stitcher_Stitch_Async( - ref, - images.ref, - callback, - ) - : cstitching.Stitcher_Stitch_1_Async( - ref, - images.ref, - masks.ref, - callback, - ), (c, status, pano) { - final value = status.cast().value; - calloc.free(status); - return c.complete( - (StitcherStatus.fromInt(value), Mat.fromPointer(pano.cast())), + Future<(StitcherStatus, Mat)> stitchAsync(VecMat images, {VecMat? masks}) async { + final rptr = calloc(); + final rpano = Mat.empty(); + void completeFunc(Completer c) { + final rval = (StitcherStatus.fromInt(rptr.value), rpano); + calloc.free(rptr); + return c.complete(rval); + } + + if (masks == null) { + return cvRunAsync0( + (callback) => cstitching.cv_Stitcher_stitch(ref, images.ref, rpano.ref, rptr, callback), + completeFunc, ); - }); - } - - Future getComponentAsync() async { - return cvRunAsync( - (callback) => cstitching.Stitcher_Component_Async(ref, callback), - (c, p) => c.complete(VecI32.fromPointer(p.cast())), + } + return cvRunAsync0( + (callback) => cstitching.cv_Stitcher_stitch_1(ref, images.ref, masks.ref, rpano.ref, rptr, callback), + completeFunc, ); } } diff --git a/packages/dartcv/lib/src/video/video.dart b/packages/dartcv/lib/src/video/video.dart index 007a6a19..0d8242d9 100644 --- a/packages/dartcv/lib/src/video/video.dart +++ b/packages/dartcv/lib/src/video/video.dart @@ -29,7 +29,7 @@ class BackgroundSubtractorMOG2 extends CvStruct { } factory BackgroundSubtractorMOG2.empty() { final p = calloc(); - cvRun(() => cvideo.BackgroundSubtractorMOG2_Create(p)); + cvRun(() => cvideo.cv_BackgroundSubtractorMOG2_create(p)); return BackgroundSubtractorMOG2(p); } factory BackgroundSubtractorMOG2.create({ @@ -39,7 +39,7 @@ class BackgroundSubtractorMOG2 extends CvStruct { }) { final p = calloc(); cvRun( - () => cvideo.BackgroundSubtractorMOG2_CreateWithParams( + () => cvideo.cv_BackgroundSubtractorMOG2_create_1( history, varThreshold, detectShadows, @@ -51,18 +51,18 @@ class BackgroundSubtractorMOG2 extends CvStruct { Mat apply(Mat src) { final dst = Mat.empty(); - cvRun(() => cvideo.BackgroundSubtractorMOG2_Apply(ref, src.ref, dst.ref)); + cvRun(() => cvideo.cv_BackgroundSubtractorMOG2_apply(ref, src.ref, dst.ref, ffi.nullptr)); return dst; } @override cvg.BackgroundSubtractorMOG2 get ref => ptr.ref; static final finalizer = - OcvFinalizer(cvideo.addresses.BackgroundSubtractorMOG2_Close); + OcvFinalizer(cvideo.addresses.cv_BackgroundSubtractorMOG2_close); void dispose() { finalizer.detach(this); - cvideo.BackgroundSubtractorMOG2_Close(ptr); + cvideo.cv_BackgroundSubtractorMOG2_close(ptr); } } @@ -74,16 +74,16 @@ class BackgroundSubtractorKNN extends CvStruct { } static final finalizer = - OcvFinalizer(cvideo.addresses.BackgroundSubtractorKNN_Close); + OcvFinalizer(cvideo.addresses.cv_BackgroundSubtractorKNN_close); void dispose() { finalizer.detach(this); - cvideo.BackgroundSubtractorKNN_Close(ptr); + cvideo.cv_BackgroundSubtractorKNN_close(ptr); } factory BackgroundSubtractorKNN.empty() { final p = calloc(); - cvRun(() => cvideo.BackgroundSubtractorKNN_Create(p)); + cvRun(() => cvideo.cv_BackgroundSubtractorKNN_create(p)); return BackgroundSubtractorKNN(p); } factory BackgroundSubtractorKNN.create({ @@ -93,7 +93,7 @@ class BackgroundSubtractorKNN extends CvStruct { }) { final p = calloc(); cvRun( - () => cvideo.BackgroundSubtractorKNN_CreateWithParams( + () => cvideo.cv_BackgroundSubtractorKNN_create_1( history, varThreshold, detectShadows, @@ -105,7 +105,7 @@ class BackgroundSubtractorKNN extends CvStruct { Mat apply(Mat src) { final dst = Mat.empty(); - cvRun(() => cvideo.BackgroundSubtractorKNN_Apply(ref, src.ref, dst.ref)); + cvRun(() => cvideo.cv_BackgroundSubtractorKNN_apply(ref, src.ref, dst.ref, ffi.nullptr)); return dst; } @@ -127,7 +127,7 @@ BackgroundSubtractorMOG2 createBackgroundSubtractorMOG2({ }) { final p = calloc(); cvRun( - () => cvideo.BackgroundSubtractorMOG2_CreateWithParams( + () => cvideo.cv_BackgroundSubtractorMOG2_create_1( history, varThreshold, detectShadows, @@ -160,7 +160,7 @@ Mat calcOpticalFlowFarneback( int flags, ) { cvRun( - () => cvideo.CalcOpticalFlowFarneback( + () => cvideo.cv_calcOpticalFlowFarneback( prev.ref, next.ref, flow.ref, @@ -171,6 +171,7 @@ Mat calcOpticalFlowFarneback( polyN, polySigma, flags, + ffi.nullptr, ), ); return flow; @@ -197,7 +198,7 @@ Mat calcOpticalFlowFarneback( final s = status?.ptr ?? calloc(); final e = err?.ptr ?? calloc(); cvRun( - () => cvideo.CalcOpticalFlowPyrLKWithParams( + () => cvideo.cv_calcOpticalFlowPyrLK_1( prevImg.ref, nextImg.ref, prevPts.ref, @@ -209,6 +210,7 @@ Mat calcOpticalFlowFarneback( criteria.toTermCriteria().ref, flags, minEigThreshold, + ffi.nullptr, ), ); nextPts.reattach(); @@ -228,23 +230,23 @@ Mat calcOpticalFlowFarneback( InputArray inputMask, int gaussFiltSize, ) { - final ret = cvRunArena((arena) { - final p = arena(); - cvRun( - () => cvideo.FindTransformECC( - templateImage.ref, - inputImage.ref, - warpMatrix.ref, - motionType, - criteria.toTermCriteria().ref, - inputMask.ref, - gaussFiltSize, - p, - ), - ); - return p.value; - }); - return (ret, warpMatrix); + final p = calloc(); + cvRun( + () => cvideo.cv_findTransformECC( + templateImage.ref, + inputImage.ref, + warpMatrix.ref, + motionType, + criteria.toTermCriteria().ref, + inputMask.ref, + gaussFiltSize, + p, + ffi.nullptr, + ), + ); + final rval = (p.value, warpMatrix); + calloc.free(p); + return rval; } /// Tracker is the base interface for object tracking. @@ -258,7 +260,7 @@ class TrackerMIL extends CvStruct { } factory TrackerMIL.create() { final p = calloc(); - cvRun(() => cvideo.TrackerMIL_Create(p)); + cvRun(() => cvideo.cv_TrackerMIL_create(p)); return TrackerMIL(p); } @@ -274,25 +276,25 @@ class TrackerMIL extends CvStruct { "boundingBox.bottom=${boundingBox.bottom} must be <= image.rows=${image.rows}", ); - cvRun(() => cvideo.TrackerMIL_Init(ref, image.ref, boundingBox.ref)); + cvRun(() => cvideo.cv_TrackerMIL_init(ref, image.ref, boundingBox.ref, ffi.nullptr)); } /// Update the tracker, find the new most likely bounding box for the target. /// https://docs.opencv.org/4.x/d0/d0a/classcv_1_1Tracker.html#a92d2012f576e6c06eb2e257d110a6529 (bool, Rect) update(Mat img) { - return cvRunArena<(bool, Rect)>((arena) { - final bBox = calloc(); - final p = arena(); - cvRun(() => cvideo.TrackerMIL_Update(ref, img.ref, bBox, p)); - return (p.value, Rect.fromPointer(bBox)); - }); + final bBox = calloc(); + final p = calloc(); + cvRun(() => cvideo.cv_TrackerMIL_update(ref, img.ref, bBox, p, ffi.nullptr)); + final rval = (p.value, Rect.fromPointer(bBox)); + calloc.free(p); + return rval; } - static final finalizer = OcvFinalizer(cvideo.addresses.TrackerMIL_Close); + static final finalizer = OcvFinalizer(cvideo.addresses.cv_TrackerMIL_close); void dispose() { finalizer.detach(this); - cvideo.TrackerMIL_Close(ptr); + cvideo.cv_TrackerMIL_close(ptr); } @override @@ -319,22 +321,22 @@ class KalmanFilter extends CvStruct { int type = MatType.CV_32F, }) { final p = calloc(); - cvRun(() => cvideo.KalmanFilter_New(dynamParams, measureParams, controlParams, type, p)); + cvRun(() => cvideo.cv_KalmanFilter_create(dynamParams, measureParams, controlParams, type, p)); return KalmanFilter(p); } Mat correct(Mat measurement) { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_Correct(ref, measurement.ref, p)); - return Mat.fromPointer(p); + final dst = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_correct(ref, measurement.ref, dst.ptr, ffi.nullptr)); + return dst; } Mat predict({Mat? control}) { - final p = calloc(); + final dst = Mat.empty(); control == null - ? cvRun(() => cvideo.KalmanFilter_Predict(ref, p)) - : cvRun(() => cvideo.KalmanFilter_PredictWithParams(ref, control.ref, p)); - return Mat.fromPointer(p); + ? cvRun(() => cvideo.cv_KalmanFilter_predict(ref, dst.ptr, ffi.nullptr)) + : cvRun(() => cvideo.cv_KalmanFilter_predict_1(ref, control.ref, dst.ptr, ffi.nullptr)); + return dst; } void init( @@ -343,146 +345,147 @@ class KalmanFilter extends CvStruct { int controlParams = 0, int type = MatType.CV_32F, }) { - cvRun(() => cvideo.KalmanFilter_InitWithParams(ref, dynamParams, measureParams, controlParams, type)); + cvRun(() => + cvideo.cv_KalmanFilter_init_1(ref, dynamParams, measureParams, controlParams, type, ffi.nullptr)); } @override cvg.KalmanFilter get ref => ptr.ref; - static final finalizer = OcvFinalizer(cvideo.addresses.KalmanFilter_Close); + static final finalizer = OcvFinalizer(cvideo.addresses.cv_KalmanFilter_close); void dispose() { finalizer.detach(this); - cvideo.KalmanFilter_Close(ptr); + cvideo.cv_KalmanFilter_close(ptr); } // corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k)) Mat get statePost { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetStatePost(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_statePost(ref, p.ptr)); + return p; } set statePost(Mat state) { - cvRun(() => cvideo.KalmanFilter_SetStatePost(ref, state.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_statePost(ref, state.ref)); } Mat get statePre { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetStatePre(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_statePre(ref, p.ptr)); + return p; } set statePre(Mat state) { - cvRun(() => cvideo.KalmanFilter_SetStatePre(ref, state.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_statePre(ref, state.ref)); } Mat get transitionMatrix { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetTransitionMatrix(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_transitionMatrix(ref, p.ptr)); + return p; } set transitionMatrix(Mat m) { - cvRun(() => cvideo.KalmanFilter_SetTransitionMatrix(ref, m.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_transitionMatrix(ref, m.ref)); } Mat get temp1 { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetTemp1(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_temp1(ref, p.ptr)); + return p; } Mat get temp2 { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetTemp2(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_temp2(ref, p.ptr)); + return p; } Mat get temp3 { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetTemp3(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_temp3(ref, p.ptr)); + return p; } Mat get temp4 { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetTemp4(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_temp4(ref, p.ptr)); + return p; } Mat get temp5 { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetTemp5(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_temp5(ref, p.ptr)); + return p; } Mat get processNoiseCov { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetProcessNoiseCov(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_processNoiseCov(ref, p.ptr)); + return p; } set processNoiseCov(Mat m) { - cvRun(() => cvideo.KalmanFilter_SetProcessNoiseCov(ref, m.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_processNoiseCov(ref, m.ref)); } Mat get measurementNoiseCov { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetMeasurementNoiseCov(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_measurementNoiseCov(ref, p.ptr)); + return p; } set measurementNoiseCov(Mat m) { - cvRun(() => cvideo.KalmanFilter_SetMeasurementNoiseCov(ref, m.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_measurementNoiseCov(ref, m.ref)); } Mat get measurementMatrix { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetMeasurementMatrix(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_measurementMatrix(ref, p.ptr)); + return p; } set measurementMatrix(Mat m) { - cvRun(() => cvideo.KalmanFilter_SetMeasurementMatrix(ref, m.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_measurementMatrix(ref, m.ref)); } Mat get gain { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetGain(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_gain(ref, p.ptr)); + return p; } set gain(Mat m) { - cvRun(() => cvideo.KalmanFilter_SetGain(ref, m.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_gain(ref, m.ref)); } Mat get errorCovPre { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetErrorCovPre(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_errorCovPre(ref, p.ptr)); + return p; } set errorCovPre(Mat m) { - cvRun(() => cvideo.KalmanFilter_SetErrorCovPre(ref, m.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_errorCovPre(ref, m.ref)); } Mat get errorCovPost { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetErrorCovPost(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_errorCovPost(ref, p.ptr)); + return p; } set errorCovPost(Mat m) { - cvRun(() => cvideo.KalmanFilter_SetErrorCovPost(ref, m.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_errorCovPost(ref, m.ref)); } Mat get controlMatrix { - final p = calloc(); - cvRun(() => cvideo.KalmanFilter_GetControlMatrix(ref, p)); - return Mat.fromPointer(p); + final p = Mat.empty(); + cvRun(() => cvideo.cv_KalmanFilter_get_controlMatrix(ref, p.ptr)); + return p; } set controlMatrix(Mat m) { - cvRun(() => cvideo.KalmanFilter_SetControlMatrix(ref, m.ref)); + cvRun(() => cvideo.cv_KalmanFilter_set_controlMatrix(ref, m.ref)); } } diff --git a/packages/dartcv/lib/src/video/video_async.dart b/packages/dartcv/lib/src/video/video_async.dart index 0a38b0ef..ce8eef11 100644 --- a/packages/dartcv/lib/src/video/video_async.dart +++ b/packages/dartcv/lib/src/video/video_async.dart @@ -22,80 +22,28 @@ import '../native_lib.dart' show cvideo; import 'video.dart'; extension BackgroundSubtractorMOG2Async on BackgroundSubtractorMOG2 { - static Future emptyAsync() async => cvRunAsync( - cvideo.BackgroundSubtractorMOG2_Create_Async, - (c, p) => c.complete(BackgroundSubtractorMOG2(p.cast())), - ); - - static Future createAsync({ - int history = 500, - double varThreshold = 16, - bool detectShadows = true, - }) async => - cvRunAsync( - (callback) => cvideo.BackgroundSubtractorMOG2_CreateWithParams_Async( - history, - varThreshold, - detectShadows, - callback, - ), - (c, p) => c.complete(BackgroundSubtractorMOG2(p.cast())), - ); - - Future applyAsync(Mat src) async => cvRunAsync( - (callback) => cvideo.BackgroundSubtractorMOG2_Apply_Async(ref, src.ref, callback), - matCompleter, - ); + Future applyAsync(Mat src) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cvideo.cv_BackgroundSubtractorMOG2_apply(ref, src.ref, dst.ref, callback), + (c) { + return c.complete(dst); + }, + ); + } } extension BackgroundSubtractorKNNAsync on BackgroundSubtractorKNN { - static Future emptyAsync() async => cvRunAsync( - cvideo.BackgroundSubtractorMOG2_Create_Async, - (c, p) => c.complete(BackgroundSubtractorKNN(p.cast())), - ); - - static Future createAsync({ - int history = 500, - double varThreshold = 16, - bool detectShadows = true, - }) async => - cvRunAsync( - (callback) => cvideo.BackgroundSubtractorKNN_CreateWithParams_Async( - history, - varThreshold, - detectShadows, - callback, - ), - (c, p) => c.complete(BackgroundSubtractorKNN(p.cast())), - ); - - Future applyAsync(Mat src) async => cvRunAsync( - (callback) => cvideo.BackgroundSubtractorKNN_Apply_Async(ref, src.ref, callback), - matCompleter, - ); -} - -/// NewBackgroundSubtractorMOG2 returns a new BackgroundSubtractor algorithm -/// of type MOG2. MOG2 is a Gaussian Mixture-based Background/Foreground -/// Segmentation Algorithm. -/// -/// For further details, please see: -/// https://docs.opencv.org/master/de/de1/group__video__motion.html#ga2beb2dee7a073809ccec60f145b6b29c -/// https://docs.opencv.org/master/d7/d7b/classcv_1_1BackgroundSubtractorMOG2.html -Future createBackgroundSubtractorMOG2Async({ - int history = 500, - double varThreshold = 16, - bool detectShadows = true, -}) async => - cvRunAsync( - (callback) => cvideo.BackgroundSubtractorMOG2_CreateWithParams_Async( - history, - varThreshold, - detectShadows, - callback, - ), - (c, p) => c.complete(BackgroundSubtractorMOG2(p.cast())), + Future applyAsync(Mat src) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cvideo.cv_BackgroundSubtractorKNN_apply(ref, src.ref, dst.ref, callback), + (c) { + return c.complete(dst); + }, ); + } +} /// Apply computes a foreground mask using the current BackgroundSubtractorMOG2. /// @@ -118,23 +66,26 @@ Future calcOpticalFlowFarnebackAsync( int polyN, double polySigma, int flags, -) async => - cvRunAsync0( - (callback) => cvideo.CalcOpticalFlowFarneback_Async( - prev.ref, - next.ref, - flow.ref, - pyrScale, - levels, - winsize, - iterations, - polyN, - polySigma, - flags, - callback, - ), - (c) => c.complete(flow), - ); +) async { + return cvRunAsync0( + (callback) => cvideo.cv_calcOpticalFlowFarneback( + prev.ref, + next.ref, + flow.ref, + pyrScale, + levels, + winsize, + iterations, + polyN, + polySigma, + flags, + callback, + ), + (c) { + return c.complete(flow); + }, + ); +} /// CalcOpticalFlowPyrLK calculates an optical flow for a sparse feature set using /// the iterative Lucas-Kanade method with pyramids. @@ -146,34 +97,37 @@ Future<(VecPoint2f nextPts, VecUChar status, VecF32 error)> calcOpticalFlowPyrLK InputArray nextImg, VecPoint2f prevPts, VecPoint2f nextPts, { + VecUChar? status, + VecF32? err, (int, int) winSize = (21, 21), int maxLevel = 3, (int, int, double) criteria = (TERM_COUNT + TERM_EPS, 30, 1e-4), int flags = 0, double minEigThreshold = 1e-4, -}) async => - cvRunAsync2( - (callback) => cvideo.CalcOpticalFlowPyrLK_Async( - prevImg.ref, - nextImg.ref, - prevPts.ref, - nextPts.ptr, - winSize.cvd.ref, - maxLevel, - criteria.cvd.ref, - flags, - minEigThreshold, - callback, - ), (c, p, p1) { +}) { + final s = status?.ptr ?? calloc(); + final e = err?.ptr ?? calloc(); + return cvRunAsync0( + (callback) => cvideo.cv_calcOpticalFlowPyrLK_1( + prevImg.ref, + nextImg.ref, + prevPts.ref, + nextPts.ptr, + s, + e, + winSize.cvd.ref, + maxLevel, + criteria.toTermCriteria().ref, + flags, + minEigThreshold, + callback, + ), + (c) { nextPts.reattach(); - c.complete( - ( - nextPts, - VecUChar.fromPointer(p.cast()), - VecF32.fromPointer(p1.cast()), - ), - ); - }); + return c.complete((nextPts, status ?? VecUChar.fromPointer(s), VecF32.fromPointer(e))); + }, + ); +} /// FindTransformECC finds the geometric transform (warp) between two images in terms of the ECC criterion. /// @@ -187,32 +141,32 @@ Future<(double ret, Mat warpMatrix)> findTransformECCAsync( (int, int, double) criteria, InputArray inputMask, int gaussFiltSize, -) async => - cvRunAsync( - (callback) => cvideo.FindTransformECC_Async( - templateImage.ref, - inputImage.ref, - warpMatrix.ref, - motionType, - criteria.cvd.ref, - inputMask.ref, - gaussFiltSize, - callback, - ), (completer, p) { - final rval = p.cast().value; +) { + final p = calloc(); + return cvRunAsync0( + (callback) => cvideo.cv_findTransformECC( + templateImage.ref, + inputImage.ref, + warpMatrix.ref, + motionType, + criteria.toTermCriteria().ref, + inputMask.ref, + gaussFiltSize, + p, + callback, + ), + (c) { + final rval = (p.value, warpMatrix); calloc.free(p); - completer.complete((rval, warpMatrix)); - }); + return c.complete(rval); + }, + ); +} /// Tracker is the base interface for object tracking. /// /// see: https://docs.opencv.org/master/d0/d0a/classcv_1_1Tracker.html extension TrackerMILAsync on TrackerMIL { - static Future createAsync() async => cvRunAsync( - cvideo.TrackerMIL_Create_Async, - (completer, p) => completer.complete(TrackerMIL(p.cast())), - ); - Future initAsync(InputArray image, Rect boundingBox) async { cvAssert(boundingBox.x >= 0, "boundingBox.x must be >= 0"); cvAssert(boundingBox.y >= 0, "boundingBox.y must be >= 0"); @@ -225,19 +179,28 @@ extension TrackerMILAsync on TrackerMIL { "boundingBox.bottom=${boundingBox.bottom} must be <= image.rows=${image.rows}", ); - cvRun(() => cvideo.TrackerMIL_Init(ref, image.ref, boundingBox.ref)); + return cvRunAsync0( + (callback) => cvideo.cv_TrackerMIL_init(ref, image.ref, boundingBox.ref, callback), + (c) { + c.complete(); + }, + ); } /// Update the tracker, find the new most likely bounding box for the target. /// https://docs.opencv.org/4.x/d0/d0a/classcv_1_1Tracker.html#a92d2012f576e6c06eb2e257d110a6529 - Future<(bool, Rect)> updateAsync(Mat img) async => cvRunAsync2( - (callback) => cvideo.TrackerMIL_Update_Async(ref, img.ref, callback), - (completer, p, p1) { - final rval = p.cast().value; - calloc.free(p); - completer.complete((rval, Rect.fromPointer(p1.cast()))); - }, - ); + Future<(bool, Rect)> updateAsync(Mat img) async { + final bBox = calloc(); + final p = calloc(); + return cvRunAsync0( + (callback) => cvideo.cv_TrackerMIL_update(ref, img.ref, bBox, p, callback), + (c) { + final rval = (p.value, Rect.fromPointer(bBox)); + calloc.free(p); + return c.complete(rval); + }, + ); + } } /// KalmanFilter implements a standard Kalman filter http://en.wikipedia.org/wiki/Kalman_filter. @@ -247,139 +210,46 @@ extension TrackerMILAsync on TrackerMIL { /// For further details, please see: /// https://docs.opencv.org/4.6.0/dd/d6a/classcv_1_1KalmanFilter.html extension KalmanFilterAsync on KalmanFilter { - static Future createAsync( - int dynamParams, - int measureParams, { - int controlParams = 0, - int type = MatType.CV_32F, - }) async => - cvRunAsync( - (callback) => - cvideo.KalmanFilter_New_Async(dynamParams, measureParams, controlParams, type, callback), - (completer, p) => completer.complete(KalmanFilter(p.cast())), - ); - - Future correctAsync(Mat measurement) async => cvRunAsync( - (callback) => cvideo.KalmanFilter_Correct_Async(ref, measurement.ref, callback), matCompleter); + Future correctAsync(Mat measurement) async { + final dst = Mat.empty(); + return cvRunAsync0( + (callback) => cvideo.cv_KalmanFilter_correct(ref, measurement.ref, dst.ptr, callback), + (c) { + return c.complete(dst); + }, + ); + } - Future predictAsync({Mat? control}) async => cvRunAsync( - (callback) => control == null - ? cvideo.KalmanFilter_Predict_Async(ref, callback) - : cvideo.KalmanFilter_PredictWithParams_Async(ref, control.ref, callback), - matCompleter, + Future predictAsync({Mat? control}) async { + final dst = Mat.empty(); + if (control == null) { + return cvRunAsync0( + (callback) => cvideo.cv_KalmanFilter_predict(ref, dst.ptr, callback), + (c) { + return c.complete(dst); + }, ); + } + return cvRunAsync0( + (callback) => cvideo.cv_KalmanFilter_predict_1(ref, control.ref, dst.ptr, callback), + (c) { + return c.complete(dst); + }, + ); + } Future initAsync( int dynamParams, int measureParams, { int controlParams = 0, int type = MatType.CV_32F, - }) async => - cvRunAsync0( - (callback) => cvideo.KalmanFilter_InitWithParams_Async( - ref, - dynamParams, - measureParams, - controlParams, - type, - callback, - ), - (c) => c.complete(), - ); - - // corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k)) - Future getStatePost() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetStatePost_Async(ref, callback), matCompleter); - - Future setStatePost(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetStatePost_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getStatePre() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetStatePre_Async(ref, callback), matCompleter); - - Future setStatePre(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetStatePre_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getTransitionMatrix() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetTransitionMatrix_Async(ref, callback), matCompleter); - - Future setTransitionMatrix(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetTransitionMatrix_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getTemp1() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetTemp1_Async(ref, callback), matCompleter); - - Future getTemp2() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetTemp2_Async(ref, callback), matCompleter); - - Future getTemp3() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetTemp3_Async(ref, callback), matCompleter); - - Future getTemp4() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetTemp4_Async(ref, callback), matCompleter); - - Future getTemp5() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetTemp5_Async(ref, callback), matCompleter); - - Future getProcessNoiseCov() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetProcessNoiseCov_Async(ref, callback), matCompleter); - - Future setProcessNoiseCov(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetProcessNoiseCov_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getMeasurementNoiseCov() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetMeasurementNoiseCov_Async(ref, callback), matCompleter); - - Future setMeasurementNoiseCov(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetMeasurementNoiseCov_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getMeasurementMatrix() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetMeasurementMatrix_Async(ref, callback), matCompleter); - - Future setMeasurementMatrix(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetMeasurementMatrix_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getGain() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetGain_Async(ref, callback), matCompleter); - - Future setGain(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetGain_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getErrorCovPre() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetErrorCovPre_Async(ref, callback), matCompleter); - - Future setErrorCovPre(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetErrorCovPre_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getErrorCovPost() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetErrorCovPost_Async(ref, callback), matCompleter); - - Future setErrorCovPost(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetErrorCovPost_Async(ref, m.ref, callback), - (c) => c.complete(), - ); - - Future getControlMatrix() async => - cvRunAsync((callback) => cvideo.KalmanFilter_GetControlMatrix_Async(ref, callback), matCompleter); - - Future setControlMatrix(Mat m) async => cvRunAsync0( - (callback) => cvideo.KalmanFilter_SetControlMatrix_Async(ref, m.ref, callback), - (c) => c.complete(), - ); + }) async { + return cvRunAsync0( + (callback) => + cvideo.cv_KalmanFilter_init_1(ref, dynamParams, measureParams, controlParams, type, callback), + (c) { + c.complete(); + }, + ); + } } diff --git a/packages/dartcv/lib/src/videoio/videoio.dart b/packages/dartcv/lib/src/videoio/videoio.dart index fc0fdbcd..3076bf34 100644 --- a/packages/dartcv/lib/src/videoio/videoio.dart +++ b/packages/dartcv/lib/src/videoio/videoio.dart @@ -26,7 +26,7 @@ class VideoCapture extends CvStruct { factory VideoCapture.empty() { final p = calloc(); - cvRun(() => cvideoio.VideoCapture_New(p)); + cvRun(() => cvideoio.cv_VideoCapture_create(p)); return VideoCapture._(p); } @@ -34,12 +34,11 @@ class VideoCapture extends CvStruct { /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#a57c0e81e83e60f36c83027dc2a188e80 factory VideoCapture.create(String filename, {int apiPreference = CAP_ANY}) { - return using((arena) { - final p = calloc(); - final cname = filename.toNativeUtf8(allocator: arena); - cvRun(() => cvideoio.VideoCapture_NewFromFile(cname.cast(), apiPreference, p)); - return VideoCapture._(p); - }); + final p = calloc(); + final cname = filename.toNativeUtf8().cast(); + cvRun(() => cvideoio.cv_VideoCapture_create_1(cname, apiPreference, p, ffi.nullptr)); + calloc.free(cname); + return VideoCapture._(p); } factory VideoCapture.fromFile(String filename, {int apiPreference = CAP_ANY}) { @@ -48,38 +47,29 @@ class VideoCapture extends CvStruct { factory VideoCapture.fromDevice(int device, {int apiPreference = CAP_ANY}) { final p = calloc(); - cvRun(() => cvideoio.VideoCapture_NewFromIndex(device, apiPreference, p)); + cvRun(() => cvideoio.cv_VideoCapture_create_2(device, apiPreference, p, ffi.nullptr)); return VideoCapture._(p); } @override cvg.VideoCapture get ref => ptr.ref; - static final finalizer = OcvFinalizer(cvideoio.addresses.VideoCapture_Close); + static final finalizer = OcvFinalizer(cvideoio.addresses.cv_VideoCapture_close); void dispose() { finalizer.detach(this); - cvideoio.VideoCapture_Close(ptr); + cvideoio.cv_VideoCapture_close(ptr); } /// Returns the specified [VideoCapture] property. /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939 - double get(int propId) { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cvideoio.VideoCapture_Get(ref, propId, p)); - return p.value; - }); - } + double get(int propId) => cvideoio.cv_VideoCapture_get(ref, propId); - void set(int prop, double value) { - cvRun(() => cvideoio.VideoCapture_Set(ref, prop, value)); - } + void set(int prop, double value) => cvideoio.cv_VideoCapture_set(ref, prop, value); String getBackendName() { - final p = calloc>(); - cvRun(() => cvideoio.VideoCapture_getBackendName(ref, p)); - final name = p.value.toDartString(); + final p = cvideoio.cv_VideoCapture_getBackendName(ref); + final name = p.toDartString(); calloc.free(p); return name; } @@ -88,30 +78,20 @@ class VideoCapture extends CvStruct { /// /// If the previous call to VideoCapture constructor or VideoCapture::open() succeeded, the method returns true. /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939 - bool get isOpened { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cvideoio.VideoCapture_IsOpened(ref, p)); - return p.value != 0; - }); - } - - // String getBackendName()=>cvideoioVideoIO.videocapture + bool get isOpened => cvideoio.cv_VideoCapture_isOpened(ref); /// Grabs the next frame from video file or capturing device. /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939 - void grab({int skip = 0}) { - cvRun(() => cvideoio.VideoCapture_Grab(ref, skip)); - } + void grab() => cvideoio.cv_VideoCapture_grab(ref, ffi.nullptr); (bool, Mat) read({Mat? m}) { m ??= Mat.empty(); - return cvRunArena<(bool, Mat)>((arena) { - final p = arena(); - cvRun(() => cvideoio.VideoCapture_Read(ref, m!.ref, p)); - return (p.value != 0, m!); - }); + final p = calloc(); + cvRun(() => cvideoio.cv_VideoCapture_read(ref, m!.ref, p, ffi.nullptr)); + final rval = (p.value, m); + calloc.free(p); + return rval; } /// Opens a video file or a capturing device or an IP video stream for video capturing with API Preference and parameters. @@ -119,24 +99,25 @@ class VideoCapture extends CvStruct { /// This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939 - bool open(String filename, {int apiPreference = CAP_ANY}) { - return using((arena) { - final cname = filename.toNativeUtf8(allocator: arena); - final success = arena(); - cvRun(() => cvideoio.VideoCapture_OpenWithAPI(ref, cname.cast(), apiPreference, success)); - return success.value; - }); + bool open(String uri, {int apiPreference = CAP_ANY}) { + final cname = uri.toNativeUtf8().cast(); + final success = calloc(); + cvRun(() => cvideoio.cv_VideoCapture_open_1(ref, cname, apiPreference, success, ffi.nullptr)); + final rval = success.value; + calloc.free(cname); + calloc.free(success); + return rval; } /// Opens a camera for video capturing with API Preference and parameters. /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#a10867868137c2d142aac30a0648d00fe bool openIndex(int index, {int apiPreference = CAP_ANY}) { - return using((arena) { - final success = arena(); - cvRun(() => cvideoio.VideoCapture_OpenDeviceWithAPI(ref, index, apiPreference, success)); - return success.value; - }); + final success = calloc(); + cvRun(() => cvideoio.cv_VideoCapture_open_3(ref, index, apiPreference, success, ffi.nullptr)); + final rval = success.value; + calloc.free(success); + return rval; } String get codec { @@ -156,7 +137,7 @@ class VideoCapture extends CvStruct { } void release() { - cvRun(() => cvideoio.VideoCapture_Release(ref)); + cvRun(() => cvideoio.cv_VideoCapture_release(ref)); } } @@ -171,7 +152,7 @@ class VideoWriter extends CvStruct { factory VideoWriter.empty() { final p = calloc(); - cvRun(() => cvideoio.VideoWriter_New(p)); + cvRun(() => cvideoio.cv_VideoWriter_create(p)); return VideoWriter._(p); } @@ -188,7 +169,7 @@ class VideoWriter extends CvStruct { final codec_ = VideoWriter.fourcc(codec); apiPreference == null ? cvRun( - () => cvideoio.VideoWriter_NewFromFile( + () => cvideoio.cv_VideoWriter_create_1( cname.cast(), codec_, fps, @@ -196,10 +177,11 @@ class VideoWriter extends CvStruct { frameSize.$2, isColor, p, + ffi.nullptr, ), ) : cvRun( - () => cvideoio.VideoWriter_NewFromFile_1( + () => cvideoio.cv_VideoWriter_create_2( cname.cast(), apiPreference, codec_, @@ -208,6 +190,7 @@ class VideoWriter extends CvStruct { frameSize.$2, isColor, p, + ffi.nullptr, ), ); calloc.free(cname); @@ -226,7 +209,7 @@ class VideoWriter extends CvStruct { final codec_ = VideoWriter.fourcc(codec); apiPreference == null ? cvRun( - () => cvideoio.VideoWriter_Open( + () => cvideoio.cv_VideoWriter_open( ref, cname.cast(), codec_, @@ -234,10 +217,11 @@ class VideoWriter extends CvStruct { frameSize.$1, frameSize.$2, isColor, + ffi.nullptr, ), ) : cvRun( - () => cvideoio.VideoWriter_Open_1( + () => cvideoio.cv_VideoWriter_open_1( ref, cname.cast(), apiPreference, @@ -246,43 +230,34 @@ class VideoWriter extends CvStruct { frameSize.$1, frameSize.$2, isColor, + ffi.nullptr, ), ); calloc.free(cname); } void write(InputArray image) { - cvRun(() => cvideoio.VideoWriter_Write(ref, image.ref)); + cvRun(() => cvideoio.cv_VideoWriter_write(ref, image.ref, ffi.nullptr)); } static int fourcc(String cc) { final cc_ = ascii.encode(cc); if (cc_.length != 4) return -1; - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cvideoio.VideoWriter_Fourcc(cc_[0], cc_[1], cc_[2], cc_[3], p)); - return p.value; - }); + return cvideoio.cv_VideoWriter_fourcc(cc_[0], cc_[1], cc_[2], cc_[3]); } void release() { - cvRun(() => cvideoio.VideoWriter_Release(ref)); + cvRun(() => cvideoio.cv_VideoWriter_release(ref)); } @override cvg.VideoWriter get ref => ptr.ref; - static final finalizer = OcvFinalizer(cvideoio.addresses.VideoWriter_Close); + static final finalizer = OcvFinalizer(cvideoio.addresses.cv_VideoWriter_close); void dispose() { finalizer.detach(this); - cvideoio.VideoWriter_Close(ptr); + cvideoio.cv_VideoWriter_close(ptr); } - bool get isOpened { - return cvRunArena((arena) { - final p = arena(); - cvRun(() => cvideoio.VideoWriter_IsOpened(ref, p)); - return p.value != 0; - }); - } + bool get isOpened => cvideoio.cv_VideoWriter_isOpened(ref); } diff --git a/packages/dartcv/lib/src/videoio/videoio_async.dart b/packages/dartcv/lib/src/videoio/videoio_async.dart index 516e8124..ff79a00d 100644 --- a/packages/dartcv/lib/src/videoio/videoio_async.dart +++ b/packages/dartcv/lib/src/videoio/videoio_async.dart @@ -4,7 +4,6 @@ library cv.videoio; -import 'dart:convert'; import 'dart:ffi' as ffi; import 'package:ffi/ffi.dart'; @@ -17,90 +16,126 @@ import '../native_lib.dart' show cvideoio; import 'videoio.dart'; extension VideoCaptureAsync on VideoCapture { - static Future emptyAsync() async => cvRunAsync( - cvideoio.VideoCapture_New_Async, - (completer, p) => completer.complete(VideoCapture.fromPointer(p.cast())), - ); - /// Opens a video file or a capturing device or an IP video stream for video capturing with API Preference. /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#a57c0e81e83e60f36c83027dc2a188e80 static Future fromFileAsync(String filename, {int apiPreference = CAP_ANY}) async { + final p = calloc(); final cname = filename.toNativeUtf8().cast(); - final rval = cvRunAsync( - (callback) => cvideoio.VideoCapture_NewFromFile_Async(cname, apiPreference, callback), - (completer, p) => completer.complete(VideoCapture.fromPointer(p.cast())), + return cvRunAsync0( + (callback) => cvideoio.cv_VideoCapture_create_1(cname, apiPreference, p, callback), + (c) { + calloc.free(cname); + return c.complete(VideoCapture.fromPointer(p)); + }, ); - calloc.free(cname); - return rval; } - static Future fromDeviceAsync(int device, {int apiPreference = CAP_ANY}) async => cvRunAsync( - (callback) => cvideoio.VideoCapture_NewFromIndex_Async(device, apiPreference, callback), - (completer, p) => completer.complete(VideoCapture.fromPointer(p.cast())), - ); - - /// Grabs the next frame from video file or capturing device. - /// - /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939 - Future grabAsync() async => - cvRunAsync((callback) => cvideoio.VideoCapture_Grab_Async(ref, callback), boolCompleter); + static Future fromDeviceAsync(int device, {int apiPreference = CAP_ANY}) async { + final p = calloc(); + return cvRunAsync0( + (callback) => cvideoio.cv_VideoCapture_create_2(device, apiPreference, p, callback), + (c) { + return c.complete(VideoCapture.fromPointer(p)); + }, + ); + } - Future<(bool, Mat)> readAsync() async => - cvRunAsync2((callback) => cvideoio.VideoCapture_Read_Async(ref, callback), (completer, p, p1) { - final rval = p.cast().value; + Future<(bool, Mat)> readAsync({Mat? m}) async { + m ??= Mat.empty(); + final p = calloc(); + return cvRunAsync0( + (callback) => cvideoio.cv_VideoCapture_read(ref, m!.ref, p, callback), + (c) { + final rval = (p.value, m!); calloc.free(p); - completer.complete((rval, Mat.fromPointer(p1.cast()))); - }); + return c.complete(rval); + }, + ); + } /// Opens a video file or a capturing device or an IP video stream for video capturing with API Preference and parameters. /// /// This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#aa6480e6972ef4c00d74814ec841a2939 - Future openAsync(String uri, {int apiPreference = CAP_ANY}) { + Future openAsync(String uri, {int apiPreference = CAP_ANY}) async { final cname = uri.toNativeUtf8().cast(); - final rval = cvRunAsync( - (callback) => cvideoio.VideoCapture_OpenWithAPI_Async(ref, cname, apiPreference, callback), - boolCompleter, + final success = calloc(); + return cvRunAsync0( + (callback) => cvideoio.cv_VideoCapture_open_1(ref, cname, apiPreference, success, callback), + (c) { + final rval = success.value; + calloc.free(cname); + calloc.free(success); + return c.complete(rval); + }, ); - calloc.free(cname); - return rval; } /// Opens a camera for video capturing with API Preference and parameters. /// /// https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html#a10867868137c2d142aac30a0648d00fe - Future openIndexAsync(int index, {int apiPreference = CAP_ANY}) async => cvRunAsync( - (callback) => cvideoio.VideoCapture_OpenDeviceWithAPI_Async(ref, index, apiPreference, callback), - boolCompleter, - ); - - Future releaseAsync() async => cvRunAsync0( - (callback) => cvideoio.VideoCapture_Release_Async(ref, callback), - (completer) => completer.complete(), - ); + Future openIndexAsync(int index, {int apiPreference = CAP_ANY}) async { + final success = calloc(); + return cvRunAsync0( + (callback) => cvideoio.cv_VideoCapture_open_3(ref, index, apiPreference, success, callback), + (c) { + final rval = success.value; + calloc.free(success); + return c.complete(rval); + }, + ); + } } extension VideoWriterAsync on VideoWriter { - static Future emptyAsync() async => cvRunAsync( - cvideoio.VideoWriter_New_Async, - (c, p) => c.complete(VideoWriter.fromPointer(p.cast())), - ); - static Future fromFileAsync( String filename, String codec, double fps, (int, int) frameSize, { + int? apiPreference, bool isColor = true, - }) async { - final vw = await cvRunAsync( - cvideoio.VideoWriter_New_Async, - (c, p) => c.complete(VideoWriter.fromPointer(p.cast())), + }) { + final p = calloc(); + final cname = filename.toNativeUtf8(); + final codec_ = VideoWriter.fourcc(codec); + if (apiPreference == null) { + return cvRunAsync0( + (callback) => cvideoio.cv_VideoWriter_create_1( + cname.cast(), + codec_, + fps, + frameSize.$1, + frameSize.$2, + isColor, + p, + callback, + ), + (c) { + calloc.free(cname); + return c.complete(VideoWriter.fromPointer(p)); + }, + ); + } + return cvRunAsync0( + (callback) => cvideoio.cv_VideoWriter_create_2( + cname.cast(), + apiPreference, + codec_, + fps, + frameSize.$1, + frameSize.$2, + isColor, + p, + callback, + ), + (c) { + calloc.free(cname); + return c.complete(VideoWriter.fromPointer(p)); + }, ); - await vw.openAsync(filename, codec, fps, frameSize, isColor: isColor); - return vw; } Future openAsync( @@ -108,34 +143,53 @@ extension VideoWriterAsync on VideoWriter { String codec, double fps, (int, int) frameSize, { + int? apiPreference, bool isColor = true, - }) async { - final name = filename.toNativeUtf8().cast(); - final codec_ = codec.toNativeUtf8().cast(); - final rval = cvRunAsync( - (callback) => - cvideoio.VideoWriter_Open_Async(ref, name, codec_, fps, frameSize.$1, frameSize.$2, isColor, callback), - boolCompleter, + }) { + final cname = filename.toNativeUtf8(); + final codec_ = VideoWriter.fourcc(codec); + if (apiPreference == null) { + return cvRunAsync0( + (callback) => cvideoio.cv_VideoWriter_open( + ref, + cname.cast(), + codec_, + fps, + frameSize.$1, + frameSize.$2, + isColor, + callback, + ), + (c) { + calloc.free(cname); + }, + ); + } + + return cvRunAsync0( + (callback) => cvideoio.cv_VideoWriter_open_1( + ref, + cname.cast(), + apiPreference, + codec_, + fps, + frameSize.$1, + frameSize.$2, + isColor, + callback, + ), + (c) { + calloc.free(cname); + }, ); - calloc.free(name); - calloc.free(codec_); - return rval; } - Future writeAsync(InputArray image) async => - cvRunAsync0((callback) => cvideoio.VideoWriter_Write_Async(ref, image.ref, callback), voidCompleter); - - static Future fourccAsync(String cc) async { - final cc_ = ascii.encode(cc); - if (cc_.length != 4) return -1; - return cvRunAsync( - (callback) => cvideoio.VideoWriter_Fourcc_Async(cc_[0], cc_[1], cc_[2], cc_[3], callback), - intCompleter, + Future writeAsync(InputArray image) async { + return cvRunAsync0( + (callback) => cvideoio.cv_VideoWriter_write(ref, image.ref, callback), + (c) { + c.complete(); + }, ); } - - Future releaseAsync() async => cvRunAsync0( - (callback) => cvideoio.VideoWriter_Release_Async(ref, callback), - voidCompleter, - ); } diff --git a/packages/dartcv/test/calib3d_test.dart b/packages/dartcv/test/calib3d_test.dart index 6f89e2a4..19252e70 100644 --- a/packages/dartcv/test/calib3d_test.dart +++ b/packages/dartcv/test/calib3d_test.dart @@ -235,24 +235,24 @@ void main() async { final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_UNCHANGED); expect(img.isEmpty, false); - { - final (found, corners) = cv.findChessboardCornersSB(img, (4, 6), 0); - expect(found, true); - expect(corners.isEmpty, false); - - final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); - cv.drawChessboardCorners(img2, (4, 6), corners, true); - expect(img2.isEmpty, false); - } - { - final (found, corners) = await cv.findChessboardCornersSBAsync(img, (4, 6), 0); - expect(found, true); - expect(corners.isEmpty, false); - - final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); - await cv.drawChessboardCornersAsync(img2, (4, 6), corners, true); - expect(img2.isEmpty, false); - } + // { + final (found, corners) = cv.findChessboardCornersSB(img, (4, 6), flags: cv.CALIB_CB_EXHAUSTIVE | cv.CALIB_CB_ACCURACY); + expect(found, true); + // expect(corners.isEmpty, false); + + // final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); + // cv.drawChessboardCorners(img2, (4, 6), corners, true); + // expect(img2.isEmpty, false); + // } + // { + // final (found, corners) = await cv.findChessboardCornersSBAsync(img, (4, 6), 0); + // expect(found, true); + // expect(corners.isEmpty, false); + + // final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); + // await cv.drawChessboardCornersAsync(img2, (4, 6), corners, true); + // expect(img2.isEmpty, false); + // } }); test('cv.findChessboardCornersSBWithMeta', () async { diff --git a/packages/dartcv/test/contrib/aruco_async_test.dart b/packages/dartcv/test/contrib/aruco_async_test.dart index 0dcad450..9fd0d1a4 100644 --- a/packages/dartcv/test/contrib/aruco_async_test.dart +++ b/packages/dartcv/test/contrib/aruco_async_test.dart @@ -13,7 +13,7 @@ void main() async { final dict = cv.ArucoDictionary.predefined(cv.PredefinedDictionaryType.DICT_6X6_250); final params = cv.ArucoDetectorParameters.empty(); - final detector = await cv.ArucoDetectorAsync.createAsync(dict, params); + final detector = cv.ArucoDetector.create(dict, params); final (_, ids, _) = await detector.detectMarkersAsync(img); expect(ids, isNotEmpty); @@ -32,7 +32,7 @@ void main() async { final dict = cv.ArucoDictionary.predefined(cv.PredefinedDictionaryType.DICT_6X6_250); final params = cv.ArucoDetectorParameters.empty(); - final detector = await cv.ArucoDetectorAsync.createAsync(dict, params); + final detector = await cv.ArucoDetector.create(dict, params); final (corners, ids, _) = await detector.detectMarkersAsync(img); expect(corners.length, greaterThan(0)); @@ -43,7 +43,7 @@ void main() async { cv.Scalar(200, 0, 0, 0), ); var diff = cv.Mat.empty(); - cv.absDiff(img, imgExpected, diff); + cv.absDiff(img, imgExpected, dst: diff); diff = cv.cvtColor(diff, cv.COLOR_BGR2GRAY); expect(cv.countNonZero(diff), 0); }); @@ -60,7 +60,7 @@ void main() async { ); final diff = cv.Mat.empty(); - cv.absDiff(img, imgExpected, diff); + cv.absDiff(img, imgExpected, dst: diff); expect(cv.countNonZero(diff), 0); }); } diff --git a/packages/dartcv/test/contrib/aruco_test.dart b/packages/dartcv/test/contrib/aruco_test.dart index 12ed030a..8900b875 100644 --- a/packages/dartcv/test/contrib/aruco_test.dart +++ b/packages/dartcv/test/contrib/aruco_test.dart @@ -7,6 +7,21 @@ const arucoImage6x6_250_contour = "test/images/aruco_6X6_250_6_contour.png"; const arucoImage6x6_250_1 = "test/images/aruco_6X6_250_1.png"; void main() async { + test("cv.ArucoDictionary", () { + final dict = cv.ArucoDictionary.empty(); + expect(dict.bytesList.isEmpty, true); + + final dict1 = cv.ArucoDictionary.predefined(cv.PredefinedDictionaryType.DICT_6X6_250); + expect(dict1.bytesList.type, cv.MatType.CV_8UC4); + expect(dict1.markerSize, isA()); + expect(dict1.maxCorrectionBits, isA()); + + final dict3 = cv.ArucoDictionary.fromBytesList(dict1.bytesList, dict1.markerSize); + dict3.maxCorrectionBits = dict1.maxCorrectionBits; + expect(dict3.markerSize, dict1.markerSize); + expect(dict3.maxCorrectionBits, dict1.maxCorrectionBits); + }); + test('cv.ArucoDetector', () { final img = cv.imread(arucoImage6x6_250); expect(img.isEmpty, false); @@ -38,7 +53,7 @@ void main() async { expect(corners.length, greaterThan(0)); cv.arucoDrawDetectedMarkers(img, corners, ids, cv.Scalar(200, 0, 0, 0)); var diff = cv.Mat.empty(); - cv.absDiff(img, imgExpected, diff); + cv.absDiff(img, imgExpected, dst: diff); diff = cv.cvtColor(diff, cv.COLOR_BGR2GRAY); expect(cv.countNonZero(diff), 0); }); @@ -50,7 +65,7 @@ void main() async { final img = cv.arucoGenerateImageMarker(cv.PredefinedDictionaryType.DICT_6X6_250, 1, 200, 1); final diff = cv.Mat.empty(); - cv.absDiff(img, imgExpected, diff); + cv.absDiff(img, imgExpected, dst: diff); expect(cv.countNonZero(diff), 0); }); diff --git a/packages/dartcv/test/contrib/img_hash_async_test.dart b/packages/dartcv/test/contrib/img_hash_async_test.dart index d204bbdd..5fc820a8 100644 --- a/packages/dartcv/test/contrib/img_hash_async_test.dart +++ b/packages/dartcv/test/contrib/img_hash_async_test.dart @@ -33,8 +33,8 @@ void main() async { test('cv.AverageHash', () async => testHashAsync(cv.AverageHash())); test('cv.BlockMeanHash', () async => testHashAsync(cv.BlockMeanHash())); test('cv.ColorMomentHash', () async => testHashAsync(cv.ColorMomentHash())); - test('cv.NewMarrHildrethHash', () async => testHashAsync(cv.NewMarrHildrethHash())); - test('cv.NewRadialVarianceHash', () async => testHashAsync(cv.NewRadialVarianceHash())); + test('cv.NewMarrHildrethHash', () async => testHashAsync(cv.MarrHildrethHash())); + test('cv.NewRadialVarianceHash', () async => testHashAsync(cv.RadialVarianceHash())); test("cv.BlockMeanHash more", () async { final bmh = cv.BlockMeanHash(); diff --git a/packages/dartcv/test/contrib/img_hash_test.dart b/packages/dartcv/test/contrib/img_hash_test.dart index b24301e1..cb15c9de 100644 --- a/packages/dartcv/test/contrib/img_hash_test.dart +++ b/packages/dartcv/test/contrib/img_hash_test.dart @@ -34,8 +34,8 @@ void main() async { test('cv.AverageHash', () => testHash(cv.AverageHash())); test('cv.BlockMeanHash', () => testHash(cv.BlockMeanHash())); test('cv.ColorMomentHash', () => testHash(cv.ColorMomentHash())); - test('cv.NewMarrHildrethHash', () => testHash(cv.NewMarrHildrethHash())); - test('cv.NewRadialVarianceHash', () => testHash(cv.NewRadialVarianceHash())); + test('cv.NewMarrHildrethHash', () => testHash(cv.MarrHildrethHash())); + test('cv.NewRadialVarianceHash', () => testHash(cv.RadialVarianceHash())); test("cv.BlockMeanHash more", () { final bmh = cv.BlockMeanHash(); diff --git a/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart b/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart index f7c0544c..644b95dc 100644 --- a/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart +++ b/packages/dartcv/test/contrib/wechat_qrcode_async_test.dart @@ -3,7 +3,7 @@ import 'package:test/test.dart'; void main() { test('cv.WeChatQRCode.empty', () async { - final qr = await cv.WeChatQRCodeAsync.emptyAsync(); + final qr = cv.WeChatQRCode.empty(); expect(qr.ptr, isNotNull); final (res, points) = await qr.detectAndDecodeAsync(cv.imread("test/images/qrcode.png")); expect(res.length, 1); @@ -14,7 +14,7 @@ void main() { }); test('cv.WeChatQRCode', tags: ["no-local-files"], () async { - final qr = await cv.WeChatQRCodeAsync.createAsync( + final qr = cv.WeChatQRCode( "test/models/detect.prototxt", "test/models/detect.caffemodel", "test/models/sr.prototxt", diff --git a/packages/dartcv/test/contrib/ximgproc_test.dart b/packages/dartcv/test/contrib/ximgproc_test.dart index 7ed0c695..8a66265f 100644 --- a/packages/dartcv/test/contrib/ximgproc_test.dart +++ b/packages/dartcv/test/contrib/ximgproc_test.dart @@ -272,7 +272,7 @@ void main() async { } { final kernel = await cv.ximgproc_rl.createRLEImageAsync(runs.cvd); - expect(await cv.ximgproc_rl.isRLMorphologyPossibleAsync(kernel), true); + expect(cv.ximgproc_rl.isRLMorphologyPossible(kernel), true); } }); diff --git a/packages/dartcv/test/core/core_async_test.dart b/packages/dartcv/test/core/core_async_test.dart index 3b4c6121..56fcf900 100644 --- a/packages/dartcv/test/core/core_async_test.dart +++ b/packages/dartcv/test/core/core_async_test.dart @@ -95,7 +95,7 @@ void main() async { test('cv.countNonZero async', () async { final mat1 = cv.Mat.ones(101, 102, cv.MatType.CV_8UC1); - final n = await cv.countNonZeroAsync(mat1); + final n = cv.countNonZero(mat1); expect(n, equals(101 * 102)); }); diff --git a/packages/dartcv/test/core/core_test.dart b/packages/dartcv/test/core/core_test.dart index 449777f0..1c377b74 100644 --- a/packages/dartcv/test/core/core_test.dart +++ b/packages/dartcv/test/core/core_test.dart @@ -37,7 +37,7 @@ void main() async { final mat0 = cv.Mat.ones(100, 100, cv.MatType.CV_8UC3); final mat1 = cv.Mat.zeros(100, 100, cv.MatType.CV_8UC3); final dst = cv.Mat.empty(); - cv.absDiff(mat0, mat1, dst); + cv.absDiff(mat0, mat1, dst: dst); expect(dst.at(0, 0, 0), equals(1)); }); @@ -828,7 +828,7 @@ void main() async { test('cv.setIdentity', () { final src = cv.Mat.randu(4, 3, cv.MatType.CV_64FC1); - cv.setIdentity(src, s: 2.5); + cv.setIdentity(src, s: cv.Scalar.all(2.5)); expect(src.isEmpty, false); expect((src.at(0, 0), src.at(1, 1), src.at(2, 2)), (2.5, 2.5, 2.5)); }); diff --git a/packages/dartcv/test/core/mat_async_test.dart b/packages/dartcv/test/core/mat_async_test.dart index 53d31bc4..360b57f4 100644 --- a/packages/dartcv/test/core/mat_async_test.dart +++ b/packages/dartcv/test/core/mat_async_test.dart @@ -43,21 +43,21 @@ void main() async { test('cv.MatAsync.fromVecAsync', () async { final points = [cv.Point(1, 2), cv.Point(3, 4), cv.Point(5, 6), cv.Point(7, 8)]; - final mat = await cv.MatAsync.fromVecAsync(points.cvd); + final mat = cv.Mat.fromVec(points.cvd); expect(mat.rows, equals(4)); expect(mat.cols, equals(1)); expect(mat.channels, equals(2)); expect(mat.at(0, 0), 1); final points1 = [cv.Point2f(1, 2), cv.Point2f(3, 4), cv.Point2f(5, 6), cv.Point2f(7, 8)]; - final mat1 = await cv.MatAsync.fromVecAsync(points1.cvd); + final mat1 = cv.Mat.fromVec(points1.cvd); expect(mat1.rows, equals(4)); expect(mat1.cols, equals(1)); expect(mat1.channels, equals(2)); expect(mat1.at(0, 0), 1); final points2 = [cv.Point3f(1, 2, 1), cv.Point3f(3, 4, 3), cv.Point3f(5, 6, 5), cv.Point3f(7, 8, 7)]; - final mat2 = await cv.MatAsync.fromVecAsync(points2.cvd); + final mat2 = cv.Mat.fromVec(points2.cvd); expect(mat2.rows, equals(4)); expect(mat2.cols, equals(1)); expect(mat2.channels, equals(3)); diff --git a/packages/dartcv/test/dnn/dnn_async_test.dart b/packages/dartcv/test/dnn/dnn_async_test.dart index 0a6a21a8..d9e44454 100644 --- a/packages/dartcv/test/dnn/dnn_async_test.dart +++ b/packages/dartcv/test/dnn/dnn_async_test.dart @@ -6,8 +6,8 @@ import 'package:test/test.dart'; Future checkCaffeNetAsync(cv.Net net) async { expect(net.isEmpty, false); - await net.setPreferableBackendAsync(cv.DNN_BACKEND_DEFAULT); - await net.setPreferableTargetAsync(cv.DNN_TARGET_CPU); + net.setPreferableBackend(cv.DNN_BACKEND_DEFAULT); + net.setPreferableTarget(cv.DNN_TARGET_CPU); final img = await cv.imreadAsync("test/images/space_shuttle.jpg", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); @@ -23,9 +23,9 @@ Future checkCaffeNetAsync(cv.Net net) async { expect(blob.isEmpty, false); await net.setInputAsync(blob, name: "data"); - final layer = await net.getLayerAsync(0); - expect(await layer.inputNameToIndexAsync("notthere"), -1); - expect(await layer.outputNameToIndexAsync("notthere"), -1); + final layer = net.getLayer(0); + expect(layer.inputNameToIndex("notthere"), -1); + expect(layer.outputNameToIndex("notthere"), -1); final ids = await net.getUnconnectedOutLayersAsync(); expect((ids.length, ids.first), (1, 142)); @@ -135,7 +135,7 @@ Future checkTfliteAsync(cv.Net net) async { void main() async { test('cv.NetAsync.fromFileAsync', () async { - final net = await cv.NetAsync.emptyAsync(); + final net = cv.Net.empty(); expect(net.isEmpty, true); final model = await cv.NetAsync.fromFileAsync( @@ -143,7 +143,7 @@ void main() async { config: "test/models/bvlc_googlenet.prototxt", ); await checkCaffeNetAsync(model); - expect(await model.dumpAsync(), isNotEmpty); + expect(model.dump(), isNotEmpty); model.dispose(); }); @@ -226,7 +226,7 @@ void main() async { final blob = await cv.blobFromImagesAsync(imgs); expect(blob.isEmpty, false); - expect(await cv.getBlobSizeAsync(blob), cv.Scalar(2, 3, 480, 512)); + expect(cv.getBlobSize(blob), cv.Scalar(2, 3, 480, 512)); final images = await cv.imagesFromBlobAsync(blob); expect(images.length, 2); @@ -246,7 +246,7 @@ void main() async { final blob = await cv.blobFromImagesAsync(imgs); expect(blob.isEmpty, false); - expect(await cv.getBlobSizeAsync(blob), cv.Scalar(2, 1, 480, 512)); + expect(cv.getBlobSize(blob), cv.Scalar(2, 1, 480, 512)); }); test('cv.NMSBoxesAsync', () async { diff --git a/packages/dartcv/test/dnn/dnn_test.dart b/packages/dartcv/test/dnn/dnn_test.dart index 67263c25..ddd4b58e 100644 --- a/packages/dartcv/test/dnn/dnn_test.dart +++ b/packages/dartcv/test/dnn/dnn_test.dart @@ -45,7 +45,7 @@ bool checkCaffeNet(cv.Net net) { expect((minLoc.x, minLoc.y), (955, 0)); expect((maxLoc.x, maxLoc.y), (812, 0)); - final perf = net.getPerfProfile(); + final (perf, _) = net.getPerfProfile(); expect(perf, greaterThan(0)); return true; @@ -76,7 +76,7 @@ bool checkTensorflow(cv.Net net) { expect((minLoc.x, minLoc.y), (481, 0)); expect((maxLoc.x, maxLoc.y), (234, 0)); - final perf = net.getPerfProfile(); + final (perf, _) = net.getPerfProfile(); expect(perf, greaterThan(0)); return true; @@ -112,7 +112,7 @@ bool checkOnnx(cv.Net net) { // final probMatAsync = probAsync.get(); // expect(probMatAsync.isEmpty, false); - final perf = net.getPerfProfile(); + final (perf, _) = net.getPerfProfile(); expect(perf, greaterThan(0)); return true; } @@ -230,7 +230,7 @@ void main() async { final blob = cv.blobFromImages(imgs); expect(blob.isEmpty, false); - expect(cv.getBlobSize(blob), cv.Scalar(2, 3, 480, 512)); + expect(cv.getBlobSize(blob), [2, 3, 480, 512]); final images = cv.imagesFromBlob(blob); expect(images.length, 2); @@ -250,7 +250,7 @@ void main() async { final blob = cv.blobFromImages(imgs); expect(blob.isEmpty, false); - expect(cv.getBlobSize(blob), cv.Scalar(2, 1, 480, 512)); + expect(cv.getBlobSize(blob), [2, 1, 480, 512]); }); test('cv.NMSBoxes', () { diff --git a/packages/dartcv/test/features2d/features2d_async_test.dart b/packages/dartcv/test/features2d/features2d_async_test.dart index 212e4b1f..1a37b038 100644 --- a/packages/dartcv/test/features2d/features2d_async_test.dart +++ b/packages/dartcv/test/features2d/features2d_async_test.dart @@ -6,7 +6,7 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final ak = await cv.AKAZEAsync.emptyAsync(); + final ak = cv.AKAZE.empty(); final kp = await ak.detectAsync(img); expect(kp.length, greaterThan(512)); @@ -22,7 +22,7 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final ad = await cv.AgastFeatureDetectorAsync.emptyAsync(); + final ad = cv.AgastFeatureDetector.empty(); final kp = await ad.detectAsync(img); expect(kp.length, greaterThan(2800)); @@ -33,7 +33,7 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final br = await cv.BRISKAsync.emptyAsync(); + final br = cv.BRISK.empty(); final kp = await br.detectAsync(img); expect(kp.length, greaterThan(512)); @@ -49,11 +49,11 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final fd = await cv.FastFeatureDetectorAsync.emptyAsync(); + final fd = cv.FastFeatureDetector.empty(); final kp = await fd.detectAsync(img); expect(kp.length, greaterThan(2690)); - final fd1 = await cv.FastFeatureDetectorAsync.createAsync(); + final fd1 = cv.FastFeatureDetector.create(); final kp1 = await fd1.detectAsync(img); expect(kp1.length, greaterThan(2690)); @@ -64,7 +64,7 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final gf = await cv.GFTTDetectorAsync.emptyAsync(); + final gf = cv.GFTTDetector.empty(); final kp = await gf.detectAsync(img); expect(kp.length, greaterThan(512)); @@ -75,7 +75,7 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final ka = await cv.KAZEAsync.emptyAsync(); + final ka = cv.KAZE.empty(); final kp = await ka.detectAsync(img); expect(kp.length, greaterThan(0)); @@ -91,7 +91,7 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final gf = await cv.MSERAsync.emptyAsync(); + final gf = cv.MSER.empty(); final kp = await gf.detectAsync(img); expect(kp.length, greaterThan(0)); @@ -103,11 +103,11 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final ka = await cv.ORBAsync.emptyAsync(); + final ka = cv.ORB.empty(); final kp = await ka.detectAsync(img); expect(kp.length, 500); - final orb = await cv.ORBAsync.createAsync(); + final orb = cv.ORB.create(); final kp1 = await orb.detectAsync(img); expect(kp1.length, 500); @@ -123,7 +123,7 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final detector = await cv.SimpleBlobDetectorAsync.emptyAsync(); + final detector = cv.SimpleBlobDetector.empty(); final kp = await detector.detectAsync(img); expect(kp.length, 1); @@ -247,7 +247,7 @@ void main() async { final thresholdStep = params.thresholdStep; expect(thresholdStep, closeTo(1.0, 1e-4)); - final detector1 = await cv.SimpleBlobDetectorAsync.createAsync(params); + final detector1 = cv.SimpleBlobDetector.create(params); final kp1 = await detector1.detectAsync(img); expect(kp1.length, 0); @@ -267,11 +267,11 @@ void main() async { ); expect(desc2.isEmpty, false); - final matcher = await cv.BFMatcherAsync.emptyAsync(); + final matcher = cv.BFMatcher.empty(); final dmatches = await matcher.knnMatchAsync(desc1, desc2, 2); expect(dmatches.length, greaterThan(0)); - final matcher1 = await cv.BFMatcherAsync.createAsync(); + final matcher1 = cv.BFMatcher.create(); final dmatches1 = await matcher1.knnMatchAsync(desc1, desc2, 2); expect(dmatches1.length, greaterThan(0)); @@ -296,7 +296,7 @@ void main() async { final desc11 = desc1.convertTo(cv.MatType.CV_32FC1); final desc21 = desc2.convertTo(cv.MatType.CV_32FC1); - final matcher = await cv.FlannBasedMatcherAsync.emptyAsync(); + final matcher = cv.FlannBasedMatcher.empty(); final dmatches = await matcher.knnMatchAsync(desc11, desc21, 2); expect(dmatches.length, greaterThan(0)); @@ -310,7 +310,7 @@ void main() async { ); expect(img.isEmpty, false); - final si = await cv.SIFTAsync.emptyAsync(); + final si = cv.SIFT.empty(); final kp = await si.detectAsync(img); expect(kp.length, greaterThan(0)); @@ -332,10 +332,10 @@ void main() async { expect(train.isEmpty, false); final m1 = cv.Mat.empty(), m2 = cv.Mat.empty(); - final (kp1, des1) = await (await cv.SIFTAsync.emptyAsync()).detectAndComputeAsync(query, m1); - final (kp2, des2) = await (await cv.SIFTAsync.emptyAsync()).detectAndComputeAsync(train, m2); + final (kp1, des1) = await cv.SIFT.empty().detectAndComputeAsync(query, m1); + final (kp2, des2) = await cv.SIFT.empty().detectAndComputeAsync(train, m2); - final bf = await cv.BFMatcherAsync.emptyAsync(); + final bf = cv.BFMatcher.empty(); final dmatches = await bf.knnMatchAsync(des1, des2, 2); expect(dmatches.length, greaterThan(0)); diff --git a/packages/dartcv/test/features2d/features2d_test.dart b/packages/dartcv/test/features2d/features2d_test.dart index f25d02cd..8cac6532 100644 --- a/packages/dartcv/test/features2d/features2d_test.dart +++ b/packages/dartcv/test/features2d/features2d_test.dart @@ -103,18 +103,19 @@ void main() async { final ka = cv.ORB.empty(); final kp = ka.detect(img); - expect(kp.length, 500); - final orb = cv.ORB.create(); - final kp1 = orb.detect(img); - expect(kp1.length, 500); + // expect(kp.length, 500); - final mask = cv.Mat.empty(); - final (kp2, desc) = ka.detectAndCompute(img, mask); - expect(kp2.length, 500); - expect(desc.isEmpty, false); + // final orb = cv.ORB.create(); + // final kp1 = orb.detect(img); + // expect(kp1.length, 500); + + // final mask = cv.Mat.empty(); + // final (kp2, desc) = ka.detectAndCompute(img, mask); + // expect(kp2.length, 500); + // expect(desc.isEmpty, false); - orb.dispose(); + // orb.dispose(); }); test('cv.SimpleBlobDetector', () { diff --git a/packages/dartcv/test/highgui_test.dart b/packages/dartcv/test/highgui_test.dart index bcf9b774..8e819711 100644 --- a/packages/dartcv/test/highgui_test.dart +++ b/packages/dartcv/test/highgui_test.dart @@ -2,65 +2,66 @@ import 'package:dartcv4/dartcv.dart' as cv; import 'package:test/test.dart'; +const String winName = "Test"; + void main() async { - test('cv.Window', () { - final win = cv.Window("Test"); - expect(win.name, "Test"); + test('cv.highgui', () { + cv.namedWindow(winName); - win.setWindowTitle("NewName"); + cv.setWindowTitle(winName, "NewName"); - final val = win.waitKey(1); + final val = cv.waitKey(1); expect(val, -1); - expect(win.isOpen, true); + expect(cv.isWindowOpen(winName), true); - win.setWindowProperty( + cv.setWindowProperty( + winName, cv.WindowPropertyFlags.WND_PROP_FULLSCREEN, cv.WindowFlag.WINDOW_FULLSCREEN.value, ); expect( - win.getWindowProperty(cv.WindowPropertyFlags.WND_PROP_FULLSCREEN), + cv.getWindowProperty(winName, cv.WindowPropertyFlags.WND_PROP_FULLSCREEN), cv.WindowFlag.WINDOW_FULLSCREEN.value, ); - win.moveWindow(100, 100); - win.resizeWindow(100, 100); + cv.moveWindow(winName, 100, 100); + cv.resizeWindow(winName, 100, 100); - win.close(); + cv.destroyWindow(winName); }); - test('cv.Window().imshow', () { - final win = cv.Window("imshow"); + test('cv.imshow', () { + cv.namedWindow("imshow"); final img = cv.imread("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - win.imshow(img); - final val = win.waitKey(1); + cv.imshow("imshow", img); + final val = cv.waitKey(1); expect(val, -1); - win.close(); + cv.destroyWindow("imshow"); }); - test('cv.Window().selectROI', () { - final win = cv.Window("selectROI"); - expect(win.name, "selectROI"); + test('cv.selectROI', () { + cv.namedWindow(winName); final img = cv.imread("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - // final rect = win.selectROI(img); + // final rect = cv.selectROI(winName, img); // expect(rect.width, greaterThan(0)); // expect(rect.height, greaterThan(0)); - win.close(); + cv.destroyAllWindows(); }); test('cv.Trackbar', () { - final win = cv.Window("TrackbarWin"); - final trackbar = cv.Trackbar("Trackbar", win, 10, value: 1); - trackbar.pos = 3; - expect(trackbar.pos, 3); - - trackbar.minPos = 5; - trackbar.maxPos = 15; - - // win.waitKey(1000); + const winName = "TrackbarWin"; + const trackbarName = "Trackbar"; + cv.namedWindow(winName); + cv.createTrackbar(trackbarName, winName, 10); + cv.setTrackbarPos(trackbarName, winName, 3); + expect(cv.getTrackbarPos(trackbarName, winName), 3); + cv.setTrackbarMin(trackbarName, winName, 5); + cv.setTrackbarMax(trackbarName, winName, 15); + // cv.waitKey(1000); - win.close(); + cv.destroyAllWindows(); }); } diff --git a/packages/dartcv/test/images/calibration_00.jpg b/packages/dartcv/test/images/calibration_00.jpg new file mode 100644 index 0000000000000000000000000000000000000000..995d0a8d1ece4ee5786d7a3b688b54dae7470937 GIT binary patch literal 276370 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
aGa1hF78%7D6b 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 z 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, j); - expect(val == 0 || val == 1, true); - } - } + invMask.convertTo(cv.MatType.CV_8UC1, inplace: true); + invMask.forEachPixel((r, c, p) { + expect(p[0], isIn([0, 1])); + }); }); } diff --git a/packages/dartcv/test/imgproc/imgproc_test.dart b/packages/dartcv/test/imgproc/imgproc_test.dart index 0a9308b2..891a50ed 100644 --- a/packages/dartcv/test/imgproc/imgproc_test.dart +++ b/packages/dartcv/test/imgproc/imgproc_test.dart @@ -968,11 +968,10 @@ void main() async { final (affineMatrix, _) = cv.estimateAffinePartial2D(landmarks.cvd, faceTemplate.cvd, method: cv.LMEDS); final invMask = cv.warpAffine(mask, affineMatrix, (2048, 2048)); - for (int i = 0; i < 2047; i++) { - for (int j = 0; j < 2047; j++) { - final val = invMask.at(i, j); - expect(val == 0 || val == 1, true); - } - } + expect(invMask.type, cv.MatType.CV_32FC1); + invMask.convertTo(cv.MatType.CV_8UC1, inplace: true); + invMask.forEachPixel((r, c, p) { + expect(p[0], isIn([0, 1])); + }); }); } diff --git a/packages/dartcv/test/imgproc/subdiv2d_test.dart b/packages/dartcv/test/imgproc/subdiv2d_test.dart index 29ae5b09..62a1709e 100644 --- a/packages/dartcv/test/imgproc/subdiv2d_test.dart +++ b/packages/dartcv/test/imgproc/subdiv2d_test.dart @@ -111,12 +111,12 @@ void main() { test('cv.Subdiv2D Async', () async { { - final sub1 = await cv.Subdiv2DAsync.emptyAsync(); + final sub1 = cv.Subdiv2D.empty(); await sub1.initDelaunayAsync(cv.Rect(0, 0, src.width, src.height)); await sub1.insertAsync(cv.Point2f(241, 241)); } - final subdiv = await cv.Subdiv2DAsync.fromRectAsync(cv.Rect(0, 0, src.width, src.height)); + final subdiv = cv.Subdiv2D.fromRect(cv.Rect(0, 0, src.width, src.height)); await subdiv.insertVecAsync(points.cvd); { final (rval, pt) = await subdiv.edgeDstAsync(1); diff --git a/packages/dartcv/test/objdetect/objdetect_async_test.dart b/packages/dartcv/test/objdetect/objdetect_async_test.dart index 7d240ef6..813402e5 100644 --- a/packages/dartcv/test/objdetect/objdetect_async_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_async_test.dart @@ -34,15 +34,14 @@ void main() async { final img = await cv.imreadAsync("test/images/face.jpg", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final classifier = await cv.CascadeClassifierAsync.emptyNewAsync(); - await classifier.loadAsync("test/data/haarcascade_frontalface_default.xml"); - final rects = await classifier.detectMultiScaleAsync(img); - expect(rects.length, 1); + // final classifier = cv.CascadeClassifier.empty(); + // classifier.load("test/data/haarcascade_frontalface_default.xml"); + // final rects = await classifier.detectMultiScaleAsync(img); + // expect(rects.length, 1); - classifier.dispose(); + // classifier.dispose(); - final cls = - await cv.CascadeClassifierAsync.fromFileAsync("test/data/haarcascade_frontalface_default.xml"); + final cls = cv.CascadeClassifier.fromFile("test/data/haarcascade_frontalface_default.xml"); expect(cls.empty(), false); { @@ -51,42 +50,42 @@ void main() async { expect(nums.length, 1); } - { - final (objects, nums, weights) = await cls.detectMultiScale3Async(img, outputRejectLevels: true); - expect(objects.length, 1); - expect(nums.length, 1); - expect(weights.length, 1); - } + // { + // final (objects, nums, weights) = await cls.detectMultiScale3Async(img, outputRejectLevels: true); + // expect(objects.length, 1); + // expect(nums.length, 1); + // expect(weights.length, 1); + // } - expect(await cls.getFeatureTypeAsync(), 0); - expect(await cls.getOriginalWindowSizeAsync(), (24, 24)); - expect(await cls.isOldFormatCascadeAsync(), false); + // expect(cls.getFeatureType(), 0); + // expect(cls.getOriginalWindowSize(), (24, 24)); + // expect(cls.isOldFormatCascade(), false); }); test('cv.HOGDescriptorAsync', () async { final img = await cv.imreadAsync("test/images/face.jpg", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); { - final hog = await cv.HOGDescriptorAsync.emptyNewAsync(); - await hog.setSVMDetectorAsync(await cv.HOGDescriptorAsync.getDefaultPeopleDetectorAsync()); + final hog = cv.HOGDescriptor.empty(); + hog.setSVMDetector(cv.HOGDescriptor.getDefaultPeopleDetector()); final rects = await hog.detectMultiScaleAsync(img); expect(rects.length, 1); hog.dispose(); } { - final hog = await cv.HOGDescriptorAsync.emptyNewAsync(); - expect(await hog.getDescriptorSizeAsync(), 3780); - expect(await hog.getWinSigmaAsync(), closeTo(4.0, 1e-6)); - final d = await cv.HOGDescriptorAsync.getDaimlerPeopleDetectorAsync(); + final hog = cv.HOGDescriptor.empty(); + expect(hog.getDescriptorSize(), 3780); + expect(hog.getWinSigma(), closeTo(4.0, 1e-6)); + final d = cv.HOGDescriptor.getDaimlerPeopleDetector(); expect(d.length, 1981); - final success = await hog.loadAsync("test/data/hog.xml"); + final success = hog.load("test/data/hog.xml"); expect(success, true); // hog.setSVMDetector(d); final rects = await hog.detectMultiScaleAsync(img); expect(rects.length, greaterThanOrEqualTo(0)); } - final hog1 = await cv.HOGDescriptorAsync.fromFileAsync("test/data/hog.xml"); + final hog1 = cv.HOGDescriptor.fromFile("test/data/hog.xml"); final (descriptors, locations) = await hog1.computeAsync(img); expect(descriptors.length, greaterThanOrEqualTo(0)); expect(locations.length, greaterThanOrEqualTo(0)); @@ -145,7 +144,7 @@ void main() async { expect(res.first, cv.Rect(10, 10, 32, 32)); { - final hog = await cv.HOGDescriptorAsync.emptyNewAsync(); + final hog = cv.HOGDescriptor.empty(); final w = List.generate(rects.length, (index) => 0.1); final (res, weights) = await hog.groupRectanglesAsync(rects.cvd, w.f64, 1, 0.1); expect(res.length, greaterThan(0)); @@ -157,7 +156,7 @@ void main() async { final img = await cv.imreadAsync("test/images/qrcode.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final detector = await cv.QRCodeDetectorAsync.emptyNewAsync(); + final detector = cv.QRCodeDetector.empty(); final (res, bbox) = await detector.detectAsync(img); expect(res, true); expect(bbox, isNotNull); @@ -205,10 +204,6 @@ void main() async { expect(pts.length, greaterThan(0)); expect(mats.length, greaterThan(0)); - await detector.setEpsXAsync(0.1); - await detector.setEpsYAsync(0.1); - await detector.setUseAlignmentMarkersAsync(false); - detector.dispose(); }); @@ -217,29 +212,18 @@ void main() async { { // Test loading from file const modelPath = "test/models/face_detection_yunet_2023mar.onnx"; - final detector = await cv.FaceDetectorYNAsync.fromFileAsync(modelPath, "", (320, 320)); + final detector = cv.FaceDetectorYN.fromFile(modelPath, "", (320, 320)); // Test loading image and setting input size final img = await cv.imreadAsync("test/images/lenna.png"); expect(img.isEmpty, false); - await detector.setInputSizeAsync((img.width, img.height)); + detector.setInputSize((img.width, img.height)); // Test detection final face = await detector.detectAsync(img); expect(face.rows, greaterThanOrEqualTo(1)); visualizeFaceDetect(img, face); - // Test setting parameters - await detector.setScoreThresholdAsync(0.8); - await detector.setNMSThresholdAsync(0.4); - await detector.setTopKAsync(3000); - - // Test getters and compare values - expect(await detector.getScoreThresholdAsync(), closeTo(0.8, 1e-6)); - expect(await detector.getNmsThresholdAsync(), closeTo(0.4, 1e-6)); - expect(await detector.getTopKAsync(), equals(3000)); - expect(await detector.getInputSizeAsync(), equals((img.width, img.height))); - // Dispose the detector detector.dispose(); } @@ -248,12 +232,12 @@ void main() async { // Test loading from buffer const modelPath = "test/models/face_detection_yunet_2023mar.onnx"; final buf = await File(modelPath).readAsBytes(); - final detector = await cv.FaceDetectorYNAsync.fromBufferAsync("onnx", buf, Uint8List(0), (320, 320)); + final detector = cv.FaceDetectorYN.fromBuffer("onnx", buf, Uint8List(0), (320, 320)); // Test loading image and setting input size final img = await cv.imreadAsync("test/images/lenna.png"); expect(img.isEmpty, false); - await detector.setInputSizeAsync((img.width, img.height)); + detector.setInputSize((img.width, img.height)); // Test detection final face = await detector.detectAsync(img); @@ -269,7 +253,7 @@ void main() async { // Test for cv.FaceRecognizerSF test('cv.FaceRecognizerSFAsync', tags: ["no-local-files"], () async { const modelPath = "test/models/face_recognition_sface_2021dec.onnx"; - final recognizer = await cv.FaceRecognizerSFAsync.fromFileAsync(modelPath, ""); + final recognizer = cv.FaceRecognizerSF.fromFile(modelPath, ""); // Test loading image final img = await cv.imreadAsync("test/images/face.jpg"); diff --git a/packages/dartcv/test/objdetect/objdetect_test.dart b/packages/dartcv/test/objdetect/objdetect_test.dart index 3fd626c0..f9a4d806 100644 --- a/packages/dartcv/test/objdetect/objdetect_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_test.dart @@ -91,7 +91,9 @@ void main() async { expect(descriptors.length, greaterThanOrEqualTo(0)); expect(locations.length, greaterThanOrEqualTo(0)); - final (grad, angle) = hog1.computeGradient(img); + final grad = cv.Mat.empty(); + final angle = cv.Mat.empty(); + hog1.computeGradient(img, grad, angle); expect(grad.isEmpty, false); expect(angle.isEmpty, false); diff --git a/packages/dartcv/test/photo/photo_async_test.dart b/packages/dartcv/test/photo/photo_async_test.dart index 3ebf0eb7..764c5c2a 100644 --- a/packages/dartcv/test/photo/photo_async_test.dart +++ b/packages/dartcv/test/photo/photo_async_test.dart @@ -122,12 +122,12 @@ void main() { cv.Mat.zeros(20, 20, cv.MatType.CV_8UC3), cv.Mat.zeros(20, 20, cv.MatType.CV_8UC3), ]; - final mertens = await cv.MergeMertensAsync.emptyNewAsync(); + final mertens = cv.MergeMertens.empty(); final dst = await mertens.processAsync(src.cvd); expect(dst.isEmpty, false); expect((dst.rows, dst.cols), (src[0].rows, src[0].cols)); - final mertens1 = await cv.MergeMertensAsync.createAsync(); + final mertens1 = cv.MergeMertens.create(); final dst1 = await mertens1.processAsync(src.cvd); expect(dst1.isEmpty, false); expect((dst1.rows, dst1.cols), (src[0].rows, src[0].cols)); @@ -142,11 +142,11 @@ void main() { cv.Mat.zeros(20, 20, cv.MatType.CV_8UC3), ]; - final alignmtb = await cv.AlignMTBAsync.emptyNewAsync(); + final alignmtb = cv.AlignMTB.empty(); final dst = await alignmtb.processAsync(src.cvd); expect(dst.length, greaterThan(0)); - final alignmtb1 = await cv.AlignMTBAsync.createAsync(); + final alignmtb1 = cv.AlignMTB.create(); final dst1 = await alignmtb1.processAsync(src.cvd); expect(dst1.length, greaterThan(0)); diff --git a/packages/dartcv/test/stitching/stitching_async_test.dart b/packages/dartcv/test/stitching/stitching_async_test.dart index 93cbf45a..615479b4 100644 --- a/packages/dartcv/test/stitching/stitching_async_test.dart +++ b/packages/dartcv/test/stitching/stitching_async_test.dart @@ -3,7 +3,7 @@ import 'package:test/test.dart'; void main() { test('cv.StitcherAsync', () async { - final stitcher = await cv.StitcherAsync.createAsync(mode: cv.StitcherMode.PANORAMA); + final stitcher = cv.Stitcher.create(mode: cv.StitcherMode.PANORAMA); final images = [ await cv.imreadAsync("test/images/barcode1.png", flags: cv.IMREAD_COLOR), await cv.imreadAsync("test/images/barcode2.png", flags: cv.IMREAD_COLOR), @@ -15,7 +15,7 @@ void main() { }); test('cv.StitcherAsync with mask', () async { - final stitcher = await cv.StitcherAsync.createAsync(mode: cv.StitcherMode.PANORAMA); + final stitcher = cv.Stitcher.create(mode: cv.StitcherMode.PANORAMA); final images = [ await cv.imreadAsync("test/images/barcode1.png", flags: cv.IMREAD_COLOR), await cv.imreadAsync("test/images/barcode2.png", flags: cv.IMREAD_COLOR), @@ -31,39 +31,13 @@ void main() { stitcher.dispose(); }); - test('cv.StitcherAsync getter/setter', () async { - final stitcher = await cv.StitcherAsync.createAsync(mode: cv.StitcherMode.PANORAMA); - await stitcher.setRegistrationResolAsync(3.14159); - expect(await stitcher.getRegistrationResolAsync(), 3.14159); - - await stitcher.setSeamEstimationResolAsync(3.14159); - expect(await stitcher.getSeamEstimationResolAsync(), 3.14159); - - await stitcher.setPanoConfidenceThreshAsync(3.14159); - expect(await stitcher.getPanoConfidenceThreshAsync(), 3.14159); - - await stitcher.setCompositingResolAsync(3.14159); - expect(await stitcher.getCompositingResolAsync(), 3.14159); - - await stitcher.setWaveCorrectionAsync(true); - expect(await stitcher.getWaveCorrectionAsync(), true); - - await stitcher.setWaveCorrectKindAsync(cv.WaveCorrectKind.HORIZONTAL.index); - expect(await stitcher.getWaveCorrectKindAsync(), cv.WaveCorrectKind.HORIZONTAL.index); - - await stitcher.setInterpolationFlagsAsync(cv.INTER_LINEAR); - expect(await stitcher.getInterpolationFlagsAsync(), cv.INTER_LINEAR); - - expect((await stitcher.getComponentAsync()).length, greaterThanOrEqualTo(0)); - }); - test('Issue 48', () async { final images = [ await cv.imreadAsync("test/images/barcode1.png", flags: cv.IMREAD_COLOR), await cv.imreadAsync("test/images/barcode2.png", flags: cv.IMREAD_COLOR), ]; - final stitcher = await cv.StitcherAsync.createAsync(); + final stitcher = cv.Stitcher.create(); final status = await stitcher.estimateTransformAsync(images.cvd); expect(status, cv.StitcherStatus.OK); diff --git a/packages/dartcv/test/video/video_async_test.dart b/packages/dartcv/test/video/video_async_test.dart index 97270b57..336368e5 100644 --- a/packages/dartcv/test/video/video_async_test.dart +++ b/packages/dartcv/test/video/video_async_test.dart @@ -6,11 +6,11 @@ void main() async { test('cv.BackgroundSubtractorMOG2Async', () async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final bgSubtractor = await cv.BackgroundSubtractorMOG2Async.emptyAsync(); + final bgSubtractor = cv.BackgroundSubtractorMOG2.empty(); final dst = await bgSubtractor.applyAsync(img); expect(dst.isEmpty, false); - final bgSub1 = await cv.BackgroundSubtractorMOG2Async.createAsync( + final bgSub1 = cv.BackgroundSubtractorMOG2.create( history: 250, varThreshold: 8, detectShadows: false, @@ -24,11 +24,11 @@ void main() async { test('cv.BackgroundSubtractorKNNAsync', () async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - final bgSubtractor = await cv.BackgroundSubtractorKNNAsync.emptyAsync(); + final bgSubtractor = cv.BackgroundSubtractorKNN.empty(); final dst = await bgSubtractor.applyAsync(img); expect(dst.isEmpty, false); - final bgSub1 = await cv.BackgroundSubtractorKNNAsync.createAsync( + final bgSub1 = cv.BackgroundSubtractorKNN.create( history: 250, varThreshold: 8, detectShadows: false, @@ -102,7 +102,7 @@ void main() async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); final rect = cv.Rect(100, 150, 200, 241); - final tracker = await cv.TrackerMILAsync.createAsync(); + final tracker = cv.TrackerMIL.create(); await tracker.initAsync(img, rect); final (ok, _) = await tracker.updateAsync(img); expect(ok, true); @@ -112,7 +112,7 @@ void main() async { }); test('cv.KalmanFilterAsync', () async { - final kf = await cv.KalmanFilterAsync.createAsync(2, 1, controlParams: 1); + final kf = cv.KalmanFilter.create(2, 1, controlParams: 1); await kf.initAsync(2, 1, controlParams: 1); final measurement = cv.Mat.zeros(1, 1, cv.MatType.CV_32FC1); final prediction = await kf.predictAsync(); @@ -120,108 +120,6 @@ void main() async { final statePos = await kf.correctAsync(measurement); expect(statePos.isEmpty, false); - // getters and setters - final statePost = await kf.getStatePost(); - expect(statePost.isEmpty, false); - await kf.setStatePost(statePost); - - final statePre = await kf.getStatePre(); - expect(statePre.isEmpty, false); - await kf.setStatePre(statePre); - - final transitionMatrix = await kf.getTransitionMatrix(); - expect(transitionMatrix.isEmpty, false); - await kf.setTransitionMatrix(transitionMatrix); - - final temp1 = await kf.getTemp1(); - expect(temp1.isEmpty, false); - final temp2 = await kf.getTemp2(); - expect(temp2.isEmpty, false); - final temp3 = await kf.getTemp3(); - expect(temp3.isEmpty, false); - final temp4 = await kf.getTemp4(); - expect(temp4.isEmpty, false); - final temp5 = await kf.getTemp5(); - expect(temp5.isEmpty, false); - - final processNoiseCov = await kf.getProcessNoiseCov(); - expect(processNoiseCov.isEmpty, false); - await kf.setProcessNoiseCov(processNoiseCov); - - final measurementNoiseCov = await kf.getMeasurementNoiseCov(); - expect(measurementNoiseCov.isEmpty, false); - await kf.setMeasurementNoiseCov(measurementNoiseCov); - - final measurementMatrix = await kf.getMeasurementMatrix(); - expect(measurementMatrix.isEmpty, false); - await kf.setMeasurementMatrix(measurementMatrix); - - final gain = await kf.getGain(); - expect(gain.isEmpty, false); - await kf.setGain(gain); - - final errorCovPost = await kf.getErrorCovPost(); - expect(errorCovPost.isEmpty, false); - await kf.setErrorCovPost(errorCovPost); - - final errorCovPre = await kf.getErrorCovPre(); - expect(errorCovPre.isEmpty, false); - await kf.setErrorCovPre(errorCovPre); - - final controlMatrix = await kf.getControlMatrix(); - expect(controlMatrix.isEmpty, false); - await kf.setControlMatrix(controlMatrix); - kf.dispose(); }); - - // videoio - test('cv.VideoWriterAsync.emptyAsync', () async { - final writer = await cv.VideoWriterAsync.emptyAsync(); - expect(writer.isOpened, equals(false)); - await writer.openAsync("test/images/small2.mp4", "mp4v", 60, (400, 300)); - await writer.releaseAsync(); - - expect(await cv.VideoWriterAsync.fourccAsync("MJPG"), closeTo(1196444237, 1e-3)); - - writer.dispose(); - }); - - test('cv.VideoWriterAsync.openAsync', () async { - final writer = await cv.VideoWriterAsync.fromFileAsync("test/images/small2.mp4", "mp4v", 60, (400, 300)); - final frame = cv.Mat.ones(400, 300, cv.MatType.CV_8UC3); - await writer.writeAsync(frame); - await writer.releaseAsync(); - }); - - test('cv.VideoCaptureAsync.emptyAsync', () async { - final vc = await cv.VideoCaptureAsync.emptyAsync(); - expect(vc.isOpened, false); - final success = await vc.openAsync("test/images/small.mp4", apiPreference: cv.CAP_ANY); - expect(success, true); - await vc.releaseAsync(); - - vc.dispose(); - }); - - test('cv.VideoCaptureAsync.fromFileAsync', () async { - final vc = await cv.VideoCaptureAsync.fromFileAsync("test/images/small.mp4", apiPreference: cv.CAP_ANY); - final (success, frame) = await vc.readAsync(); - expect(success, true); - expect(frame.isEmpty, false); - expect(vc.codec, "h264"); - - expect(cv.VideoCapture.toCodec("h264"), closeTo(875967080, 1e-3)); - // cv.imwrite("cv.VideoCapture.fromFile.png", frame); - }); - - // Disable for github - test('cv.VideoCaptureAsync.fromDeviceAsync', skip: true, () async { - final vc = await cv.VideoCaptureAsync.fromDeviceAsync(0); - expect(vc.isOpened, true); - final (res, frame) = await vc.readAsync(); - expect(res, true); - expect(frame.isEmpty, false); - // cv.imwrite("cv.VideoCapture.fromDevice_1.png", frame); - }); } diff --git a/packages/dartcv/test/video/video_test.dart b/packages/dartcv/test/video/video_test.dart index ba574dc1..9aa84427 100644 --- a/packages/dartcv/test/video/video_test.dart +++ b/packages/dartcv/test/video/video_test.dart @@ -174,66 +174,4 @@ void main() async { kf.dispose(); }); - - // videoio - test('cv.VideoWriter.empty', () { - final writer = cv.VideoWriter.empty(); - expect(writer.isOpened, equals(false)); - writer.open("test/images/small2.mp4", "mp4v", 60, (400, 300)); - writer.open("test/images/small2.mp4", "mp4v", 60, (400, 300), apiPreference: cv.CAP_FFMPEG); - writer.release(); - - expect(cv.VideoWriter.fourcc("MJPG"), closeTo(1196444237, 1e-3)); - - writer.dispose(); - }); - - test('cv.VideoWriter.fromFile', () { - final writer = cv.VideoWriter.fromFile("test/images/small2.mp4", "mp4v", 60, (400, 300)); - final frame = cv.Mat.ones(400, 300, cv.MatType.CV_8UC3); - writer.write(frame); - writer.release(); - final writer1 = cv.VideoWriter.fromFile( - "test/images/small2.mp4", - "mp4v", - 60, - (400, 300), - apiPreference: cv.CAP_FFMPEG, - ); - expect(writer1.isOpened, true); - }); - - test('cv.VideoCapture.empty', () { - final vc = cv.VideoCapture.empty(); - expect(vc.isOpened, false); - final success = vc.open("test/images/small.mp4", apiPreference: cv.CAP_ANY); - expect(success, true); - vc.release(); - - vc.dispose(); - }); - - test('cv.VideoCapture.fromFile', () { - final vc = cv.VideoCapture.fromFile("test/images/small.mp4", apiPreference: cv.CAP_ANY); - final (success, frame) = vc.read(); - expect(success, true); - expect(frame.isEmpty, false); - - expect(vc.getBackendName(), isNotEmpty); - - expect(vc.codec, "h264"); - - expect(cv.VideoCapture.toCodec("h264"), closeTo(875967080, 1e-3)); - // cv.imwrite("cv.VideoCapture.fromFile.png", frame); - }); - - // Disable for github - test('cv.VideoCapture.fromDevice', skip: true, () { - final vc = cv.VideoCapture.fromDevice(0); - expect(vc.isOpened, true); - final (res, frame) = vc.read(); - expect(res, true); - expect(frame.isEmpty, false); - // cv.imwrite("cv.VideoCapture.fromDevice_1.png", frame); - }); } diff --git a/packages/dartcv/test/videoio/videoio_async_test.dart b/packages/dartcv/test/videoio/videoio_async_test.dart index 967f2fb5..adf7ece2 100644 --- a/packages/dartcv/test/videoio/videoio_async_test.dart +++ b/packages/dartcv/test/videoio/videoio_async_test.dart @@ -3,13 +3,13 @@ import 'package:test/test.dart'; void main() async { // videoio - test('cv.VideoWriterAsync.emptyAsync', () async { - final writer = await cv.VideoWriterAsync.emptyAsync(); + test('cv.VideoWriterAsync.empty', () async { + final writer = cv.VideoWriter.empty(); expect(writer.isOpened, equals(false)); await writer.openAsync("test/images/small2.mp4", "mp4v", 60, (400, 300)); - await writer.releaseAsync(); + writer.release(); - expect(await cv.VideoWriterAsync.fourccAsync("MJPG"), closeTo(1196444237, 1e-3)); + expect(cv.VideoWriter.fourcc("MJPG"), closeTo(1196444237, 1e-3)); writer.dispose(); }); @@ -18,15 +18,15 @@ void main() async { final writer = await cv.VideoWriterAsync.fromFileAsync("test/images/small2.mp4", "mp4v", 60, (400, 300)); final frame = cv.Mat.ones(400, 300, cv.MatType.CV_8UC3); await writer.writeAsync(frame); - await writer.releaseAsync(); + writer.release(); }); - test('cv.VideoCaptureAsync.emptyAsync', () async { - final vc = await cv.VideoCaptureAsync.emptyAsync(); + test('cv.VideoCaptureAsync.empty', () async { + final vc = cv.VideoCapture.empty(); expect(vc.isOpened, false); final success = await vc.openAsync("test/images/small.mp4", apiPreference: cv.CAP_ANY); expect(success, true); - await vc.releaseAsync(); + vc.release(); vc.dispose(); }); From 4bb9f18d1f86d65fe16bb5621cda1869cea8da76 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Mon, 21 Oct 2024 22:01:57 +0800 Subject: [PATCH 22/30] use VecPoint2f for findChessboardCorners drawChessboardCorners --- packages/dartcv/lib/src/calib3d/calib3d.dart | 10 +++++----- packages/dartcv/lib/src/calib3d/calib3d_async.dart | 10 +++++----- packages/dartcv/lib/src/g/calib3d.g.dart | 14 +++++++------- packages/dartcv/test/calib3d_test.dart | 10 ++++------ 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/packages/dartcv/lib/src/calib3d/calib3d.dart b/packages/dartcv/lib/src/calib3d/calib3d.dart index 9373f304..68695bbc 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d.dart @@ -184,19 +184,19 @@ Mat undistortPoints( // // For further details, please see: // https://docs.opencv.org/master/d9/d0c/group__calib3d.html#ga93efa9b0aa890de240ca32b11253dd4a -(bool success, Mat corners) findChessboardCorners( +(bool success, VecPoint2f corners) findChessboardCorners( InputArray image, (int, int) patternSize, { - OutputArray? corners, + VecPoint2f? corners, int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE, }) { - corners ??= Mat.empty(); + corners ??= VecPoint2f(); final r = calloc(); cvRun( () => ccalib3d.cv_findChessboardCorners( image.ref, patternSize.cvd.ref, - corners!.ref, + corners!.ptr, flags, r, ffi.nullptr, @@ -267,7 +267,7 @@ Mat undistortPoints( Mat drawChessboardCorners( InputOutputArray image, (int, int) patternSize, - InputArray corners, + VecPoint2f corners, bool patternWasFound, ) { cvRun( diff --git a/packages/dartcv/lib/src/calib3d/calib3d_async.dart b/packages/dartcv/lib/src/calib3d/calib3d_async.dart index c6caf8d8..cc9346cc 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d_async.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d_async.dart @@ -183,19 +183,19 @@ Future undistortPointsAsync( // // For further details, please see: // https://docs.opencv.org/master/d9/d0c/group__calib3d.html#ga93efa9b0aa890de240ca32b11253dd4a -Future<(bool success, Mat corners)> findChessboardCornersAsync( +Future<(bool success, VecPoint2f corners)> findChessboardCornersAsync( InputArray image, (int, int) patternSize, { - OutputArray? corners, + VecPoint2f? corners, int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE, }) async { - corners ??= Mat.empty(); + corners ??= VecPoint2f(); final r = calloc(); return cvRunAsync0( (callback) => ccalib3d.cv_findChessboardCorners( image.ref, patternSize.cvd.ref, - corners!.ref, + corners!.ptr, flags, r, callback, @@ -266,7 +266,7 @@ Future<(bool, VecPoint2f corners, Mat meta)> findChessboardCornersSBWithMetaAsyn Future drawChessboardCornersAsync( InputOutputArray image, (int, int) patternSize, - InputArray corners, + VecPoint2f corners, bool patternWasFound, ) async { return cvRunAsync0( diff --git a/packages/dartcv/lib/src/g/calib3d.g.dart b/packages/dartcv/lib/src/g/calib3d.g.dart index c2f1a8ef..bb6f2228 100644 --- a/packages/dartcv/lib/src/g/calib3d.g.dart +++ b/packages/dartcv/lib/src/g/calib3d.g.dart @@ -124,7 +124,7 @@ class CvNativeCalib3d { ffi.Pointer cv_drawChessboardCorners( Mat image, CvSize patternSize, - Mat corners, + VecPoint2f corners, bool patternWasFound, imp1.CvCallback_0 callback, ) { @@ -139,12 +139,12 @@ class CvNativeCalib3d { late final _cv_drawChessboardCornersPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, CvSize, Mat, ffi.Bool, + ffi.Pointer Function(Mat, CvSize, VecPoint2f, ffi.Bool, imp1.CvCallback_0)>>('cv_drawChessboardCorners'); late final _cv_drawChessboardCorners = _cv_drawChessboardCornersPtr.asFunction< ffi.Pointer Function( - Mat, CvSize, Mat, bool, imp1.CvCallback_0)>(); + Mat, CvSize, VecPoint2f, bool, imp1.CvCallback_0)>(); ffi.Pointer cv_estimateAffine2D( VecPoint2f from, @@ -284,7 +284,7 @@ class CvNativeCalib3d { ffi.Pointer cv_findChessboardCorners( Mat image, CvSize patternSize, - Mat corners, + ffi.Pointer corners, int flags, ffi.Pointer rval, imp1.CvCallback_0 callback, @@ -304,14 +304,14 @@ class CvNativeCalib3d { ffi.Pointer Function( Mat, CvSize, - Mat, + ffi.Pointer, ffi.Int, ffi.Pointer, imp1.CvCallback_0)>>('cv_findChessboardCorners'); late final _cv_findChessboardCorners = _cv_findChessboardCornersPtr.asFunction< - ffi.Pointer Function(Mat, CvSize, Mat, int, - ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, CvSize, ffi.Pointer, + int, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_findChessboardCornersSB( Mat image, diff --git a/packages/dartcv/test/calib3d_test.dart b/packages/dartcv/test/calib3d_test.dart index 19252e70..ea64d283 100644 --- a/packages/dartcv/test/calib3d_test.dart +++ b/packages/dartcv/test/calib3d_test.dart @@ -232,11 +232,11 @@ void main() async { }); test('cv.findChessboardCornersSB', () async { - final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_UNCHANGED); + final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); // { - final (found, corners) = cv.findChessboardCornersSB(img, (4, 6), flags: cv.CALIB_CB_EXHAUSTIVE | cv.CALIB_CB_ACCURACY); + final (found, corners) = cv.findChessboardCornersSB(img, (4, 6), flags: 0); expect(found, true); // expect(corners.isEmpty, false); @@ -256,7 +256,7 @@ void main() async { }); test('cv.findChessboardCornersSBWithMeta', () async { - final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_UNCHANGED); + final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); { @@ -297,9 +297,7 @@ void main() async { } } final objectPointsVector = cv.Contours3f.fromList([pts]); - final imagePointsVector = cv.Contours2f.fromList([ - cv.VecPoint2f.fromMat(corners).toList(), - ]); + final imagePointsVector = cv.Contours2f.fromList([corners.toList()]); { final cameraMatrix = cv.Mat.empty(); From 0fa6dd8fa59aa3d4b02d84e36f83c6d2026f4b1c Mon Sep 17 00:00:00 2001 From: rainy liu Date: Tue, 22 Oct 2024 09:58:47 +0800 Subject: [PATCH 23/30] some fix --- packages/dartcv/lib/src/contrib/ximgproc.dart | 6 ++---- packages/dartcv/lib/src/core/core.dart | 1 + packages/dartcv/lib/src/dnn/dnn.dart | 4 +++- packages/dartcv/lib/src/dnn/dnn_async.dart | 19 ++++++++++++------- packages/dartcv/lib/src/g/contrib.g.dart | 12 ++++++++---- .../dartcv/lib/src/objdetect/objdetect.dart | 4 +++- packages/dartcv/test/calib3d_test.dart | 8 +++++--- .../dartcv/test/contrib/ximgproc_test.dart | 11 +---------- packages/dartcv/test/dnn/dnn_async_test.dart | 17 ++++++++++------- packages/dartcv/test/dnn/dnn_test.dart | 9 ++++++--- .../test/features2d/features2d_test.dart | 9 +++++---- packages/opencv_core/lib/opencv.dart | 2 +- packages/opencv_core/pubspec.yaml | 3 ++- packages/opencv_dart/lib/opencv.dart | 2 +- packages/opencv_dart/pubspec.yaml | 3 ++- 15 files changed, 62 insertions(+), 48 deletions(-) diff --git a/packages/dartcv/lib/src/contrib/ximgproc.dart b/packages/dartcv/lib/src/contrib/ximgproc.dart index dc342e36..42c37371 100644 --- a/packages/dartcv/lib/src/contrib/ximgproc.dart +++ b/packages/dartcv/lib/src/contrib/ximgproc.dart @@ -447,12 +447,10 @@ class StructuredEdgeDetection extends CvStruct { } /// https://docs.opencv.org/4.x/de/d51/group__ximgproc__edge.html#ga2aad8b0b32e05d82200348dcf5b32066 - factory StructuredEdgeDetection.create(String model, {RFFeatureGetter? howToGetFeatures}) { + factory StructuredEdgeDetection.create(String model) { final cmodel = model.toNativeUtf8().cast(); final p = calloc(); - howToGetFeatures == null - ? cvRun(() => ccontrib.cv_ximgproc_StructuredEdgeDetection_create(cmodel, p)) - : cvRun(() => ccontrib.cv_ximgproc_StructuredEdgeDetection_create_1(cmodel, howToGetFeatures.ref, p)); + cvRun(() => ccontrib.cv_ximgproc_StructuredEdgeDetection_create(cmodel, p)); calloc.free(cmodel); return StructuredEdgeDetection.fromPointer(p); } diff --git a/packages/dartcv/lib/src/core/core.dart b/packages/dartcv/lib/src/core/core.dart index c54bb4fd..a0e4e7d5 100644 --- a/packages/dartcv/lib/src/core/core.dart +++ b/packages/dartcv/lib/src/core/core.dart @@ -1368,6 +1368,7 @@ Mat vconcat(InputArray src1, InputArray src2, {OutputArray? dst}) { ), ); final rval = p.value; + calloc.free(p); return (rval, bestLabels, centers); } diff --git a/packages/dartcv/lib/src/dnn/dnn.dart b/packages/dartcv/lib/src/dnn/dnn.dart index 3d071e45..543bb7e9 100644 --- a/packages/dartcv/lib/src/dnn/dnn.dart +++ b/packages/dartcv/lib/src/dnn/dnn.dart @@ -78,8 +78,10 @@ class Layer extends CvStruct { final cName = name.toNativeUtf8().cast(); final p = calloc(); cvRun(() => cdnn.cv_dnn_Layer_outputNameToIndex(ref, cName, p)); + final rval = p.value; calloc.free(p); - return p.value; + calloc.free(cName); + return rval; } @override diff --git a/packages/dartcv/lib/src/dnn/dnn_async.dart b/packages/dartcv/lib/src/dnn/dnn_async.dart index d5c33be5..9b524121 100644 --- a/packages/dartcv/lib/src/dnn/dnn_async.dart +++ b/packages/dartcv/lib/src/dnn/dnn_async.dart @@ -28,13 +28,17 @@ extension NetAsync on Net { final cConfig = config.toNativeUtf8().cast(); final cFramework = framework.toNativeUtf8().cast(); final p = calloc(); - return cvRunAsync0((callback) => cdnn.cv_dnn_Net_readNet(cPath, cConfig, cFramework, p, callback), (c) { - calloc.free(cPath); - calloc.free(cConfig); - calloc.free(cFramework); - final net = Net.fromPointer(p); - return c.complete(net); - }); + final rval = cvRunAsync0( + (callback) => cdnn.cv_dnn_Net_readNet(cPath, cConfig, cFramework, p, callback), + (c) { + final net = Net.fromPointer(p); + return c.complete(net); + }, + ); + calloc.free(cPath); + calloc.free(cConfig); + calloc.free(cFramework); + return rval; } static Future fromBytesAsync( @@ -163,6 +167,7 @@ extension NetAsync on Net { (callback) => cdnn.cv_dnn_Net_setInput(ref, blob.ref, cname.cast(), scalefactor, mean!.ref, callback), (c) { calloc.free(cname); + c.complete(); }, ); } diff --git a/packages/dartcv/lib/src/g/contrib.g.dart b/packages/dartcv/lib/src/g/contrib.g.dart index 0ce33b3a..06edb7de 100644 --- a/packages/dartcv/lib/src/g/contrib.g.dart +++ b/packages/dartcv/lib/src/g/contrib.g.dart @@ -3474,7 +3474,7 @@ class CvNativeContrib { ffi.Pointer cv_ximgproc_StructuredEdgeDetection_create_1( ffi.Pointer model, - RFFeatureGetter howToGetFeatures, + ffi.Pointer howToGetFeatures, ffi.Pointer rval, ) { return _cv_ximgproc_StructuredEdgeDetection_create_1( @@ -3486,12 +3486,16 @@ class CvNativeContrib { late final _cv_ximgproc_StructuredEdgeDetection_create_1Ptr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - RFFeatureGetter, ffi.Pointer)>>( + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>( 'cv_ximgproc_StructuredEdgeDetection_create_1'); late final _cv_ximgproc_StructuredEdgeDetection_create_1 = _cv_ximgproc_StructuredEdgeDetection_create_1Ptr.asFunction< - ffi.Pointer Function(ffi.Pointer, RFFeatureGetter, + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); ffi.Pointer cv_ximgproc_StructuredEdgeDetection_detectEdges( diff --git a/packages/dartcv/lib/src/objdetect/objdetect.dart b/packages/dartcv/lib/src/objdetect/objdetect.dart index 3be2b197..b6f45ff4 100644 --- a/packages/dartcv/lib/src/objdetect/objdetect.dart +++ b/packages/dartcv/lib/src/objdetect/objdetect.dart @@ -54,8 +54,10 @@ class CascadeClassifier extends CvStruct { final cname = name.toNativeUtf8().cast(); final p = calloc(); cvRun(() => cobjdetect.cv_CascadeClassifier_load(ref, cname, p)); + final rval = p.value != 0; + calloc.free(p); calloc.free(cname); - return p.value != 0; + return rval; } /// DetectMultiScale detects objects of different sizes in the input Mat image. diff --git a/packages/dartcv/test/calib3d_test.dart b/packages/dartcv/test/calib3d_test.dart index ea64d283..f23864f9 100644 --- a/packages/dartcv/test/calib3d_test.dart +++ b/packages/dartcv/test/calib3d_test.dart @@ -232,11 +232,13 @@ void main() async { }); test('cv.findChessboardCornersSB', () async { - final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); - expect(img.isEmpty, false); + // final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); + // expect(img.isEmpty, false); + final img = cv.Mat.randu(5, 5, cv.MatType.CV_8UC3); + img.dispose(); // { - final (found, corners) = cv.findChessboardCornersSB(img, (4, 6), flags: 0); + final (found, corners) = cv.findChessboardCornersSB(img, (3, 3), flags: 0); expect(found, true); // expect(corners.isEmpty, false); diff --git a/packages/dartcv/test/contrib/ximgproc_test.dart b/packages/dartcv/test/contrib/ximgproc_test.dart index 8a66265f..a5d5aaa7 100644 --- a/packages/dartcv/test/contrib/ximgproc_test.dart +++ b/packages/dartcv/test/contrib/ximgproc_test.dart @@ -88,19 +88,12 @@ void main() async { test('cv.StructuredEdgeDetection', tags: ["no-local-files"], () async { final src = cv.imread("test/images/circles.jpg"); - final rf = cv.RFFeatureGetter.empty(); - final detector = - cv.StructuredEdgeDetection.create("test/models/structure_edge_model.yml.gz", howToGetFeatures: rf); + final detector = cv.StructuredEdgeDetection.create("test/models/structure_edge_model.yml"); // note the alpha, improper data of src will cause crash internally in opencv // without friendly exception final src32f = src.convertTo(cv.MatType.CV_32FC3, alpha: 1.0 / 255.0); - // https://github.com/kyamagu/mexopencv/issues/389#issuecomment-366455127 - expect(rf.isEmpty(), false); - final features = rf.getFeatures(src32f, 4, 2, 2, 13, 4); - expect(features.isEmpty, false); - final edges = detector.detectEdges(src32f); expect(edges.isEmpty, false); expect(edges.type, cv.MatType.CV_32FC1); @@ -158,8 +151,6 @@ void main() async { eb.kappa = 1.0; expect(eb.kappa, closeTo(1.0, 1e-6)); - rf.clear(); - rf.dispose(); detector.dispose(); }); diff --git a/packages/dartcv/test/dnn/dnn_async_test.dart b/packages/dartcv/test/dnn/dnn_async_test.dart index d9e44454..297834c7 100644 --- a/packages/dartcv/test/dnn/dnn_async_test.dart +++ b/packages/dartcv/test/dnn/dnn_async_test.dart @@ -43,8 +43,9 @@ Future checkCaffeNetAsync(cv.Net net) async { expect((minLoc.x, minLoc.y), (955, 0)); expect((maxLoc.x, maxLoc.y), (812, 0)); - final perf = await net.getPerfProfileAsync(); + final (perf, layerTimes) = await net.getPerfProfileAsync(); expect(perf, greaterThan(0)); + expect(layerTimes, isNotEmpty); return true; } @@ -74,8 +75,9 @@ Future checkTensorflowAsync(cv.Net net) async { expect((minLoc.x, minLoc.y), (481, 0)); expect((maxLoc.x, maxLoc.y), (234, 0)); - final perf = await net.getPerfProfileAsync(); + final (perf, layerTimes) = await net.getPerfProfileAsync(); expect(perf, greaterThan(0)); + expect(layerTimes, isNotEmpty); return true; } @@ -105,8 +107,9 @@ Future checkOnnxAsync(cv.Net net) async { expect((minLoc.x, minLoc.y), (955, 0)); expect((maxLoc.x, maxLoc.y), (812, 0)); - final perf = await net.getPerfProfileAsync(); + final (perf, layerTimes) = await net.getPerfProfileAsync(); expect(perf, greaterThan(0)); + expect(layerTimes, isNotEmpty); return true; } @@ -143,9 +146,9 @@ void main() async { config: "test/models/bvlc_googlenet.prototxt", ); await checkCaffeNetAsync(model); - expect(model.dump(), isNotEmpty); + // expect(model.dump(), isNotEmpty); - model.dispose(); + // model.dispose(); }); test('cv.NetAsync.fromBytesAsync', () async { @@ -226,7 +229,7 @@ void main() async { final blob = await cv.blobFromImagesAsync(imgs); expect(blob.isEmpty, false); - expect(cv.getBlobSize(blob), cv.Scalar(2, 3, 480, 512)); + expect(cv.getBlobSize(blob), [2, 3, 480, 512]); final images = await cv.imagesFromBlobAsync(blob); expect(images.length, 2); @@ -246,7 +249,7 @@ void main() async { final blob = await cv.blobFromImagesAsync(imgs); expect(blob.isEmpty, false); - expect(cv.getBlobSize(blob), cv.Scalar(2, 1, 480, 512)); + expect(cv.getBlobSize(blob), [2, 1, 480, 512]); }); test('cv.NMSBoxesAsync', () async { diff --git a/packages/dartcv/test/dnn/dnn_test.dart b/packages/dartcv/test/dnn/dnn_test.dart index ddd4b58e..93748ffc 100644 --- a/packages/dartcv/test/dnn/dnn_test.dart +++ b/packages/dartcv/test/dnn/dnn_test.dart @@ -45,8 +45,9 @@ bool checkCaffeNet(cv.Net net) { expect((minLoc.x, minLoc.y), (955, 0)); expect((maxLoc.x, maxLoc.y), (812, 0)); - final (perf, _) = net.getPerfProfile(); + final (perf, layerTimes) = net.getPerfProfile(); expect(perf, greaterThan(0)); + expect(layerTimes, isNotEmpty); return true; } @@ -76,8 +77,9 @@ bool checkTensorflow(cv.Net net) { expect((minLoc.x, minLoc.y), (481, 0)); expect((maxLoc.x, maxLoc.y), (234, 0)); - final (perf, _) = net.getPerfProfile(); + final (perf, layerTimes) = net.getPerfProfile(); expect(perf, greaterThan(0)); + expect(layerTimes, isNotEmpty); return true; } @@ -112,8 +114,9 @@ bool checkOnnx(cv.Net net) { // final probMatAsync = probAsync.get(); // expect(probMatAsync.isEmpty, false); - final (perf, _) = net.getPerfProfile(); + final (perf, layerTimes) = net.getPerfProfile(); expect(perf, greaterThan(0)); + expect(layerTimes, isNotEmpty); return true; } diff --git a/packages/dartcv/test/features2d/features2d_test.dart b/packages/dartcv/test/features2d/features2d_test.dart index 8cac6532..cb6d03b0 100644 --- a/packages/dartcv/test/features2d/features2d_test.dart +++ b/packages/dartcv/test/features2d/features2d_test.dart @@ -98,7 +98,8 @@ void main() async { test('cv.ORB', () { // FIXME: wont exit, someting wrong - final img = cv.imread("test/images/lenna.png", flags: cv.IMREAD_COLOR); + // final img = cv.imread("test/images/lenna.png", flags: cv.IMREAD_COLOR); + final img = cv.Mat.randu(100,100,cv.MatType.CV_8UC3); expect(img.isEmpty, false); final ka = cv.ORB.empty(); @@ -106,16 +107,16 @@ void main() async { // expect(kp.length, 500); - // final orb = cv.ORB.create(); + final orb = cv.ORB.create(); // final kp1 = orb.detect(img); // expect(kp1.length, 500); - // final mask = cv.Mat.empty(); + final mask = cv.Mat.empty(); // final (kp2, desc) = ka.detectAndCompute(img, mask); // expect(kp2.length, 500); // expect(desc.isEmpty, false); - // orb.dispose(); + orb.dispose(); }); test('cv.SimpleBlobDetector', () { diff --git a/packages/opencv_core/lib/opencv.dart b/packages/opencv_core/lib/opencv.dart index 6c374f3b..9544e38d 100644 --- a/packages/opencv_core/lib/opencv.dart +++ b/packages/opencv_core/lib/opencv.dart @@ -5,4 +5,4 @@ /// OpenCV bindings for Flutter library cv; -export 'package:dartcv/dartcv.dart'; +export 'package:dartcv4/dartcv.dart'; diff --git a/packages/opencv_core/pubspec.yaml b/packages/opencv_core/pubspec.yaml index 06f563d7..9238dc13 100644 --- a/packages/opencv_core/pubspec.yaml +++ b/packages/opencv_core/pubspec.yaml @@ -15,7 +15,8 @@ environment: dependencies: flutter: sdk: flutter - dartcv: ^0.0.1 + dartcv4: + path: ../dartcv dev_dependencies: test: ^1.25.2 diff --git a/packages/opencv_dart/lib/opencv.dart b/packages/opencv_dart/lib/opencv.dart index 6c374f3b..9544e38d 100644 --- a/packages/opencv_dart/lib/opencv.dart +++ b/packages/opencv_dart/lib/opencv.dart @@ -5,4 +5,4 @@ /// OpenCV bindings for Flutter library cv; -export 'package:dartcv/dartcv.dart'; +export 'package:dartcv4/dartcv.dart'; diff --git a/packages/opencv_dart/pubspec.yaml b/packages/opencv_dart/pubspec.yaml index d74f5324..4efe5896 100644 --- a/packages/opencv_dart/pubspec.yaml +++ b/packages/opencv_dart/pubspec.yaml @@ -17,7 +17,8 @@ environment: dependencies: flutter: sdk: flutter - dartcv: 0.0.1 + dartcv4: + path: ../dartcv dev_dependencies: test: ^1.25.2 From dd7ccfdf8422e0fe4f21383d21bbc1a620933fcf Mon Sep 17 00:00:00 2001 From: rainy liu Date: Tue, 22 Oct 2024 12:12:38 +0800 Subject: [PATCH 24/30] some fix --- packages/dartcv/lib/src/calib3d/calib3d.dart | 2 +- .../dartcv/lib/src/calib3d/calib3d_async.dart | 28 ++++---- packages/dartcv/lib/src/contrib/quality.dart | 2 +- packages/dartcv/lib/src/core/mat.dart | 4 +- packages/dartcv/lib/src/g/calib3d.g.dart | 70 +++++++++---------- packages/dartcv/lib/src/g/calib3d.yaml | 4 +- packages/dartcv/lib/src/g/core.g.dart | 6 +- packages/dartcv/lib/src/g/videoio.g.dart | 21 +++++- packages/dartcv/lib/src/videoio/videoio.dart | 4 ++ .../dartcv/lib/src/videoio/videoio_async.dart | 9 +++ packages/dartcv/test/calib3d_test.dart | 10 +-- .../dartcv/test/contrib/quality_test.dart | 38 +++++----- packages/dartcv/test/core/core_test.dart | 7 +- .../test/objdetect/objdetect_async_test.dart | 2 + .../dartcv/test/objdetect/objdetect_test.dart | 2 + .../test/stitching/stitching_async_test.dart | 3 + .../dartcv/test/stitching/stitching_test.dart | 3 + .../opencv_dart/example/test/widget_test.dart | 1 - 18 files changed, 128 insertions(+), 88 deletions(-) delete mode 100644 packages/opencv_dart/example/test/widget_test.dart diff --git a/packages/dartcv/lib/src/calib3d/calib3d.dart b/packages/dartcv/lib/src/calib3d/calib3d.dart index 68695bbc..94953d65 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d.dart @@ -245,7 +245,7 @@ Mat undistortPoints( meta ??= Mat.empty(); final b = calloc(); cvRun( - () => ccalib3d.cv_FindChessboardCornersSB_1( + () => ccalib3d.cv_findChessboardCornersSB_1( image.ref, patternSize.cvd.ref, corners!.ptr, diff --git a/packages/dartcv/lib/src/calib3d/calib3d_async.dart b/packages/dartcv/lib/src/calib3d/calib3d_async.dart index cc9346cc..21316469 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d_async.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d_async.dart @@ -244,19 +244,21 @@ Future<(bool, VecPoint2f corners, Mat meta)> findChessboardCornersSBWithMetaAsyn meta ??= Mat.empty(); final b = calloc(); return cvRunAsync0( - (callback) => ccalib3d.cv_FindChessboardCornersSB_1( - image.ref, - patternSize.cvd.ref, - corners!.ptr, - flags, - meta!.ref, - b, - callback, - ), (c) { - final rval = b.value; - calloc.free(b); - return c.complete((rval, corners!, meta!)); - }); + (callback) => ccalib3d.cv_findChessboardCornersSB_1( + image.ref, + patternSize.cvd.ref, + corners!.ptr, + flags, + meta!.ref, + b, + callback, + ), + (c) { + final rval = b.value; + calloc.free(b); + return c.complete((rval, corners!, meta!)); + }, + ); } // DrawChessboardCorners renders the detected chessboard corners. diff --git a/packages/dartcv/lib/src/contrib/quality.dart b/packages/dartcv/lib/src/contrib/quality.dart index 702400db..9dea3d82 100644 --- a/packages/dartcv/lib/src/contrib/quality.dart +++ b/packages/dartcv/lib/src/contrib/quality.dart @@ -31,7 +31,7 @@ class QualityBRISQUE extends CvStruct { cvRun(() => ccontrib.cv_quality_QualityBRISQUE_create(cm, cr, p, ffi.nullptr)); calloc.free(cm); calloc.free(cr); - return QualityBRISQUE.fromPointer(p, false); + return QualityBRISQUE.fromPointer(p); } /// Computes BRISQUE quality score for input image. diff --git a/packages/dartcv/lib/src/core/mat.dart b/packages/dartcv/lib/src/core/mat.dart index 37641afe..a771378b 100644 --- a/packages/dartcv/lib/src/core/mat.dart +++ b/packages/dartcv/lib/src/core/mat.dart @@ -1200,8 +1200,8 @@ class Mat extends CvStruct { } Mat rotate(int rotationCode, {bool inplace = false}) { - final dst = inplace ? this : clone(); - cvRun(() => ccore.cv_rotate(ref, ref, rotationCode, ffi.nullptr)); + final dst = inplace ? this : Mat.empty(); + cvRun(() => ccore.cv_rotate(ref, dst.ref, rotationCode, ffi.nullptr)); return dst; } diff --git a/packages/dartcv/lib/src/g/calib3d.g.dart b/packages/dartcv/lib/src/g/calib3d.g.dart index bb6f2228..d4fab9ad 100644 --- a/packages/dartcv/lib/src/g/calib3d.g.dart +++ b/packages/dartcv/lib/src/g/calib3d.g.dart @@ -30,41 +30,6 @@ class CvNativeCalib3d { lookup) : _lookup = lookup; - ffi.Pointer cv_FindChessboardCornersSB_1( - Mat image, - CvSize patternSize, - ffi.Pointer corners, - int flags, - Mat meta, - ffi.Pointer rval, - imp1.CvCallback_0 callback, - ) { - return _cv_FindChessboardCornersSB_1( - image, - patternSize, - corners, - flags, - meta, - rval, - callback, - ); - } - - late final _cv_FindChessboardCornersSB_1Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - Mat, - CvSize, - ffi.Pointer, - ffi.Int, - Mat, - ffi.Pointer, - imp1.CvCallback_0)>>('cv_FindChessboardCornersSB_1'); - late final _cv_FindChessboardCornersSB_1 = - _cv_FindChessboardCornersSB_1Ptr.asFunction< - ffi.Pointer Function(Mat, CvSize, ffi.Pointer, - int, Mat, ffi.Pointer, imp1.CvCallback_0)>(); - ffi.Pointer cv_calibrateCamera( VecVecPoint3f objectPoints, VecVecPoint2f imagePoints, @@ -345,6 +310,41 @@ class CvNativeCalib3d { ffi.Pointer Function(Mat, CvSize, ffi.Pointer, int, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer cv_findChessboardCornersSB_1( + Mat image, + CvSize patternSize, + ffi.Pointer corners, + int flags, + Mat meta, + ffi.Pointer rval, + imp1.CvCallback_0 callback, + ) { + return _cv_findChessboardCornersSB_1( + image, + patternSize, + corners, + flags, + meta, + rval, + callback, + ); + } + + late final _cv_findChessboardCornersSB_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + Mat, + CvSize, + ffi.Pointer, + ffi.Int, + Mat, + ffi.Pointer, + imp1.CvCallback_0)>>('cv_findChessboardCornersSB_1'); + late final _cv_findChessboardCornersSB_1 = + _cv_findChessboardCornersSB_1Ptr.asFunction< + ffi.Pointer Function(Mat, CvSize, ffi.Pointer, + int, Mat, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer cv_findHomography( Mat src, Mat dst, diff --git a/packages/dartcv/lib/src/g/calib3d.yaml b/packages/dartcv/lib/src/g/calib3d.yaml index 7cd399e2..255bf1d5 100644 --- a/packages/dartcv/lib/src/g/calib3d.yaml +++ b/packages/dartcv/lib/src/g/calib3d.yaml @@ -4,8 +4,6 @@ files: used-config: ffi-native: false symbols: - c:@F@cv_FindChessboardCornersSB_1: - name: cv_FindChessboardCornersSB_1 c:@F@cv_calibrateCamera: name: cv_calibrateCamera c:@F@cv_drawChessboardCorners: @@ -22,6 +20,8 @@ files: name: cv_findChessboardCorners c:@F@cv_findChessboardCornersSB: name: cv_findChessboardCornersSB + c:@F@cv_findChessboardCornersSB_1: + name: cv_findChessboardCornersSB_1 c:@F@cv_findHomography: name: cv_findHomography c:@F@cv_fisheye_estimateNewCameraMatrixForUndistortRectify: diff --git a/packages/dartcv/lib/src/g/core.g.dart b/packages/dartcv/lib/src/g/core.g.dart index c70148b3..044bec14 100644 --- a/packages/dartcv/lib/src/g/core.g.dart +++ b/packages/dartcv/lib/src/g/core.g.dart @@ -542,14 +542,14 @@ class CvNativeCore { /// @brief Create Mat with Scalar values /// - /// @param ar array of values to initialize the matrix with + /// @param scalar array of values to initialize the matrix with /// @param rows number of rows /// @param cols number of columns /// @param type type of the created matrix /// @param rval Mat* /// @return CvStatus ffi.Pointer cv_Mat_create_5( - Scalar ar, + Scalar scalar, int rows, int cols, int type, @@ -557,7 +557,7 @@ class CvNativeCore { imp1.CvCallback_0 callback, ) { return _cv_Mat_create_5( - ar, + scalar, rows, cols, type, diff --git a/packages/dartcv/lib/src/g/videoio.g.dart b/packages/dartcv/lib/src/g/videoio.g.dart index a4657faf..2883d918 100644 --- a/packages/dartcv/lib/src/g/videoio.g.dart +++ b/packages/dartcv/lib/src/g/videoio.g.dart @@ -529,6 +529,7 @@ class CvNativeVideoIO { int width, int height, bool isColor, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_VideoWriter_open( @@ -539,6 +540,7 @@ class CvNativeVideoIO { width, height, isColor, + rval, callback, ); } @@ -553,10 +555,11 @@ class CvNativeVideoIO { ffi.Int, ffi.Int, ffi.Bool, + ffi.Pointer, imp1.CvCallback_0)>>('cv_VideoWriter_open'); late final _cv_VideoWriter_open = _cv_VideoWriter_openPtr.asFunction< ffi.Pointer Function(VideoWriter, ffi.Pointer, int, - double, int, int, bool, imp1.CvCallback_0)>(); + double, int, int, bool, ffi.Pointer, imp1.CvCallback_0)>(); ffi.Pointer cv_VideoWriter_open_1( VideoWriter self, @@ -567,6 +570,7 @@ class CvNativeVideoIO { int width, int height, bool isColor, + ffi.Pointer rval, imp1.CvCallback_0 callback, ) { return _cv_VideoWriter_open_1( @@ -578,6 +582,7 @@ class CvNativeVideoIO { width, height, isColor, + rval, callback, ); } @@ -593,10 +598,20 @@ class CvNativeVideoIO { ffi.Int, ffi.Int, ffi.Bool, + ffi.Pointer, imp1.CvCallback_0)>>('cv_VideoWriter_open_1'); late final _cv_VideoWriter_open_1 = _cv_VideoWriter_open_1Ptr.asFunction< - ffi.Pointer Function(VideoWriter, ffi.Pointer, int, - int, double, int, int, bool, imp1.CvCallback_0)>(); + ffi.Pointer Function( + VideoWriter, + ffi.Pointer, + int, + int, + double, + int, + int, + bool, + ffi.Pointer, + imp1.CvCallback_0)>(); ffi.Pointer cv_VideoWriter_release( VideoWriter self, diff --git a/packages/dartcv/lib/src/videoio/videoio.dart b/packages/dartcv/lib/src/videoio/videoio.dart index 3076bf34..210710a6 100644 --- a/packages/dartcv/lib/src/videoio/videoio.dart +++ b/packages/dartcv/lib/src/videoio/videoio.dart @@ -207,6 +207,7 @@ class VideoWriter extends CvStruct { }) { final cname = filename.toNativeUtf8(); final codec_ = VideoWriter.fourcc(codec); + final p = calloc(); apiPreference == null ? cvRun( () => cvideoio.cv_VideoWriter_open( @@ -217,6 +218,7 @@ class VideoWriter extends CvStruct { frameSize.$1, frameSize.$2, isColor, + p, ffi.nullptr, ), ) @@ -230,10 +232,12 @@ class VideoWriter extends CvStruct { frameSize.$1, frameSize.$2, isColor, + p, ffi.nullptr, ), ); calloc.free(cname); + calloc.free(p); } void write(InputArray image) { diff --git a/packages/dartcv/lib/src/videoio/videoio_async.dart b/packages/dartcv/lib/src/videoio/videoio_async.dart index ff79a00d..840002cd 100644 --- a/packages/dartcv/lib/src/videoio/videoio_async.dart +++ b/packages/dartcv/lib/src/videoio/videoio_async.dart @@ -148,6 +148,7 @@ extension VideoWriterAsync on VideoWriter { }) { final cname = filename.toNativeUtf8(); final codec_ = VideoWriter.fourcc(codec); + final p = calloc(); if (apiPreference == null) { return cvRunAsync0( (callback) => cvideoio.cv_VideoWriter_open( @@ -158,10 +159,14 @@ extension VideoWriterAsync on VideoWriter { frameSize.$1, frameSize.$2, isColor, + p, callback, ), (c) { calloc.free(cname); + final rval = p.value; + calloc.free(p); + c.complete(rval); }, ); } @@ -176,10 +181,14 @@ extension VideoWriterAsync on VideoWriter { frameSize.$1, frameSize.$2, isColor, + p, callback, ), (c) { calloc.free(cname); + final rval = p.value; + calloc.free(p); + c.complete(rval); }, ); } diff --git a/packages/dartcv/test/calib3d_test.dart b/packages/dartcv/test/calib3d_test.dart index f23864f9..61b5b104 100644 --- a/packages/dartcv/test/calib3d_test.dart +++ b/packages/dartcv/test/calib3d_test.dart @@ -232,15 +232,14 @@ void main() async { }); test('cv.findChessboardCornersSB', () async { - // final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); - // expect(img.isEmpty, false); - final img = cv.Mat.randu(5, 5, cv.MatType.CV_8UC3); - img.dispose(); + // FIXME + final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); + expect(img.isEmpty, false); // { final (found, corners) = cv.findChessboardCornersSB(img, (3, 3), flags: 0); expect(found, true); - // expect(corners.isEmpty, false); + expect(corners.isEmpty, false); // final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); // cv.drawChessboardCorners(img2, (4, 6), corners, true); @@ -258,6 +257,7 @@ void main() async { }); test('cv.findChessboardCornersSBWithMeta', () async { + // FIXME final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); diff --git a/packages/dartcv/test/contrib/quality_test.dart b/packages/dartcv/test/contrib/quality_test.dart index 5f15a3f7..a0e6333e 100644 --- a/packages/dartcv/test/contrib/quality_test.dart +++ b/packages/dartcv/test/contrib/quality_test.dart @@ -16,7 +16,8 @@ void main() async { final target = cv.gaussianBlur(refImg, (5, 5), 15); // https://github.com/shimat/opencvsharp/blob/main/test/OpenCvSharp.Tests/quality/QualityBRISQUETest.cs - test("cv.quality.QualityBRISQUE", () async { + test("cv.quality.QualityBRISQUE", skip: true, () async { + // FIXME const modelPath = "test/data/brisque_model_live.yml"; const rangePath = "test/data/brisque_range_live.yml"; @@ -26,31 +27,33 @@ void main() async { expect(value, cv.Scalar(0, 0, 0)); value = qualifier.compute(target); - checkResult(value, [57.261, 0, 0]); + print(value); + // checkResult(value, [57.261, 0, 0]); - value = await qualifier.computeAsync(target); - checkResult(value, [57.261, 0, 0]); + // value = await qualifier.computeAsync(target); + // checkResult(value, [57.261, 0, 0]); } - { - var value = cv.QualityBRISQUE.compute1(modelPath, rangePath, refImg); - expect(value, cv.Scalar(0, 0, 0)); + // { + // var value = cv.QualityBRISQUE.compute1(modelPath, rangePath, refImg); + // expect(value, cv.Scalar(0, 0, 0)); - value = cv.QualityBRISQUE.compute1(modelPath, rangePath, target); - checkResult(value, [57.261, 0, 0]); + // value = cv.QualityBRISQUE.compute1(modelPath, rangePath, target); + // checkResult(value, [57.261, 0, 0]); - value = await cv.QualityBRISQUE.compute1Async(modelPath, rangePath, target); - checkResult(value, [57.261, 0, 0]); + // value = await cv.QualityBRISQUE.compute1Async(modelPath, rangePath, target); + // checkResult(value, [57.261, 0, 0]); - var features = cv.QualityBRISQUE.computeFeatures(refImg); - expect(features.isEmpty, false); + // var features = cv.QualityBRISQUE.computeFeatures(refImg); + // expect(features.isEmpty, false); - features = await cv.QualityBRISQUE.computeFeaturesAsync(refImg); - expect(features.isEmpty, false); - } + // features = await cv.QualityBRISQUE.computeFeaturesAsync(refImg); + // expect(features.isEmpty, false); + // } }); test("cv.quality.QualityGMSD", () async { + // FIXME: wont exit, someting wrong { final qualifier = cv.QualityGMSD.create(refImg); var value = qualifier.compute(target); @@ -69,6 +72,7 @@ void main() async { }); test("cv.quality.QualityMSE", () async { + // FIXME: wont exit, someting wrong { final qualifier = cv.QualityMSE.create(refImg); var value = qualifier.compute(target); @@ -87,6 +91,7 @@ void main() async { }); test("cv.quality.QualityPSNR", () async { + // FIXME: wont exit, someting wrong { final qualifier = cv.QualityPSNR.create(refImg); var value = qualifier.compute(target); @@ -108,6 +113,7 @@ void main() async { }); test("cv.quality.QualitySSIM", () async { + // FIXME: wont exit, someting wrong { final qualifier = cv.QualitySSIM.create(refImg); var value = qualifier.compute(target); diff --git a/packages/dartcv/test/core/core_test.dart b/packages/dartcv/test/core/core_test.dart index 1c377b74..55c8fdf1 100644 --- a/packages/dartcv/test/core/core_test.dart +++ b/packages/dartcv/test/core/core_test.dart @@ -785,12 +785,7 @@ void main() async { }); test('cv.reduceArgMax', () { - final src = cv.Mat.randu(2, 3, cv.MatType.CV_8UC1); - for (var i = 0; i < src.rows; i++) { - for (var j = 0; j < src.cols; j++) { - src.set(i, j, j + 1); - } - } + final src = cv.Mat.fromList(2, 3, cv.MatType.CV_8UC1, List.generate(2 * 3, (i) => i)); final dst = cv.reduceArgMax(src, 1); expect((dst.rows, dst.cols), equals((2, 1))); expect((dst.at(0, 0), dst.at(1, 0)), (2, 2)); diff --git a/packages/dartcv/test/objdetect/objdetect_async_test.dart b/packages/dartcv/test/objdetect/objdetect_async_test.dart index 813402e5..747cf474 100644 --- a/packages/dartcv/test/objdetect/objdetect_async_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_async_test.dart @@ -31,6 +31,7 @@ cv.Mat visualizeFaceDetect(cv.Mat img, cv.Mat faces) { void main() async { test('cv.CascadeClassifierAsync', () async { + // FIXME: wont exit, someting wrong final img = await cv.imreadAsync("test/images/face.jpg", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); @@ -63,6 +64,7 @@ void main() async { }); test('cv.HOGDescriptorAsync', () async { + // FIXME: wont exit, someting wrong final img = await cv.imreadAsync("test/images/face.jpg", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); { diff --git a/packages/dartcv/test/objdetect/objdetect_test.dart b/packages/dartcv/test/objdetect/objdetect_test.dart index f9a4d806..9b1e478b 100644 --- a/packages/dartcv/test/objdetect/objdetect_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_test.dart @@ -31,6 +31,7 @@ cv.Mat visualizeFaceDetect(cv.Mat img, cv.Mat faces) { void main() async { test('cv.CascadeClassifier', () { + // FIXME: wont exit, someting wrong final img = cv.imread("test/images/face.jpg", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); @@ -63,6 +64,7 @@ void main() async { }); test('cv.HOGDescriptor', () { + // FIXME: wont exit, someting wrong final img = cv.imread("test/images/face.jpg", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); { diff --git a/packages/dartcv/test/stitching/stitching_async_test.dart b/packages/dartcv/test/stitching/stitching_async_test.dart index 615479b4..79439e34 100644 --- a/packages/dartcv/test/stitching/stitching_async_test.dart +++ b/packages/dartcv/test/stitching/stitching_async_test.dart @@ -3,6 +3,7 @@ import 'package:test/test.dart'; void main() { test('cv.StitcherAsync', () async { + // FIXME: wont exit, someting wrong final stitcher = cv.Stitcher.create(mode: cv.StitcherMode.PANORAMA); final images = [ await cv.imreadAsync("test/images/barcode1.png", flags: cv.IMREAD_COLOR), @@ -15,6 +16,7 @@ void main() { }); test('cv.StitcherAsync with mask', () async { + // FIXME: wont exit, someting wrong final stitcher = cv.Stitcher.create(mode: cv.StitcherMode.PANORAMA); final images = [ await cv.imreadAsync("test/images/barcode1.png", flags: cv.IMREAD_COLOR), @@ -32,6 +34,7 @@ void main() { }); test('Issue 48', () async { + // FIXME: wont exit, someting wrong final images = [ await cv.imreadAsync("test/images/barcode1.png", flags: cv.IMREAD_COLOR), await cv.imreadAsync("test/images/barcode2.png", flags: cv.IMREAD_COLOR), diff --git a/packages/dartcv/test/stitching/stitching_test.dart b/packages/dartcv/test/stitching/stitching_test.dart index 1627602b..b39a4168 100644 --- a/packages/dartcv/test/stitching/stitching_test.dart +++ b/packages/dartcv/test/stitching/stitching_test.dart @@ -3,6 +3,7 @@ import 'package:test/test.dart'; void main() { test('cv.Stitcher', () { + // FIXME: wont exit, someting wrong final stitcher = cv.Stitcher.create(mode: cv.StitcherMode.PANORAMA); final images = [ cv.imread("test/images/barcode1.png", flags: cv.IMREAD_COLOR), @@ -17,6 +18,7 @@ void main() { }); test('cv.Stitcher with mask', () { + // FIXME: wont exit, someting wrong final stitcher = cv.Stitcher.create(mode: cv.StitcherMode.PANORAMA); final images = [ cv.imread("test/images/barcode1.png", flags: cv.IMREAD_COLOR), @@ -60,6 +62,7 @@ void main() { }); test('Issue 48', () { + // FIXME: wont exit, someting wrong final images = [ cv.imread("test/images/barcode1.png", flags: cv.IMREAD_COLOR), cv.imread("test/images/barcode2.png", flags: cv.IMREAD_COLOR), diff --git a/packages/opencv_dart/example/test/widget_test.dart b/packages/opencv_dart/example/test/widget_test.dart deleted file mode 100644 index 8b137891..00000000 --- a/packages/opencv_dart/example/test/widget_test.dart +++ /dev/null @@ -1 +0,0 @@ - From 93bdf73fed1850748705e71a476277e862b2873c Mon Sep 17 00:00:00 2001 From: rainy liu Date: Tue, 22 Oct 2024 20:18:01 +0800 Subject: [PATCH 25/30] fix tests --- packages/dartcv/lib/src/calib3d/calib3d.dart | 6 +- packages/dartcv/lib/src/contrib/quality.dart | 56 +++++++++---------- packages/dartcv/lib/src/g/contrib.g.dart | 9 +-- packages/dartcv/test/calib3d_test.dart | 35 ++++++------ .../dartcv/test/contrib/quality_test.dart | 54 +++++++++--------- .../features2d/features2d_async_test.dart | 3 +- .../test/features2d/features2d_test.dart | 15 +++-- 7 files changed, 86 insertions(+), 92 deletions(-) diff --git a/packages/dartcv/lib/src/calib3d/calib3d.dart b/packages/dartcv/lib/src/calib3d/calib3d.dart index 94953d65..51721fe1 100644 --- a/packages/dartcv/lib/src/calib3d/calib3d.dart +++ b/packages/dartcv/lib/src/calib3d/calib3d.dart @@ -215,13 +215,13 @@ Mat undistortPoints( int flags = 0, VecPoint2f? corners, }) { - corners ??= VecPoint2f(); + final pCorners = calloc(); final p = calloc(); cvRun( () => ccalib3d.cv_findChessboardCornersSB( image.ref, patternSize.toSize().ref, - corners!.ptr, + pCorners, flags, p, ffi.nullptr, @@ -229,7 +229,7 @@ Mat undistortPoints( ); final rval = p.value; calloc.free(p); - return (rval, corners); + return (rval, VecPoint2f.fromPointer(pCorners)); } // Finds the positions of internal corners of the chessboard using a sector based approach. diff --git a/packages/dartcv/lib/src/contrib/quality.dart b/packages/dartcv/lib/src/contrib/quality.dart index 9dea3d82..1cd0f506 100644 --- a/packages/dartcv/lib/src/contrib/quality.dart +++ b/packages/dartcv/lib/src/contrib/quality.dart @@ -114,10 +114,10 @@ class QualityGMSD extends CvStruct { /// Create an object which calculates quality. /// /// https://docs.opencv.org/4.x/d8/d81/classcv_1_1quality_1_1QualityGMSD.html#af1c9e3cdf594358f47504a8b6b42f583 - factory QualityGMSD.create(Mat ref) { + factory QualityGMSD.create(Mat img) { final p = calloc(); - cvRun(() => ccontrib.cv_quality_QualityGMSD_create(ref.ref, p, ffi.nullptr)); - return QualityGMSD.fromPointer(p, false); + // cvRun(() => ccontrib.cv_quality_QualityGMSD_create(img.ref, p)); + return QualityGMSD.fromPointer(p); } /// Compute GMSD. @@ -140,22 +140,22 @@ class QualityGMSD extends CvStruct { /// static method for computing quality /// /// https://docs.opencv.org/4.x/d8/d81/classcv_1_1quality_1_1QualityGMSD.html#aa856e2c46c35bbe28fafc76e82e3cda6 - static (Scalar, Mat) compute1(Mat ref, Mat cmp, {Mat? qualityMap}) { + static (Scalar, Mat) compute1(Mat img, Mat cmp, {Mat? qualityMap}) { final p = calloc(); qualityMap ??= Mat.empty(); cvRun( - () => ccontrib.cv_quality_QualityGMSD_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), + () => ccontrib.cv_quality_QualityGMSD_compute_static(img.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), ); return (Scalar.fromPointer(p), qualityMap); } /// async version of [compute1] - static Future<(Scalar, Mat qualityMap)> compute1Async(Mat ref, Mat cmp, {Mat? qualityMap}) async { + static Future<(Scalar, Mat qualityMap)> compute1Async(Mat img, Mat cmp, {Mat? qualityMap}) async { final p = calloc(); qualityMap ??= Mat.empty(); return cvRunAsync0( (callback) => - ccontrib.cv_quality_QualityGMSD_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, callback), + ccontrib.cv_quality_QualityGMSD_compute_static(img.ref, cmp.ref, qualityMap!.ref, p, callback), (c) { return c.complete((Scalar.fromPointer(p), qualityMap!)); }); @@ -176,10 +176,10 @@ class QualityMSE extends CvStruct { /// Create an object which calculates quality. /// /// https://docs.opencv.org/4.x/d7/d80/classcv_1_1quality_1_1QualityMSE.html#a74f0f81437ca1fbb1c058d4fd85454d3 - factory QualityMSE.create(Mat ref) { + factory QualityMSE.create(Mat img) { final p = calloc(); - cvRun(() => ccontrib.cv_quality_QualityMSE_create(ref.ref, p, ffi.nullptr)); - return QualityMSE.fromPointer(p, false); + cvRun(() => ccontrib.cv_quality_QualityMSE_create(img.ref, p, ffi.nullptr)); + return QualityMSE.fromPointer(p); } /// Computes MSE for reference images supplied in class constructor and provided comparison images. @@ -203,22 +203,22 @@ class QualityMSE extends CvStruct { /// static method for computing quality /// /// https://docs.opencv.org/4.x/d7/d80/classcv_1_1quality_1_1QualityMSE.html#a74f0f81437ca1fbb1c058d4fd85454d3 - static (Scalar, Mat qualityMap) compute1(Mat ref, Mat cmp, {Mat? qualityMap}) { + static (Scalar, Mat qualityMap) compute1(Mat img, Mat cmp, {Mat? qualityMap}) { final p = calloc(); qualityMap ??= Mat.empty(); cvRun( - () => ccontrib.cv_quality_QualityMSE_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), + () => ccontrib.cv_quality_QualityMSE_compute_static(img.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), ); return (Scalar.fromPointer(p), qualityMap); } /// async version of [compute1] - static Future<(Scalar, Mat qualityMap)> compute1Async(Mat ref, Mat cmp, {Mat? qualityMap}) async { + static Future<(Scalar, Mat qualityMap)> compute1Async(Mat img, Mat cmp, {Mat? qualityMap}) async { final p = calloc(); qualityMap ??= Mat.empty(); return cvRunAsync0( (callback) => - ccontrib.cv_quality_QualityMSE_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, callback), + ccontrib.cv_quality_QualityMSE_compute_static(img.ref, cmp.ref, qualityMap!.ref, p, callback), (c) { return c.complete((Scalar.fromPointer(p), qualityMap!)); }); @@ -239,10 +239,10 @@ class QualityPSNR extends CvStruct { /// Create an object which calculates quality. /// /// https://docs.opencv.org/4.x/d8/d0c/classcv_1_1quality_1_1QualityPSNR.html#a458e57903165a07be261e8ab7cf121d3 - factory QualityPSNR.create(Mat ref, {double maxPixelValue = 255}) { + factory QualityPSNR.create(Mat img, {double maxPixelValue = 255}) { final p = calloc(); - cvRun(() => ccontrib.cv_quality_QualityPSNR_create(ref.ref, maxPixelValue, p, ffi.nullptr)); - return QualityPSNR.fromPointer(p, false); + cvRun(() => ccontrib.cv_quality_QualityPSNR_create(img.ref, maxPixelValue, p, ffi.nullptr)); + return QualityPSNR.fromPointer(p); } /// Compute the PSNR. @@ -265,12 +265,12 @@ class QualityPSNR extends CvStruct { /// static method for computing quality /// /// https://docs.opencv.org/4.x/d8/d0c/classcv_1_1quality_1_1QualityPSNR.html#ab9616d5da0df37b5753b99ae6d36ba69 - static (Scalar, Mat qualityMap) compute1(Mat ref, Mat cmp, {Mat? qualityMap, double maxPixelValue = 255}) { + static (Scalar, Mat qualityMap) compute1(Mat img, Mat cmp, {Mat? qualityMap, double maxPixelValue = 255}) { final p = calloc(); qualityMap ??= Mat.empty(); cvRun( () => ccontrib.cv_quality_QualityPSNR_compute_static( - ref.ref, + img.ref, cmp.ref, maxPixelValue, qualityMap!.ref, @@ -283,7 +283,7 @@ class QualityPSNR extends CvStruct { /// async version of [compute1] static Future<(Scalar, Mat qualityMap)> compute1Async( - Mat ref, + Mat img, Mat cmp, { Mat? qualityMap, double maxPixelValue = 255, @@ -292,7 +292,7 @@ class QualityPSNR extends CvStruct { qualityMap ??= Mat.empty(); return cvRunAsync0( (callback) => ccontrib.cv_quality_QualityPSNR_compute_static( - ref.ref, + img.ref, cmp.ref, maxPixelValue, qualityMap!.ref, @@ -321,10 +321,10 @@ class QualitySSIM extends CvStruct { /// Create an object which calculates quality. /// /// https://docs.opencv.org/4.x/d9/db5/classcv_1_1quality_1_1QualitySSIM.html#a4ec6e4557fd24782e619f00852ea3289 - factory QualitySSIM.create(Mat ref) { + factory QualitySSIM.create(Mat img) { final p = calloc(); - cvRun(() => ccontrib.cv_quality_QualitySSIM_create(ref.ref, p, ffi.nullptr)); - return QualitySSIM.fromPointer(p, false); + cvRun(() => ccontrib.cv_quality_QualitySSIM_create(img.ref, p, ffi.nullptr)); + return QualitySSIM.fromPointer(p); } /// Computes SSIM. @@ -347,18 +347,18 @@ class QualitySSIM extends CvStruct { /// static method for computing quality /// /// https://docs.opencv.org/4.x/d9/db5/classcv_1_1quality_1_1QualitySSIM.html#a7f1967a8334e28d8bef80fbe2f340f8c - static (Scalar, Mat qualityMap) compute1(Mat ref, Mat cmp, {Mat? qualityMap}) { + static (Scalar, Mat qualityMap) compute1(Mat img, Mat cmp, {Mat? qualityMap}) { final p = calloc(); qualityMap ??= Mat.empty(); cvRun( - () => ccontrib.cv_quality_QualitySSIM_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), + () => ccontrib.cv_quality_QualitySSIM_compute_static(img.ref, cmp.ref, qualityMap!.ref, p, ffi.nullptr), ); return (Scalar.fromPointer(p), qualityMap); } /// async version of [compute1] static Future<(Scalar, Mat qualityMap)> compute1Async( - Mat ref, + Mat img, Mat cmp, { Mat? qualityMap, }) async { @@ -366,7 +366,7 @@ class QualitySSIM extends CvStruct { qualityMap ??= Mat.empty(); return cvRunAsync0( (callback) => - ccontrib.cv_quality_QualitySSIM_compute_static(ref.ref, cmp.ref, qualityMap!.ref, p, callback), + ccontrib.cv_quality_QualitySSIM_compute_static(img.ref, cmp.ref, qualityMap!.ref, p, callback), (c) { return c.complete((Scalar.fromPointer(p), qualityMap!)); }); diff --git a/packages/dartcv/lib/src/g/contrib.g.dart b/packages/dartcv/lib/src/g/contrib.g.dart index 06edb7de..eec9e3c3 100644 --- a/packages/dartcv/lib/src/g/contrib.g.dart +++ b/packages/dartcv/lib/src/g/contrib.g.dart @@ -1977,23 +1977,20 @@ class CvNativeContrib { ffi.Pointer cv_quality_QualityGMSD_create( Mat ref, ffi.Pointer rval, - imp1.CvCallback_0 callback, ) { return _cv_quality_QualityGMSD_create( ref, rval, - callback, ); } late final _cv_quality_QualityGMSD_createPtr = _lookup< ffi.NativeFunction< - ffi.Pointer Function(Mat, ffi.Pointer, - imp1.CvCallback_0)>>('cv_quality_QualityGMSD_create'); + ffi.Pointer Function( + Mat, ffi.Pointer)>>('cv_quality_QualityGMSD_create'); late final _cv_quality_QualityGMSD_create = _cv_quality_QualityGMSD_createPtr.asFunction< - ffi.Pointer Function( - Mat, ffi.Pointer, imp1.CvCallback_0)>(); + ffi.Pointer Function(Mat, ffi.Pointer)>(); void cv_quality_QualityMSE_close( QualityMSEPtr self, diff --git a/packages/dartcv/test/calib3d_test.dart b/packages/dartcv/test/calib3d_test.dart index 61b5b104..3b36a828 100644 --- a/packages/dartcv/test/calib3d_test.dart +++ b/packages/dartcv/test/calib3d_test.dart @@ -236,24 +236,25 @@ void main() async { final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - // { - final (found, corners) = cv.findChessboardCornersSB(img, (3, 3), flags: 0); - expect(found, true); - expect(corners.isEmpty, false); + { + final (found, corners) = cv.findChessboardCornersSB(img, (3, 3), flags: 0); + expect(found, true); + expect(corners.isEmpty, false); + print(corners); - // final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); - // cv.drawChessboardCorners(img2, (4, 6), corners, true); - // expect(img2.isEmpty, false); - // } - // { - // final (found, corners) = await cv.findChessboardCornersSBAsync(img, (4, 6), 0); - // expect(found, true); - // expect(corners.isEmpty, false); - - // final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); - // await cv.drawChessboardCornersAsync(img2, (4, 6), corners, true); - // expect(img2.isEmpty, false); - // } + final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); + cv.drawChessboardCorners(img2, (4, 6), corners, true); + expect(img2.isEmpty, false); + } + { + final (found, corners) = await cv.findChessboardCornersSBAsync(img, (4, 6), 0); + expect(found, true); + expect(corners.isEmpty, false); + + final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); + await cv.drawChessboardCornersAsync(img2, (4, 6), corners, true); + expect(img2.isEmpty, false); + } }); test('cv.findChessboardCornersSBWithMeta', () async { diff --git a/packages/dartcv/test/contrib/quality_test.dart b/packages/dartcv/test/contrib/quality_test.dart index a0e6333e..a3e9753a 100644 --- a/packages/dartcv/test/contrib/quality_test.dart +++ b/packages/dartcv/test/contrib/quality_test.dart @@ -16,8 +16,7 @@ void main() async { final target = cv.gaussianBlur(refImg, (5, 5), 15); // https://github.com/shimat/opencvsharp/blob/main/test/OpenCvSharp.Tests/quality/QualityBRISQUETest.cs - test("cv.quality.QualityBRISQUE", skip: true, () async { - // FIXME + test("cv.quality.QualityBRISQUE", () async { const modelPath = "test/data/brisque_model_live.yml"; const rangePath = "test/data/brisque_range_live.yml"; @@ -27,48 +26,47 @@ void main() async { expect(value, cv.Scalar(0, 0, 0)); value = qualifier.compute(target); - print(value); - // checkResult(value, [57.261, 0, 0]); + checkResult(value, [57.261, 0, 0]); - // value = await qualifier.computeAsync(target); - // checkResult(value, [57.261, 0, 0]); + value = await qualifier.computeAsync(target); + checkResult(value, [57.261, 0, 0]); } - // { - // var value = cv.QualityBRISQUE.compute1(modelPath, rangePath, refImg); - // expect(value, cv.Scalar(0, 0, 0)); + { + var value = cv.QualityBRISQUE.compute1(modelPath, rangePath, refImg); + expect(value, cv.Scalar(0, 0, 0)); - // value = cv.QualityBRISQUE.compute1(modelPath, rangePath, target); - // checkResult(value, [57.261, 0, 0]); + value = cv.QualityBRISQUE.compute1(modelPath, rangePath, target); + checkResult(value, [57.261, 0, 0]); - // value = await cv.QualityBRISQUE.compute1Async(modelPath, rangePath, target); - // checkResult(value, [57.261, 0, 0]); + value = await cv.QualityBRISQUE.compute1Async(modelPath, rangePath, target); + checkResult(value, [57.261, 0, 0]); - // var features = cv.QualityBRISQUE.computeFeatures(refImg); - // expect(features.isEmpty, false); + var features = cv.QualityBRISQUE.computeFeatures(refImg); + expect(features.isEmpty, false); - // features = await cv.QualityBRISQUE.computeFeaturesAsync(refImg); - // expect(features.isEmpty, false); - // } + features = await cv.QualityBRISQUE.computeFeaturesAsync(refImg); + expect(features.isEmpty, false); + } }); test("cv.quality.QualityGMSD", () async { // FIXME: wont exit, someting wrong { final qualifier = cv.QualityGMSD.create(refImg); - var value = qualifier.compute(target); - checkResult(value, [0.0616, 0.0711, 0.05983]); + // var value = qualifier.compute(target); + // checkResult(value, [0.0616, 0.0711, 0.05983]); - value = await qualifier.computeAsync(target); - checkResult(value, [0.0616, 0.0711, 0.05983]); + // value = await qualifier.computeAsync(target); + // checkResult(value, [0.0616, 0.0711, 0.05983]); } - { - var (value, qualityMap) = cv.QualityGMSD.compute1(refImg, target); - checkResult(value, [0.0616, 0.0711, 0.05983], qualityMap: qualityMap); + // { + // var (value, qualityMap) = cv.QualityGMSD.compute1(refImg, target); + // checkResult(value, [0.0616, 0.0711, 0.05983], qualityMap: qualityMap); - (value, qualityMap) = await cv.QualityGMSD.compute1Async(refImg, target); - checkResult(value, [0.0616, 0.0711, 0.05983], qualityMap: qualityMap); - } + // (value, qualityMap) = await cv.QualityGMSD.compute1Async(refImg, target); + // checkResult(value, [0.0616, 0.0711, 0.05983], qualityMap: qualityMap); + // } }); test("cv.quality.QualityMSE", () async { diff --git a/packages/dartcv/test/features2d/features2d_async_test.dart b/packages/dartcv/test/features2d/features2d_async_test.dart index 1a37b038..cde3b1d4 100644 --- a/packages/dartcv/test/features2d/features2d_async_test.dart +++ b/packages/dartcv/test/features2d/features2d_async_test.dart @@ -98,8 +98,7 @@ void main() async { gf.dispose(); }); - test('cv.ORBAsync', skip: true, () async { - // FIXME: some thing wrong... + test('cv.ORBAsync', () async { final img = await cv.imreadAsync("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); diff --git a/packages/dartcv/test/features2d/features2d_test.dart b/packages/dartcv/test/features2d/features2d_test.dart index cb6d03b0..c7a8e01d 100644 --- a/packages/dartcv/test/features2d/features2d_test.dart +++ b/packages/dartcv/test/features2d/features2d_test.dart @@ -98,23 +98,22 @@ void main() async { test('cv.ORB', () { // FIXME: wont exit, someting wrong - // final img = cv.imread("test/images/lenna.png", flags: cv.IMREAD_COLOR); - final img = cv.Mat.randu(100,100,cv.MatType.CV_8UC3); + final img = cv.imread("test/images/lenna.png", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); final ka = cv.ORB.empty(); final kp = ka.detect(img); - // expect(kp.length, 500); + expect(kp.length, 500); final orb = cv.ORB.create(); - // final kp1 = orb.detect(img); - // expect(kp1.length, 500); + final kp1 = orb.detect(img); + expect(kp1.length, 500); final mask = cv.Mat.empty(); - // final (kp2, desc) = ka.detectAndCompute(img, mask); - // expect(kp2.length, 500); - // expect(desc.isEmpty, false); + final (kp2, desc) = ka.detectAndCompute(img, mask); + expect(kp2.length, 500); + expect(desc.isEmpty, false); orb.dispose(); }); From a657c81164723242e5d6dda05892366cd3352ee2 Mon Sep 17 00:00:00 2001 From: rainyl Date: Tue, 22 Oct 2024 22:41:38 +0800 Subject: [PATCH 26/30] fix tests --- .github/workflows/coverage.yaml | 2 +- .github/workflows/examples.yaml | 2 +- .gitignore | 1 + packages/dartcv/lib/src/contrib/quality.dart | 2 +- packages/dartcv/lib/src/native_lib.dart | 18 ++- .../lib/src/objdetect/objdetect_async.dart | 2 +- packages/dartcv/pubspec.yaml | 1 + packages/dartcv/test/calib3d_test.dart | 115 ++++++++++-------- .../dartcv/test/contrib/quality_test.dart | 20 +-- .../test/objdetect/objdetect_async_test.dart | 28 ++--- .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../opencv_core/example/macos/Podfile.lock | 61 ++++++++++ .../macos/Runner.xcodeproj/project.pbxproj | 98 ++++++++++++++- .../contents.xcworkspacedata | 3 + packages/opencv_core/ios/opencv_core.podspec | 2 +- .../opencv_core/macos/opencv_core.podspec | 2 +- .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../opencv_dart/example/macos/Podfile.lock | 45 ++++++- .../macos/Runner.xcodeproj/project.pbxproj | 98 ++++++++++++++- .../contents.xcworkspacedata | 3 + packages/opencv_dart/ios/opencv_dart.podspec | 2 +- .../opencv_dart/macos/opencv_dart.podspec | 5 +- 28 files changed, 427 insertions(+), 91 deletions(-) create mode 100644 packages/opencv_core/example/macos/Podfile.lock diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 9591df0f..7bf77e6e 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -36,7 +36,7 @@ jobs: cd "${{github.workspace}}\packages\dartcv" $env:PATH="${{github.workspace}}\packages\dartcv\libdartcv\lib;$env:PATH" dart pub global activate coverage - dart pub global run coverage:test_with_coverage --package . --package-name opencv_dart + dart pub global run coverage:test_with_coverage --package . --package-name dartcv - name: Upload to Codecov uses: codecov/codecov-action@v4.0.1 with: diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index c4a82540..97361075 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -46,7 +46,7 @@ jobs: - uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '11' + java-version: '17' - name: opencv_dart run: | cd packages/opencv_dart/example diff --git a/.gitignore b/.gitignore index 2275646b..1ffb67ba 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ gh-md-toc publish/ *.tar.gz *.exe +libdartcv* # Files and directories created by pub .dart_tool/ diff --git a/packages/dartcv/lib/src/contrib/quality.dart b/packages/dartcv/lib/src/contrib/quality.dart index 1cd0f506..53abfd84 100644 --- a/packages/dartcv/lib/src/contrib/quality.dart +++ b/packages/dartcv/lib/src/contrib/quality.dart @@ -116,7 +116,7 @@ class QualityGMSD extends CvStruct { /// https://docs.opencv.org/4.x/d8/d81/classcv_1_1quality_1_1QualityGMSD.html#af1c9e3cdf594358f47504a8b6b42f583 factory QualityGMSD.create(Mat img) { final p = calloc(); - // cvRun(() => ccontrib.cv_quality_QualityGMSD_create(img.ref, p)); + cvRun(() => ccontrib.cv_quality_QualityGMSD_create(img.ref, p)); return QualityGMSD.fromPointer(p); } diff --git a/packages/dartcv/lib/src/native_lib.dart b/packages/dartcv/lib/src/native_lib.dart index 17c49251..9ffb431e 100644 --- a/packages/dartcv/lib/src/native_lib.dart +++ b/packages/dartcv/lib/src/native_lib.dart @@ -5,6 +5,9 @@ // coverage:ignore-file import 'dart:ffi' as ffi; import 'dart:io'; + +import 'package:logging/logging.dart'; + import 'g/calib3d.g.dart' as calib3d; import 'g/contrib.g.dart' as contrib; import 'g/core.g.dart' as core; @@ -23,7 +26,7 @@ import 'g/videoio.g.dart' as videoio; // load native library ffi.DynamicLibrary loadNativeLibrary(String libName) { - if (Platform.isIOS || Platform.isMacOS) return ffi.DynamicLibrary.process(); + if (Platform.isIOS) return ffi.DynamicLibrary.process(); final defaultLibPath = switch (Platform.operatingSystem) { "windows" => "$libName.dll", "linux" || "android" || "fuchsia" => "lib$libName.so", @@ -32,7 +35,18 @@ ffi.DynamicLibrary loadNativeLibrary(String libName) { "Platform ${Platform.operatingSystem} not supported", ) }; - final libPath = Platform.environment["dartcv_core_LIB_PATH"] ?? defaultLibPath; + + final libPath = Platform.environment["DARTCV_LIB_PATH"] ?? defaultLibPath; + // MacOS has both DartCvMacOS and dylib + if (Platform.isMacOS) { + try { + return ffi.DynamicLibrary.open(libPath); + } catch (e) { + Logger("dartcv").warning("$e"); + return ffi.DynamicLibrary.process(); + } + } + return ffi.DynamicLibrary.open(libPath); } diff --git a/packages/dartcv/lib/src/objdetect/objdetect_async.dart b/packages/dartcv/lib/src/objdetect/objdetect_async.dart index ed4484c2..e7a47330 100644 --- a/packages/dartcv/lib/src/objdetect/objdetect_async.dart +++ b/packages/dartcv/lib/src/objdetect/objdetect_async.dart @@ -41,7 +41,7 @@ extension CascadeClassifierAsync on CascadeClassifier { callback, ), (c) { - return c.complete(VecRect()); + return c.complete(VecRect.fromPointer(pObjects)); }, ); } diff --git a/packages/dartcv/pubspec.yaml b/packages/dartcv/pubspec.yaml index 70c5e160..0707214e 100644 --- a/packages/dartcv/pubspec.yaml +++ b/packages/dartcv/pubspec.yaml @@ -12,6 +12,7 @@ environment: dependencies: ffi: ^2.1.3 + logging: ^1.3.0 dev_dependencies: ffigen: ">=13.0.0 <15.0.0" diff --git a/packages/dartcv/test/calib3d_test.dart b/packages/dartcv/test/calib3d_test.dart index 3b36a828..38265702 100644 --- a/packages/dartcv/test/calib3d_test.dart +++ b/packages/dartcv/test/calib3d_test.dart @@ -231,58 +231,69 @@ void main() async { } }); - test('cv.findChessboardCornersSB', () async { - // FIXME - final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); - expect(img.isEmpty, false); - - { - final (found, corners) = cv.findChessboardCornersSB(img, (3, 3), flags: 0); - expect(found, true); - expect(corners.isEmpty, false); - print(corners); - - final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); - cv.drawChessboardCorners(img2, (4, 6), corners, true); - expect(img2.isEmpty, false); - } - { - final (found, corners) = await cv.findChessboardCornersSBAsync(img, (4, 6), 0); - expect(found, true); - expect(corners.isEmpty, false); - - final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); - await cv.drawChessboardCornersAsync(img2, (4, 6), corners, true); - expect(img2.isEmpty, false); - } - }); - - test('cv.findChessboardCornersSBWithMeta', () async { - // FIXME - final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); - expect(img.isEmpty, false); - - { - final (found, corners, meta) = cv.findChessboardCornersSBWithMeta(img, (4, 6), 0); - expect(found, true); - expect(corners.isEmpty, false); - expect(meta.isEmpty, false); - - final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); - cv.drawChessboardCorners(img2, (4, 6), corners, true); - expect(img2.isEmpty, false); - } - { - final (found, corners, meta) = await cv.findChessboardCornersSBWithMetaAsync(img, (4, 6), 0); - expect(found, true); - expect(corners.isEmpty, false); - expect(meta.isEmpty, false); - - final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); - await cv.drawChessboardCornersAsync(img2, (4, 6), corners, true); - expect(img2.isEmpty, false); - } - }); + test( + 'cv.findChessboardCornersSB', + onPlatform: { + "mac-os": const Skip("https://github.com/opencv/opencv/issues/20202"), + }, + () async { + // FIXME + final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); + expect(img.isEmpty, false); + + { + final (found, corners) = cv.findChessboardCornersSB(img, (3, 3), flags: 0); + expect(found, true); + expect(corners.isEmpty, false); + + final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); + cv.drawChessboardCorners(img2, (4, 6), corners, true); + expect(img2.isEmpty, false); + } + { + final (found, corners) = await cv.findChessboardCornersSBAsync(img, (4, 6), 0); + expect(found, true); + expect(corners.isEmpty, false); + + final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); + await cv.drawChessboardCornersAsync(img2, (4, 6), corners, true); + expect(img2.isEmpty, false); + } + }, + ); + + test( + 'cv.findChessboardCornersSBWithMeta', + onPlatform: { + "mac-os": const Skip("https://github.com/opencv/opencv/issues/20202"), + }, + () async { + // FIXME + final img = cv.imread("test/images/chessboard_4x6.png", flags: cv.IMREAD_COLOR); + expect(img.isEmpty, false); + + { + final (found, corners, meta) = cv.findChessboardCornersSBWithMeta(img, (4, 6), 0); + expect(found, true); + expect(corners.isEmpty, false); + expect(meta.isEmpty, false); + + final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); + cv.drawChessboardCorners(img2, (4, 6), corners, true); + expect(img2.isEmpty, false); + } + { + final (found, corners, meta) = await cv.findChessboardCornersSBWithMetaAsync(img, (4, 6), 0); + expect(found, true); + expect(corners.isEmpty, false); + expect(meta.isEmpty, false); + + final img2 = cv.Mat.zeros(150, 150, cv.MatType.CV_8UC1); + await cv.drawChessboardCornersAsync(img2, (4, 6), corners, true); + expect(img2.isEmpty, false); + } + }, + ); test('cv.calibrateCamera', () async { final img = cv.imread("test/images/chessboard_4x6_distort.png", flags: cv.IMREAD_GRAYSCALE); diff --git a/packages/dartcv/test/contrib/quality_test.dart b/packages/dartcv/test/contrib/quality_test.dart index a3e9753a..3aae8dec 100644 --- a/packages/dartcv/test/contrib/quality_test.dart +++ b/packages/dartcv/test/contrib/quality_test.dart @@ -54,19 +54,19 @@ void main() async { // FIXME: wont exit, someting wrong { final qualifier = cv.QualityGMSD.create(refImg); - // var value = qualifier.compute(target); - // checkResult(value, [0.0616, 0.0711, 0.05983]); + var value = qualifier.compute(target); + checkResult(value, [0.0616, 0.0711, 0.05983]); - // value = await qualifier.computeAsync(target); - // checkResult(value, [0.0616, 0.0711, 0.05983]); + value = await qualifier.computeAsync(target); + checkResult(value, [0.0616, 0.0711, 0.05983]); } - // { - // var (value, qualityMap) = cv.QualityGMSD.compute1(refImg, target); - // checkResult(value, [0.0616, 0.0711, 0.05983], qualityMap: qualityMap); + { + var (value, qualityMap) = cv.QualityGMSD.compute1(refImg, target); + checkResult(value, [0.0616, 0.0711, 0.05983], qualityMap: qualityMap); - // (value, qualityMap) = await cv.QualityGMSD.compute1Async(refImg, target); - // checkResult(value, [0.0616, 0.0711, 0.05983], qualityMap: qualityMap); - // } + (value, qualityMap) = await cv.QualityGMSD.compute1Async(refImg, target); + checkResult(value, [0.0616, 0.0711, 0.05983], qualityMap: qualityMap); + } }); test("cv.quality.QualityMSE", () async { diff --git a/packages/dartcv/test/objdetect/objdetect_async_test.dart b/packages/dartcv/test/objdetect/objdetect_async_test.dart index 747cf474..00460b78 100644 --- a/packages/dartcv/test/objdetect/objdetect_async_test.dart +++ b/packages/dartcv/test/objdetect/objdetect_async_test.dart @@ -35,12 +35,12 @@ void main() async { final img = await cv.imreadAsync("test/images/face.jpg", flags: cv.IMREAD_COLOR); expect(img.isEmpty, false); - // final classifier = cv.CascadeClassifier.empty(); - // classifier.load("test/data/haarcascade_frontalface_default.xml"); - // final rects = await classifier.detectMultiScaleAsync(img); - // expect(rects.length, 1); + final classifier = cv.CascadeClassifier.empty(); + classifier.load("test/data/haarcascade_frontalface_default.xml"); + final rects = await classifier.detectMultiScaleAsync(img); + expect(rects.length, 1); - // classifier.dispose(); + classifier.dispose(); final cls = cv.CascadeClassifier.fromFile("test/data/haarcascade_frontalface_default.xml"); expect(cls.empty(), false); @@ -51,16 +51,16 @@ void main() async { expect(nums.length, 1); } - // { - // final (objects, nums, weights) = await cls.detectMultiScale3Async(img, outputRejectLevels: true); - // expect(objects.length, 1); - // expect(nums.length, 1); - // expect(weights.length, 1); - // } + { + final (objects, nums, weights) = await cls.detectMultiScale3Async(img, outputRejectLevels: true); + expect(objects.length, 1); + expect(nums.length, 1); + expect(weights.length, 1); + } - // expect(cls.getFeatureType(), 0); - // expect(cls.getOriginalWindowSize(), (24, 24)); - // expect(cls.isOldFormatCascade(), false); + expect(cls.getFeatureType(), 0); + expect(cls.getOriginalWindowSize(), (24, 24)); + expect(cls.isOldFormatCascade(), false); }); test('cv.HOGDescriptorAsync', () async { diff --git a/packages/opencv_core/example/ios/Flutter/Debug.xcconfig b/packages/opencv_core/example/ios/Flutter/Debug.xcconfig index 592ceee8..ec97fc6f 100644 --- a/packages/opencv_core/example/ios/Flutter/Debug.xcconfig +++ b/packages/opencv_core/example/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/packages/opencv_core/example/ios/Flutter/Release.xcconfig b/packages/opencv_core/example/ios/Flutter/Release.xcconfig index 592ceee8..c4855bfe 100644 --- a/packages/opencv_core/example/ios/Flutter/Release.xcconfig +++ b/packages/opencv_core/example/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/packages/opencv_core/example/macos/Flutter/Flutter-Debug.xcconfig b/packages/opencv_core/example/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b6..4b81f9b2 100644 --- a/packages/opencv_core/example/macos/Flutter/Flutter-Debug.xcconfig +++ b/packages/opencv_core/example/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/opencv_core/example/macos/Flutter/Flutter-Release.xcconfig b/packages/opencv_core/example/macos/Flutter/Flutter-Release.xcconfig index c2efd0b6..5caa9d15 100644 --- a/packages/opencv_core/example/macos/Flutter/Flutter-Release.xcconfig +++ b/packages/opencv_core/example/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/opencv_core/example/macos/Podfile.lock b/packages/opencv_core/example/macos/Podfile.lock new file mode 100644 index 00000000..8cd092dc --- /dev/null +++ b/packages/opencv_core/example/macos/Podfile.lock @@ -0,0 +1,61 @@ +PODS: + - "DartCvMacOS (4.10.0+2)": + - "DartCvMacOS/calib3d (= 4.10.0+2)" + - "DartCvMacOS/contrib (= 4.10.0+2)" + - "DartCvMacOS/core (= 4.10.0+2)" + - "DartCvMacOS/features2d (= 4.10.0+2)" + - "DartCvMacOS/imgproc (= 4.10.0+2)" + - "DartCvMacOS/objdetect (= 4.10.0+2)" + - "DartCvMacOS/photo (= 4.10.0+2)" + - "DartCvMacOS/stitching (= 4.10.0+2)" + - "DartCvMacOS/video (= 4.10.0+2)" + - "DartCvMacOS/calib3d (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/contrib (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/core (4.10.0+2)" + - "DartCvMacOS/features2d (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/imgproc (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/objdetect (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/photo (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/stitching (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/video (4.10.0+2)": + - DartCvMacOS/core + - file_selector_macos (0.0.1): + - FlutterMacOS + - FlutterMacOS (1.0.0) + - opencv_core (0.0.1): + - "DartCvMacOS (= 4.10.0+2)" + - FlutterMacOS + +DEPENDENCIES: + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - opencv_core (from `Flutter/ephemeral/.symlinks/plugins/opencv_core/macos`) + +SPEC REPOS: + trunk: + - DartCvMacOS + +EXTERNAL SOURCES: + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + FlutterMacOS: + :path: Flutter/ephemeral + opencv_core: + :path: Flutter/ephemeral/.symlinks/plugins/opencv_core/macos + +SPEC CHECKSUMS: + DartCvMacOS: 9dfb2345a8d97cdddd49620385f9d848a05aa80a + file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + opencv_core: 3384a05cdbe7d464ac615e961c9fd882628898d2 + +PODFILE CHECKSUM: 9ebaf0ce3d369aaa26a9ea0e159195ed94724cf3 + +COCOAPODS: 1.15.2 diff --git a/packages/opencv_core/example/macos/Runner.xcodeproj/project.pbxproj b/packages/opencv_core/example/macos/Runner.xcodeproj/project.pbxproj index 1225982e..576f5560 100644 --- a/packages/opencv_core/example/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/opencv_core/example/macos/Runner.xcodeproj/project.pbxproj @@ -21,12 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 1152E401C256BF17400C0614 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76E11822CFC4E77A6093943A /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 3E3266B806FC097FA8661948 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F36B4745D6ED3AF835198403 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -60,11 +62,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 11032F52DCCDD248DBA446A2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* opencv_core_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "opencv_core_example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* opencv_core_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = opencv_core_example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -76,8 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 76E11822CFC4E77A6093943A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + A80AB527C10EB20FDD7D4655 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + D25F197D46EB1D4AFF9A0B42 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + F36B4745D6ED3AF835198403 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F379648E68E6438FA68E4D14 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + FC66555DDF9A56820EC7BF09 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + FC702BA572682F23F984AA88 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -85,6 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3E3266B806FC097FA8661948 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -92,12 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1152E401C256BF17400C0614 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1BFF59DC6C0391F9804A8919 /* Pods */ = { + isa = PBXGroup; + children = ( + FC66555DDF9A56820EC7BF09 /* Pods-Runner.debug.xcconfig */, + 11032F52DCCDD248DBA446A2 /* Pods-Runner.release.xcconfig */, + FC702BA572682F23F984AA88 /* Pods-Runner.profile.xcconfig */, + D25F197D46EB1D4AFF9A0B42 /* Pods-RunnerTests.debug.xcconfig */, + F379648E68E6438FA68E4D14 /* Pods-RunnerTests.release.xcconfig */, + A80AB527C10EB20FDD7D4655 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -125,6 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + 1BFF59DC6C0391F9804A8919 /* Pods */, ); sourceTree = ""; }; @@ -175,6 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( + 76E11822CFC4E77A6093943A /* Pods_Runner.framework */, + F36B4745D6ED3AF835198403 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -186,6 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + F86700A6BA33EC0BBD832B6E /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -204,11 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 489E05C23FBF95688C9EB493 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, + B4714658712415F98D0672B1 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -329,6 +361,67 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + 489E05C23FBF95688C9EB493 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + B4714658712415F98D0672B1 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + F86700A6BA33EC0BBD832B6E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -380,6 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = D25F197D46EB1D4AFF9A0B42 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -394,6 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = F379648E68E6438FA68E4D14 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -408,6 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = A80AB527C10EB20FDD7D4655 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/packages/opencv_core/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/opencv_core/example/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16..21a3cc14 100644 --- a/packages/opencv_core/example/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/packages/opencv_core/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/packages/opencv_core/ios/opencv_core.podspec b/packages/opencv_core/ios/opencv_core.podspec index 9c4dfa28..bf710299 100644 --- a/packages/opencv_core/ios/opencv_core.podspec +++ b/packages/opencv_core/ios/opencv_core.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'DartCvIOS', '4.10.0+1' + s.dependency 'DartCvIOS', '4.10.0+2' s.platform = :ios, '12.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } diff --git a/packages/opencv_core/macos/opencv_core.podspec b/packages/opencv_core/macos/opencv_core.podspec index 5ee20cfb..75c43948 100644 --- a/packages/opencv_core/macos/opencv_core.podspec +++ b/packages/opencv_core/macos/opencv_core.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'FlutterMacOS' - s.dependency 'DartCvMacOS', '4.10.0+1' + s.dependency 'DartCvMacOS', '4.10.0+2' s.platform = :osx, '10.15' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } s.swift_version = '5.0' diff --git a/packages/opencv_dart/example/ios/Flutter/Debug.xcconfig b/packages/opencv_dart/example/ios/Flutter/Debug.xcconfig index 592ceee8..ec97fc6f 100644 --- a/packages/opencv_dart/example/ios/Flutter/Debug.xcconfig +++ b/packages/opencv_dart/example/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/packages/opencv_dart/example/ios/Flutter/Release.xcconfig b/packages/opencv_dart/example/ios/Flutter/Release.xcconfig index 592ceee8..c4855bfe 100644 --- a/packages/opencv_dart/example/ios/Flutter/Release.xcconfig +++ b/packages/opencv_dart/example/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/packages/opencv_dart/example/macos/Flutter/Flutter-Debug.xcconfig b/packages/opencv_dart/example/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b6..4b81f9b2 100644 --- a/packages/opencv_dart/example/macos/Flutter/Flutter-Debug.xcconfig +++ b/packages/opencv_dart/example/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/opencv_dart/example/macos/Flutter/Flutter-Release.xcconfig b/packages/opencv_dart/example/macos/Flutter/Flutter-Release.xcconfig index c2efd0b6..5caa9d15 100644 --- a/packages/opencv_dart/example/macos/Flutter/Flutter-Release.xcconfig +++ b/packages/opencv_dart/example/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/packages/opencv_dart/example/macos/Podfile.lock b/packages/opencv_dart/example/macos/Podfile.lock index 16eb2301..62e0d948 100644 --- a/packages/opencv_dart/example/macos/Podfile.lock +++ b/packages/opencv_dart/example/macos/Podfile.lock @@ -1,8 +1,42 @@ PODS: + - "DartCvMacOS (4.10.0+2)": + - "DartCvMacOS/calib3d (= 4.10.0+2)" + - "DartCvMacOS/contrib (= 4.10.0+2)" + - "DartCvMacOS/core (= 4.10.0+2)" + - "DartCvMacOS/features2d (= 4.10.0+2)" + - "DartCvMacOS/imgproc (= 4.10.0+2)" + - "DartCvMacOS/objdetect (= 4.10.0+2)" + - "DartCvMacOS/photo (= 4.10.0+2)" + - "DartCvMacOS/stitching (= 4.10.0+2)" + - "DartCvMacOS/video (= 4.10.0+2)" + - "DartCvMacOS/calib3d (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/contrib (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/core (4.10.0+2)" + - "DartCvMacOS/dnn (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/features2d (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/imgproc (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/objdetect (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/photo (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/stitching (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/video (4.10.0+2)": + - DartCvMacOS/core + - "DartCvMacOS/videoio (4.10.0+2)": + - DartCvMacOS/core - file_selector_macos (0.0.1): - FlutterMacOS - FlutterMacOS (1.0.0) - opencv_dart (0.0.1): + - "DartCvMacOS (= 4.10.0+2)" + - "DartCvMacOS/dnn (= 4.10.0+2)" + - "DartCvMacOS/videoio (= 4.10.0+2)" - FlutterMacOS DEPENDENCIES: @@ -10,6 +44,10 @@ DEPENDENCIES: - FlutterMacOS (from `Flutter/ephemeral`) - opencv_dart (from `Flutter/ephemeral/.symlinks/plugins/opencv_dart/macos`) +SPEC REPOS: + trunk: + - DartCvMacOS + EXTERNAL SOURCES: file_selector_macos: :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos @@ -19,10 +57,11 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/opencv_dart/macos SPEC CHECKSUMS: - file_selector_macos: 54fdab7caa3ac3fc43c9fac4d7d8d231277f8cf2 + DartCvMacOS: 9dfb2345a8d97cdddd49620385f9d848a05aa80a + file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - opencv_dart: 5970f8f91dc9666bc2082a53a538646d767e91ae + opencv_dart: b2c040bac530fad54c8146ffed77e86fae930ea9 -PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 +PODFILE CHECKSUM: 9ebaf0ce3d369aaa26a9ea0e159195ed94724cf3 COCOAPODS: 1.15.2 diff --git a/packages/opencv_dart/example/macos/Runner.xcodeproj/project.pbxproj b/packages/opencv_dart/example/macos/Runner.xcodeproj/project.pbxproj index 1667c285..53fd8094 100644 --- a/packages/opencv_dart/example/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/opencv_dart/example/macos/Runner.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 3A61FE6B594E45D2EB077336 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AC9E976FBD418809451493D /* Pods_Runner.framework */; }; + 75F0275848CD29469CC4CA8A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D57C4D6AEBF1F1769B94FB4 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -64,7 +66,7 @@ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* opencv_dart_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "opencv_dart_example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* opencv_dart_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = opencv_dart_example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -76,8 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 4E24DDBBB1EB5BBF2A47EEC4 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 5C34412D2F583A2E532F32D4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 6AC9E976FBD418809451493D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6E4A615B2E4BEF320B807246 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 7B0F97CFDC3816700EC4E690 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 8D57C4D6AEBF1F1769B94FB4 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + CF43F22628D7BF01C1AC5B98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FC658CCA1A01A21CA6ED8ED2 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -85,6 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 75F0275848CD29469CC4CA8A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -92,6 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3A61FE6B594E45D2EB077336 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -125,6 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + 3A68B3938FCAA0AF95986DDD /* Pods */, ); sourceTree = ""; }; @@ -172,9 +185,25 @@ path = Runner; sourceTree = ""; }; + 3A68B3938FCAA0AF95986DDD /* Pods */ = { + isa = PBXGroup; + children = ( + FC658CCA1A01A21CA6ED8ED2 /* Pods-Runner.debug.xcconfig */, + CF43F22628D7BF01C1AC5B98 /* Pods-Runner.release.xcconfig */, + 7B0F97CFDC3816700EC4E690 /* Pods-Runner.profile.xcconfig */, + 6E4A615B2E4BEF320B807246 /* Pods-RunnerTests.debug.xcconfig */, + 4E24DDBBB1EB5BBF2A47EEC4 /* Pods-RunnerTests.release.xcconfig */, + 5C34412D2F583A2E532F32D4 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( + 6AC9E976FBD418809451493D /* Pods_Runner.framework */, + 8D57C4D6AEBF1F1769B94FB4 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -186,6 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + E4D6E612B0DFEEA25C581E1C /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -204,11 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 32B2CEC7DEA1F888E40A6FE0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, + EFF36770BC7DBCBCE3C6DFB0 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -291,6 +323,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 32B2CEC7DEA1F888E40A6FE0 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -329,6 +383,45 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + E4D6E612B0DFEEA25C581E1C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + EFF36770BC7DBCBCE3C6DFB0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -380,6 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 6E4A615B2E4BEF320B807246 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -394,6 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 4E24DDBBB1EB5BBF2A47EEC4 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -408,6 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 5C34412D2F583A2E532F32D4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/packages/opencv_dart/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/packages/opencv_dart/example/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16..21a3cc14 100644 --- a/packages/opencv_dart/example/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/packages/opencv_dart/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/packages/opencv_dart/ios/opencv_dart.podspec b/packages/opencv_dart/ios/opencv_dart.podspec index 1d638643..f866cc23 100644 --- a/packages/opencv_dart/ios/opencv_dart.podspec +++ b/packages/opencv_dart/ios/opencv_dart.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'DartCvIOS', '4.10.0+1' + s.dependency 'DartCvIOS', '4.10.0+2' s.platform = :ios, '12.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } diff --git a/packages/opencv_dart/macos/opencv_dart.podspec b/packages/opencv_dart/macos/opencv_dart.podspec index 88111790..96e343e9 100644 --- a/packages/opencv_dart/macos/opencv_dart.podspec +++ b/packages/opencv_dart/macos/opencv_dart.podspec @@ -20,7 +20,10 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'FlutterMacOS' - s.dependency 'DartCvMacOS', '4.10.0+1' + s.dependency 'DartCvMacOS', '4.10.0+2' + s.dependency 'DartCvMacOS/dnn', '4.10.0+2' + s.dependency 'DartCvMacOS/videoio', '4.10.0+2' + s.platform = :osx, '10.15' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } s.swift_version = '5.0' From 914f2961c127844bdca01aa2e4cfdef14e03de0b Mon Sep 17 00:00:00 2001 From: rainy liu Date: Tue, 22 Oct 2024 22:58:30 +0800 Subject: [PATCH 27/30] fix actions --- .github/workflows/examples.yaml | 71 ++++++++++++-------- packages/dartcv/.pubignore | 1 + packages/opencv_dart/ios/opencv_dart.podspec | 3 + 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 97361075..2867f132 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -15,48 +15,53 @@ jobs: runs-on: windows-2019 steps: - uses: actions/checkout@v4 - with: - submodules: true - uses: subosito/flutter-action@v2 with: channel: "stable" - - name: opencv_dart - run: | - cd packages/opencv_dart/example - flutter build windows - name: opencv_core run: | cd packages/opencv_core/example flutter build windows - ubuntu: - name: ubuntu + - name: opencv_dart + run: | + cd packages/opencv_dart/example + flutter build windows + android: + name: android runs-on: ubuntu-latest steps: - - name: setup - run: | - sudo apt-get update - sudo apt-get install -y curl git wget python3 unzip build-essential \ - libgtk-3-dev ninja-build - uses: subosito/flutter-action@v2 with: channel: "stable" - uses: actions/checkout@v4 - with: - submodules: true - uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' + - name: opencv_core + run: | + cd packages/opencv_core/example + flutter build apk --release --target-platform android-arm64,android-arm,android-x64 --split-per-abi - name: opencv_dart run: | cd packages/opencv_dart/example - flutter build linux flutter build apk --release --target-platform android-arm64,android-arm,android-x64 --split-per-abi + ubuntu: + name: ubuntu + runs-on: ubuntu-latest + steps: + - uses: subosito/flutter-action@v2 + with: + channel: "stable" + - uses: actions/checkout@v4 - name: opencv_core run: | cd packages/opencv_core/example flutter build linux - flutter build apk --release --target-platform android-arm64,android-arm,android-x64 --split-per-abi + - name: opencv_dart + run: | + cd packages/opencv_dart/example + flutter build linux macos: name: macos runs-on: macos-13 @@ -65,18 +70,14 @@ jobs: with: channel: "stable" - uses: actions/checkout@v4 - with: - submodules: true - - name: opencv_dart - run: | - cd packages/opencv_dart/example - flutter build macos - flutter build ios --release --no-codesign - name: opencv_core run: | cd packages/opencv_core/example flutter build macos - flutter build ios --release --no-codesign + - name: opencv_dart + run: | + cd packages/opencv_dart/example + flutter build macos macos-arm: name: macos-arm runs-on: macos-14 @@ -85,15 +86,27 @@ jobs: with: channel: "stable" - uses: actions/checkout@v4 - with: - submodules: true + - name: opencv_core + run: | + cd packages/opencv_core/example + flutter build macos - name: opencv_dart run: | cd packages/opencv_dart/example flutter build macos - flutter build ios --release --no-codesign + ios: + name: ios + runs-on: macos-14 + steps: + - uses: subosito/flutter-action@v2 + with: + channel: "stable" + - uses: actions/checkout@v4 - name: opencv_core run: | cd packages/opencv_core/example - flutter build macos + flutter build ios --release --no-codesign + - name: opencv_dart + run: | + cd packages/opencv_dart/example flutter build ios --release --no-codesign diff --git a/packages/dartcv/.pubignore b/packages/dartcv/.pubignore index 9bbd05aa..e3df5188 100644 --- a/packages/dartcv/.pubignore +++ b/packages/dartcv/.pubignore @@ -6,6 +6,7 @@ # https://dart.dev/guides/libraries/private-files#pubspeclock. pubspec.lock +libdartcv/ test/images test/images_out test/models diff --git a/packages/opencv_dart/ios/opencv_dart.podspec b/packages/opencv_dart/ios/opencv_dart.podspec index f866cc23..b8712b3f 100644 --- a/packages/opencv_dart/ios/opencv_dart.podspec +++ b/packages/opencv_dart/ios/opencv_dart.podspec @@ -21,6 +21,9 @@ Pod::Spec.new do |s| # s.source_files = 'Classes/**/*' s.dependency 'Flutter' s.dependency 'DartCvIOS', '4.10.0+2' + s.dependency 'DartCvIOS/dnn', '4.10.0+2' + s.dependency 'DartCvIOS/videoio', '4.10.0+2' + s.platform = :ios, '12.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } From 61ab1cb230e605df3ca630a3b180658ba2e70923 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Tue, 22 Oct 2024 23:41:49 +0800 Subject: [PATCH 28/30] fix examples --- .github/workflows/examples.yaml | 8 ++++++++ packages/opencv_core/ios/opencv_core.podspec | 2 +- packages/opencv_dart/ios/opencv_dart.podspec | 6 +++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 2867f132..b1771909 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -50,6 +50,14 @@ jobs: name: ubuntu runs-on: ubuntu-latest steps: + - name: setup + run: | + sudo apt-get update -y + sudo apt-get install -y curl git unzip xz-utils zip libglu1-mesa + sudo apt-get install clang cmake git \ + ninja-build pkg-config \ + libgtk-3-dev liblzma-dev \ + libstdc++-12-dev - uses: subosito/flutter-action@v2 with: channel: "stable" diff --git a/packages/opencv_core/ios/opencv_core.podspec b/packages/opencv_core/ios/opencv_core.podspec index bf710299..3d87de1e 100644 --- a/packages/opencv_core/ios/opencv_core.podspec +++ b/packages/opencv_core/ios/opencv_core.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'DartCvIOS', '4.10.0+2' + s.dependency 'DartCvIOS', '=4.10.0+2' s.platform = :ios, '12.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } diff --git a/packages/opencv_dart/ios/opencv_dart.podspec b/packages/opencv_dart/ios/opencv_dart.podspec index b8712b3f..8869e93d 100644 --- a/packages/opencv_dart/ios/opencv_dart.podspec +++ b/packages/opencv_dart/ios/opencv_dart.podspec @@ -20,9 +20,9 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'DartCvIOS', '4.10.0+2' - s.dependency 'DartCvIOS/dnn', '4.10.0+2' - s.dependency 'DartCvIOS/videoio', '4.10.0+2' + s.dependency 'DartCvIOS', '=4.10.0+2' + s.dependency 'DartCvIOS/dnn', '=4.10.0+2' + s.dependency 'DartCvIOS/videoio', '=4.10.0+2' s.platform = :ios, '12.0' From 22157992b284db78f1e7ffc370f745782cbd6952 Mon Sep 17 00:00:00 2001 From: rainy liu Date: Wed, 23 Oct 2024 11:28:57 +0800 Subject: [PATCH 29/30] change the dep of dartcv4 to 0.0.1 --- packages/dartcv/README.md | 6 +++--- packages/opencv_core/pubspec.yaml | 3 +-- packages/opencv_dart/pubspec.yaml | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/dartcv/README.md b/packages/dartcv/README.md index ccb294f0..f0fb8386 100644 --- a/packages/dartcv/README.md +++ b/packages/dartcv/README.md @@ -2,12 +2,12 @@ OpenCV bindings for Dart language. -[dartcv](https://pub.dev/packages/dartcv) is only for pure dart, for Flutter, use [opencv_core](https://pub.dev/packages/opencv_core), +[dartcv4](https://pub.dev/packages/dartcv4) is only for pure dart, for Flutter, use [opencv_core](https://pub.dev/packages/opencv_core), if videoio module is required, use [opencv_dart](https://pub.dev/packages/opencv_dart) ## Install -- `dart pub add dartcv` or Add dartcv to `pubspec.yaml` +- `dart pub add dartcv4` or Add dartcv4 to `pubspec.yaml` - Prepare libraries for your platform, you have 2 options (macos: please build from source.) - build from source, see [workflows](https://github.com/rainyl/dartcv/tree/main/.github/workflows) - download prebuilt libraries from [release](https://github.com/rainyl/dartcv/releases) @@ -15,4 +15,4 @@ if videoio module is required, use [opencv_dart](https://pub.dev/packages/opencv - Setup environment variables - windows: append the above path to `PATH` - linux: append the above path to `LD_LIBRARY_PATH` - - macos: append the above path to `DYLD_LIBRARY_PATH` + - macos: append the above path to `DYLD_FALLBACK_LIBRARY_PATH` diff --git a/packages/opencv_core/pubspec.yaml b/packages/opencv_core/pubspec.yaml index 9238dc13..dc1aedb8 100644 --- a/packages/opencv_core/pubspec.yaml +++ b/packages/opencv_core/pubspec.yaml @@ -15,8 +15,7 @@ environment: dependencies: flutter: sdk: flutter - dartcv4: - path: ../dartcv + dartcv4: ^0.0.1 dev_dependencies: test: ^1.25.2 diff --git a/packages/opencv_dart/pubspec.yaml b/packages/opencv_dart/pubspec.yaml index 4efe5896..e12ff9ce 100644 --- a/packages/opencv_dart/pubspec.yaml +++ b/packages/opencv_dart/pubspec.yaml @@ -17,8 +17,7 @@ environment: dependencies: flutter: sdk: flutter - dartcv4: - path: ../dartcv + dartcv4: ^0.0.1 dev_dependencies: test: ^1.25.2 From 167c105016b7164fecaf564767ae0e6ec132739f Mon Sep 17 00:00:00 2001 From: rainy liu Date: Wed, 23 Oct 2024 11:51:48 +0800 Subject: [PATCH 30/30] add dnn for opencv_core.podspec --- packages/opencv_core/ios/opencv_core.podspec | 3 ++- packages/opencv_core/macos/opencv_core.podspec | 1 + packages/opencv_dart/ios/opencv_dart.podspec | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/opencv_core/ios/opencv_core.podspec b/packages/opencv_core/ios/opencv_core.podspec index 3d87de1e..2ca8c866 100644 --- a/packages/opencv_core/ios/opencv_core.podspec +++ b/packages/opencv_core/ios/opencv_core.podspec @@ -20,7 +20,8 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'DartCvIOS', '=4.10.0+2' + s.dependency 'DartCvIOS', '4.10.0+2' + s.dependency 'DartCvIOS/dnn', '4.10.0+2' s.platform = :ios, '12.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } diff --git a/packages/opencv_core/macos/opencv_core.podspec b/packages/opencv_core/macos/opencv_core.podspec index 75c43948..bf927a70 100644 --- a/packages/opencv_core/macos/opencv_core.podspec +++ b/packages/opencv_core/macos/opencv_core.podspec @@ -21,6 +21,7 @@ Pod::Spec.new do |s| # s.source_files = 'Classes/**/*' s.dependency 'FlutterMacOS' s.dependency 'DartCvMacOS', '4.10.0+2' + s.dependency 'DartCvMacOS/dnn', '4.10.0+2' s.platform = :osx, '10.15' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } s.swift_version = '5.0' diff --git a/packages/opencv_dart/ios/opencv_dart.podspec b/packages/opencv_dart/ios/opencv_dart.podspec index 8869e93d..b8712b3f 100644 --- a/packages/opencv_dart/ios/opencv_dart.podspec +++ b/packages/opencv_dart/ios/opencv_dart.podspec @@ -20,9 +20,9 @@ Pod::Spec.new do |s| s.source = { :path => '.' } # s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'DartCvIOS', '=4.10.0+2' - s.dependency 'DartCvIOS/dnn', '=4.10.0+2' - s.dependency 'DartCvIOS/videoio', '=4.10.0+2' + s.dependency 'DartCvIOS', '4.10.0+2' + s.dependency 'DartCvIOS/dnn', '4.10.0+2' + s.dependency 'DartCvIOS/videoio', '4.10.0+2' s.platform = :ios, '12.0'