如何从 Emgu CV C# 中的网络摄像头获取最亮的区域?
How to get the brightest area from webcam in Emgu CV C#?
我在 C#
中使用 Emgu CV
库,我可以在 PictureBox 中成功显示网络摄像头。我想通过以下方式动态设置相机的亮度:
Visible_capture.SetCaptureProperty(CapProp.Brightness, Convert.ToInt32(Value));
我需要获得图片上的最亮点并更改相机亮度设置。我不需要平均亮度。
你试过获取所有像素的亮度,然后选择最高值吗?
假设您正在使用灰度或寻找任何通道的最大值,看起来 Mat.MinMax
可能是一个不错的选择。您可以使用如下内容:
image.MinMax(out _, out double[] maxValues, out _, out _);
而且因为您只对最大值感兴趣,而不是它们的所有位置,所以结果将在 maxValues[0]
中。我认为使用 image.GetRawData().Max()
可能会更快,因此在 LINQPad 中编写了一个粗略的基准来比较示例图像:
void Main()
{
const int testIterations = 1000;
string imageUrl = "https://raw.githubusercontent.com/opencv/opencv/master/samples/data/orange.jpg";
string imagePath = Path.Combine(Path.GetTempPath(), Path.GetFileName(imageUrl));
using (WebClient client = new WebClient())
{
client.DownloadFile(imageUrl, imagePath);
}
using (Mat image = CvInvoke.Imread(imagePath, Emgu.CV.CvEnum.ImreadModes.Grayscale))
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < testIterations; i++)
{
image.MinMax(out _, out double[] maxValues, out _, out _);
if (i == testIterations - 1)
{
sw.Stop();
Console.WriteLine($"Using Mat.MinMax: {maxValues[0]}, elapsed {sw.ElapsedMilliseconds} ms");
}
}
sw.Reset();
sw.Start();
for (int i = 0; i < testIterations; i++)
{
var max = image.GetRawData().Max();
if (i == testIterations - 1)
{
sw.Stop();
Console.WriteLine($"Using Mat.GetRawData().Max(): {max}, elapsed {sw.ElapsedMilliseconds} ms");
}
}
CvInvoke.Imshow("Test", image);
}
}
但是我运行几次后得到的结果表明 MinMax
方法始终快一点,大概是因为一些开销从非托管代码传回数据,但你应该比较一下对于您自己的应用程序:
Using Mat.MinMax: 253, elapsed 691 ms
Using Mat.GetRawData().Max(): 253, elapsed 3760 ms
我在 C#
中使用 Emgu CV
库,我可以在 PictureBox 中成功显示网络摄像头。我想通过以下方式动态设置相机的亮度:
Visible_capture.SetCaptureProperty(CapProp.Brightness, Convert.ToInt32(Value));
我需要获得图片上的最亮点并更改相机亮度设置。我不需要平均亮度。
你试过获取所有像素的亮度,然后选择最高值吗?
假设您正在使用灰度或寻找任何通道的最大值,看起来 Mat.MinMax
可能是一个不错的选择。您可以使用如下内容:
image.MinMax(out _, out double[] maxValues, out _, out _);
而且因为您只对最大值感兴趣,而不是它们的所有位置,所以结果将在 maxValues[0]
中。我认为使用 image.GetRawData().Max()
可能会更快,因此在 LINQPad 中编写了一个粗略的基准来比较示例图像:
void Main()
{
const int testIterations = 1000;
string imageUrl = "https://raw.githubusercontent.com/opencv/opencv/master/samples/data/orange.jpg";
string imagePath = Path.Combine(Path.GetTempPath(), Path.GetFileName(imageUrl));
using (WebClient client = new WebClient())
{
client.DownloadFile(imageUrl, imagePath);
}
using (Mat image = CvInvoke.Imread(imagePath, Emgu.CV.CvEnum.ImreadModes.Grayscale))
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < testIterations; i++)
{
image.MinMax(out _, out double[] maxValues, out _, out _);
if (i == testIterations - 1)
{
sw.Stop();
Console.WriteLine($"Using Mat.MinMax: {maxValues[0]}, elapsed {sw.ElapsedMilliseconds} ms");
}
}
sw.Reset();
sw.Start();
for (int i = 0; i < testIterations; i++)
{
var max = image.GetRawData().Max();
if (i == testIterations - 1)
{
sw.Stop();
Console.WriteLine($"Using Mat.GetRawData().Max(): {max}, elapsed {sw.ElapsedMilliseconds} ms");
}
}
CvInvoke.Imshow("Test", image);
}
}
但是我运行几次后得到的结果表明 MinMax
方法始终快一点,大概是因为一些开销从非托管代码传回数据,但你应该比较一下对于您自己的应用程序:
Using Mat.MinMax: 253, elapsed 691 ms
Using Mat.GetRawData().Max(): 253, elapsed 3760 ms