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. 도형 그리기
- Point 클래스
- 2차원 공간 상의 점을 표현
- P1(start point), P2(end point)
Point pt = Point(x, y);
- Scalar 클래스
- ((R, G, B), 투명도) 표현
- 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;
}
- 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