Как повернуть изображение с помощью opencv - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь повернуть изображение. Приведенный ниже код может успешно повернуть изображение, но оно обрезает углы изображения и вращается в неправильном направлении. В чем может быть проблема? Буду благодарен, если кто-нибудь даст мне совет. Вот код:

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);
    }

И фон повернутого изображения черный, но я хочу, чтобы он был прозрачным или белым. Ниже приведен код https://stackoverflow.com/a/45559068/9994984 Я пытаюсь все шаги, но не работает правильно. Заранее спасибо.

1 Ответ

0 голосов
/ 12 марта 2019

Потому что вы не меняете размер изображения при его вращении; 1.Если вы не хотите изменять размер изображения, вы должны увеличить размер окна, потому что при повороте изображения ширины и высоты окна недостаточно; 2.Если вы не хотите изменять размер окна, вам следует уменьшить размер изображения.

...