직선의 각도 구하기
0. 웹캠을 동작 시킨다.
1. 그레이스케일로 영상을 변환한다.
2. 이진화를 한다. (p238 포스터 만들기 참고) - 실습 5.3.5
3. 에지를 구한다. (p382 소벨 에지)
4. 화소 검색을 통해 두 점을 구한다.
5. 두 점으로 직선의 방정식으로 각도를 구한다.
직선을 구하는 방법
1) 선형 회귀분석을 통해 점들로부터 직선을 구한다.
선형 회귀 분석(linear regression analysis) : 네이버 블로그 (naver.com)
Linear Regression Method Using C++ with Output (codesansar.com)
Linear Regression Implementation In C++ | by Ahmed Hashesh | DS4B | Medium
점들의 좌표와 직선과의 오차가 가장 작은 직선을 구하기 위해 최소자승법을 이용하여 구하게 된다.
| 점들과 직선의 오차를 SSE (Sum of squared errors)로 표현하여 최소자승법으로 구한다.
|
최소자승법은 오차를 최소화 하는 방법으로 오차의 총합인 SSE를 a,b에 대해 편미분한 값이 0이 되는 식을 이용하여 ,a,b를 구하게 된다. 이를 만족하는 a,b를 계산하면 다음과 같은 식이 된다. (연세대학교 물리학실험실(Yonsei Phylab))
| 소스코드 | 결과 |
#include<iostream> #define S 50 using namespace std;
int main() { int n, i; float x[S], y[S], sumX=0, sumX2=0, sumY=0, sumXY=0, a, b;
/* Input */ cout<<"How many data points? "; cin>>n;
cout<<"Enter data:"<< endl;
for(i=1;i<=n;i++) { cout<<"x["<< i <<"] = "; cin>>x[i]; cout<<"y["<< i <<"] = "; cin>>y[i]; }
/* Calculating Required Sum */ for(i=1;i<=n;i++) { sumX = sumX + x[i]; sumX2 = sumX2 + x[i]*x[i]; sumY = sumY + y[i]; sumXY = sumXY + x[i]*y[i]; } /* Calculating a and b */ b = (n*sumXY-sumX*sumY)/(n*sumX2-sumX*sumX); a = (sumY - b*sumX)/n;
/* Displaying value of a and b */ cout<<"Calculated value of a is "<< a << "and b is "<< b << endl; cout<<"Equation of best fit is: y = "<< a <<" + "<< b<<"x";
return(0); } | 4개의 점들의 좌표(x,y)를 입력하면 직선의 방정식 y=ax+b에서 a,b의 계수를 계산할 수 있다.
How many data points? 4 Enter data: x[1] = 0 y[1] = -1 x[2] = 2 y[2] = 5 x[3] = 5 y[3] = 12 x[4] = 7 y[4] = 20
Calculated value of a is -1.13793and b is 2.89655 Equation of best fit is: y = -1.13793 + 2.89655x |
2) 두 점으로부터 직선의 각도를 구한다.
직선영상: (그림판에서 직접 그려본다.)
deg -> rad 변환 (https://truecode.tistory.com/18)
테스트 영상들
학생 작품
2024-2학기 원건희