Как повернуть изображение без его обрезки с помощью Opencv в Android? - PullRequest
1 голос
/ 01 апреля 2019

Я использую Opencv в Android для вычисления rotation angle обнаруженного объекта, затем поворачиваю этот объект обратно в его нормальное положение для дальнейшего изменения качества изображения, такого как сегментация и сопоставление объектов.

Это то, что яу нас так далеко

double rect_angle = rbox.angle - 90.0f;
Size rect_size = rbox.size;

double d = rect_size.width;
rect_size.width = rect_size.height;
rect_size.height = d;

M = Imgproc.getRotationMatrix2D(rbox.center, rect_angle, 1.0);
Imgproc.warpAffine(origMat, rotated, M, origMat.size());

Если я немного поверну свой объект, вот результат

enter image description here

И если я нея поворачиваю объект вот что я получаю

enter image description here

Мне нужно держать объект всегда в центре.

Моя проблема похожа наэтот вопрос Поворот изображения без обрезки в OpenCV в C ++

, но я не смог добиться этого в Java.

Я надеюсь, что вы, ребята, можете помочь мне достичь этого.

1 Ответ

0 голосов
/ 02 апреля 2019

Есть отличное объяснение на PyImageSearch для этой проблемы.Хотя решение в Python, я уверен, что вы можете легко перевести математику в Java.

Цель состоит в том, чтобы отредактировать матрицу вращения с размерами нового выходного изображения.Размер этого выходного изображения корректируется с учетом эффекта поворота.

Ссылаясь на следующий код из пояснения PyImageSearch, вы можете видеть, что размеры нового выходного изображения учитываются в модифицированной матрице вращения:

def rotate_bound(image, angle):
    # grab the dimensions of the image and then determine the
    # center
    (h, w) = image.shape[:2]
    (cX, cY) = (w // 2, h // 2)

    # grab the rotation matrix (applying the negative of the
    # angle to rotate clockwise), then grab the sine and cosine
    # (i.e., the rotation components of the matrix)
    M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])

    # compute the new bounding dimensions of the image
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))

    # adjust the rotation matrix to take into account translation
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY

    # perform the actual rotation and return the image
    return cv2.warpAffine(image, M, (nW, nH))
...