CV 5주차 10월 18일

Cho's log·2023년 11월 6일

Computer Vision

목록 보기
3/7
post-thumbnail

1. OpenCV 그리기 함수

  • 예제 코드
#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main()
{
	VideoCapture cap("test_video.mp4");

	if (!cap.isOpened()) {
		cerr << "Video open failed!" << endl;
		return -1;
	}

	Mat frame;
	while (true) {
		cap >> frame;

		if (frame.empty()) {
			cerr << "Empty frame!" << endl;
			break;
		}

		line(frame, Point(570, 280), Point(0, 560), Scalar(255, 0, 0), 2);
		line(frame, Point(570, 280), Point(1024, 720), Scalar(255, 0, 0), 2);

		int pos = cvRound(cap.get(CAP_PROP_POS_FRAMES));
		String text = format("frame number: %d", pos);
		putText(frame, text, Point(20, 50), FONT_HERSHEY_SIMPLEX, 
			0.7, Scalar(0, 0, 255), 1, LINE_AA);

		imshow("frame", frame);

		if (waitKey(10) == 27)
			break;
	}

	cap.release();
	destroyAllWindows();
}
  • 실행 화면

  • 이와 같이 opencv를 활용하여 영상에 여러가지 그림들을 그려 넣을 수 있다.


line

  • void line(InputOutputArray img , Point pt1, Point pt2 , const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);

  • img : 입출력 영상

  • pt1 : 시작점 좌표

  • pt2 : 끝점 좌표

  • color : 선 색상

  • thickness : 선 두께

  • lineType : 선 타입

  • shift : 그리기 좌표 값의 축소 비율

rectangle

  • void rectangle(InputOutputArray img , Rect rec , const Scalar& color , int thickness = 1 , int lineType = LINE_8 , int shift = 0);

  • img : 입출력 영상

  • rec : 사각형 위치 정보

  • color : 선 색상

  • thickness : 선 두께

  • lineType : 선 타입

  • shift : 그리기 좌표 값의 축소 비율

circle

  • void circle(InputOutputArray img , Point center , int radius , const Scalar& color , int thickness = 1 , int lineType = LINE_8 , int shift = 0);

  • img : 입출력 영상

  • center : 원 중심 좌표

  • radius : 원 반지름

  • color : 선 색상

  • thickness : 선 두께

  • lineType : 선 타입

  • shift : 그리기 좌표 값의 축소 비율

text

  • void putText(InputOutputArray img , const String& text , Point org, int font face, double fontscale, Scalar color, int thickness = 1 , int linetype = LINE_8 , bool bottomLeftOrigin = false);

  • img : 문자열을 출력할 영상

  • text : 출력할 문자열

  • org : 문자열이 출력될 좌측 하단 시작 좌표

  • fontFace : 폰트 종류

  • fontScale : 폰트 크기

  • color : 문자열 색상

  • thickness : 폰트 두께

  • lineType : 선 타입


2. 마스크 연산과 ROI

  • 관심 영역(ROI) : 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역

  • 예제 코드

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

using namespace std;
using namespace cv;

void MaskOp1();
void MaskOp2();

int main()
{
//	MaskOp1();
	MaskOp2();
}

void MaskOp1()
{
	Mat src = imread("airplane.bmp", IMREAD_COLOR);
	Mat mask = imread("mask_plane.bmp", IMREAD_GRAYSCALE);
	Mat dst = imread("field.bmp", IMREAD_COLOR);

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

	//copyTo(src, dst, mask);
	src.copyTo(dst, mask);

	imshow("src", src);
	imshow("dst", dst);
	imshow("mask", mask);
	waitKey();
	destroyAllWindows();
}

void MaskOp2()
{
	Mat src = imread("cat.bmp", IMREAD_COLOR);
	Mat logo = imread("opencv-logo-white.png", IMREAD_UNCHANGED);

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

	vector<Mat> planes;
	split(logo, planes);

	Mat mask = planes[3];
	merge(vector<Mat>(planes.begin(), planes.begin() + 3), logo);
	Mat crop = src(Rect(10, 10, logo.cols, logo.rows));

	logo.copyTo(crop, mask);

	imshow("src", src);
	waitKey();
	destroyAllWindows();
}
  • MaskOp2() 실행 화면

마스크 연산

  • void copyTo(InputArray src , OutputArray dst , InputArray mask);

  • src : 입력 영상

  • mask : 마스크 영상

  • dst : 출력 영상

0개의 댓글