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

+ Recent posts