[w 5 d 4]ビデオ輝度の調整


(Ubuntu 18.04.6 LTS)
2022.03.17
C++、VSコードを使用
プログラマー自主走行Defcos 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();
}
dst 3の平均値を計算し、128が平均値であると判断することができる.
mean(src + (128 - m) = mean(src) + mean( 128 - m ) = m + 128 - m = 128


トラックバーを使用してビデオの輝度を調整

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