旋转图像不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转图像不起作用相关的知识,希望对你有一定的参考价值。

下面是一段代码,它通过一个简单的行翻转图像:

for i in range(num_images):
    im = cv2.imread(roidb[i]['image'])
    if roidb[i]['hflipped']:
      im = im[:, ::-1, :]
    if roidb[i]['vflipped']:
      im = im[::-1, :, :]

hflipped意味着水平翻转图像,而vflipped意味着垂直翻转它们。我想添加另一部分以逆时针旋转每个图像90度。

我尝试了两个选项,但它们都不起作用:

1)

if roidb[i]['rotated']:
  im = im.rotate(im, 90)

2)

num_rows, num_cols = im.shape[:2]
if roidb[i]['rotated']:
  rotation_matrix = cv2.getRotationMatrix2D((num_cols/2, num_rows/2), 90, 1)
  img_rotation = cv2.warpAffine(im, rotation_matrix, (num_cols, num_rows))

有没有办法旋转图像类似于翻转?还是有更好的方法?

谢谢

答案

因为OpenCV的Python包装器使用numpy作为后端,所以考虑使用numpy.rot90,它专门用于将矩阵旋转90度的倍数。这也适用于彩色图像,其中水平和垂直尺寸每个通道独立旋转。第二个参数是多个k,它指定您想要旋转图像的90度的倍数。正值执行逆时针旋转,而负值执行顺时针旋转。在您的情况下,将第二个参数指定为k=1以逆时针旋转90度。巧合的是,第二个参数的默认值是k=1,因此您可以省略它。如果你想顺时针旋转,你可以指定k=-1

将此逻辑添加到您的代码中如下:

import numpy as np

# Your setup code goes here...
# ...
# ...

# Main code in question
for i in range(num_images):
    im = cv2.imread(roidb[i]['image'])
    if roidb[i]['hflipped']:
        im = im[:, ::-1, :]
    if roidb[i]['vflipped']:
        im = im[::-1, :, :]
    if roidb[i]['rotated']: # New
        im = np.rot90(im, k=1) # Rotates 90 degrees anti-clockwise
        #im = np.rot90(im) # Also rotates 90 degrees anti-clockwise
        #im = np.rot90(im, k=-1) # Rotates 90 degrees clockwise

    # ...
    # The rest of your code follows

以上是关于旋转图像不起作用的主要内容,如果未能解决你的问题,请参考以下文章

无法替换图像视图,用于来自相机或画廊的图像(它不起作用)

片段不起作用并且有错误

在百里香弹簧靴中,动态旋转木马滑块不起作用

片段隐藏在Android中不起作用

从库中选择图像在 Android 的 Fragment 类中不起作用

java代码在片段活动中不起作用