영상처리 시스템에서는 각 단계에서 소요되는 연산 시간을 측정하고 오래걸리는 부분을 찾아 개선하는 최적화 작업이 필수적이다.
int64 t1 = getTickCount()
my_func();
int64 t2 = getTickCount();
double ms = (t2 - t1) * 1000 / getTickFrequency();
연산시간 측정은 Release 모드에서 수행해야함!(g++ 의 경우 -O2 옵션 사용)
class TickMeter {
public:
TickMeter(); //생성자
void start(); // 시간측정을 시작할때 사용
void stop(); //시간측정을 멈출 때 사용
void reset(); //시간 측정을 초기화 할 때 사용
double getTimeMicro() // 연산시간을 마이크로초 단위로 반환
double getTimeMilli() // 연산시간을 밀리초 단위로 반환
double getTimeSec() // 연산시간을 초 단위로 반환
}
TickMeter tm;
tm.start();
func1();
tm.stop();
cout << "func1():" << tm.getTimeMilli() << "ms." << endl;
tm.reset();
tm.start();
func2();
tm.stop();
cout << "func2():" << tm.getTimeMilli() << "ms." << endl;
void Mat::copyTo(InputArray m, InputArray mask) const;
//전역함수
void Mat::copyTo(InputArray src, OutputArray dst, InputArray mask);
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();
}