می تونید از تابع سینوسی برای کنترل میزان روشنایی استفاده کنید فرکانس میزان شتاب تغییرات و دامنه میزان تغییرات .
فرض کنید میزان تغییرات شما از -50 تا 50 باشه و در 20 مرحله باشه 2pi را تقسیم بر 20 کنید میزان تغییرات در هر بار به رادیان بدست بیاید خروجی تابع سینوس را هم در 50 ضرب کنید به این ترتیب می تونید به هدفی که دارید برسید.
void changeBrightness(cv::InputArray _src, cv::OutputArray _dst, cv::Scalar brightness){
CV_Assert(_src.depth() == CV_8U);
if (_src.size() != _dst.size() || _src.type() != _dst.type())
_dst.create(_src.size(), _src.type());
cv::Mat src = _src.getMat();
if (!src.isContinuous())
src = src.clone();
cv::Mat dst = _dst.getMat();
if (!dst.isContinuous())
dst = dst.clone();
cv::Size new_size = src.size();
new_size.width *= new_size.height;
new_size.height = 1;
if (src.channels() == 1){
for (int i = 0; i < new_size.height; i++)
{
unsigned char *src_row = src.ptr<unsigned char>(i);
unsigned char *dst_row = dst.ptr<unsigned char>(i);
for( int j = 0; j < new_size.width; j++ )
dst_row[j ] = saturate_cast<unsigned char>(src_row[j] + brightness.val[0] );
}
}
else if (src.channels() == 3){
for (int i = 0; i < new_size.height; i++)
{
unsigned char *src_row = src.ptr<unsigned char>(i);
unsigned char *dst_row = dst.ptr<unsigned char>(i);
int j_pos = 0;
for (int j = 0; j < new_size.width; j++)
{
dst_row[j_pos + 0] = saturate_cast<unsigned char>(src_row[j_pos] + brightness.val[0]);
dst_row[j_pos + 1] = saturate_cast<unsigned char>(src_row[j_pos + 1] + brightness.val[1]);
dst_row[j_pos + 2] = saturate_cast<unsigned char>(src_row[j_pos + 2] + brightness.val[2]);
j_pos += 3;
}
}
}
}
main(){
int smoothness = 10;
int size = 50;
float cofi = (2 * CV_PI) / smoothness;
while (capture.isOpened()) {
cv::Mat frame;
capture >> frame;
int value = sin(cofi * counter++) * size;
changeBrightness(frame, frame, cv::Scalar::all(value));
imshow("frame", frame);
cv::waitKey(1000 / 24);
}
}