[w5d4] 영상밝기 조정
(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;
}
Author And Source
이 문제에 관하여([w5d4] 영상밝기 조정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@anecjong/w5d4-VideoCapture-그리기-함수-Trackbar저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)