Programing/OpenCV

#OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 - 7

CouqueD'asse 2022. 5. 30. 16:15

4.5 유용한 OpenCV 기능

 

4.5.1 마스크 연산

Mat& Mat::setTo(InputArray value, InputArray mask = noArray());

void mask_setTo()
{
	Mat src = imread("lenna.bmp");

	Mat mask = imread("mask_smile.bmp", IMREAD_GRAYSCALE);

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

	src.setTo(Scalar(0, 255, 255), mask);

	imshow("src", src);
	imshow("mask", mask);

	waitKey();
	destroyAllWindows();
}
void Mat::copyTo(OutputArray m, InputArray mask) const;

void mask_copyTo()
{
	Mat src = imread("airplane.bmp");
	Mat mask = imread("mask_plane.bmp");
	Mat dst = imread("field.bmp");

	src.copyTo(dst, mask); // mask 영상에서 흰색 영역 위치에서만 src 영상 픽셀 값을 dst로 복사

	imshow("dst", dst);

	waitKey();
	destroyAllWindows();
}

 

4.5.2 연산 시간 측정

int64 getTickCount(void)

double getTickFrequency(void)

int64 t1 = getTickCount();
my_func(); // do something
int64 t2 = getTickCount();
double ms = (t2-t1) * 1000 / getTickFrequency();

void time_inverse()
{
	Mat src = imread("lenna.bmp");

	Mat dst(src.rows, src.cols, src.type());

	TickMeter tm;
	tm.start();

	for (int j = 0; j < src.rows; j++)
	{
		for (int i = 0; i < src.cols; i++)
		{
			dst.at<uchar>(j, i) = 255 - src.at<uchar>(j, i);
		}
	}
	tm.stop();

	cout << "Image inver took " << tm.getTimeMilli() << "ms." << endl;
}

 

4.5.3 유용한 OpenCV 함수 사용법

Scalar sum(InputArray src); // 원소의 합

Scalar mean(InputArray src, InputArray mask = noArray()); // 원소의 평균

void minMaxLoc(InputArray src, double* minVal, double* maxVal = 0, Point* minLoc = 0,
		Point* maxLoc = 0, InputArray mask = noArray()); // 행렬의 최솟값, 최댓값
        
void normalize(InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
		int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
// 행렬의 노름값을 정규화하거나 또는 원소 값 범위를 특정 범위로 정규화

int cvRound(double value);
int cvRound(float value); // 반올림 연산

 

5장 영상의 밝기롸 명암비 조절

 

5.1 영상의 밝기 조절

 

5.1.1 그레이스케일 영상 다루기

void change_grayscale()
{
	Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);

	Mat img2(480, 640, CV_8UC1, Scalar(0));

	Mat img3 = imread("lenna.bmp", IMREAD_COLOR);
	Mat img4;
	cvtColor(img3, img4, COLOR_BGR2GRAY);

	imshow("img", img);
	imshow("img2", img2);
	imshow("img3", img3);
	imshow("img4", img4);

	waitKey();
	destroyAllWindows();
}

 

5.1.2 영상의 밝기 조절

입력 영상의 모든 픽셀에 일정 값을 더하거나 빼는 작업

void brightness1()
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
	if (src.empty())
	{
		return;
	}
	Mat dst = src + 100;
	imshow("src", src);
	imshow("dst", dst);

	waitKey();
	destroyAllWindows();
}

 

5.1.3 영상의 밝기 조절 직접 구현하기

void brightness2()
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty())
	{
		return;
	}

	Mat dst(src.rows, src.cols, src.type());

	for (int j = 0; j < src.rows; j++)
	{
		for (int i = 0; i < src.cols; i++)
		{
			dst.at<uchar>(j, i) = saturate_cast<uchar>(src.at<uchar>(j, i) + 100);
			//int v = src.at<uchar>(j, i) + 100;
			//dst.at<uchar>(j, i) = v > 255 ? 255 : v < 0 ? 0 : v;
			/////dst.at<uchar>(j, i) = src.at<uchar>(j, i) + 100;
		}
	}

	imshow("src", src);
	imshow("dst", dst);

	waitKey();
	destroyAllWindows();
}

 

5.1.4 트랙바를 이용한 영상의 밝기 조절

void brightness3()
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty())
	{
		return;
	}

	namedWindow("dst");
	createTrackbar("Brightness", "dst", 0, 100, on_brightness, (void*)&src);
	on_brightness(0, (void*)&src);

	waitKey();
	destroyAllWindows();
}

void on_brightness(int pos, void* userdata)
{
	Mat src = *(Mat*)userdata;
	Mat dst = src + pos;

	imshow("dst", dst);
}