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

来源:互联网 发布:网络主播靠什么赚钱 编辑:程序博客网 时间:2024/05/13 13:46

旋转图像 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 0
原创粉丝点击