如何从 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