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/CvInvoke.java b/android/src/main/java/com/adamfreeman/rnocv3/CvInvoke.java index d894937..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,15 +149,29 @@ else if (param == String.class) { } else if (itsType == ReadableType.Map) { ReadableMap dMap = RM.getMap(paramNum); - 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 @@ -486,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 657e949..032e939 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/MatManager.java @@ -5,13 +5,17 @@ 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; import org.opencv.core.Scalar; import org.opencv.core.Mat; import org.opencv.core.MatOfInt; import org.opencv.core.MatOfFloat; +import org.opencv.core.MatOfPoint; +import org.opencv.core.Point; import android.util.Log; @@ -90,6 +94,20 @@ 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 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); @@ -112,15 +130,34 @@ 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()) { + points.pushDouble(point.x); + points.pushDouble(point.y); + } + + 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; } diff --git a/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java b/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java index 7899a68..7d9dd27 100644 --- a/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java +++ b/android/src/main/java/com/adamfreeman/rnocv3/RNOpencv3Module.java @@ -225,5 +225,19 @@ 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); + } + + @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 fd19b7d..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, setTo, get } from './mats'; +import { Mat, MatOfInt, MatOfFloat, MatOfPoint, ListOfMatOfPoint, setTo, get } from './mats'; import { CvImage } from './cvimage'; import { findNodeHandle } from 'react-native'; @@ -255,8 +255,10 @@ export { Mat, MatOfInt, MatOfFloat, + MatOfPoint, + ListOfMatOfPoint, CvScalar, CvPoint, CvSize, - CvRect + CvRect, }; diff --git a/mats.js b/mats.js index 7a09727..7644bae 100644 --- a/mats.js +++ b/mats.js @@ -88,3 +88,15 @@ export class MatOfFloat { } } } + +export class MatOfPoint { + init = async() => { + return await RNOpencv3.MatOfPoint() + } +} + +export class ListOfMatOfPoint { + init = async() => { + return await RNOpencv3.ListOfMatOfPoint() + } +}