관리 메뉴

ComputerVision Jack

[이미지 - Perspective Transform] 본문

Campus Project/Homework

[이미지 - Perspective Transform]

JackYoon 2020. 1. 19. 20:37
반응형

영상에 대해 Perspective Transform을 적용하고 싶은 영역의 4점을 찍고,

목적 영상에 4점을 찍으면 그 점으로 Transform이 적용된다. 또한 영상에대한 잡음제거도 적용된다.

Transform을 적용할 원본 이미지

[Perspective Transform]

buff = imread("../_res/card_noise.jpg", IMREAD_GRAYSCALE);

#효과를 적용할 이미지를 읽어온다.

 

dst = Mat::zeros(buff.size(), CV_8UC3);

#읽어온 이미지 크기 만큼, 결과 영상을 출력할 Mat객체를 생성한다.

 

setMouseCallback("buff", on_mouse);

#마우스 연산이 필요하기 때문에 mousecallback 시스템 함수를 생성한다.

 

void on_mouse(int event, int x, int y, int flags, void*) {
    static int cnt = 0;

    if (event == EVENT_LBUTTONDOWN) {
        if (cnt < 4) {
            srcQuad[cnt++] = Point2f(x, y);
            circle(buff, Point(x, y), 5, Scalar(0, 0, 255), -1);
            imshow("buff", buff);
        }
    }
}

#static으로 cnt를 설정해 콜백 함수가 호출될 때 마다 그 값을 누적할 수 있게 한다.

cnt갯수를 체크하면서 클릭된 값을 Point2f 벡터어 넣는다.

 

bilateralFilter(buff, src, -1, 35, 20);

#잡음제거 하기위한 filter.

 

setMouseCallback("dst", on_result);

#이번엔 결과 영상 윈도우에 적용될 mousecallback함수를 설정한다.

 

void on_result(int event, int x, int y, int flags, void*) {
    static int result = 0;

    if (event == EVENT_LBUTTONDOWN) {
        if (result < 4) {
            dstQuad[result++] = Point2f(x, y);
            circle(dst, Point(x, y), 5, Scalar(0, 0, 255), -1);
            imshow("dst", dst);

            if (result == 4) {
                Mat pers = getPerspectiveTransform(srcQuad, dstQuad);
                warpPerspective(src, dst, pers, src.size());
                imshow("dst", dst);
            }
        }
    }
}

#on_Mouse()함수와 똑같이 작성을 하되, result점이 4개 이상 찍힐 경우, 그점에 대해 transform을 적용한다.

실행하면 영상이 2개 준비 된다
원하는 부분을 점으로 찍는다.
오른쪽 영상에 점을 찍는다.
Perspective Transform.cpp
0.00MB

반응형

'Campus Project > Homework' 카테고리의 다른 글

[머신러닝 - 2차원 2클래스 분류]  (0) 2020.01.21
[게임 - snake game]  (2) 2020.01.21
[컴퓨터 비전 - Face Detect]  (0) 2020.01.20
[이미지 - 필터링 적용]  (1) 2020.01.17
[이미지 - 동전 검출]  (1) 2020.01.16
Comments