I'm working with perspective transformation in opencv for android for a personal project.
The thing I'd like to do is to acquire a document like CamScanner does.
For this I import a picture and let the user set the four transformation points needed.
Everything works, except for the fact that the transformation seems to be applied to different points or something like that. I need some fresh eyes to point me to the right direction.
Note that myHandle
is a custom class, its only interesting properties in this context are that they are points with x
and y
coordinates and getX()
and getY()
are its getters for the coordinates.
Here's my function for the transformation:
public Bitmap addrizzone(Bitmap image, ArrayList<myHandle> sourcePoints){
// sourcePoints are expected to be clockwise ordered
// [top_left,top_right,bottom_right,bottom_left]
// getting the size of the output image
double dst_width = Math.max(sourcePoints.get(0).distanceFrom(sourcePoints.get(1)),sourcePoints.get(3).distanceFrom(sourcePoints.get(2)));
double dst_height = Math.max(sourcePoints.get(0).distanceFrom(sourcePoints.get(3)),sourcePoints.get(1).distanceFrom(sourcePoints.get(2)));
//determining point sets to get the transformation matrix
List<org.opencv.core.Point> srcPts = new ArrayList<org.opencv.core.Point>();
for (myHandle ball : sourcePoints) {
srcPts.add(new org.opencv.core.Point((ball.getX()),ball.getY()));
}
List<org.opencv.core.Point> dstPoints= new ArrayList<org.opencv.core.Point>();
dstPoints.add(new org.opencv.core.Point(0,0));
dstPoints.add(new org.opencv.core.Point(dst_width-1,0));
dstPoints.add(new org.opencv.core.Point(dst_width-1,dst_height-1));
dstPoints.add(new org.opencv.core.Point(0,dst_height));
Mat srcMat = Converters.vector_Point2f_to_Mat(srcPts);
Mat dstMat = Converters.vector_Point2f_to_Mat(dstPoints);
//getting the transformation matrix
Mat perspectiveTransformation = Imgproc.getPerspectiveTransform(srcMat,dstMat);
//getting the input matrix from the given bitmap
Mat inputMat = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC1);
Utils.bitmapToMat(image,inputMat);
Imgproc.cvtColor(inputMat,inputMat,Imgproc.COLOR_RGB2GRAY);
//getting the output matrix with the previously determined sizes
Mat outputMat = new Mat((int) dst_height,(int) dst_width,CvType.CV_8UC1);
//applying the transformation
Imgproc.warpPerspective(inputMat,outputMat,perspectiveTransformation,new Size(dst_width,dst_height));
//creating the output bitmap
Bitmap outputBitmap = Bitmap.createBitmap((int)dst_width,(int)dst_height, Bitmap.Config.RGB_565);
//Mat to Bitmap
Imgproc.cvtColor(outputMat,outputMat,Imgproc.COLOR_GRAY2RGB);
Utils.matToBitmap(outputMat,outputBitmap);
return outputBitmap;
}
Some example screenshots:
User determined the points
Transformation is not as expected