图像中某点绕点旋转后的坐标,图像旋转坐标位置
来源:互联网 发布:用淘宝联盟赚钱安全吗 编辑:程序博客网 时间:2024/05/18 03:42
图像中某点绕点旋转后的坐标,图像旋转坐标位置
在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)旋转θ角度后,新的坐标设为(x, y)的计算公式:x= (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) + x2 ; y= (x1 - x2)*sin(θ) + (y1 - y2)*cos(θ) + y2 ;这是在平面上的坐标旋转公式,但在图像中某个像素点旋转一个角度后的坐标不能用上述公式直接求出,因为图像(0,0)点的坐标的原点是在图像的左上角。
假设图像的宽度x高度为col x row,图像中某个像素P(x1,y1),绕某个像素点Q(x2,y2)旋转θ角度后,则该像素点的新坐标位置为(x, y),其计算公式为:
x1 = x1;y1 = row - y1;x2 = x2;y2 = row - y2;x = (x1 - x2)*cos(pi / 180.0 * θ) - (y1 - y2)*sin(pi / 180.0 * θ) + x2;y = (x1 - x2)*sin(pi / 180.0 * θ) + (y1 - y2)*cos(pi / 180.0 * θ) + y2;x=x;y = row - y;下面给出OpenCV的实现代码:原图像的大小500x577,像素点P(100,100),绕图像中心Q(250,288.5)旋转θ角度后,则该像素点的新坐标位置为(173, 60)
关于OpenCV实现图像旋转的方法,可参考本人的博客:《OpenCV图像旋转,指定填充背景颜色边界颜色》 http://blog.csdn.net/guyuealian/article/details/77993410
#include "stdafx.h"#include <iostream> #include<vector>#include<algorithm>#include <opencv2\opencv.hpp> #include <opencv2\highgui\highgui.hpp> using namespace std;using namespace cv;#define pi 3.1415926vector<cv::Point2i> getRotatePoint(cv::Mat srcImage, vector<cv::Point2i> Points, const cv::Point rotate_center, const double angle) {vector<cv::Point2i> dstPoints;int x1 = 0, y1 = 0;int row = srcImage.rows;for (size_t i = 0; i < Points.size(); i++){x1 = Points.at(i).x;y1 = row - Points.at(i).y;int x2 = rotate_center.x;int y2 = row - rotate_center.y;int x = cvRound((x1 - x2)*cos(pi / 180.0 * angle) - (y1 - y2)*sin(pi / 180.0 * angle) + x2);int y = cvRound((x1 - x2)*sin(pi / 180.0 * angle) + (y1 - y2)*cos(pi / 180.0 * angle) + y2);y = row - y;dstPoints.push_back(Point2i(x, y));}return dstPoints;}int main() {Mat src = imread("D:\\OpencvTest\\16.jpg");Point2i point(100, 100);vector<cv::Point2i> Points;Points.push_back(point);cv::circle(src, point, 2, cv::Scalar(255, 0, 0),2); cv::imshow("src image ", src);cv::Mat dst; //旋转角度-20度 double angle =- 20;//输出图像的尺寸与原图一样 cv::Size dst_sz(src.cols, src.rows);//指定旋转中心 cv::Point2f center(src.cols / 2., src.rows / 2.);//获取旋转矩阵(2x3矩阵) cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);//设置选择背景边界颜色:绿色 cv::Scalar borderColor = Scalar(0, 238, 0);cv::warpAffine(src, dst, rot_mat, dst_sz, INTER_LINEAR, BORDER_CONSTANT, borderColor);//cv::warpAffine(src, dst, rot_mat, dst_sz, INTER_LINEAR, BORDER_REPLICATE); vector<cv::Point2i> dstPoints = getRotatePoint(dst, Points, center, angle);cv::circle(dst, dstPoints.at(0), 5, cv::Scalar(0, 0, 255), 2);cv::imshow("Rotation Image", dst);waitKey(0);return 0;}
【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/78288131
阅读全文
0 0
- 图像中某点绕点旋转后的坐标,图像旋转坐标位置
- 图像旋转后的还原图像坐标
- 图像旋转后的还原图像坐标
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
- 极坐标 数组为例 图像处理 可旋转的极坐标
- 获取图片旋转后的坐标点
- 计算显示坐标旋转后点的坐标
- 坐标的平移旋转
- 旋转坐标的计算
- 坐标的旋转,翻转
- 坐标旋转
- 12.燃烧的橡胶:使用极坐标旋转位置
- 图像的坐标变换
- 坐标旋转公式的推导
- GPS 经纬度转换为 经过旋转后的平面坐标
- 一个 点绕另一个点旋转后的坐标
- 一个 点绕另一个点旋转后的坐标
- 干货|人人都是翻译项目的Master
- Redis能干啥?细看11种Web应用场景
- 互联网分层架构的本质
- 树莓派禁止休眠、屏幕常亮
- [设计]观察者模式
- 图像中某点绕点旋转后的坐标,图像旋转坐标位置
- C语言指针实现简单二叉排序树
- Ubuntu搭建SFtp服务器
- idea设置字体大小
- [设计]命令模式
- 数论训练 {限制} [扩展gcd][组合数][容斥原理]
- 字母图形
- String、StringBuffer与StringBuilder之间区别
- [设计]适配器模式