【问题标题】:How to get the brightest area from webcam in Emgu CV C#?如何从 Emgu CV C# 中的网络摄像头获取最亮的区域?
【发布时间】:2019-09-10 12:58:50
【问题描述】:

我在C# 中使用Emgu CV 库,并且可以在PictureBox 中成功显示网络摄像头。我想通过以下方式动态设置相机的亮度:

Visible_capture.SetCaptureProperty(CapProp.Brightness, Convert.ToInt32(Value));

我需要找到图片上的最亮点并更改相机亮度设置。我不需要平均亮度。

【问题讨论】:

    标签: c# camera stream emgucv brightness


    【解决方案1】:

    假设您正在使用灰度或寻找任何通道的最大值,看起来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
    

    【讨论】:

      【解决方案2】:

      您是否尝试过获取所有像素的亮度,然后选择最高值?

      【讨论】:

      • 实际上并没有,我正在寻找一种快速的方法,我认为这可能需要很多时间来处理每一帧。
      • 您至少应该尝试一下,直到找到更好的解决方案。
      猜你喜欢
      • 2013-09-14
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多