برای این کار mass of center کانتور را بدست آورده و سپس کلیه نقاط را حول آن به روش قطبی بچرخانید.
#define BH_DEG_TO_RAD CV_PI/180
cv::Point bhContourCenter(const BhContour& contour, bool center_of_mass ){
cv::Point result;
if (center_of_mass){
Moments m = moments(contour, true);
result = cv::Point(int(m.m10 / m.m00), int(m.m01 / m.m00));
}
else {
cv::Rect rct = boundingRect(contour);
result = cv::Point(rct.x + rct.width / 2, rct.y + rct.height / 2);
}
return result;
}
Point rotatePoint(const Point& pnt,const Point& center, float angle){
auto rad = (int)norm(pnt - center);
auto teta = bhGetLineAngle(center, pnt);
Point result;
float new_teta = angle + teta;
result.x = center.x + cvRound(rad * cos(new_teta * BH_DEG_TO_RAD));
result.y = center.y + cvRound(rad * sin(new_teta * BH_DEG_TO_RAD));
return result;
}
BhContour rotateContour(const BhContour& contour, float angle){
BhContour result;
auto center = bhContourCenter(contour, true);
result.reserve(contour.size());
for (auto& pnt : contour)
result.push_back(rotatePoint(pnt, center, angle));
return result;
}
int main(){
BhContour contour;
rotateContour(contour,30);
return 0;
}