تغییرات شدت روشنایی به صورت دینامیک در ویدیو - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تغییرات شدت روشنایی به صورت دینامیک در ویدیو

0 امتیاز
سلام.برای تست کدی که نوشتم نیاز دارم که فیلم ضبط شده را به گونه ای تغییر بدم که به صورت نا محسوس شدت روشنایی بین فریم به صورت کاهنده یا افزاینده تغییر کنه چون تو محیط باز همچین اتفاقی ممکنه بیفته میخام همچین چیزی ایجاد کنم بعدش کدم با این ویدیو تست کنم.شما چه روشی پیشنهاد میدید؟
سوال شده خرداد 24, 1396  بوسیله ی محسن ستاری پور (امتیاز 28)   2 4 4

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

می تونید از تابع سینوسی برای کنترل میزان روشنایی استفاده کنید فرکانس میزان شتاب تغییرات و دامنه میزان تغییرات .

فرض کنید میزان تغییرات شما از -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);
	}
	
}

 

پاسخ داده شده خرداد 28, 1396 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد خرداد 29, 1396 بوسیله ی محسن ستاری پور
ممنون از شما راضی به زحمت شما نبودم.
...