[OpenCV] OpenCV기본 활용

올리브수
|2021. 10. 18. 02:10
728x90
개발언어 : C++
개발환경 : Visual Studio 2019

해당 포스팅의 실습에 사용한 이미지들은 무료 이용이 가능한 이미지들입니다.
(출처 : Pixabay.com) 

1. 그레이 스케일 적용

OpenCV는 이미지를 RGB가 아닌 BGR로 저장한다!

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
    Mat src = imread("./Lenna.jpg", IMREAD_COLOR); // imread('읽어들이려는 파일명', 컬러모드)
    if (src.empty()) { cout << "영상을 읽을 수 없음" << endl; }

    imshow("origin", src); // imshow('윈도우 타이틀 명', 출력하려는 이미지 객체)

    Mat gray, edge, output;
    cvtColor(src, gray, CV_BGR2GRAY); // cvtColor(원본, 변경 객체, 변경하려는 컬러모델)

    imshow("gray", gray);
    imwrite("./Lenna.jpg", gray); // imwrite('변경한 파일을 저장할 경로', 객체명)
    waitKey(0);
    return 0;
}

2. 도형 그리기

  1. Point 클래스
    • 2차원 공간 상의 점을 표현
    • P1(start point), P2(end point)
    • Point pt = Point(x, y);
  2. Scalar 클래스
    • ((R, G, B), 투명도) 표현
  3. Size 클래스
    • Size s = Size(x, y)

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;

int main()
{
    // 흰색으로 초기화된 600×400 크기의 영상 생성

    Mat image = Mat(400, 600, CV_8UC3, Scalar(255, 255, 255));

    line(image, Point(100, 100), Point(100, 300), Scalar(100, 0, 255), 7);
    line(image, Point(50, 100), Point(150, 300), Scalar(100, 0, 255), 7);
    rectangle(image, Point(250, 30), Point(500, 200), Scalar(100, 255, 0), 5);
    circle(image, Point(500, 300), 60, Scalar(255, 0, 100), 3);
    circle(image, Point(200, 100), 100, Scalar(255, 100, 0), 3);
    ellipse(image, Point(300, 350), Point(100, 60), 45, 100, 250, Scalar(50, 100, 50), 5);

    imshow("Image", image);
    waitKey(0);
    return(0);
}

3. 마우스 이벤트

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

// 마우스 이벤트가 발생하면 호출되는 콜백 함수이다. 
void onMouse(int event, int x, int y, int flags, void* param) 
{
    if (event == EVENT_LBUTTONDOWN) { // 마우스 왼쪽 버튼 클릭
        Mat& img = *(Mat*)(param); // 영상이 그려질 공간
        circle(img, Point(x, y), 50, Scalar(255, 0, 0), 10);
        putText(img, "Mouse Left Button!", Point(x, y + 50), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 0), 2);
        imshow("src", img);    // 영상이 변경되면 다시 표시한다.
    }
    else if (event == EVENT_RBUTTONDOWN) { // 마우스 오른쪽 버튼 클릭
        Mat& img = *(Mat*)(param);
        circle(img, Point(x, y), 50, Scalar(0, 255, 0), 10);
        putText(img, "Mouse Right Button!", Point(x, y + 50), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 255, 0), 2);
        imshow("src", img);
    }
    else if (event == EVENT_MBUTTONDOWN) { // 마우스 스크롤 버튼 클릭
        Mat& img = *(Mat*)(param);
        circle(img, Point(x, y), 50, Scalar(0, 0, 255), 10);
        putText(img, "Mouse Scroll Button!", Point(x, y + 50), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 0, 255), 2);
        imshow("src", img);
    }
    else if (event == EVENT_MOUSEMOVE) { // 마우스 이동 경로 표시
        Mat& img = *(Mat*)(param);
        circle(img, Point(x, y), 1, Scalar(255, 255, 255), 1);
        imshow("src", img);
    }
}
int main()
{
    Mat src = imread("./find.jpg", IMREAD_COLOR);
    resize(src, src, Size(1280, 812));
    if (src.empty()) { cout << "영상을 읽을 수 없음" << endl; }
    imshow("src", src);

    setMouseCallback("src", onMouse, &src);
    waitKey(0);
    return 0;
}
  1. onMouse(int event, int x, int y, int flags, void* param)
    • x, y : 마우스 이벤트가 발생하는 좌표 위치
    • event : 어떤 마우스 이벤트인지 지정
    • param : 자유롭게 사용하는 파라미터(일반적으로 Mat에 객체를 전달하는 데에 이용)

4. 키보드 이벤트

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

using namespace std;
using namespace cv;

int main()
{
    Mat img;
    img = imread("./find.jpg", IMREAD_COLOR);
    resize(img, img, Size(1280, 812));
    if (img.empty()) { cout << "영상을 읽을 수 없음" << endl; }

    imshow("img", img);
    int x = 300;
    int y = 300;
    while (1) {
        int key = waitKey(100);
        if (key == 'q') break;
        else if (key == 'a'){
            x -= 100;
            circle(img, Point(x, y), 30, Scalar(255, 0, 0), 5);
            putText(img, "Key a!", Point(x, y + 50), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 0), 2);
            imshow("img", img);
        }
        else if (key == 'w') {
            y -= 100;
            circle(img, Point(x, y), 30, Scalar(0, 255, 0), 5);
            putText(img, "Key w!", Point(x, y + 50), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 255, 0), 2);
            imshow("img", img);
        }
        else if (key == 'd') {
            x += 100;
            circle(img, Point(x, y), 30, Scalar(0, 0, 255), 5);
            putText(img, "Key d!", Point(x, y + 50), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 0, 255), 2);
            imshow("img", img);
        }
        else if (key == 's') {
            y += 100;
            circle(img, Point(x, y), 30, Scalar(0, 0, 0), 5);
            putText(img, "Key s!", Point(x, y + 50), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 0, 0), 2);
            imshow("img", img);
        }
    }
    return 0;
}
  • 키보드 입력은 따로 콜백 함수 존재 ❌
728x90