Pouya Ahmadvand
Pouya Ahmadvand

Reputation: 259

get new location of cv::rect after rotation image by warpAffine (opencv , c++)

I want to get new location of a cv::rect (ROI) after rotate the image by using the following code :

cv::Point2f center(image.cols/2.0, image.rows/2.0);

cv::Rect ROI = cv::Rect(100,200,50,100);

cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0);
cv::Rect bbox = cv::RotatedRect(center,image.size(), angle).boundingRect();

rot.at<double>(0,2) += bbox.width/2.0 - center.x;
rot.at<double>(1,2) += bbox.height/2.0 - center.y;


cv::warpAffine(image, image, rot, bbox.size(),cv::INTER_LINEAR,cv::BORDER_CONSTANT,
               cv::Scalar(255, 255, 255));

how I can do it ?

Upvotes: 1

Views: 2631

Answers (2)

frogatto
frogatto

Reputation: 29285

Since you have the rotation matrix, you can rotate the ROI rectangle using cv::transform function. First of all, you would need an array of points of that rectangle.

vector<Point2f> roi_points = {
        {roi.x,             roi.y},
        {roi.x + roi.width, roi.y},
        {roi.x + roi.width, roi.y + roi.height},
        {roi.x,             roi.y + roi.height}
};

Then, you can use cv::transform:

vector<Point2f> rot_roi_points;
transform(roi_points, rot_roi_points, rot);

This way, rot_roi_points holds points of the transformed rectangle.

enter image description here ==> enter image description here

Upvotes: 5

ErmIg
ErmIg

Reputation: 4038

In order to get new location of a cv::rect (ROI) you have to transform each of its corners with using of following function:

cv::Point2f Convert(const cv::Point2f & p, const cv::Mat & t)
{
    float x = p.x*t.at<double>((0, 0) + p.y*t.at<double>((0, 1) + t.at<double>((0, 2); 
    float y = p.x*t.at<double>((1, 0) + p.y*t.at<double>((1, 1) + t.at<double>((1, 2); 
    return cv::Point2f(x, y);
}

The transformation matrix is the same as you used for image rotation.

Upvotes: 2

Related Questions