如何利用opencv进行图形的旋转以及画出一个旋转的矩形
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用opencv进行图形的旋转以及画出一个旋转的矩形相关的知识,希望对你有一定的参考价值。
参考技术A如何利用opencv进行图形的旋转以及画出一个旋转的矩形
testRotateRect.cpp : 定义控制台应用程序的入口点。
02
03 #include "stdafx.h"
04 #include "opencv2/opencv.hpp"
05 using namespace std;
06 using namespace cv;
07 int _tmain(int argc, _TCHAR* argv[])
08
09 Mat image(200,200,CV_8UC3,Scalar(0));
10 RotatedRect rRect=RotatedRect(Point2f(100,100),Size2f(100,50),30); 定义一个旋转矩形
11 Point2f vertices[4];
12 rRect.points(vertices);提取旋转矩形的四个角点
13 for(int i=0;i<4;i++)
14
15 line(image,vertices[i],vertices[(i+1)%4],Scalar(0,255,0));四个角点连成线,最终形成旋转的矩形。
16
17 Mat img=imread("d:/fff.jpg");
18 imshow("ran",image);
19 waitKey();
20 return 0;
21
在进行图形的旋转变换时,旋转中心一定是原图形的一个顶点.______.(判断对错
由旋转的含义可知:在进行图形的旋转变换时,旋转中心一定是原图形的一个顶点,说法错误;
故答案为:×.
如何画图形的旋转
任意画一个三角形,然后任取一个角做旋转中心O,再找旋转中心O的对称点,用量角器在旋转中心O那一点量出题目要你量的度数!再画出来。OK了。我们刚好上了这个图形的旋转。
图形的旋转的典型例题
旋转
1.旋转的特征:
(1)旋转不改变图形的形状和大小;改变图形的方向和位置
(2)“图形的每个点,同时都按相同的方向转动相同的角度”
(3)对应点与旋转中心的夹角等于旋转角
2.旋转的性质:
(1)对应点到旋转中心的距离相等
(2)对应点与旋转中心的夹角相等,都是等于旋转角
(3)旋转的图形全等
3.旋转的作用:
(1)先旋转作出每一个 关键点
(2)连接关键点
希望对你有帮助
如何画出一个旋转的立方体
C 六边形。将正方体拿起来,使其底面保持水平,这样,底面最多是可以有3个顶点投出影来的;还是这样拿着,那么上面的4个顶点中,除了最先接受光照的那个顶点之外(其实各个点接受光照的时间差是很小的,但从理论上讲,朝向太阳的那个顶点是最先接受光照的;由于光是上向斜下方向照的,所以该点影子会被正方体上面的影子盖掉,即,没有投影),其他的3个顶点都是有投影的;这样,上面3个点,下面3个点,就是6个点了,6个点的投影就是6边形了。 做任何数学题都要体现出数学思想。这一点希望楼主明白。投影是这一章,考的是学生的空间想象能力。只要你多看图,多想想,就行了。 祝你取得好成绩!
图形的旋转的要素是什么?
你好,图形旋转的要素是找准顺时针和逆时针方向以及是绕着哪个图形旋转,旋转的度数。
opencv如何提取旋转矩形的ROI?
代码如下:
testRotateRect.cpp : 定义控制台应用程序的入口点。
02
03 #include "stdafx.h"
04 #include "opencv2/opencv.hpp"
05 using namespace std;
06 using namespace cv;
07 int _tmain(int argc, _TCHAR* argv[])
08
09 Mat image(200,200,CV_8UC3,Scalar(0));
10 RotatedRect rRect=RotatedRect(Point2f(100,100),Size2f(100,50),30); 定义一个旋转矩形
11 Point2f vertices[4];
12 rRect.points(vertices);提取旋转矩形的四个角点
13 for(int i=0;i<4;i++)
14
15 line(image,vertices[i],vertices[(i+1)%4],Scalar(0,255,0));四个角点连成线,最终形成旋转的矩形。
16
17 Mat img=imread("d:/fff.jpg");
18 imshow("ran",image);
19 waitKey();
20 return 0;
21
VC MFC怎样画一个可以旋转的矩形
说个思路吧我,定义一个类Rectangle,内部维护5个变量——CPoint center, int a, int b, float angle,float w,分别对应中心点,长宽和角度和角速度,定义一个public方法 Update ,传递一个时间参数 float interval和一个DC,根据这些参数生成四个点(时间乘以角速度就是转过的角度,其它就是中学的几何问题了 lol) ,用MoveToEx和LineTo把它们画出来。然后你可以在CView类里设置OnTime消息, 这样每隔一段时间就调用一次Update
呵呵,纯理论,希望你能成功 :)
图形的旋转
你要画3条三个形的3个角与旋转中心相连的线,然后在以其中1条先旋转90度(顺时针就好像秒针所转的方向,相反就就逆时针),然后另外那2条都1样,然后再用圆规把有针的1边插在旋转中心上,而有铅笔的那边就量1下你其中1个角到旋转中心的距离,然后到你旋转后的那条想应的先上画上1点,如此类推把另外2个角画出来,然后把3点顺次连起来就好了.
图形的旋转怎么画
图形的旋转的关键是旋转中心,旋转方向和旋转的角度
画图时将图形上的所有点与旋转中心连接,以旋转中心为圆心,连线段长为半径画圆,按照旋转的角度来找出对应点。再画出所有的对应线段
opencv 图像各方向旋转
1. 简介
计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换,在仿射变换中的基本变换包括平移、旋转、缩放、剪切这几种。本文以及接下来的几篇文章重点介绍一下关于旋转的变换,包括二维旋转变换、三维旋转变换以及它的一些表达方式(旋转矩阵、四元数、欧拉角等)。
2. 绕原点二维旋转
首先要明确旋转在二维中是绕着某一个点进行旋转,三维中是绕着某一个轴进行旋转。二维旋转中最简单的场景是绕着坐标原点进行的旋转,如下图所示:
如图所示点v 绕 原点旋转θθ 角,得到点v’,假设 v点的坐标是(x, y) ,那么可以推导得到 v’点的坐标(x’, y’)(设原点到v的距离是r,原点到v点的向量与x轴的夹角是?? )
尽管图示中仅仅表示的是旋转一个锐角θθ的情形,但是我们推导中使用的是三角函数的基本定义来计算坐标的,因此当旋转的角度是任意角度(例如大于180度,导致v’点进入到第四象限)结论仍然是成立的。
旋转和平移 代码1
Rx 可以通过 getRotationMatrix2D 得到
Point center(face_img.cols/2, face_img.rows/2);
//cv::Mat rot_mat = cv::getRotationMatrix2D(center, -1 * arctan, 1.0);
cv::Mat Rx(2, 3, CV_32FC1);
double theta_r = roll * 3.1415926 / 180; /** 3.1415926 / 180*/
float cos_theta = cos(theta_r);
float sin_theta = sin(theta_r);
Rx.at<float>(0, 0) = cos_theta;
Rx.at<float>(0, 1) = -sin_theta;
Rx.at<float>(0, 2) = (1-cos_theta)*center.x + center.y * sin_theta;
Rx.at<float>(1, 0) = sin_theta;
Rx.at<float>(1, 1) = cos_theta;
Rx.at<float>(1, 2) = (1-cos_theta) * center.y - center.x* sin_theta;
//std::cout << rot_mat << std::endl;
cv::Mat rotated_ROI;
cv::warpAffine(face_img, rotated_ROI, Rx, face_img.size(), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar::all(0));
3. 绕任意点的二维旋转
绕原点的旋转是二维旋转最基本的情况,当我们需要进行绕任意点旋转时,我们可以把这种情况转换到绕原点的旋转,思路如下:
1. 首先将旋转点移动到原点处
2. 执行如2所描述的绕原点的旋转
3. 再将旋转点移回到原来的位置
旋转和平移 代码2
Point center(face_img.cols/2, face_img.rows/2);
//cv::Mat rot_mat = cv::getRotationMatrix2D(center, -1 * arctan, 1.0);
cv::Mat Rx(3, 3, CV_32FC1);
double theta_r = roll * 3.1415926 / 180; /** 3.1415926 / 180*/
float cos_theta = cos(theta_r);
float sin_theta = sin(theta_r);
Rx.at<float>(0, 0) = cos_theta;
Rx.at<float>(0, 1) = -sin_theta;
Rx.at<float>(0, 2) = (1-cos_theta)*center.x + center.y * sin_theta;
Rx.at<float>(1, 0) = sin_theta;
Rx.at<float>(1, 1) = cos_theta;
Rx.at<float>(1, 2) = (1-cos_theta) * center.y - center.x* sin_theta;
Rx.at<float>(2, 0) = 0;
Rx.at<float>(2, 1) = 0;
Rx.at<float>(2, 2) = 1;
//std::cout << rot_mat << std::endl;
cv::Mat rotated_ROI;
//cv::warpAffine(face_img, rotated_ROI, rot_mat, face_img.size(), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar::all(0));
warpPerspective(face_img, rotated_ROI, Rx, cv::Size(face_img.cols, face_img.rows));
cv::imshow("roll face", rotated_ROI);
绕X 轴 Y轴 Z轴旋转的结果
void warp_perspect_3_angle(cv::Mat face, float roll, float yaw, float pitch)
cv::Mat face_img = face.clone();
int imgHeight = face_img.rows;
int imgWidth = face_img.cols;
float alpha, beta, gamma;
alpha = pitch * 3.1415926 / 180;
beta = yaw* 3.1415926 / 180;
gamma = roll * 3.1415926 / 180;
Mat Rot = Mat::eye(3, 3, CV_32FC1);
Rot.at<float>(0, 0) = cos(beta) * cos(gamma);
Rot.at<float>(0, 1) = cos(beta) * sin(gamma);
Rot.at<float>(0, 2) = -sin(beta);
Rot.at<float>(1, 0) = sin(alpha) * sin(beta) * cos(gamma) - cos(alpha) * sin(gamma);
Rot.at<float>(1, 1) = sin(alpha) * sin(beta) * sin(gamma) + cos(alpha) * cos(gamma);
Rot.at<float>(1, 2) = sin(alpha) * cos(beta);
Rot.at<float>(2, 0) = cos(alpha) * sin(beta) * cos(gamma) + sin(alpha) * sin(gamma);
Rot.at<float>(2, 1) = cos(alpha) * sin(beta) * sin(gamma) - sin(alpha) * cos(gamma);
Rot.at<float>(2, 2) = cos(alpha) * cos(beta);
Mat invRot;
invert(Rot, invRot, DECOMP_SVD);
float fx = imgWidth/2;
float fy = imgHeight/2;
float cx = imgWidth / 2;
float cy = imgHeight / 2;
Mat point3D = Mat::zeros(3, 1, CV_32FC1);
Mat oldPoint3D = Mat::zeros(3, 1, CV_32FC1);
Mat dstImg = face_img.clone();
dstImg.setTo(0);
uchar* pImgData = (uchar*)face_img.data;
uchar* pDstData = (uchar*)dstImg.data;
for (int j = 0; j < imgHeight; j++)
for (int i = 0; i < imgWidth; i++)
float X = (i - cx) / fx;
float Y = (j - cy) / fy;
float Z = 1;
point3D.at<float>(0, 0) = X;
point3D.at<float>(1, 0) = Y;
point3D.at<float>(2, 0) = Z;
//求旋转前坐标点
oldPoint3D = invRot*point3D;
float oldX = oldPoint3D.at<float>(0, 0);
float oldY = oldPoint3D.at<float>(1, 0);
float oldZ = oldPoint3D.at<float>(2, 0);
//重投影到二维平面
if (oldZ > 1e-3)
float u = ((fx*oldX + cx*oldZ) / oldZ);
float v = ((fy*oldY + cy*oldZ) / oldZ);
int u0 = floor(u);
int v0 = floor(v);
int u1 = u0 + 1;
int v1 = v0 + 1;
if (u0 >= 0 && v0 >= 0 && u1 < imgWidth && v1 < imgHeight)
float dx = u - u0;
float dy = v - v0;
float weight1 = (1 - dx)*(1 - dy);
float weight2 = dx*(1 - dy);
float weight3 = (1 - dx)*dy;
float weight4 = dx*dy;
pDstData[j*imgWidth * 3 + i * 3 + 0] = weight1*pImgData[v0*imgWidth * 3 + u0 * 3 + 0] +
weight2*pImgData[v0*imgWidth * 3 + u1 * 3 + 0] +
weight3*pImgData[v1*imgWidth * 3 + u0 * 3 + 0] +
weight4*pImgData[v1*imgWidth * 3 + u1 * 3 + 0];
pDstData[j*imgWidth * 3 + i * 3 + 1] = weight1*pImgData[v0*imgWidth * 3 + u0 * 3 + 1] +
weight2*pImgData[v0*imgWidth * 3 + u1 * 3 + 1] +
weight3*pImgData[v1*imgWidth * 3 + u0 * 3 + 1] +
weight4*pImgData[v1*imgWidth * 3 + u1 * 3 + 1];
pDstData[j*imgWidth * 3 + i * 3 + 2] = weight1*pImgData[v0*imgWidth * 3 + u0 * 3 + 2] +
weight2*pImgData[v0*imgWidth * 3 + u1 * 3 + 2] +
weight3*pImgData[v1*imgWidth * 3 + u0 * 3 + 2] +
weight4*pImgData[v1*imgWidth * 3 + u1 * 3 + 2];
imshow("show", dstImg);
---------------------
以上是关于如何利用opencv进行图形的旋转以及画出一个旋转的矩形的主要内容,如果未能解决你的问题,请参考以下文章