본문 바로가기

OpenCV

ch08 affine

#python 

import cv2
import numpy as np

def affine_transform():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch08\\affine\\tekapo.bmp")

    if src is None:
        print("Image load failed!")
        return

    srcPts = np.array([[0, 0], [src.shape[1] - 1, 0], [src.shape[1] - 1, src.shape[0] - 1]], dtype=np.float32)
    dstPts = np.array([[50, 50], [src.shape[1] - 100, 100], [src.shape[1] - 50, src.shape[0] - 50]], dtype=np.float32)

    M = cv2.getAffineTransform(srcPts, dstPts)

    dst = cv2.warpAffine(src, M, (src.shape[1], src.shape[0]))

    cv2.imshow("src", src)
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def affine_translation():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch08\\affine\\tekapo.bmp")

    if src is None:
        print("Image load failed!")
        return

    M = np.array([[1, 0, 150], [0, 1, 100]], dtype=np.float32)

    dst = cv2.warpAffine(src, M, (src.shape[1], src.shape[0]))

    cv2.imshow("src", src)
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def affine_shear():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch08\\affine\\tekapo.bmp")

    if src is None:
        print("Image load failed!")
        return

    mx = 0.3
    M = np.array([[1, mx, 0], [0, 1, 0]], dtype=np.float32)

    dst = cv2.warpAffine(src, M, (int(src.shape[1] + src.shape[0] * mx), src.shape[0]))

    cv2.imshow("src", src)
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def affine_scale():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch08\\affine\\rose.bmp")

    if src is None:
        print("Image load failed!")
        return

    dst1 = cv2.resize(src, None, fx=4, fy=4, interpolation=cv2.INTER_NEAREST)
    dst2 = cv2.resize(src, (1920, 1280))
    dst3 = cv2.resize(src, (1920, 1280), interpolation=cv2.INTER_CUBIC)
    dst4 = cv2.resize(src, (1920, 1280), interpolation=cv2.INTER_LANCZOS4)

    cv2.imshow("src", src)
    cv2.imshow("dst1", dst1[500:900, 400:800])
    cv2.imshow("dst2", dst2[500:900, 400:800])
    cv2.imshow("dst3", dst3[500:900, 400:800])
    cv2.imshow("dst4", dst4[500:900, 400:800])
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def affine_rotation():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch08\\affine\\tekapo.bmp")

    if src is None:
        print("Image load failed!")
        return

    cp = (src.shape[1] // 2, src.shape[0] // 2)
    M = cv2.getRotationMatrix2D(cp, 20, 1)

    dst = cv2.warpAffine(src, M, (src.shape[1], src.shape[0]))

    cv2.imshow("src", src)
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def affine_flip():
    src = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch08\\affine\\eastsea.bmp")

    if src is None:
        print("Image load failed!")
        return

    cv2.imshow("src", src)

    flipCode = [1, 0, -1]
    for code in flipCode:
        dst = cv2.flip(src, code)

        desc = "flipCode: " + str(code)
        cv2.putText(dst, desc, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 1, cv2.LINE_AA)

        cv2.imshow("dst", dst)
        cv2.waitKey(0)

    cv2.destroyAllWindows()

if __name__ == "__main__":
    affine_transform()
    affine_translation()
    affine_shear()
    affine_scale()
    affine_rotation()
    affine_flip()

// C++

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

void affine_transform();
void affine_translation();
void affine_shear();
void affine_scale();
void affine_rotation();
void affine_flip();

int main(void)
{
	affine_transform();
	affine_translation();
	affine_shear();
	affine_scale();
	affine_rotation();
	affine_flip();

	return 0;
}

void affine_transform()
{
	Mat src = imread("tekapo.bmp");

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Point2f srcPts[3], dstPts[3];
	srcPts[0] = Point2f(0, 0);
	srcPts[1] = Point2f(src.cols - 1, 0);
	srcPts[2] = Point2f(src.cols - 1, src.rows - 1);
	dstPts[0] = Point2f(50, 50);
	dstPts[1] = Point2f(src.cols - 100, 100);
	dstPts[2] = Point2f(src.cols - 50, src.rows - 50);

	Mat M = getAffineTransform(srcPts, dstPts);

	Mat dst;
	warpAffine(src, dst, M, Size());

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

	waitKey();
	destroyAllWindows();
}

void affine_translation()
{
	Mat src = imread("tekapo.bmp");

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Mat M = Mat_<double>({ 2, 3 }, { 1, 0, 150, 0, 1, 100 });

	Mat dst;
	warpAffine(src, dst, M, Size());

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

	waitKey();
	destroyAllWindows();
}

void affine_shear()
{
	Mat src = imread("tekapo.bmp");

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	double mx = 0.3;
	Mat M = Mat_<double>({ 2, 3 }, { 1, mx, 0, 0, 1, 0 });

	Mat dst;
	warpAffine(src, dst, M, Size(cvRound(src.cols + src.rows * mx), src.rows));

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

	waitKey();
	destroyAllWindows();
}

void affine_scale()
{
	Mat src = imread("rose.bmp");

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Mat dst1, dst2, dst3, dst4;
	resize(src, dst1, Size(), 4, 4, INTER_NEAREST);
	resize(src, dst2, Size(1920, 1280));
	resize(src, dst3, Size(1920, 1280), 0, 0, INTER_CUBIC);
	resize(src, dst4, Size(1920, 1280), 0, 0, INTER_LANCZOS4);

	imshow("src", src);
	imshow("dst1", dst1(Rect(400, 500, 400, 400)));
	imshow("dst2", dst2(Rect(400, 500, 400, 400)));
	imshow("dst3", dst3(Rect(400, 500, 400, 400)));
	imshow("dst4", dst4(Rect(400, 500, 400, 400)));

	waitKey();
	destroyAllWindows();
}

void affine_rotation()
{
	Mat src = imread("tekapo.bmp");

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Point2f cp(src.cols / 2.f, src.rows / 2.f);
	Mat M = getRotationMatrix2D(cp, 20, 1);

	Mat dst;
	warpAffine(src, dst, M, Size());

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

	waitKey();
	destroyAllWindows();
}

void affine_flip()
{
	Mat src = imread("eastsea.bmp");

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	imshow("src", src);

	Mat dst;
	int flipCode[] = { 1, 0, -1 };
	for (int i = 0; i < 3; i++) {
		flip(src, dst, flipCode[i]);

		String desc = format("flipCode: %d", flipCode[i]);
		putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255, 0, 0), 1, LINE_AA);

		imshow("dst", dst);
		waitKey();
	}

	destroyAllWindows();
}

C++ Code 출처 : OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 - 황선규 저


'OpenCV' 카테고리의 다른 글

ch09 edges  (0) 2024.05.20
ch08 perspective  (0) 2024.05.20
ch07 sharpen  (0) 2024.05.20
ch07 noise  (0) 2024.05.20
ch07 filter  (0) 2024.05.20