MFC 에서 OpenCV 의 cvGetQuadrangleSubPix 를 이용한 이미지 회전 |
개발환경 : window 7 32bit, Visual Studio 2010, OpenCV 2.3.4 |
행열을 이용해서 이미지를 회전한다. 아래 예제는 45도 회전한 것인데
회전을 하게 되면 픽셀값이 없는 부분이 나타나게 된다. 이것은 화상 경계의
외측에 있는 픽셀값을 확장해서 보여준다.
(1) 소스설명 |
먼저 cvCloneImage 를 사용해서 이미지를 복사한다.
IplImage* pDstImg = 0 ; // 복사 pDstImg = cvCloneImage (m_pImage);
회전을 위한 행렬을 초기화 한다. CvMat 을 사용하며 아래와 같이 초기화 한다.
초기화 함수는 cvInitMatHeader 이다.
float m[6]; m [0] = (float)(cos(angle * CV_PI / 180)); m [1] = (float)(- sin(angle * CV_PI / 180)); m [2] = pDstImg->width * 0.5 ; m [3] = -m [1]; m [4] = m [0]; m [5] = m_pImage->height * 0.5 ; cvInitMatHeader (&M, 2, 3, CV_32FC1, m, CV_AUTOSTEP);
2차원 회전행렬 공식은 다음과 같다.
이것을 풀어 쓴다면 아래와 같이 된다.
X' = x * cosθ - y * sinθ Y' = x * sinθ + y * cosθ |
위의 공식을 기반으로 소스코드를 해석해보자. Angle 는 회전 각도를 나타낸다.
| A11 A12 b1 | map_matrix = | | | A21 A22 b2 |
m[0] = A11 = cos(angle*π/180) m[1] = A12 = -sin(angle*π/180) m[2] = b1 = 회전 중심의 x 좌표 m[3] = A21 = sin(angle*π/180) m[4] = A22 = cos(angle*π/180) m[5] = b2 = 회전 중심의 y 좌표
dst(x, y) = src( A11x' + A12y' + b1, A21x' + A22y' + b2 ) |
지정된 회전 행렬에 의해 cvGetQuadrangleSubPix 함수를 사용해서 이미지를
회전 시킨다. M 은 cvInitMatHeader 에서 초기화한 값이다.
cvGetQuadrangleSubPix(m_pImage , pDstImg , &M );
(1) 전체소스 |
전체소스는 아래와 같다.
// 이미지 회전 void CTotalVisionDlg::OnBnClickedBtnTransform() { if (m_pImage == NULL) return; int angle = 45 ; float m[6]; IplImage* pDstImg = 0 ; CvMat M ; // 복사 pDstImg = cvCloneImage (m_pImage); // 회전을위한 행렬 (아핀 행렬) 요소를 설정하고 CvMat 행렬 M을 초기화 m [0] = (float)(cos(angle * CV_PI / 180)); m [1] = (float)(- sin(angle * CV_PI / 180)); m [2] = pDstImg->width * 0.5 ; m [3] = -m [1]; m [4] = m [0]; m [5] = m_pImage->height * 0.5 ; cvInitMatHeader (&M, 2, 3, CV_32FC1, m, CV_AUTOSTEP); // 지정된 회전 행렬은 GetQuadrangleSubPix을 이용해 이미지 전체를 회전 cvGetQuadrangleSubPix(m_pImage , pDstImg , &M ); // 표현 CRect rt; CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_CHANGE1); pStatic->GetClientRect(rt); CDC* pDC = pStatic->GetDC(); m_cImage.CopyOf(pDstImg); m_cImage.DrawToHDC(pDC->m_hDC, rt); m_cImage.Destroy(); cvReleaseImage(&pDstImg); ReleaseDC(pDC); }
'기타 언어 > C# & MFC' 카테고리의 다른 글
Visual C# Form 에 WebBrowser 클래스 이용해 웹브라우저 만들기 (2부) (0) | 2014.09.25 |
---|---|
Visual C# Form 에 WebBrowser 클래스 이용해 웹브라우저 만들기 (1부) (0) | 2014.09.25 |
개발도구인 C++ 빌더가 window 7 에서 실행되지 않을 때 (0) | 2013.05.23 |
MFC 에서 도형, 이미지등의 그림을 그릴 때 원하는 영역에만 표시하고자 할 때 (0) | 2013.05.14 |
OpenCV 를 이용해 MFC 컨트롤(Static Control) 이미지 표현 하기 (0) | 2013.05.01 |
OpenCV 에서 IplImage 구조체 데이터 초기화 하기 (0) | 2013.04.29 |
Visual C++ 2010 fatal error LNK1123: failure during conversion to COFF 에러발생시 (8) | 2013.04.26 |
OpenCV2.4 에서 raw 파일 로딩하기 (0) | 2013.04.18 |