sas*_*nin 61
旋转是转置和翻转的组合.
在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)
Jac*_*cob 10
换位更新:
您应该使用cvTranspose()
或cv::transpose()
因为(正如您正确指出的那样)它更有效率.同样,我建议升级到OpenCV2.0,因为大多数cvXXX
功能只是将IplImage*
结构转换为Mat
对象(没有深层副本).如果将图像存储在Mat
对象中,Mat.t()
则会返回转置.
任何轮换:
您应该通过在转换矩阵的一般框架中定义旋转矩阵来使用cvWarpAffine.我强烈建议升级到具有多个功能的OpenCV2.0以及Mat
封装矩阵和图像的类.使用2.0,您可以使用warpAffine来实现上述目标.
这是我的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)
这是一个没有新 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)