图像中某点绕点旋转后的坐标,图像旋转坐标位置


在平面坐标上,任意点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;
}

python代码:

def rotate_point(point1, point2, angle, height):"""点point1绕点point2旋转angle后的点======================================在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)旋转θ角度后,新的坐标设为(x, y)的计算公式:x= (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) + x2 ;y= (x1 - x2)*sin(θ) + (y1 - y2)*cos(θ) + y2 ;======================================将图像坐标(x,y)转换到平面坐标(x`,y`):x`=xy`=height-y:param point1::param point2: base point (基点):param angle: 旋转角度,正:表示逆时针,负:表示顺时针:param height::return:"""x1, y1 = point1x2, y2 = point2# 将图像坐标转换到平面坐标y1 = height - y1y2 = height - y2x = (x1 - x2) * np.cos(np.pi / 180.0 * angle) - (y1 - y2) * np.sin(np.pi / 180.0 * angle) + x2y = (x1 - x2) * np.sin(np.pi / 180.0 * angle) + (y1 - y2) * np.cos(np.pi / 180.0 * angle) + y2# 将平面坐标转换到图像坐标y = height - yreturn (x, y)

【尊重原创,转载请注明出处】https://panjinquan.blog.csdn.net/article/details/78288131

图像中某点绕点旋转后的坐标,图像旋转坐标位置相关推荐

  1. 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合

    1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...

  2. matlab如何截取图像的中间部分_利用matlab提取并分割RGB图像中的某一个已知像素值的图像...

    已知一副RGB图像中的的像素值,利用matlab将其分割出来并以二进制图像形式显示: %extract.m clear all; I=imread('new_original.png'); figur ...

  3. 图像中一个坐标绕图像中心旋转90度、-90度、180度的新坐标求解

    1. 首先图像的左上角为原点建立坐标系,往右往下为正向,围绕图像的中心位置进行旋转 逆时针90度:x=2*(x/w-0.5) ,y=2*(y/h-0.5) , X=y, y=-x, x=(x+1)/2 ...

  4. 像素旋转:一种在加密图像中实现安全的可逆数据隐藏方案

    文章目录 前言 一.提出的PR-RDHEI方案 二.算法步骤简介 1.图像加密 2.数据嵌入(重点) 3.图像恢复(重点) 总结 收获与思考 前言 原文题目<Reversal of pixel ...

  5. 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像格式与 Camera图像传感器方向问题 二. NV21 图像格式视频旋转 1. 图像旋转问题及解决方案 ( 顺时针旋转 90 度 ) 2. NV ...

  6. 用 OpenCV 检测图像中各物体大小

    我们需要定义一个比值,它测量每个给定指标的像素个数. 我将其称为「像素/度量」比率,在下一节中我将更正式地定义它. 1.「像素/度量」比率 为了确定图像中物体的大小,我们首先需要使用一个参考物体进行「 ...

  7. 图像中目标的绝对位置信息(2)--Global Pooling, More than Meets the Eye: Position Information is Encoded Channel-

    关于偶数卷积核和padding的副作用可以参考这个博客. 首先,本文是翻译了 ICCV 2021的一篇文章:Global Pooling, More than Meets the Eye: Posit ...

  8. X射线图像中的目标检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1 动机和背景 每天有数百万人乘坐地铁.民航飞机等公共交通工具,因 ...

  9. 谷歌最新论文:从图像中进行3-D目标检测

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:黄浴 知乎链接:https://zhuanlan.zhihu.com/p/1 ...

最新文章

  1. Microbiome:首个地球微生物“社会关系”网络在浙大绘制!
  2. 新书上市|鲁智深和镇关西是怎么吵起来的?
  3. 商业智能项目错误经验总结(三) 需求调研
  4. Scrollview+ListView冲突解决
  5. 1014 Waiting in Line (30 分) 【未完成】【难度: 难 / 知识点: 大模拟】
  6. php rss xml,php – 如何使用simplexml解析RSS中的标记
  7. hdu 2586(LCA的离线做法)
  8. java设计模式 组合_JAVA 设计模式 组合模式
  9. 面向对象-多态,反射
  10. android sdk与adt版本,eclipse中sdk与adt版本不兼容该怎么解决? 三种方法帮你搞定
  11. 乘风破浪:LeetCode真题_008_String to Integer (atoi)
  12. java Web应用配置log4j日志记录
  13. poj 2385 Apple Catching 经典dp
  14. python2.7.11 for iOS 苹果上的python27环境
  15. 《具体数学》——数论
  16. java字面量和符号引用
  17. Ubuntu包依赖损坏的解决unmet dependencies
  18. python字母对照表_Python获取字母表
  19. 【JavaLearn】 # (2)类和对象、变量、构造方法、普通方法、this关键字
  20. 一种基于嵌入式的多重识别门禁系统设计方案

热门文章

  1. 新版Microsoft Azure Web管理控制台 - Microsoft Azure New Portal - (3)
  2. 安装完Oracle数据库之后设置手动启动方法
  3. Java多线程之捕获异常
  4. 针对集合中的某个字段对集合中的对象进行排序
  5. 【译】RAID的概念和RAID对于SQL性能的影响
  6. 安卓Day16-bug
  7. 2018第九届蓝桥杯省赛真题 C语言B组 第一题
  8. 利用Access-Control-Allow-Origin响应头解决跨域请求
  9. java中的多线程——进度1
  10. a data source instance has not been supplied for the datasource 'dataset1'. rdlc