1. 회전 변환(Rotation transform): 영상을 특정 각도만큼 회전시키는 변환으로 Opencv 에서는 반시계방향을 기본으로 사용. theta 회전 시 반시계방향으로 theta만큼 회전
1) 회전변환도 역방향 매핑으로 구현해야 빈 픽셀이 발생하지 않는다.
2) 보간법 선택 가능.
2. 회전변환 시 rotate() [90, 270, 180 도 등 특수각 형태만 지원) 와 warpAffine 를 조합해 범용적인 회전변환이 가능하다
1) 영상의 회전변환 행렬 구하는 함수
Mat getRotationMatrix2D(Point2f center, double angle, double scale);
center: 회전중심 좌표
angle <0 인 경우 시계방향으로 해당 각도만큼 회전
scale: 회전 후 확대비율
반환값: 2x3 double(CV_64F) 행렬 (==어파인변환행렬)
2) 어파인 함수
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar());
dst : src와 같은 타입의 출력영상
M: 2x3 어파인 변환 행렬, CV_32 또는 CV_64F.
dsize: 결과 영상의크기 ( Size() 로 타이핑 시 입력영상의 크기와 동일하게 나옴)
flags: 보간법선택
borderMode: 가장자리 픽셀 처리 방식 ( 영상 회전 시 비어있는 공간에 어떤 값을 설정할건가 처리 방식 의미)
borderValue: BORDER_CONSTANT 모드 사용 시 사용할 픽셀 값. Scalar() == (0, 0, 0, 0) 으로 픽셀이 빈값으로 동작함,.
void flip(InputArray src, OutputArray dst, int flipCode);
flipCode: 대칭방향 지정
양수(+1): 좌우 대칭
0 : 상하대칭
음수(-1): 좌우 & 상하 대칭
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
void on_rotate(int pos, void* data) {
Mat src = *(Mat*)data;
float degree = (float)pos;
Point2f pt(src.cols / 2.f, src.rows / 2.f);
Mat rot = getRotationMatrix2D(pt, degree, 1.0);
Mat dst;
//warpAffine(src, dst, rot, Size()); //src : 512x512
warpAffine(src, dst, rot, Size(700,700));
imshow("dst", dst);
}
void TC1() {
Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty()) {
cerr << "Image laod failed!" << endl;
return;
}
imshow("src", src);
namedWindow("dst");
createTrackbar("angle", "dst", 0, 360, on_rotate, (void*)&src);
waitKey();
}
void TC2() { //이동변환, 크기변환, 회전변환 조합하기.
//1 크기변환 -> 회전변환
//2 크기변환 -> 회전변환 -> 크기변환
//3 이동변환 -> 크기변환
//4 이동변환 -> 크기변환 -> 회전변환
/*덧셈 변환을 없애는 방법
->동 차 좌표계(homogenous coordinates)
1) 차원의 좌표를 1차원 증가시켜 표현 하는 방법
2) eg. 2차원 (x, y) 좌표를 (x, y, 1) 로 표현
3) 이동, 크기 , 회전변환의 조합을 2x3 행렬 하나로 표현 가능
4)getRotationMatrix2D() 함수를 이용해 영상의 중앙 기준으로 회전을 할 수 있다.
*/
}
void TC3() {
//대칭변환 (flip, reflection)
//영상의 상하대칭, 좌우대칭, 원점대칭
}
int main()
{
//TC1();
//TC2();
TC3();
}
'프로그래머스 > OPENCV' 카테고리의 다른 글
리매핑(remapping) (0) | 2022.12.05 |
---|---|
어파인 변환과 투시 변환 ( with bird eyeview) (0) | 2022.12.05 |
영상의 크기 변환 (scale transform == resize) 과 보간법 [ 다시] (0) | 2022.12.05 |
영상의 기하학적 변환(geometric transformation) (0) | 2022.12.05 |
1주차 과제) 히스토그램 개선해서 명암비가 좋은 결과 이미지 만들기 (0) | 2022.12.03 |