Android 如何知道图像是否太暗,需要使用OpenCv进行闪存

Android 如何知道图像是否太暗,需要使用OpenCv进行闪存,android,opencv,computer-vision,android-camera,Android,Opencv,Computer Vision,Android Camera,我在一个使用OpenCV的Android项目中工作,我正在使用surface来实现我自己的相机,因为我想向用户提供他们正在拍摄的照片的反馈,以帮助他们提高照片的质量。我想做的是检测他们将要拍摄的图像有多暗,并建议他们使用闪光灯。提前感谢。 < P>如果你对照相机的参数有控制,在使用闪光灯之前考虑对它们进行调整。如果您想要全球风险敞口的x2因子,您可以: 将曝光时间乘以2 用sqrt(2)除以光圈值(或f-number) 将增益乘以2(这会增加一些噪声) 现在回答这个问题,如果您已经知道如何使

我在一个使用OpenCV的Android项目中工作,我正在使用surface来实现我自己的相机,因为我想向用户提供他们正在拍摄的照片的反馈,以帮助他们提高照片的质量。我想做的是检测他们将要拍摄的图像有多暗,并建议他们使用闪光灯。提前感谢。

< P>如果你对照相机的参数有控制,在使用闪光灯之前考虑对它们进行调整。如果您想要全球风险敞口的x2因子,您可以:

  • 将曝光时间乘以2
  • 用sqrt(2)除以光圈值(或f-number
  • 增益乘以2(这会增加一些噪声)
现在回答这个问题,如果您已经知道如何使用
OpenCV
访问图像中的像素,我首先建议您使用
cvtColor
将其转换为灰度,然后您可以计算(每个图像)像素强度之和(
cv::sum
),并定义一个阈值,在该阈值下图像“太暗”

伪代码示例(应根据您的需求/应用程序进行优化):

whilesum(像素)固定\u限制或如果(扩展时间/增益不能再增加)
打印“使用flash”
打破

请注意,增加曝光时间也会增加噪音。我修正了你答案中的一个错误。为了获得更多的光线,必须减少f-数!直方图是判断图像亮度和对比度的很好的工具。阅读一些关于它们以及如何解释它们的文章。除此之外,网上应该有大量的资源。只需谷歌自动曝光算法,你就会发现很多关于数码相机的文章。我相信flash也会有一些有用的东西。
while sum(pixels) < threshold
   it_nb=0
   exp_time += 0.1 (second)
   if it_nb>fixed_limit or if (exp_time/gain cannot be increased anymore)
      print 'use flash'      
      break