【OpenCV_12】旋转视频以及图片 Rotate Image & Video

旋转图像 Rotate Image


通过给定角度来选择图像是常见的图像处理问题,虽然看起来有点复杂,但是得益于OpenCV内置的一些函数,使得实现起来非常简单。下面就是代码,为了使得表达更加直观,加入了滑动条 track bar来动态的调整。


#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

 int main( int argc, char** argv )
 {
     // Load the image
     Mat imgOriginal = imread( "/Users/iDreamboat/Desktop/OpenCV/RG.JPG", 1 );

     //show the original image
     const char* pzOriginalImage = "Original Image";
     namedWindow( pzOriginalImage, CV_WINDOW_AUTOSIZE );
     imshow( pzOriginalImage, imgOriginal );

     const char* pzRotatedImage = "Rotated Image";
     namedWindow( pzRotatedImage, CV_WINDOW_AUTOSIZE );

     int iAngle = 180;
     createTrackbar("Angle", pzRotatedImage, &iAngle, 360);

     int iImageHieght = imgOriginal.rows / 2;
     int iImageWidth = imgOriginal.cols / 2;

     while (true)
     {
          Mat matRotation = getRotationMatrix2D( Point(iImageWidth, iImageHieght), (iAngle - 180), 1 );
 
          // Rotate the image
          Mat imgRotated;
          warpAffine( imgOriginal, imgRotated, matRotation, imgOriginal.size() );

          imshow( pzRotatedImage, imgRotated );

          int iRet = waitKey(30);
          if ( iRet == 27 )
          {
               break;
          }
     }

     return 0;
}
///



Original Image/Rotated Image

代码详解
  • Mat getRotationMatrix2D( Point2f center, double angle, double scale )

这个函数返回2x3仿射变换矩阵来对应2D旋转

参数 -
    • center - 源图像旋转中心的位置
    • angle - 旋转的角度(正的为逆时针方向,负的为顺时针方向)
    • scale - 图像比例因子(比例因子为1意味着原始大小)
可以尝试不同的旋转中心,角度及比例因子观察输出结果。

  • void warpAffine( InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int bordreMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar() )
调用OpenCV函数对图像进行仿射变换。

参数 - 
  • src - 源图像
  • dst - 目标图像应与源图像属性一致(变换之后的图像存储在这个位置)
  • - 2x3 仿射变换矩阵
  • dsize - 目标图像的尺寸
  • flags - 插值方法
  • borderMode - 像素插值方法(尝试下面值BORDER_REPLICATE, BORDER_CONSTANT, BORDER_REFLECT, BORDER_WRAP, BORDER_REFLECT_101, BORDER_TRANSPARENT and BORDER_ISOLATED)
  • borderValue - If you use BORDER_CONSTANT for borderMode, this argument define the value used for the border

旋转图像另一种方法 OpenCV


还有另外一种旋转图像的方法,这里,我用的回调函数采用旋转而不是采用while无限循环,除了旋转,还可以动态的采用插值方法缩放图像。

///
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

int iAngle = 180;
int iScale = 50;
int iBorderMode = 0;
Mat imgOriginal ;
int iImageCenterY = 0;
int iImageCenterX = 0;
const char* pzRotatedImage = "Rotated Image";

void CallbackForTrackBar(int, void*)
{
 Mat matRotation = getRotationMatrix2D(  Point( iImageCenterX, iImageCenterY ), (iAngle - 180), iScale / 50.0 );
 
 // Rotate the image
 Mat imgRotated;
 warpAffine( imgOriginal, imgRotated, matRotation, imgOriginal.size(), INTER_LINEAR, iBorderMode, Scalar() );

 imshow( pzRotatedImage, imgRotated );
 
}

 int main( int argc, char** argv )
 {
 // Load the image
 imgOriginal = imread(  "/Users/iDreamboat/Desktop/OpenCV/RG.JPG", 1 );

 iImageCenterY = imgOriginal.rows / 2;
 iImageCenterX = imgOriginal.cols / 2;

 //show the original image
 const char* pzOriginalImage = "Original Image";
 namedWindow( pzOriginalImage, CV_WINDOW_AUTOSIZE );
 imshow( pzOriginalImage, imgOriginal );

 //create the "Rotated Image" window and 3 trackbars in it
 namedWindow( pzRotatedImage, CV_WINDOW_AUTOSIZE );
 createTrackbar("Angle", pzRotatedImage, &iAngle, 360, CallbackForTrackBar);
 createTrackbar("Scale", pzRotatedImage, &iScale, 100, CallbackForTrackBar);
 createTrackbar("Border Mode", pzRotatedImage, &iBorderMode, 5, CallbackForTrackBar);
 
 int iDummy = 0;

 CallbackForTrackBar(iDummy, &iDummy);

 waitKey(0);

 return 0;
}
///



 


旋转视频 

 

旋转视频也很简单,


///
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
    // open the video file for reading
    VideoCapture cap("/Users/iDreamboat/Desktop/OpenCV/MyVideo.mp4"); 

    // if not success, exit program
    if ( !cap.isOpened() )  
    {
         cout << "Cannot open the video file" << endl;
         return -1;
    }

    const char* pzOriginalWindowName = "Original Video";
    namedWindow(pzOriginalWindowName, CV_WINDOW_AUTOSIZE); 

    const char* pzRotatingWindowName = "Rotated Video";
    namedWindow( pzRotatingWindowName, CV_WINDOW_AUTOSIZE );

    int iAngle = 180;
    createTrackbar("Angle", pzRotatingWindowName, &iAngle, 360);


    while (true)
    {
        Mat matOriginalFrame;

 // read a new frame from video
        bool bSuccess = cap.read(matOriginalFrame); 

 //if not success, break loop
        if (!bSuccess) 
 {
                       cout << "Cannot read the frame from video file" << endl;
                       break;
        }

        imshow(pzOriginalWindowName, matOriginalFrame);

 //get the affine transformation matrix
 Mat matRotation = getRotationMatrix2D( Point(matOriginalFrame.cols / 2, matOriginalFrame.rows / 2), (iAngle - 180), 1 );
 
 // Rotate the image
 Mat matRotatedFrame;
 warpAffine( matOriginalFrame, matRotatedFrame, matRotation, matOriginalFrame.size() );

 imshow( pzRotatingWindowName, matRotatedFrame );

 //wait for 'esc' key press for 30 ms. If 'esc' key is pressed, break loop
        if (waitKey(30) == 27) 
 {
                cout << "esc key is pressed by user" << endl; 
                break; 
 }
    }

    return 0;
}
///


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值