相机预览帧抽查处理

相机预览帧抽查处理

Posted by BY on April 6, 2023

定时器任务

背景:在对接工业相机时,预览要循环调用相机API一帧一帧的获取,但是要随机抽出一帧作为判定人像是否在规定范围内的逻辑,当时第一时间感觉定时器会比较简单且不以来硬件处理过程中时快时慢的情况。但后面发现这种情况其实可以忽略不记,23333… 但还是记录一下吧!

最终实际用的方式是定义一个变量,在循环时自增,根据自增变量取模,如10帧取一帧做逻辑判断,这样其实更简单。

定时器的方式

void Main()
{
	bool take = false;
	bool isTime = false;
	int x = 0;
	
	#region 计时器
	int needNumber = 0;
	// System.Drawing.Bitmap imageByTime = null;
	// 设定计时器时间
	System.Timers.Timer timer = new System.Timers.Timer(10000);
	timer.Elapsed += (sender, e) =>
	{
		// 获取循环帧
		isTime = true;
	};
	// 开始
	timer.Start();
	
	#endregion 计时器

	while (true)
	{
		if (!take)
		{
			// 获取预览帧

		}
		x++;
		needNumber++;
		Console.WriteLine($"X的值:{x}");
		
		// 是否满足条件,满足则返回该帧
		if(isTime){
			Console.WriteLine("定时取的帧:" + needNumber + ",时间:" + DateTime.Now);
			
			// 重置触发时间
			isTime = false;
		}
		System.Threading.Thread.Sleep(1000);
	}
}


// You can define other methods, fields, classes and namespaces here


定义变量循环自增的方式

int i = 0;
while (true)
{
	i++;
	if (!take)
	{
		// 默认值
		byte[] bytes = new byte[460854];

		// 获取预览帧
		var result = usb_cam_get_preview_data_cs(bytes);

		if (result > 0)
		{
			//Cnds.Common.LocalLoggingService.Info(Guid.NewGuid().ToString());
			MemoryStream stream = new MemoryStream(bytes);
			Bitmap image = new Bitmap(stream);

			
			#region 方式二,用变量循环自增,然后根据变量值取模的方式
			if (i % 10 == 0)
			{
				var checkResult = PortraitCheck(image);// 人像识别

				UpdateTextBox(checkResult);// 返回提示到textBox

				//Thread.Sleep(3000);// 休眠三秒显示捕获的图像帧
			}
			#endregion 方式二,用变量循环自增,然后根据变量值取模的方式

			pictureBox.Image = image;
		}
		Thread.Sleep(30);
	}
}