From 9e9c430b01d7a80848980c6e59509d3b89fa8fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20I=C3=A1=C3=B1ez=20=C3=81vila?= Date: Wed, 18 Nov 2020 14:00:56 +0100 Subject: [PATCH 1/4] Add bindings for MatOfPoint --- .gitignore | 3 ++- .../src/main/java/com/adamfreeman/rnocv3/MatManager.java | 8 ++++++++ .../main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java | 8 +++++++- index.js | 3 ++- mats.js | 6 ++++++ 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 7468db9..f876021 100644 --- a/.gitignore +++ b/.gitignore @@ -44,4 +44,5 @@ local.properties buck-out/ \.buckd/ *.keystore - + +react-native-opencv3*.tgz diff --git a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java index 657e949..06e28f6 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java @@ -12,6 +12,7 @@ import org.opencv.core.Mat; import org.opencv.core.MatOfInt; import org.opencv.core.MatOfFloat; +import org.opencv.core.MatOfPoint; import android.util.Log; @@ -90,6 +91,13 @@ public static int createMatOfFloat(float lomatval, float himatval) { return matIndex; } + public static int createMatOfPoint() { + int matIndex = mats.size(); + MatOfPoint matToAdd = new MatOfPoint(); + mats.add(matToAdd); + return matIndex; + } + public static int addMat(Object matToAdd) { int matIndex = mats.size(); mats.add(matToAdd); diff --git a/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java b/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java index 7899a68..b88e8bc 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java @@ -225,5 +225,11 @@ public void MatOfFloat(float lomatfloat, float himatfloat, final Promise promise promise.resolve(result); } - + @ReactMethod + public void MatOfPoint(final Promise promise) { + int matIndex = MatManager.getInstance().createMatOfPoint(); + WritableNativeMap result = new WritableNativeMap(); + result.putInt("matIndex", matIndex); + promise.resolve(result); + } } diff --git a/index.js b/index.js index fd19b7d..212d57d 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,7 @@ const { RNOpencv3 } = NativeModules; import { ColorConv, CvType, Imgproc, Core } from './constants'; import { CvScalar, CvPoint, CvSize, CvRect } from './coretypes'; -import { Mat, MatOfInt, MatOfFloat, setTo, get } from './mats'; +import { Mat, MatOfInt, MatOfFloat, MatOfPoint, setTo, get } from './mats'; import { CvImage } from './cvimage'; import { findNodeHandle } from 'react-native'; @@ -255,6 +255,7 @@ export { Mat, MatOfInt, MatOfFloat, + MatOfPoint, CvScalar, CvPoint, CvSize, diff --git a/mats.js b/mats.js index 7a09727..419a6d6 100644 --- a/mats.js +++ b/mats.js @@ -88,3 +88,9 @@ export class MatOfFloat { } } } + +export class MatOfPoint { + init = async() => { + return await RNOpencv3.MatOfPoint() + } +} From ff6d668afa48ed0bfd0580f083a35b06aa0ce7e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20I=C3=A1=C3=B1ez=20=C3=81vila?= Date: Thu, 19 Nov 2020 16:26:09 +0100 Subject: [PATCH 2/4] Add binding for ArrayList --- .../java/com/adamfreeman/rnocv3/CvInvoke.java | 7 ++- .../com/adamfreeman/rnocv3/MatManager.java | 8 ++++ .../adamfreeman/rnocv3/RNOpencv3Module.java | 8 ++++ coretypes.js | 48 +++++++++---------- index.js | 5 +- mats.js | 6 +++ 6 files changed, 55 insertions(+), 27 deletions(-) diff --git a/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java b/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java index d894937..eab0953 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java @@ -150,7 +150,12 @@ else if (param == String.class) { } else if (itsType == ReadableType.Map) { ReadableMap dMap = RM.getMap(paramNum); - if (param == Mat.class || param == List.class) { + if (param == List.class && dMap.hasKey("listIndex")) { + int listIndex = dMap.getInt("listIndex"); + List dList = (List)MatManager.getInstance().matAtIndex(listIndex); + retObjs.add(dList); + } + else if (param == Mat.class || param == List.class) { int matIndex = dMap.getInt("matIndex"); Mat dMat = (Mat)MatManager.getInstance().matAtIndex(matIndex); if (param == Mat.class) { diff --git a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java index 06e28f6..a993a2c 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java @@ -7,6 +7,7 @@ import com.facebook.react.bridge.WritableNativeArray; import java.util.ArrayList; +import java.util.List; import org.opencv.core.Scalar; import org.opencv.core.Mat; @@ -98,6 +99,13 @@ public static int createMatOfPoint() { return matIndex; } + public static int createListOfMapOfPoint() { + int listIndex = mats.size(); + List listToAdd = new ArrayList<>(); + mats.add(listToAdd); + return listIndex; + } + public static int addMat(Object matToAdd) { int matIndex = mats.size(); mats.add(matToAdd); diff --git a/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java b/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java index b88e8bc..7d9dd27 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java @@ -232,4 +232,12 @@ public void MatOfPoint(final Promise promise) { result.putInt("matIndex", matIndex); promise.resolve(result); } + + @ReactMethod + public void ListOfMatOfPoint(final Promise promise) { + int listIndex = MatManager.getInstance().createListOfMapOfPoint(); + WritableNativeMap result = new WritableNativeMap(); + result.putInt("listIndex", listIndex); + promise.resolve(result); + } } diff --git a/coretypes.js b/coretypes.js index 3438bae..cd88538 100644 --- a/coretypes.js +++ b/coretypes.js @@ -100,28 +100,28 @@ export class CvSize { export class CvRect { constructor(top, left, width, height) { if (top) { - this.top = top - } - else { - this.top = 0.0 - } - if (left) { - this.left = left - } - else { - this.left = 0.0 - } - if (width) { - this.width = width - } - else { - this.width = 0.0 - } - if (height) { - this.height = height - } - else { - this.height = 0.0 - } + this.top = top + } + else { + this.top = 0.0 + } + if (left) { + this.left = left + } + else { + this.left = 0.0 + } + if (width) { + this.width = width + } + else { + this.width = 0.0 + } + if (height) { + this.height = height + } + else { + this.height = 0.0 + } } -} \ No newline at end of file +} diff --git a/index.js b/index.js index 212d57d..b90cde2 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,7 @@ const { RNOpencv3 } = NativeModules; import { ColorConv, CvType, Imgproc, Core } from './constants'; import { CvScalar, CvPoint, CvSize, CvRect } from './coretypes'; -import { Mat, MatOfInt, MatOfFloat, MatOfPoint, setTo, get } from './mats'; +import { Mat, MatOfInt, MatOfFloat, MatOfPoint, ListOfMatOfPoint, setTo, get } from './mats'; import { CvImage } from './cvimage'; import { findNodeHandle } from 'react-native'; @@ -256,8 +256,9 @@ export { MatOfInt, MatOfFloat, MatOfPoint, + ListOfMatOfPoint, CvScalar, CvPoint, CvSize, - CvRect + CvRect, }; diff --git a/mats.js b/mats.js index 419a6d6..7644bae 100644 --- a/mats.js +++ b/mats.js @@ -94,3 +94,9 @@ export class MatOfPoint { return await RNOpencv3.MatOfPoint() } } + +export class ListOfMatOfPoint { + init = async() => { + return await RNOpencv3.ListOfMatOfPoint() + } +} From 9be6ae06df6ca85bff06642252ef0ae050bfc5e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20I=C3=A1=C3=B1ez=20=C3=81vila?= Date: Fri, 20 Nov 2020 16:14:59 +0100 Subject: [PATCH 3/4] Return results of findContours to JS --- .../java/com/adamfreeman/rnocv3/CvInvoke.java | 40 +++++++++++------- .../com/adamfreeman/rnocv3/MatManager.java | 42 +++++++++++++++---- 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java b/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java index eab0953..ca8438d 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java @@ -105,7 +105,6 @@ private static int getNumKeys(ReadableMap RM) { } private Object[] getObjectArr(String func, ReadableMap RM, Class[] params) { - int i = 1; ArrayList retObjs = new ArrayList(); @@ -150,20 +149,29 @@ else if (param == String.class) { } else if (itsType == ReadableType.Map) { ReadableMap dMap = RM.getMap(paramNum); - if (param == List.class && dMap.hasKey("listIndex")) { - int listIndex = dMap.getInt("listIndex"); - List dList = (List)MatManager.getInstance().matAtIndex(listIndex); - retObjs.add(dList); - } - else if (param == Mat.class || param == List.class) { - int matIndex = dMap.getInt("matIndex"); - Mat dMat = (Mat)MatManager.getInstance().matAtIndex(matIndex); - if (param == Mat.class) { - retObjs.add(dMat); - } - else { - retObjs.add(Arrays.asList(dMat)); - } + if (param == Mat.class || param == List.class) { + int matIndex; + + if (dMap.hasKey("listIndex")) { + matIndex = dMap.getInt("listIndex"); + List dList = (List)MatManager.getInstance().matAtIndex(matIndex); + + if (func.equals("findContours")) { + // Special case, we need to clear the list + dList.clear(); + } + + retObjs.add(dList); + } else { + matIndex = dMap.getInt("matIndex"); + Mat dMat = (Mat)MatManager.getInstance().matAtIndex(matIndex); + if (param == Mat.class) { + retObjs.add(dMat); + } + else { + retObjs.add(Arrays.asList(dMat)); + } + } // have to update the dst mat after op ... // should be last mat in function parameters unless exception function @@ -491,7 +499,7 @@ else if (in != null && matParams.containsKey(in)) { } if (dstMatIndex >= 0) { - Mat dstMat = (Mat)objects[arrMatIndex]; + Object dstMat = objects[arrMatIndex]; MatManager.getInstance().setMat(dstMatIndex, dstMat); result = dstMatIndex; dstMatIndex = -1; diff --git a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java index a993a2c..54fa963 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java @@ -5,6 +5,7 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.WritableNativeArray; +import com.facebook.react.bridge.WritableNativeMap; import java.util.ArrayList; import java.util.List; @@ -14,6 +15,7 @@ import org.opencv.core.MatOfInt; import org.opencv.core.MatOfFloat; import org.opencv.core.MatOfPoint; +import org.opencv.core.Point; import android.util.Log; @@ -128,15 +130,37 @@ public static void setMat(int matIndex, Object matToSet) { // TODO: get this to work for different data types checking CvType public static WritableArray getMatData(int matIndex, int rownum, int colnum) { WritableArray retArr = new WritableNativeArray(); - Mat mat = (Mat)matAtIndex(matIndex); - - if (mat.rows() > 0 && mat.cols() > 0) { - float[] retFloats = new float[mat.rows() * mat.cols() * mat.channels()]; - mat.get(rownum, colnum, retFloats); - for (float retFloat : retFloats) { - retArr.pushDouble(retFloat); - } - } + + Object matObject = matAtIndex(matIndex); + + if (List.class.isAssignableFrom(matObject.getClass())) { + List listOfMat = (List)matObject; + + for (MatOfPoint mat : listOfMat) { + WritableNativeArray points = new WritableNativeArray(); + + for (Point point : mat.toArray()) { + WritableNativeMap pointMap = new WritableNativeMap(); + + pointMap.putDouble("x", point.x); + pointMap.putDouble("y", point.y); + points.pushMap(pointMap); + } + + retArr.pushArray(points); + } + } else { + Mat mat = (Mat)matObject; + + if (mat.rows() > 0 && mat.cols() > 0) { + float[] retFloats = new float[mat.rows() * mat.cols() * mat.channels()]; + mat.get(rownum, colnum, retFloats); + for (float retFloat : retFloats) { + retArr.pushDouble(retFloat); + } + } + } + return retArr; } From 7c8c5a86638bd07a029d44aa855ce3b9f4b13e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20I=C3=A1=C3=B1ez=20=C3=81vila?= Date: Mon, 23 Nov 2020 11:04:05 +0100 Subject: [PATCH 4/4] Reduce garbage collection and increase performance --- .../src/main/java/com/adamfreeman/rnocv3/MatManager.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java index 54fa963..032e939 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java @@ -140,11 +140,8 @@ public static WritableArray getMatData(int matIndex, int rownum, int colnum) { WritableNativeArray points = new WritableNativeArray(); for (Point point : mat.toArray()) { - WritableNativeMap pointMap = new WritableNativeMap(); - - pointMap.putDouble("x", point.x); - pointMap.putDouble("y", point.y); - points.pushMap(pointMap); + points.pushDouble(point.x); + points.pushDouble(point.y); } retArr.pushArray(points);