旋转cv :: Rect的中心 [英] Center of rotated cv::Rect

查看:140
本文介绍了旋转cv :: Rect的中心的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个图像,并且在图像上放置了一个矩形.然后,我旋转图像.如何获得旋转图像上矩形的中心?

I have an image, and I place a rectangle on the image. Then I rotate the image. How do I get the center of the rectangle on the rotated image?

或者我可以以某种方式旋转矩形以放置旋转后的图像吗?我认为在这种情况下,旋转必须与用于旋转图像的点沿着同一点进行.

Or can I rotate a rectangle somehow to put on rotated image? I think in this case rotation must be done along same point with point used to rotate image.

这是上面放有矩形的图像.

This is the image with a rectangle placed on it.

这是旋转的图像.

这是我用来旋转图片的代码:

Here is the code I use to rotate my image:

cv::Mat frame, frameRotated;
frame = cv::imread("lena.png");

cv::Rect rect(225,250,150,150);
cv::rectangle(frame, rect, cv::Scalar(0,0,255),2);

int theta = 30;
double radians = theta * PI / 180.0;            

double sin = abs(std::sin(radians));
double cos = abs(std::cos(radians));

int newWidth = (int) (frame.cols * cos + frame.rows * sin);
int newHeight = (int) (frame.cols * sin + frame.rows * cos);

cv::Mat targetMat(cv::Size(newWidth, newHeight), frame.type());

int offsetX = (newWidth - frame.cols) / 2;
int offsetY = (newHeight - frame.rows) / 2;

frame.copyTo(targetMat.rowRange(offsetY, offsetY + frame.rows).colRange(offsetX, offsetX + frame.cols));

cv::Point2f src_center(targetMat.cols/2.0F, targetMat.rows/2.0F);
cv::Mat rot_mat = cv::getRotationMatrix2D(src_center, theta, 1.0);
cv::warpAffine(targetMat, frameRotated, rot_mat, targetMat.size());

imshow("frame", frame); 
imshow("rotated frame", frameRotated);  

编辑

假设旋转的图像中有一个点,如何使用旋转矩阵在原始图像中获得对应的点?

Suppose I have a point in the rotated image, how do I get corresponding point in the original image using rotation matrix?

推荐答案

您只需要使用rot_mat来变换矩形的原始中心.我测试了以下内容,并且可以正常工作:

You only need to use rot_mat to transform the original center of the rect. I tested the below and it works:

cv::Rect r(250, 350, 20, 30);
cv::Point2d c(r.x + r.width / 2, r.y + r.height / 2);
// c is center of rect

// get c's location in targetMat when frame is copied
c.x += offsetX;  
c.y += offsetY;


int theta = 30;
double radians = theta * M_PI / 180.0;            

cv::Point2d src_center(targetMat.cols/2.0F, targetMat.rows/2.0F);
cv::Mat rot_mat = cv::getRotationMatrix2D(src_center, theta, 1.0);

// now transform point using rot_mat
double *x = rot_mat.ptr<double>(0);
double *y = rot_mat.ptr<double>(1);
Point2d dst(x[0] * c.x + x[1] * c.y + x[2], 
            y[0] * c.x + y[1] * c.y + y[2]);
// dst is center of transformed rect

编辑

要从旋转的图像中变换一个点,您只需要逆转该过程即可:

To transform a point from the rotated image you just need to reverse the process:

// undo translation
Point2d dst1(dst.x - x[2], dst.y - y[2]); 

// undo rotation
Point2d dst2(x[0] * dst1.x - x[1] * dst1.y, -y[0] * dst1.x + y[1] * dst1.y); 

// undo shift
Point2d in_unrotated_image(dst2.x - offsetX, dst2.y - offsetY); 

这篇关于旋转cv :: Rect的中心的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆