
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를 활용하여 영상에 여러가지 그림들을 그려 넣을 수 있다.
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 : 그리기 좌표 값의 축소 비율
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 : 그리기 좌표 값의 축소 비율
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 : 그리기 좌표 값의 축소 비율
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();
}

void copyTo(InputArray src , OutputArray dst , InputArray mask);
src : 입력 영상
mask : 마스크 영상
dst : 출력 영상