C++ OpenCV Transformation

2021. 1. 18. 09:00OpenCV/OpenCV C++

반응형

1. 이미지 확대 & 축소

실행코드

#include "iostream"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    //Mat src = imread("Lenna.png");
    Mat src = imread("cloud.jpg");
    Mat dst;
    Mat dst2;

    pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));
    pyrDown(src, dst2, Size(src.cols / 2, src.rows / 2));

    imshow("src", src);
    imshow("dst", dst);
    imshow("dst2", dst2);

    waitKey(0);

    return 0;
}

 

실행결과

1



2. 이미지 크기조절

실행코드

#include "iostream"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    //Mat img = imread("Lenna.png");
    Mat img = imread("cloud.jpg");

    Mat img_big, img_small;

    resize(img, img_big, Size(0, 0), 1.5, 1.5); // 상대적 크기
    resize(img, img_small, Size(200, 200)); // 절대적 크기

    imshow("original", img);
    imshow("img_big", img_big);
    imshow("img_small", img_small);

    waitKey(0);

    return 0;
}

 

실행결과

2



3. 이미지 대칭

실행코드

#include "iostream"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    //Mat src = imread("Lenna.png");
    Mat src = imread("cloud.jpg");
    Mat dst;
    Mat dst2;
    Mat dst3;

    flip(src, dst, 0); // X축 대칭
    flip(src, dst2, 1); // Y축 대칭
    flip(src, dst3, -1); // XY축 대칭

    imshow("src", src);
    imshow("dst", dst);
    imshow("dst2", dst2);
    imshow("dst3", dst3);

    waitKey(0);

    return 0;
}

 

실행결과

3



4. 이미지 회전

실행코드

#include "iostream"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    //Mat src = imread("Lenna.png");
    Mat src = imread("cloud.jpg");
    Mat dst;

    Point center = Point(src.cols / 2, src.rows / 2);
    double angle = 45.0;
    double scale = 1.0;

    Mat rot_mat = getRotationMatrix2D(center, angle, scale);

    warpAffine(src, dst, rot_mat, src.size());

    imshow("src", src);
    imshow("dst", dst);

    waitKey(0);

    return 0;
}

 

실행결과

4



5. 아핀 변환

실행코드

#include "iostream"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    //Mat src = imread("Lenna.png");
    Mat src = imread("cloud.jpg");

    Point2f srcTri[3];
    srcTri[0] = Point2f(0.f, 0.f);
    srcTri[1] = Point2f(src.cols - 1.f, 0.f);
    srcTri[2] = Point2f(0.f, src.rows - 1.f);

    Point2f dstTri[3];
    dstTri[0] = Point2f(0.f, src.rows * 0.33f);
    dstTri[1] = Point2f(src.cols * 0.85f, src.rows * 0.25f);
    dstTri[2] = Point2f(src.cols * 0.15f, src.rows * 0.7f);

    Mat warp_mat = getAffineTransform(srcTri, dstTri);
    Mat dst = Mat::zeros(src.rows, src.cols, src.type());
    warpAffine(src, dst, warp_mat, dst.size());

    imshow("src", src);
    imshow("dst", dst);

    waitKey(0);

    return 0;
}

 

실행결과

5



6. 원근 변환

실행코드

// 원근 변환
#include "iostream"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    //Mat src = imread("Lenna.png");
    Mat src = imread("cloud.jpg");

    Point2f srcTri[4];
    srcTri[0] = Point2f(0.f, 0.f);
    srcTri[1] = Point2f(src.cols - 1.f, 0.f);
    srcTri[2] = Point2f(0.f, src.rows - 1.f);
    srcTri[3] = Point2f(src.cols - 1.f, src.rows - 1.f);

    Point2f dstTri[4];
    dstTri[0] = Point2f(0.f, src.rows * 0.33f);
    dstTri[1] = Point2f(src.cols * 0.85f, src.rows * 0.25f);
    dstTri[2] = Point2f(src.cols * 0.15f, src.rows * 0.7f);
    dstTri[3] = Point2f(src.cols * 0.85f, src.rows * 0.7f);

    Mat warp_mat = getPerspectiveTransform(srcTri, dstTri);
    Mat dst = Mat::zeros(src.rows, src.cols, src.type());
    warpPerspective(src, dst, warp_mat, dst.size());

    imshow("src", src);
    imshow("dst", dst);

    waitKey(0);

    return 0;
}

 

실행결과

6



출처

코드

https://docs.opencv.org/3.4.12/d4/d1f/tutorial_pyramids.html

https://diyver.tistory.com/90

https://docs.opencv.org/3.4.12/d4/d61/tutorial_warp_affine.html

https://docs.opencv.org/3.4.12/d2/de8/group__core__array.html#gad327659ac03e5fd6894b90025e6900a7

이미지

https://pixabay.com/ko/photos/%ED%95%98%EB%8A%98-%EA%B5%AC%EB%A6%84-%EC%9E%90%EC%97%B0-%EB%B8%94%EB%A3%A8-5420151/

반응형

'OpenCV > OpenCV C++' 카테고리의 다른 글

C++ OpenCV QRcode scanner  (1) 2021.01.26
C++ OpenCV Labeling  (0) 2021.01.20
C++ OpenCV Segmentation and Labelging  (0) 2021.01.11
C++ OpenCV 컬러 흑백 이미지 Histogram(히스토그램)  (0) 2021.01.08
C++ OpenCV 이미지 전처리  (0) 2021.01.04