ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Day8
    교육/서울 ICT 이노베이션 고오급 시각과정 2021. 5. 14. 13:55
    728x90

    https://docs.opencv.org/3.4/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326

     

    OpenCV: Geometric Image Transformations

    enum  cv::InterpolationFlags {   cv::INTER_NEAREST = 0,   cv::INTER_LINEAR = 1,   cv::INTER_CUBIC = 2,   cv::INTER_AREA = 3,   cv::INTER_LANCZOS4 = 4,   cv::INTER_LINEAR_EXACT = 5,   cv::INTER_NEAREST_EXACT = 6,   cv::INTER_MAX = 7,   cv

    docs.opencv.org

    https://homepages.cae.wisc.edu/~ece533/images/

     

    Test Images

     

    homepages.cae.wisc.edu

    영상의 기하학적 변환(geometric transform)

    perspective : 현실의 거리감도 반영

    1.어파인 변환

    perspective X

    픽셀의 배치구조를 변경함으로써 전체 영상의 모양을 바꾸는 작업

    영상의 이동, 회전, 크기 변경가능

    2*3 행렬로 나타냄

    1. 이동변환(translation transformation)

    =쉬프트 연산

    입력 영상의 모든 좌표를 x방향으로 a만큼 y방향으로 b만큼 이동하는 변환

    2. 전단변환(shear transformation)

    =층밀림 변환

    직사각형 형태의 영상을 한쪽 방향으로 밀어서 평행사변형 모양으로 변형되는 변환

    • y좌표가 증가함에 따라 영상을 가로 방향으로 조금씩 밀어서 만드는 전단 변환 수식
    • x좌표가 증가함에 따라 영상을 세로 방향으로 조금씩 밀어서 만드는 전단 변환 수식

    3. 크기변환

    4. 회전변환(rotation transformation)

    특정 좌표를 기준으로 영상을 원하는 각도만큼 회전하는 변환

    5. 대칭변환

    영상의 좌우를 서로 바꾸거나 상하를 뒤집는 형태의 변환

    입력 영상과 같은 크기의 결과 영상을 생성

    • 좌우대칭
    • 상하대칭

    어파인 변환은 방정식이 3개있으면 풀 수 있기 때문에 점 3개만 있으면 알 수 있음

    #opencv는 어파인 변환행렬을 구하는 함수와 어파인 변환 행렬을 이용하여 실제 영상을 어파인 변환하는 함수 제공
    
    #어파인 변환행렬을 구하는 함수
    Mat getAffineTransform(src, dst);
    /*
    src : 입력 영상의 세점의 좌표 ex)벡터, 행렬,,,
    dst : 결과 영상의 세점의 좌표 ex)벡터, 행렬,,,
    반환값 : 2*3 어파인 변환 행렬 CV_64FC1
    */
    
    #어파인 변환행렬을 가지고 있을 때 영상을 어파인 변환한 결과 영상을 생성하는 함수
    void warpAffine(src, dst, M, dsize, flags, borderMode, borderValue);
    /*
    src : 입력영상
    dst : 결과 영상
    M : 어파인 변환 행렬
    dsize : 결과 영상 크기
    flags : 보간법 알고리즘
    borderMode : 가장자리 픽셀 확장 방식
    borderValue : borderMode==BORDER_CONTANT경우 사용할 상수 값
    */

    2. 투시변환(perspective transform)

    perspective O

    어파인 변환보다 자유도가 높음

    직사각형 형태의 영상을 임의의 볼록 사각형 형태로 변경할 수 있는 변환, 원본 영상의 직선성은 유지되지만 직선 간 평행 관계는 깨질 수 있음

    3*3의 행렬로 나타냄

    투시 변환은 편의상 9개의 파라미터를 사용하지만 호모그래피 행렬 중 하나의 파라미터를 기준 스케일로 잡아 1로 바꾸면 8개의 파라미터로 표현할 수 있음->점 4개만 있으면 연립방정식으로 호모그래피 행렬을 구할 수 있음

    #OpenCV는 투시변환행렬을 구하는 함수, 투시 변환 행렬을 이용하여 실제 영상을 투시변환하는 함수 제공
    #투시변환행렬을 구하는 함수
    Mat getPerspectiveTransform(src, dst, solveMethod);
    /*
    src : 입력 영상 네점의 좌표
    dst : 결과 영상 네점의 좌표
    solveMethod : 연립방정식을 풀 때 사용할 계산방법지정
    */
    
    #투시변환행렬을 가지고 있을 때 영상을 투시변환한 결과 영상을 생성하는 함수
    void warpPerspective(src, dst, M, dsize, flags, borderMode, borderValue);
    /*
    src : 입력영상
    dst : 결과 영상
    M : 어파인 변환 행렬
    dsize : 결과 영상 크기
    flags : 보간법 알고리즘
    borderMode : 가장자리 픽셀 확장 방식
    borderValue : borderMode==BORDER_CONTANT경우 사용할 상수 값
    */
    더보기

    3차원->2차원표현은 가능하나 2차원->3차원표현은 불가능 : epipolar line이라고 함

    epipolar line?

    하지만 P가 놓여져있는 평면이 어디있는지 안다면 2차원->3차원 변환도 가능

    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    vector<Point2f> points;	//사진의 4개의 모서리 좌표를 저장할 벡터
    Mat back;
    Mat m;
    
    float intrinsicMatData[] = { 3000, 0, back.cols / 2, 0, 3000, back.rows / 2, 0, 0, 1 };
    Mat intrinsicMat(3, 3, CV_32F, intrinsicMatData);
    Mat distCoeffs, rvec, tvec;
    
    //출력할 이미지의 원하는 비율
    int dw = 62 * 3;
    int dh = 88 * 3;
    
    void onmouse(int e, int x, int y, int flag, void* data)
    {
    	if (e == EVENT_LBUTTONDOWN)
    	{
    		if (points.size() < 4)	//점이 4개 이하면 입력받기
    		{
    			points.push_back(Point2f(x, y));
    		}
    
    		if (points.size() == 4)	//점이 4개가 되면 입력그만
    		{
    			//2차원->2차원 변환
    			vector<Point2f> dstPoints = { 
    				Point2f(0, 0), Point2f(dw, 0), Point2f(dw, dh), Point2f(0, dh)
    			};
    			m = getPerspectiveTransform(points, dstPoints);	//호모그래피행렬구하기
    			Mat crop;	
    			warpPerspective(back, crop, m, Size(dw, dh));	//back : 원본영상 crop : 결과영상 m : 호모그래피 size : crop의 사이즈
    			imshow("cropped", crop);
    
    			//2차원->3차원 변환
    			vector<Point3f> objectPoints = {
    				Point3f(0, 0, 0), Point3f(dw, 0, 0), Point3f(dw, 0, -dh), Point3f(0, 0, -dh)
    			};
    			//intrinsicMat : 카메라의 초점거리 정보 distCoeffs : 2차원->3차원 변환 rvec, tvec : 카메라와 카메라 간의 좌표 변환
    			solvePnP(objectPoints, points, intrinsicMat, distCoeffs, rvec, tvec);	
    			cout << distCoeffs << endl;
    			cout << rvec << endl;
    			cout << tvec << endl;
    		}
    	}
    }

     

    에지의 검출과 응용

    1. 에지 검출

    1. 미분과 그래디언트

    영상에서 에지(edge)는 한쪽 방향으로 픽셀 값이 급격하게 바뀌는 부분(갑자기 밝아지거나 어두워지는 부분)

    일반적으로 객체와 배경, 객체와 객체의 경계에서 발생->객체의 윤곽을 알아낼 수 있고(=segmentation) 객체를 판별할 수 있음(=recognition)

     

    에지를 검출하려면 미분을 통해 할 수 있는데 미분 근사화 방법은 3가지(전진/후진/중앙 차분)가 있고 주로 중앙 차분을 사용

     

    그래디언트란 영상에서 어떤 특정 픽셀이 있을 때 그 지점의 미분값(방향+강도)->벡터로 나타낼 수 있음

    그래디언트는 HOG(Histogram Of Gaussian), SURF, 코너 검출, Optical Flow, 캐니 에지등에 사용

    '교육 > 서울 ICT 이노베이션 고오급 시각과정' 카테고리의 다른 글

    Day10  (0) 2021.06.17
    Day9  (0) 2021.06.16
    Day7  (0) 2021.05.14
    Day6  (0) 2021.05.13
    Day5  (0) 2021.05.11

    댓글

Designed by Tistory.