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);
}