airplane.bmp
0.69MB
cat.bmp
0.88MB
field.bmp
0.69MB
lenna.bmp
0.75MB
mask_plane.bmp
0.69MB
opencv-logo-white.png
0.01MB
합성 처리기능은 실무에선 사용하진 않지만 opencv에서 마스크 영상이 무엇인지 그 기능이 무엇인지 파악할 수 있는 강의였다.
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
void my_func() {
for (int x = 0; x < 10000; ++x) {}
}
void my_func2() {
for (int x = 0; x < 555; ++x) {}
}
void getTick_func() {
int64 t1 = getTickCount();
my_func();
int64 t2 = getTickCount();
double ms = (t2 - t1) * 1000 / getTickFrequency(); // *1000 을 함으로써 ms 단위를 받아온다.
cout << "my_func(): " << ms << "ms" << endl;
//TickMeter 클래스를 이용해 좀 더 직관적으로 연산 시간 기능 을 제공.
TickMeter ticker;
ticker.start();
my_func();
ticker.stop();
cout << "my_func(): " << ticker.getAvgTimeMilli() << "ms" << endl;
ticker.reset();
ticker.start();
my_func2();
ticker.stop();
cout << "my_func2(): " << ticker.getAvgTimeMilli() << "ms" << endl;
}
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 << "Img 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); // 4채널 IMREAD_UNCHANED로 인해 1채널(투명) 추가
if (src.empty() || logo.empty()) {
cerr << "Img load failed!" << endl;
return;
}
vector<Mat> planes;
split(logo, planes); // planes에 4채널 logo를 나눔
Mat mask = planes[3]; //투명도만, 0,1,2 번째 요소는 bgr
merge(vector<Mat>(planes.begin(), planes.begin() + 3), logo); //BGR 3채널만 logo가 가짐. 즉 투명도는 사라지고 일반적인컬러영상으로 바뀜
Mat crop = src(Rect(10, 10, logo.cols, logo.rows)); // src에 특정위치에 가로x세로 크기를 설정한다 크기 같아야 합성가능, logo 크기만큼 src Point 10,10 위치에 Rect 만듦.
imshow("src", src);
logo.copyTo(crop, mask); // logo영상을 crop에 복사, logo와 crop 모두 bgr 3채널 컬러영상이며 사이즈도 같음.
//기존 영상에서 mask 흰색 영상부분만 logo에서 crop쪽으로 합성됨// 이 부분 이해하기.
imshow("dst", src);
waitKey();
}
void ROI_func() {
//void Mat::copyTo : 이전에서의 copyTo는 첫번째 인자만 존재하여 깊은복사기능.
//Mat::copyTo(InputArray m, InputArray mask) const; 마스크 연산 지원하는 픽셀값 복사 함수.
//void copyTo(InputArray src, OutputArray dst, InputArray mask); // 마스크 연산을 지원하는 픽셀값 복사함수(전역함수)
//maskOP1();
maskOP2();
}
int main()
{
//getTick_func(); //연산 시간 측정, 연산시간 측정 시 디버그모드 아닌 , release모드에서 수행해야함. g++ 의 경우 -O2 옵션사용해야함.
ROI_func(); // 어떤 부분을 연산시 그 부분을 흰색 그 외 는 검정으로 나타내는 경우를 마스크 연산이라함.
//마스크 영상은 CV_8UC1 타입으로 마스크 영상의 픽셀값이 0이 아닌 위치에서만 연산이 수행됨, 보통 이진영상을 마스크영상으로 사용
}
'프로그래머스 > OPENCV' 카테고리의 다른 글
영상의 명암비 조절 (0) | 2022.12.01 |
---|---|
영상의 밝기조절(2) (3) | 2022.12.01 |
영상의 밝기 조절(1) (0) | 2022.12.01 |
2-4 유용한 OpenCV 함수 (0) | 2022.12.01 |
2-3 OpenCV 이벤트 처리하기. (0) | 2022.11.30 |