按点坐标旋转点向量

Posted

技术标签:

【中文标题】按点坐标旋转点向量【英文标题】:Rotate vector of points by point coordinate 【发布时间】:2015-08-13 11:43:10 【问题描述】:

有没有一种简单的方法可以将cv::vector<cv::Point> 中存储的一组点移动cv::Point 定义的数量?类似于 std::rotate 的东西,但只针对该点的一个坐标。它应该考虑向量的大小。

例如,

[1,0],[0,1],[1,2],[2,3][0,2] 移动到[1,2],[0,3],[1,0],[2,1]

我能想到的唯一方法是使用 for 循环手动完成。

【问题讨论】:

std::rotate 不采用自定义交换器,因此您需要设计迭代器适配器以提供点的 y 坐标视图。你最好写循环。 【参考方案1】:

你可以:

    vector<Point> 创建一个Mat。这将是一个 2 通道矩阵,Nx1 重塑,使其成为 1 通道矩阵,Nx2 获取包含 x 和 y 坐标的列 使用 MatIterator 在该列上使用旋转

注意Mat没有反向迭代器(实现旋转),所以当shift为负数时,你应该将vector<Point>的大小加到shift中并使用左旋转。

您主要是在使用矩阵标题,因此不会复制数据。

代码如下:

#include <opencv2\opencv.hpp>
#include <vector>
#include <iostream>

using namespace std;
using namespace cv;

int main()

    vector<Point> pts =  Point(1, 0), Point(0, 1), Point(1, 2), Point(2, 3) ;
    Point shift(0,2);

    for (const Point& p : pts)  cout << "[" << p.x << ", " << p.y << "] ";  cout << endl;

    // [1, 0] [0, 1] [1, 2] [2, 3]

    // ----------------------------  

    Mat mpts(pts);
    Mat xy = mpts.reshape(1);
    Mat x = xy.col(0);
    Mat y = xy.col(1);

    if (shift.x < 0)
        shift.x += pts.size();

    std::rotate(x.begin<Point::value_type>(), x.begin<Point::value_type>() + shift.x, x.end<Point::value_type>());

    if (shift.y < 0)
        shift.y += pts.size();

    std::rotate(y.begin<Point::value_type>(), y.begin<Point::value_type>() + shift.y, y.end<Point::value_type>());

    // ----------------------------        

    for (const Point& p : pts)  cout << "[" << p.x << ", " << p.y << "] ";  cout << endl;

    // [1, 2] [0, 3] [1, 0] [2, 1]

    return 0;

【讨论】:

以上是关于按点坐标旋转点向量的主要内容,如果未能解决你的问题,请参考以下文章

三维空间刚体运动

二维向量的旋转

视觉SLAM三维空间刚体运动的描述

视觉SLAM三维空间刚体运动的描述

描述三维刚体旋转

旋转矩阵和变换矩阵的概念和区别