[w5d4] 영상밝기 조정

22898 단어 opencvopencv

(Ubuntu 18.04.6 LTS)
2022.03.17
C++, VS code 사용
프로그래머스 자율주행 데브코스 3기

Tickmeter

지나가는 시간을 측정, 특히 함수 걸린 시간을 측정하기 위한 클래스

cv::TickMeter tick;
tick.start();
func1(); // 무언가 함수 실행
tick.stop();

std::cout << tick.getTimeMilli() << std::endl;

영상 밝기 조정

#include <iostream>
#include "opencv2/opencv.hpp"

int main()
{
	cv::Mat src = cv::imread("./resources/lenna.bmp", cv::IMREAD_GRAYSCALE);

	if (src.empty()) {
		std::cerr << "Image load failed!" << std::endl;
		return -1;
	}
	
    cv::Mat dst1 = src + 100;
    // src 객체의 밝기를 100 증가시킨 값 저장
    //dst1 = src + cv::Scalar(100)으로 해석되어 Saturation 수행(255 넘으면 255)
    
	int m = int(cv::mean(src)[0]);
    // cv::mean은 Mat 객체의 평균값을 cv::Scalar 타입으로 리턴함.
    // gray scale image를 사용할 경우 첫번째 값만 의미있으므로 [0] 사용.
	std::cout << "Mean value: " << m << std::endl;
	
	float alpha = 1.0f;
	cv::Mat dst2 = src + (src - m) * alpha;
    // 평균을 유지한 상태에서 밝기 대조. alpha가 클수록 더 높은 대조를 보임.
    cv::Mat dst3 = src + (128 - m);
    // 평균을 128로 만들고 contrast
	// img show
	cv::imshow("src", src);
	cv::imshow("dst1", dst1);
	cv::imshow("dst2", dst2);
    cv::imshow("dst3", dst3);
	cv::waitKey();
}

dst3의 평균값을 계산하면 128이 평균임을 확인할 수 있다.
mean(src + (128 - m) = mean(src) + mean( 128 - m ) = m + 128 - m = 128

Trackbar 이용 영상 밝기 조정

#include <iostream>
#include "opencv2/opencv.hpp"

void on_level_change(int pos, void*userdata);

int main()
{
    cv::Mat src;
    src = cv::imread("./resources/lenna.bmp",cv::IMREAD_GRAYSCALE);

    cv::namedWindow("image");
    cv::createTrackbar("level","image",0,200,on_level_change,(void*)&src);
    cv::setTrackbarPos("level","image",100);
    cv::imshow("image",src);
    cv::waitKey();
}

void on_level_change(int pos, void*userdata){
    cv::Mat img;
    img = (*(cv::Mat*)userdata)+(pos-100);
    cv::imshow("image",img);
}

trackbar를 이용해 trackbar 값 - 100 의 밝기를 올리는 코드이다.

동영상에서 밝기 조정

영상의 특정 영역에 해당하는 부분의 평균값을 얻고, 전체 영상의 밝기를 조정하는 코드이다.

#include <iostream>
#include "opencv2/opencv.hpp"

int main()
{
    cv::VideoCapture cap("./resources/base_camera_dark.avi");
    if (!cap.isOpened()){
        std::cerr << "Video load failed!" << std::endl;
        return -1;
    }
    cv::Mat frame,gray,dst;
    
    //making mask
    
    cv::Mat mask=cv::Mat::zeros(cap.get(cv::CAP_PROP_FRAME_HEIGHT),cap.get(cv::CAP_PROP_FRAME_WIDTH),CV_8UC1);
    std::vector<cv::Point> pts;
    pts.push_back(cv::Point(240,280));
    pts.push_back(cv::Point(400,280));
    pts.push_back(cv::Point(620,440));
    pts.push_back(cv::Point(20,440));
    cv::fillPoly(mask,pts,255);

    while (true){
        cap >> frame;
        if (frame.empty()){
            std::cout << "frame empty!" << std::endl;
            break;
        }
        cv::cvtColor(frame,gray,cv::COLOR_BGR2GRAY);
        cv::polylines(frame,pts,true,cv::Scalar(255,0,0),2);
        double mean_val = cv::mean(gray,mask)[0];
        dst = gray + (128 - mean_val);

        cv::imshow("frame",frame);
        cv::imshow("gray",gray);
        cv::imshow("dst",dst);

        if (cv::waitKey(10)==27){
            break;
        }
    }
    std::cout << frame.rows << "," << frame.cols << std::endl;
    cap.release();
    return 0;
}

좋은 웹페이지 즐겨찾기