Cannot get OpenCV warpPerspective to run on Android

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?

+5
source share
2 answers

Found, the problem was in these lines:

 Mat perspectiveTransform = new Mat(3, 3, CvType.CV_32FC1); Core.perspectiveTransform(startM, endM, perspectiveTransform); 

Which should be replaced by the following:

 Mat perspectiveTransform = Imgproc.getPerspectiveTransform(startM, endM); 
+5
source

I had some problems with your code, so I made changes until I got a working version, here is my code, if someone had problems with the question code:

 Bitmap warp(Bitmap image, Point topLeft, Point topRight, Point bottomLeft, Point bottomRight) { int resultWidth = (int)(topRight.x - topLeft.x); int bottomWidth = (int)(bottomRight.x - bottomLeft.x); if(bottomWidth > resultWidth) resultWidth = bottomWidth; int resultHeight = (int)(bottomLeft.y - topLeft.y); int bottomHeight = (int)(bottomRight.y - topRight.y); if(bottomHeight > resultHeight) resultHeight = bottomHeight; Mat inputMat = new Mat(image.getHeight(), image.getHeight(), CvType.CV_8UC1); Utils.bitmapToMat(image, inputMat); Mat outputMat = new Mat(resultWidth, resultHeight, CvType.CV_8UC1); List<Point> source = new ArrayList<>(); source.add(topLeft); source.add(topRight); source.add(bottomLeft); source.add(bottomRight); Mat startM = Converters.vector_Point2f_to_Mat(source); Point ocvPOut1 = new Point(0, 0); Point ocvPOut2 = new Point(resultWidth, 0); Point ocvPOut3 = new Point(0, resultHeight); Point ocvPOut4 = new Point(resultWidth, resultHeight); List<Point> dest = new ArrayList<>(); dest.add(ocvPOut1); dest.add(ocvPOut2); dest.add(ocvPOut3); dest.add(ocvPOut4); Mat endM = Converters.vector_Point2f_to_Mat(dest); Mat perspectiveTransform = Imgproc.getPerspectiveTransform(startM, endM); Imgproc.warpPerspective(inputMat, outputMat, perspectiveTransform, new Size(resultWidth, resultHeight)); Bitmap output = Bitmap.createBitmap(resultWidth, resultHeight, Bitmap.Config.ARGB_8888); Utils.matToBitmap(outputMat, output); return output; } 
+1
source

Source: https://habr.com/ru/post/948306/


All Articles