private static Bitmap imgtrafo( Bitmap image1, Bitmap image2, int p1_x, int p1_y, int p2_x, int p2_y, int p3_x, int p3_y, int p4_x, int p4_y) { // set output size same size as input int resultWidth = image1.getWidth(); int resultHeight = image1.getHeight(); Mat inputMat = new Mat(image1.getWidth(), image1.getHeight(), CvType.CV_32FC1); Utils.bitmapToMat(image1, inputMat); Mat outputMat = new Mat(resultWidth, resultHeight, CvType.CV_32FC1); Point ocvPIn1 = new Point(p1_x, p1_y); Point ocvPIn2 = new Point(p2_x, p2_y); Point ocvPIn3 = new Point(p3_x, p3_y); Point ocvPIn4 = new Point(p4_x, p4_y); List<Point> source = new ArrayList<Point>(); source.add(ocvPIn1); source.add(ocvPIn2); source.add(ocvPIn3); source.add(ocvPIn4); Mat inputQuad = Converters.vector_Point2f_to_Mat(source); Point ocvPOut1 = new Point(256, 40); // manually set Point ocvPOut2 = new Point(522, 62); Point ocvPOut3 = new Point(455, 479); Point ocvPOut4 = new Point(134, 404); List<Point> dest = new ArrayList<Point>(); dest.add(ocvPOut1); dest.add(ocvPOut2); dest.add(ocvPOut3); dest.add(ocvPOut4); Mat outputQuad = Converters.vector_Point2f_to_Mat(dest); Mat perspectiveTransform = Imgproc.getPerspectiveTransform(inputQuad, outputQuad); Imgproc.warpPerspective( inputMat, outputMat, perspectiveTransform, new Size(resultWidth, resultHeight)); // ? Bitmap output = Bitmap.createBitmap(resultWidth, resultHeight, Bitmap.Config.RGB_565); Utils.matToBitmap(outputMat, output); return output; }
public static Mat warp(Mat inputMat, Mat startM, int factor) { int resultWidth = 400 * factor; int resultHeight = 240 * factor; Mat outputMat = new Mat(resultWidth, resultHeight, CvType.CV_8UC4); 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 = Imgproc.getPerspectiveTransform(startM, endM); Imgproc.warpPerspective( inputMat, outputMat, perspectiveTransform, new Size(resultWidth, resultHeight), Imgproc.INTER_AREA); Imgproc.GaussianBlur(outputMat, outputMat, new org.opencv.core.Size(5, 5), 5); Imgproc.resize(outputMat, outputMat, new Size(resultWidth / factor, resultHeight / factor)); Imgproc.threshold(outputMat, outputMat, 127, 255, Imgproc.THRESH_TOZERO); return outputMat; }
public static void getSquare(Mat imgSource) { Mat sourceImage = imgSource.clone(); Imgproc.cvtColor(imgSource, imgSource, Imgproc.COLOR_BGR2GRAY); // convert the image to black and white does (8 bit) Imgproc.Canny(imgSource, imgSource, 50, 50); // apply gaussian blur to smoothen lines of dots Imgproc.GaussianBlur(imgSource, imgSource, new org.opencv.core.Size(5, 5), 5); // find the contours List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Imgproc.findContours( imgSource, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); double maxArea = -1; int maxAreaIdx = -1; // Log.d("size",Integer.toString(contours.size())); MatOfPoint temp_contour = contours.get(0); // the largest is at the // index 0 for starting // point MatOfPoint2f approxCurve = new MatOfPoint2f(); MatOfPoint largest_contour = contours.get(0); // largest_contour.ge List<MatOfPoint> largest_contours = new ArrayList<MatOfPoint>(); // Imgproc.drawContours(imgSource,contours, -1, new Scalar(0, 255, 0), // 1); for (int idx = 0; idx < contours.size(); idx++) { temp_contour = contours.get(idx); double contourarea = Imgproc.contourArea(temp_contour); // compare this contour to the previous largest contour found if (contourarea > maxArea) { // check if this contour is a square MatOfPoint2f new_mat = new MatOfPoint2f(temp_contour.toArray()); int contourSize = (int) temp_contour.total(); MatOfPoint2f approxCurve_temp = new MatOfPoint2f(); Imgproc.approxPolyDP(new_mat, approxCurve_temp, contourSize * 0.05, true); if (approxCurve_temp.total() == 4) { maxArea = contourarea; maxAreaIdx = idx; approxCurve = approxCurve_temp; largest_contour = temp_contour; } } } Imgproc.cvtColor(imgSource, imgSource, Imgproc.COLOR_BayerBG2RGB); double[] temp_double; temp_double = approxCurve.get(0, 0); Point p1 = new Point(temp_double[0], temp_double[1]); // Core.circle(imgSource,p1,55,new Scalar(0,0,255)); // Imgproc.warpAffine(sourceImage, dummy, rotImage,sourceImage.size()); temp_double = approxCurve.get(1, 0); Point p2 = new Point(temp_double[0], temp_double[1]); // Core.circle(imgSource,p2,150,new Scalar(255,255,255)); temp_double = approxCurve.get(2, 0); Point p3 = new Point(temp_double[0], temp_double[1]); // Core.circle(imgSource,p3,200,new Scalar(255,0,0)); temp_double = approxCurve.get(3, 0); Point p4 = new Point(temp_double[0], temp_double[1]); // Core.circle(imgSource,p4,100,new Scalar(0,0,255)); List<Point> source = getCorners(p1, p2, p3, p4); for (Point p : source) { // System.out.println(p); } Mat startM = Converters.vector_Point2f_to_Mat(source); // Imgproc.cvtColor(sourceImage, sourceImage, Imgproc.COLOR_BGR2GRAY); Mat result = warp(sourceImage, startM, 5); // result = warp(result,result,1); // Imgproc.cvtColor(result, result, Imgproc.COLOR_BGR2GRAY); Highgui.imwrite(output, result); // System.out.println("Done"); // return result; }