2013-07-15 6 views
0

나는 가운데 점을 중심으로 4 점 (직사각형)을 회전하려고합니다. 그러나 결과는 이상하게 보입니다. 나는 (사각형을 회전) 내 목적을 위해 여기 OpenCV, 특정 점 주변 회전

p.x'=p.x*cos(alpha) + p.y*sin(alpha); 

p.y'=(-1)p.x*sin(alpha) + p.y*cos(alpha); 

위키 피 디아

에있는 공식이 공식이 적용되어 사용할 수 있습니까? 여기

당신을 감사 시계 방향으로 내가 당신의 수식이 올바른지 매우

Mat img(480, 800, CV_8UC4, Scalar(255,255,255,255)); 
Mat dst(480, 800, CV_8UC4, Scalar(255,255,255,255)); 

Point p1, p2, p3, p4; 
Point center; 

p1.x=501; p1.y=247; 
p2.x=429; p2.y=291; 
p3.x=388; p3.y=222; 
p4.x=451; p4.y=186; 

circle(img, p1, 3, Scalar(255, 0, 0, 255), 3, 8, 0); 
circle(img, p2, 3, Scalar(0, 255, 0, 255), 3, 8, 0); 
circle(img, p3, 3, Scalar(0, 0, 255, 255), 3, 8, 0); 
circle(img, p4, 3, Scalar(255, 255, 0, 255), 3, 8, 0); 

center.x = (p1.x+p2.x+p3.x+p4.x)/4; 
center.y = (p1.y+p2.y+p3.y+p4.y)/4; 


double alpha = -33 * 0.0174532925; 
double s = sin(alpha); 
double c = cos(alpha); 

p1.x = (+c*(p1.x-center.x)* + s*(p1.y-center.y)) + center.x; 
p1.y = (-s*(p1.x-center.x) + c*(p1.y-center.y)) + center.y; 
p2.x = (+c*(p2.x-center.x)* + s*(p2.y-center.y)) + center.x; 
p2.y = (-s*(p2.x-center.x) + c*(p2.y-center.y)) + center.y; 
p3.x = (+c*(p3.x-center.x)* + s*(p3.y-center.y)) + center.x; 
p3.y = (-s*(p3.x-center.x) + c*(p3.y-center.y)) + center.y; 
p4.x = (+c*(p4.x-center.x)* + s*(p4.y-center.y)) + center.x; 
p4.y = (-s*(p4.x-center.x) + c*(p4.y-center.y)) + center.y; 

circle(dst, p1, 3, Scalar(255, 0, 0, 255), 3, 8, 0); 
circle(dst, p2, 3, Scalar(0, 255, 0, 255), 3, 8, 0); 
circle(dst, p3, 3, Scalar(0, 0, 255, 255), 3, 8, 0); 
circle(dst, p4, 3, Scalar(255, 255, 0, 255), 3, 8, 0); 

imshow("src", img); 
imshow("dst", dst); 
cvMoveWindow("dst", 0, img.cols+50); 

waitKey(0); 
return 0; 

답변

1

, 33도 카운터를 회전하려고하면 소스입니다. 당신의 수학은 좋아 보인다. 그냥 *

+0

입니다 새 계산 된 값 와 이전 x 값을 덮어 멍청한 놈, 내가 내 자신의 컴퓨터에서이 코드를 테스트 한 작동 단지 오타 및 VIM : 입니다 벌금. 자체 컴파일 된 opencv 버전에 문제가있을 수 있습니다. 고맙습니다 모두 – jus

+0

루프를 0 번에서 360도 회전하면 이상하게 작동합니다. 점은 원에서 회전하지 않지만 타원에서는 회전합니다. – jus

1

그래서, 내가 해결책을 찾아 제거

p1.x = ((+c*(p1.x-center.x))* (+ s*(p1.y-center.y))) + center.x; 

:

p1.x = (+c*(p1.x-center.x)* + s*(p1.y-center.y)) + center.x; 
         ^

이로 평가됩니다 : 당신의 문제는 아마 여분 * 상징이다. 나는이 문제가 아니었다 솔루션

for(int i = 0; i<360; i++) 
{ 
    Mat img(480, 800, CV_8UC4, Scalar(255,255,255,255)); 
    Mat dst(480, 800, CV_8UC4, Scalar(255,255,255,255)); 

    Point p1, p2, p3, p4; 
    Point center; 

    p1.x=501; p1.y=247; 
    p2.x=429; p2.y=291; 
    p3.x=388; p3.y=222; 
    p4.x=451; p4.y=186; 

    circle(img, p1, 3, Scalar(255, 0, 0, 255), 3, 8, 0); 
    circle(img, p2, 3, Scalar(0, 255, 0, 255), 3, 8, 0); 
    circle(img, p3, 3, Scalar(0, 0, 255, 255), 3, 8, 0); 
    circle(img, p4, 3, Scalar(255, 255, 0, 255), 3, 8, 0); 

    center.x = (p1.x+p2.x+p3.x+p4.x)/4; 
    center.y = (p1.y+p2.y+p3.y+p4.y)/4; 

    double alpha = -i * 0.0174532925; 
    double s = sin(alpha); 
    double c = cos(alpha); 
    int x = 0, y = 0; 

    x=p1.x; y=p1.y; 
    p1.x = (c*(x-center.x) - s*(y-center.y)) + center.x; 
    p1.y = (s*(x-center.x) + c*(y-center.y)) + center.y; 
    x=p2.x; y=p2.y; 
    p2.x = (c*(x-center.x) - s*(y-center.y)) + center.x; 
    p2.y = (s*(x-center.x) + c*(y-center.y)) + center.y; 
    x=p3.x; y=p3.y; 
    p3.x = (c*(x-center.x) - s*(y-center.y)) + center.x; 
    p3.y = (s*(x-center.x) + c*(y-center.y)) + center.y; 
    x=p4.x; y=p4.y; 
    p4.x = (c*(x-center.x) - s*(y-center.y)) + center.x; 
    p4.y = (s*(x-center.x) + c*(y-center.y)) + center.y; 


    circle(dst, p1, 3, Scalar(255, 0, 0, 255), 3, 8, 0); 
    circle(dst, p2, 3, Scalar(0, 255, 0, 255), 3, 8, 0); 
    circle(dst, p3, 3, Scalar(0, 0, 255, 255), 3, 8, 0); 
    circle(dst, p4, 3, Scalar(255, 255, 0, 255), 3, 8, 0); 

    imshow("src", img); 
    imshow("dst", dst); 
    cvMoveWindow("dst", 0, img.cols+50); 

    waitKey(20);