我希望在使用以下代码旋转图像后获取cv :: rect(ROI)的新位置:
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));
我怎么能这样做?
答案 0 :(得分:3)
由于您有旋转矩阵,因此可以使用cv::transform
函数旋转ROI矩形。首先,你需要一个矩形点的数组。
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}
};
然后,您可以使用cv::transform
:
vector<Point2f> rot_roi_points;
transform(roi_points, rot_roi_points, rot);
这样,rot_roi_points
可以保存变换后的矩形的点。
的 ==&GT; 强>
答案 1 :(得分:2)
为了获得cv :: rect(ROI)的新位置,你必须使用以下函数转换它的每个角:
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);
}
变换矩阵与用于图像旋转的变换矩阵相同。