// 根据轮廓计算最小外接矩形
cv::RotatedRect rects = cv::minAreaRect(contours[i]);
// 角度调整
double angle = rects.angle;
if (angle > -90 && angle <= -45) {
angle += 90;
}
else if (angle > -45 && angle < 0) {
angle;
}
else {
angle = 0;
}
// 旋转矫正
cv::Mat rotMat = cv::getRotationMatrix2D(rects.center, angle, 1.0);
cv::Mat dst;
cv::Size dst_sz(img.size().width, img.size().height);
cv::warpAffine(img, dst, rotMat, dst_sz);
// 计算旋转后的的坐标
cv::Point2f pts[4];
rects.points(pts);
cv::Point newPts; // pts[0]对应旋转矫正后的新坐标
int x = pts[0].x - rects.center.x;
int y = pts[0].y - rects.center.y;
double angle_1 = angle * PI / 180;// RotatedRect类型的angle转为真实的角度
newPts.x = cvRound(x * cos(angle_1) + y * sin(angle_1) + rects.center.x);
newPts.y = cvRound(-x * sin(angle_1) + y * cos(angle_1) + rects.center.y);
cv::circle(img, pts[0], 10, cv::Scalar(255, 0, 0), 5);
cv::imwrite("pts[0].bmp", img);
cv::circle(dst, newPts, 10, cv::Scalar(0, 0, 255), 5);
cv::imwrite("newPts.bmp", dst);
C++ OpenCV 计算仿射变换后对应特征点的新坐标
最新推荐文章于 2024-08-08 18:36:45 发布