使用OpenCV将图像旋转90度的最简单方法?

Ben*_*n H 46 c++ opencv image rotation

将IplImage/cv :: Mat旋转90度的最佳方法(在c/c ++中)是什么?我认为必须有比使用矩阵转换它更好的东西,但我似乎无法在API和在线中找到除此之外的任何东西.

sas*_*nin 61

旋转是转置和翻转的组合.

R _ {+ 90} = F_x\circ T.

R _ { -  90} = F_y\circ T.

在OpenCV中可以这样编写(下面的Python示例):

img = cv.LoadImage("path_to_image.jpg")
timg = cv.CreateImage((img.height,img.width), img.depth, img.channels) # transposed image

# rotate counter-clockwise
cv.Transpose(img,timg)
cv.Flip(timg,timg,flipMode=0)
cv.SaveImage("rotated_counter_clockwise.jpg", timg)

# rotate clockwise
cv.Transpose(img,timg)
cv.Flip(timg,timg,flipMode=1)
cv.SaveImage("rotated_clockwise.jpg", timg)
Run Code Online (Sandbox Code Playgroud)


Mor*_*ken 42

从OpenCV3.2开始,生活变得更加简单,您现在可以在一行代码中旋转图像:

cv::rotate(image, image, cv::ROTATE_90_CLOCKWISE);
Run Code Online (Sandbox Code Playgroud)

对于方向,您可以选择以下任何一个:

ROTATE_90_CLOCKWISE
ROTATE_180
ROTATE_90_COUNTERCLOCKWISE
Run Code Online (Sandbox Code Playgroud)

  • 在python中:dst = cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE) (16认同)

Jac*_*cob 10

换位更新:

您应该使用cvTranspose()cv::transpose()因为(正如您正确指出的那样)它更有效率.同样,我建议升级到OpenCV2.0,因为大多数cvXXX功能只是将IplImage*结构转换为Mat对象(没有深层副本).如果将图像存储在Mat对象中,Mat.t()则会返回转置.

任何轮换:

您应该通过在转换矩阵的一般框架中定义旋转矩阵来使用cvWarpAffine.我强烈建议升级到具有多个功能的OpenCV2.0以及Mat封装矩阵和图像的类.使用2.0,您可以使用warpAffine来实现上述目标.

  • 转置后必须翻转(cvFlip)才能正确旋转图像 (22认同)

Era*_*n W 6

这是我的python cv2实现:

import cv2

img=cv2.imread("path_to_image.jpg")

# rotate ccw
out=cv2.transpose(img)
out=cv2.flip(out,flipCode=0)

# rotate cw
out=cv2.transpose(img)
out=cv2.flip(out,flipCode=1)

cv2.imwrite("rotated.jpg", out)
Run Code Online (Sandbox Code Playgroud)


And*_*tis 5

这是一个没有新 C++ 接口的示例(适用于 90、180 和 270 度,使用 param = 1、2 和 3)。使用后记得调用cvReleaseImage返回的图像。

IplImage *rotate_image(IplImage *image, int _90_degrees_steps_anti_clockwise)
{
    IplImage *rotated;

    if(_90_degrees_steps_anti_clockwise != 2)
        rotated = cvCreateImage(cvSize(image->height, image->width), image->depth, image->nChannels);
    else
        rotated = cvCloneImage(image);

    if(_90_degrees_steps_anti_clockwise != 2)
        cvTranspose(image, rotated);

    if(_90_degrees_steps_anti_clockwise == 3)
        cvFlip(rotated, NULL, 1);
    else if(_90_degrees_steps_anti_clockwise == 1)
        cvFlip(rotated, NULL, 0);
    else if(_90_degrees_steps_anti_clockwise == 2)
        cvFlip(rotated, NULL, -1);

    return rotated;
}
Run Code Online (Sandbox Code Playgroud)