Java 如何使用opencv旋转图像

Java 如何使用opencv旋转图像,java,opencv,image-processing,ocr,Java,Opencv,Image Processing,Ocr,我正在尝试旋转图像。下面的代码可以成功地旋转图像,但它会切掉图像的角点,并以错误的方向旋转。有什么问题吗?如果有人给我一些建议,我将不胜感激。代码如下: public void findAngle(){ FloatBuffer deskew_angle = FloatBuffer.allocate(1); IntBuffer orientation = IntBuffer.allocate(1); IntBuffer writing_direction = IntBuff

我正在尝试旋转图像。下面的代码可以成功地旋转图像,但它会切掉图像的角点,并以错误的方向旋转。有什么问题吗?如果有人给我一些建议,我将不胜感激。代码如下:

public void findAngle(){
    FloatBuffer deskew_angle = FloatBuffer.allocate(1);
    IntBuffer orientation = IntBuffer.allocate(1);
    IntBuffer writing_direction = IntBuffer.allocate(1);
    IntBuffer textline_order = IntBuffer.allocate(1);
    final TessAPI api = TessAPI.INSTANCE;

    final TessBaseAPI handle;
    handle = api.TessBaseAPICreate();
    api.TessBaseAPIInit3(handle, "C:\\Program Files\\Tesseract-OCR\\tessdata", "eng");
    api.TessBaseAPISetVariable(handle, "tessedit_char_whitelist",
            "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?!.,:-");
    File tiff = new File("C:\\Users\\A\\Desktop\\1.jpg");
    BufferedImage image = null;
    try {
        image = ImageIO.read(new FileInputStream(tiff));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } // require jai-imageio lib to read TIFF
    ByteBuffer buf = ImageIOHelper.convertImageData(image);
    int bpp = image.getColorModel().getPixelSize();
    int bytespp = bpp / 8;
    int bytespl = (int) Math.ceil(image.getWidth() * bpp / 8.0);
    api.TessBaseAPISetPageSegMode(handle, TessAPI.TessPageSegMode.PSM_AUTO_OSD);
    api.TessBaseAPISetImage(handle, buf, image.getWidth(), image.getHeight(), bytespp, bytespl);
    TessPageIterator pi = api.TessBaseAPIAnalyseLayout(handle);
    api.TessPageIteratorOrientation(pi, orientation, writing_direction, textline_order, deskew_angle);

    float angle = deskew_angle.get(0);
    System.out.println("Angle : "+angle);

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    String resultString = "";

    Mat frame = Imgcodecs.imread(lFile, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
    Point center = new Point(350,350);
    if(angle == 270 || angle == -90) {
        Mat rotImage = Imgproc.getRotationMatrix2D(center, angle, 1);
        Imgproc.warpAffine(frame, frame, rotImage, new Size(frame.cols(),frame.cols()));
    }
    else if (angle == 180 || angle == -180 ){
        Mat rotImage = Imgproc.getRotationMatrix2D(center, angle, 1);
        Imgproc.warpAffine(frame, frame, rotImage, new Size(frame.cols(),frame.cols()));
    }
    else if(angle == 90 || angle == -270) {
        Mat rotImage = Imgproc.getRotationMatrix2D(center, angle, 1);
        Imgproc.warpAffine(frame, frame, rotImage, new Size(frame.cols(),frame.cols()));
    }
    else if(angle == 360 || angle == 0 || angle == -360) {
        Mat rotImage = Imgproc.getRotationMatrix2D(center, angle, 0.65);
        Imgproc.warpAffine(frame, frame, rotImage, new Size(frame.cols(),frame.cols()));
    }

    System.out.println(String.format(
            "Orientation: %s\nWritingDirection: %s\nTextlineOrder: %s\nDeskew angle: %.4f\n",
            Utils.getConstantName(orientation.get(), TessOrientation.class),
            Utils.getConstantName(writing_direction.get(), TessWritingDirection.class),
            Utils.getConstantName(textline_order.get(), TessTextlineOrder.class),
            deskew_angle.get(0)));
    api.TessBaseAPIClear(handle);
    api.TessBaseAPIEnd(handle);
    api.TessBaseAPIDelete(handle);
    Imgcodecs.imwrite("C:\\Users\\A\\Desktop\\a.jpg", img);
    }

旋转图像的背景是黑色的,但我希望它是透明的或白色的。以下是我尝试执行所有步骤但无法正常工作的代码。提前感谢。

因为旋转图像时不会改变图像的大小; 1.如果你不想改变图像的大小,你应该增加窗口的大小,因为当你旋转图像时,窗口的宽度和高度是不够的;
2.如果您不想更改窗口的大小,则应减小图像的大小。

如果要旋转图像,请在下面的链接中进行检查,您可以举个例子吗?