I am trying to implement a quad-quad system in my android application. The goal is to allow the user to take a picture, add 4 corner points and display this square from the image as a rectangle.
I looked through this method and this question to use OpenCV for this. The result is the following code:
public static Bitmap warp(Bitmap image, MyPoint p1, MyPoint p2, MyPoint p3, MyPoint p4) { int resultWidth = 500; int resultHeight = 500; Mat inputMat = new Mat(image.getHeight(), image.getHeight(), CvType.CV_8UC4); Utils.bitmapToMat(image, inputMat); Mat outputMat = new Mat(resultWidth, resultHeight, CvType.CV_8UC4); Point ocvPIn1 = new Point(p1.getX(), p1.getY()); Point ocvPIn2 = new Point(p2.getX(), p2.getY()); Point ocvPIn3 = new Point(p3.getX(), p3.getY()); Point ocvPIn4 = new Point(p4.getX(), p4.getY()); List<Point> source = new ArrayList<Point>(); source.add(ocvPIn1); source.add(ocvPIn2); source.add(ocvPIn3); source.add(ocvPIn4); Mat startM = Converters.vector_Point2f_to_Mat(source); Point ocvPOut1 = new Point(0, 0); Point ocvPOut2 = new Point(0, resultHeight); Point ocvPOut3 = new Point(resultWidth, resultHeight); Point ocvPOut4 = new Point(resultWidth, 0); List<Point> dest = new ArrayList<Point>(); dest.add(ocvPOut1); dest.add(ocvPOut2); dest.add(ocvPOut3); dest.add(ocvPOut4); Mat endM = Converters.vector_Point2f_to_Mat(dest); Mat perspectiveTransform = new Mat(3, 3, CvType.CV_32FC1); Core.perspectiveTransform(startM, endM, perspectiveTransform); Imgproc.warpPerspective(inputMat, outputMat, perspectiveTransform, new Size(resultWidth, resultHeight), Imgproc.INTER_CUBIC); Bitmap output = Bitmap.createBitmap(resultWidth, resultHeight, Bitmap.Config.RGB_565); Utils.matToBitmap(outputMat, output); return output; }
During testing, I am sure that the order of the corner points is upper left, lower left, lower right, upper right.
It is strange that the result is not always the same. Most of the time he shows a square of the same color, sometimes a black square, sometimes a diagonal line with different colors. Even experimenting with startM = endM leads to non-deterministic behavior.
What am I missing here?