OPENCV 基于旋转矩阵 旋转Point2f

OpenCV旋转Point2f方法详解

测试效果

创建两个点,让第二个点绕第一个点转45度

代码解析

Mat a; a = imread("D:\\0.bmp", -1);

读取一张图片当作背景板

Point2f p1(350, 150); Point2f p2(550.0f, 150.0f);

创建两个点

cv::Mat mat = getRotationMatrix2D(p1, 45, 1.0);

生成旋转矩阵,中心点为p1

std::vector<cv::Point2f> points = { p2 }; cv::Mat srcPoint(points);

将p2的数据放进一个mat对象中

cv::Mat dstPoint; // 应用变换 cv::transform(srcPoint, dstPoint, mat);

创建结果Mat 执行矩阵变换

float x = dstPoint.at<float>(0, 0); float y = dstPoint.at<float>(0, 1); cv::Point2f rotatedPoint(x, y);

输出结果也是一个Mat对象 从这个Mat对象中取出仿射变换之后的点坐标数据

std::cout << "Rotated Point: " << rotatedPoint << std::endl; circle(mergedImage, p1, 3, Scalar(0, 255, 0), 3, LINE_AA); circle(mergedImage, p2, 3, Scalar(0, 255, 0), 3, LINE_AA); circle(mergedImage, rotatedPoint, 3, Scalar(0, 0, 255), 3, LINE_AA); line(mergedImage,p1,p2, Scalar(0, 255, 255),2,LINE_AA); line(mergedImage, p1, rotatedPoint, Scalar(0, 0, 255), 2, LINE_AA);

三个点坐标数据,绘制到图像上,以便确认执行正确。

原始代码

    Mat a;
    a = imread("D:\\0.bmp", -1);

    cv::Mat mergedImage;
    std::vector<cv::Mat> channels = { a, a, a };
    cv::merge(channels, mergedImage);


    Point2f p1(350, 150);
    Point2f p2(550.0f, 150.0f);

    cv::Mat mat = getRotationMatrix2D(p1, 45, 1.0);

    std::vector<cv::Point2f> points = { p2 };
    cv::Mat srcPoint(points);

    cv::Mat dstPoint;

    // 应用变换
    cv::transform(srcPoint, dstPoint, mat);

    // 提取结果
    float x = dstPoint.at<float>(0, 0);
    float y = dstPoint.at<float>(0, 1);
    cv::Point2f rotatedPoint(x, y);

    std::cout << "Rotated Point: " << rotatedPoint << std::endl;

    circle(mergedImage, p1, 3, Scalar(0, 255, 0), 3, LINE_AA);
    circle(mergedImage, p2, 3, Scalar(0, 255, 0), 3, LINE_AA);
    circle(mergedImage, rotatedPoint, 3, Scalar(0, 0, 255), 3, LINE_AA);

    line(mergedImage,p1,p2, Scalar(0, 255, 255),2,LINE_AA);
    line(mergedImage, p1, rotatedPoint, Scalar(0, 0, 255), 2, LINE_AA);


    imshow("1", mergedImage);
    waitKey();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄晓魚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值