为什么用Python拍摄的网络摄像头图像太暗了?

时间:2015-02-17 17:06:28

标签: python opencv

我已经以各种方式展示了如何使用Python中的网络摄像头拍摄图像(请参阅How can I take camera images with Python?)。您可以看到使用Python拍摄的图像比使用JavaScript拍摄的图像暗得多。有什么问题?

图片示例

左边的图像是用http://martin-thoma.com/html5/webcam/拍摄的,右边的图像是用以下Python代码拍摄的。两者都是在相同(受控)的闪电情况下拍摄的(外面是黑暗的,我只打开了一些电灯)和相同的网络摄像头。

enter image description here

代码示例

import cv2
camera_port = 0
camera = cv2.VideoCapture(camera_port)
return_value, image = camera.read()
cv2.imwrite("opencv.png", image)
del(camera)  # so that others can use the camera as soon as possible

问题

为什么使用Python图像拍摄的图像比使用JavaScript拍摄的图像暗得多,我该如何解决?

(获得相似的图像质量;只是让它更亮可能无法修复它。)

注意"我该如何解决它":它不需要是opencv。如果您知道使用Python with another package(或没有包)获取网络摄像头图像的可能性也是可以的。

3 个答案:

答案 0 :(得分:8)

我认为你必须等待相机做好准备。

此代码适用于我:

from SimpleCV import Camera
import time
cam = Camera()
time.sleep(3)
img = cam.getImage()
img.save("simplecv.png")

我从How can I prevent SQL injection in PHP?接受了这个想法,这是我发现的最有说服力的解释:

  

在某些设备上,前几帧很暗,因为它是第一帧   初始化相机后的帧,可能需要拉一个   几帧,以便相机有时间调整亮度   自动。   this answer

因此,为了确保图像的质量,无论编程语言如何,在摄像机设备启动时都需要等待几秒钟和/或在拍摄图像之前丢弃几帧。 / p>

答案 1 :(得分:7)

面临同样的问题。我试过这个并且有效。

import cv2
camera_port = 0 
ramp_frames = 30 
camera = cv2.VideoCapture(camera_port)
def get_image():
 retval, im = camera.read()
 return im 
for i in xrange(ramp_frames):
 temp = camera.read()

camera_capture = get_image()
filename = "image.jpg"
cv2.imwrite(filename,camera_capture)
del(camera)

我认为这是关于将相机调整到光线。前者 formerlater张图片

答案 2 :(得分:1)

整理Keerthana的答案导致我的代码看起来像这样

import cv2
import time

def main():
    capture = capture_write()


def capture_write(filename="image.jpeg", port=0, ramp_frames=30, x=1280, y=720):
    camera = cv2.VideoCapture(port)

    # Set Resolution
    camera.set(3, x)
    camera.set(4, y)

    # Adjust camera lighting
    for i in range(ramp_frames):
        temp = camera.read()
    retval, im = camera.read()
    cv2.imwrite(filename,im)
    del(camera)
    return True

if __name__ == '__main__':
    main()