opencv 图像旋转

 std::vector<std::vector<cv::Point>> contours;cv::findContours(Img, contours, 0, 2);cv::RotatedRect rotatedrect = minAreaRect(contours[i]);double angle = rotaterect.angle;cv::Point2f center = rotaterect.center;cv::Mat M = cv::getRotationMatrix2D(center, angle, 1);//取得旋转矩阵warpAffine(Img, Img, M, cv::Size(Img.cols, Img.rows));//未扩大的进行旋转

opencv 图像平移

         cv::Mat M = cv::Mat::zeros(2, 3, CV_32FC1);M.at<float>(0, 0) = 1;M.at<float>(0, 2) = 0; //水平平移量M.at<float>(1, 1) = 1;M.at<float>(1, 2) = 0; //竖直平移量cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000));//图像尺寸扩张Size(500,1000)(默认扩张方式)//用固定颜色填充扩张的边界//cv::Scalar borderColor = Scalar(255, 255, 255);//cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000), 1, BORDER_CONSTANT, borderColor);//复制边缘填充//cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000), 1, BORDER_REPLICATE);

关于大M矩阵:

对平移矩阵:
M=[    [scale , 0 , a]     //a水平平移量[0 , scale , b] ]   //b竖直平移量
对旋转矩阵:
M=[    [scale*cos(angle)  , scale*sin(angle) , (1-scale*cos(angle))*center.x-scale*sin(angle)*center.y ]       [-scale*sin(angle) , scale*cos(angle) , scale*sin(angle)*center.x+(1-scale*cos(angle))*center.y ]  ]
//scale缩放因子,1表示不进行缩放
//angle旋转角度,正值表示逆时针旋转
//center图像旋转的中心位置
旋转和平移结合:
M=[    [scale*cos(angle)  , scale*sin(angle) , (1-scale*cos(angle))*center.x-scale*sin(angle)*center.y + a]       [-scale*sin(angle) , scale*cos(angle) , scale*sin(angle)*center.x+(1-scale*cos(angle))*center.y + b]  ]
#include<iostream>
#include<opencv2/opencv.hpp>
#include<math.h>using namespace std;
using namespace cv;int main() {string path = R"(circle.png)";cv::Mat Img = imread(path, IMREAD_GRAYSCALE);cv::threshold(Img, Img, 200, 255, 0);cv::Mat M = cv::Mat::zeros(2, 3, CV_32FC1);double scale = 1;//缩放因子,1表示不进行缩放double angle = 60.0 / 180.0 * CV_PI;//旋转角度,正值表示逆时针旋转cv::Point2f center = cv::Point2f(Img.cols / 2.0, Img.rows / 2.0);//图像旋转的中心位置double a = 0;//水平平移量double b = 100;//竖直平移量M.at<float>(0, 0) = scale * cos(angle);M.at<float>(0, 1) = scale * sin(angle);M.at<float>(1, 0) = -1 * M.at<float>(0, 1);M.at<float>(1, 1) = M.at<float>(0, 0);M.at<float>(0, 2) = (1 - M.at<float>(0, 0))*center.x - M.at<float>(0, 1)*center.y + a;M.at<float>(1, 2) = M.at<float>(0, 1)*center.x + (1 - M.at<float>(0, 0))*center.y + b;cv::Mat Img_R;cv::warpAffine(Img, Img_R, M, Img.size() + cv::Size(0, 100));//逆时针旋转angle度即是逆时针旋转60度waitKey(0);return 0;
}

opencv 旋转和平移的矩阵相关推荐

  1. 应用OpenCV进行图像旋转和平移

    简 介: 本文中,你了解了了如何通过OpenCV完成对于图像的旋转和平移.我们首先通过 getRotationMatrix2D() 获取2D旋转矩阵,然后完成了对于图像的旋转.具体是通过warpAff ...

  2. Opencv 基础(四):使用OpenCV进行图像旋转和平移

    如今,图像编辑变得越来越流行,因为手机有内置的功能,可以让你裁剪.旋转和更多的操作你的图像. 这篇文章中,我们将探索和学习这些图像编辑技术.具体来说,我们将学习如何: 旋转图像 移动图像 基本图像变换 ...

  3. OpenCV 图像旋转、平移、缩放

    本文是 OpenCV图像视觉入门之路的第7篇文章,本文详细的进行了图像的缩放 cv2.resize().旋转 cv2.flip().平移 cv2.warpAffine()等操作. OpenCV 图像旋 ...

  4. opencv 中affine函数实现旋转和平移

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...

  5. opencv warpAffine()函数详解 -- 图像旋转与平移

    简述 仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括"平直性"以及"平行性",常用于图像翻转(Flip).旋转(Rotations ...

  6. 矩阵陈列:平移、缩放、旋转、镜像、矩阵相乘、变化的实现_NXopen-UG二次开发_新浪博客

    矩阵陈列:平移.缩放.旋转.镜像.矩阵相乘.变化的实现 uf5940_ uf5941_ uf5942_ 矩阵相乘 uf5943_ 平移 uf5944_ 缩放 uf5945_ 旋转 uf5946_ 镜像 ...

  7. 图像的仿射变换原理及c++实现(旋转,平移,缩放,偏移,组合变换)

    github地址:https://github.com/2209520576/Image-Processing-Algorithm 一.写在前面 几何空间变换是图像处理中的最基础的算法,主要包括图像的 ...

  8. 目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强

    如有错误,恳请指出. 在之前使用opencv就介绍使用过一些常用的数据增强的实现方法,见:<数据增强 | 旋转.平移.缩放.错切.HSV增强>,当时介绍了旋转.平移.缩放.错切.HSV增强 ...

  9. 使用Python,OpenCV进行图像平移转换

    使用Python,OpenCV进行图像平移转换 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何使用Python,OpenCV对图像进行平移转换.平移是图像沿x轴和y轴的移动.使用平移, ...

最新文章

  1. 分享五款java学习辅助工具,总有你用的上的~
  2. 最新3D GAN可生成三维几何数据了!模型速度提升7倍,英伟达斯坦福出品
  3. 【Python】条件及循环语句
  4. android手势滑动——左右滑动效果实现
  5. Oracle级联查询
  6. 技术沙龙之液晶监视器和显示器
  7. python机器学习案例系列教程——GBDT算法、XGBOOST算法
  8. C++ 中宏的使用 --来自:http://blog.csdn.net/hgl868/article/details/7058906
  9. 大数据系统架构是什么
  10. 我的大学 --- 郭天祥【2】
  11. FPGA之SDRAM控制器设计(二)
  12. 中英文论文写作指导第三部分(实验、材料和方法部分)
  13. ADO连接MySql数据库之通过连接字符串
  14. 如果删掉微信中一个功能,你的选择是什么
  15. 栈与堆的区别(内存分配与数据结构)
  16. php ldap_search,如果我不知道基本DN的OU,那么如何使用PHP ldap_search()获取用户OU
  17. VB.NET连接数据库的几种方法
  18. Java:在不同界面样式下JPopupMenu与鼠标事件mousePressed表现的结果不同!
  19. 【我的Android进阶之旅】Android使用Quantity Strings来实现全球化的单复数功能
  20. 51系列单片机指令快速记忆法

热门文章

  1. 网线直连,Synergy低延迟顺滑共享鼠标键盘
  2. KeyError: ‘/home/xxx/anaconda3/lib/python3.8/site-packages/parso/python/grammar38.txt‘
  3. 果园大二下英方课学习姿势
  4. 《Hadoop 权威指南》读书笔记之七 — chapter7
  5. 论文研读笔记(二)——VGG
  6. 递归实现二叉树的前序遍历
  7. ESP32C3使用NTC电阻
  8. 第六十七章 方法关键字 - Language
  9. java垃圾回收简介
  10. JS - 自由变量与作用域链