OpenCV:按角度旋转点:解决方案中的偏移/偏移

Posted

技术标签:

【中文标题】OpenCV:按角度旋转点:解决方案中的偏移/偏移【英文标题】:OpenCV: Rotate points by an angle: Offset/shift in solution 【发布时间】:2017-07-11 14:24:28 【问题描述】:

我正在尝试将向量中的一组点旋转用户定义的角度,并在SO 找到了解决方案。 在以下代码中,输出图像的尺寸和旋转角度(45 度)是正确的,但点的位置似乎发生了偏移。 有人可以给我提示,问题是什么? 编辑:查看生成的线正确旋转的附加图片,但结果不是从 (0,0) 开始(左上角)。

generated Line rotated Line

cv::Point rotate2d(const cv::Point& inPoint, const double& angRad)

    cv::Point outPoint;
    //CW rotation
    outPoint.x = std::cos(angRad)*inPoint.x - std::sin(angRad)*inPoint.y;
    outPoint.y = std::sin(angRad)*inPoint.x + std::cos(angRad)*inPoint.y;
    return outPoint;


cv::Point rotatePoint(const cv::Point& inPoint, const cv::Point& center, const double& angRad)

    return rotate2d(inPoint - center, angRad) + center;



int main( int, char** argv )

    // Create an dark Image with a gray line in the middle
    Mat img = Mat(83, 500, CV_8U);
    img = Scalar(0);
    vector<Point> pointsModel;

    for ( int i = 0; i<500; i++)
    
        pointsModel.push_back(Point(i , 41));
    

    for ( int i=0; i<pointsModel.size(); i++)
    
        circle(img, pointsModel[i], 1, Scalar(120,120,120), 1, LINE_8, 0);
    
    imshow("Points", img);

    // Rotate Points
    vector<Point> rotatedPoints;
    Point tmpPoint;
    cv::Point pt( img.cols/2.0, img.rows/2.0 );
    for ( int i=0; i<pointsModel.size(); i++)
    
        tmpPoint = rotatePoint(pointsModel[i] , pt , 0.7854);
        rotatedPoints.push_back(tmpPoint);
    
    Rect bb = boundingRect(rotatedPoints);
    cout << bb;
    Mat rotatedImg = Mat(bb.height, bb.width, img.type());
    rotatedImg = Scalar(0);

    for (int i=0; i<rotatedPoints.size(); i++ )
    
        circle(rotatedImg, rotatedPoints[i], 1, Scalar(120,120,120), 1, LINE_8, 0);
    
    imshow("Points Rotated", rotatedImg);
    waitKey();

    return 0;

【问题讨论】:

你能上传一些输入​​图像、输出和想要的结果的截图吗? 我做到了。请查看已编辑的问题 【参考方案1】:

这两行:

Rect bb = boundingRect(rotatedPoints);
Mat rotatedImg = Mat(bb.height, bb.width, img.type());

您将新图像尺寸设置为bb。但是bb 本身有一个平移偏移量,当您继续转换点时您没有考虑到它;所以等效地,新的 viewport 本身是偏移的。

你可以做的是扩展原始图像以适应bb,即像这样:

Mat rotatedImg(std::max(img.width(), bb.x + bb.width), std::max(img.height(), bb.y + bb.height), img.type());

【讨论】:

再次感谢您的帮助@spug。我可能问得有点不清楚:我的输出点应该从点 (0,0) 开始并且是正的,而不是将 Mat 拟合到相应的点。我设法通过从每个点减去 bb.x 和 bb.y 值来做到这一点。如果没有更快的解决方案,可以关闭问题。

以上是关于OpenCV:按角度旋转点:解决方案中的偏移/偏移的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV/EMGU (C#) 物体检测

iOS 带有偏移的垂直旋转木马

计算给定球体上扭曲椭圆的偏移量

SwiftUI .rotationEffect() 框架和偏移

对 OpenCV 中 getRotationMatrix2D 函数和仿射变换的一点理解

旋转滑块 wordpress 全屏和容器偏移