Python:如何使用OpenCV在点击时从网络摄像头捕获图像

时间:2016-01-04 09:53:57

标签: python python-2.7 opencv

我想使用OpenCV从网络摄像头捕获并保存大量图像。这是我目前的代码:

import cv2

camera = cv2.VideoCapture(0)
for i in range(10):
    return_value, image = camera.read()
    cv2.imwrite('opencv'+str(i)+'.png', image)
del(camera)

这个问题是我不知道什么时候拍摄这些照片,所以很多照片都会模糊不清。我的问题是:是否可以通过点击键盘键拍摄图像?

还有更好的方法来拍摄多张图片,而不是范围吗?

5 个答案:

答案 0 :(得分:31)

这是一个简单的程序,可以在cv2.namedWindow中显示相机Feed,并在您点击SPACE时拍摄快照。如果点击ESC,它也会退出。

import cv2

cam = cv2.VideoCapture(0)

cv2.namedWindow("test")

img_counter = 0

while True:
    ret, frame = cam.read()
    cv2.imshow("test", frame)
    if not ret:
        break
    k = cv2.waitKey(1)

    if k%256 == 27:
        # ESC pressed
        print("Escape hit, closing...")
        break
    elif k%256 == 32:
        # SPACE pressed
        img_name = "opencv_frame_{}.png".format(img_counter)
        cv2.imwrite(img_name, frame)
        print("{} written!".format(img_name))
        img_counter += 1

cam.release()

cv2.destroyAllWindows()

我认为这应该在很大程度上回答你的问题。如果有任何你不明白的行让我知道,我会添加评论。

如果每次按下SPACE键需要抓取多张图像,则需要一个内循环,或者只需要创建一个抓取一定数量图像的函数。

请注意,关键事件来自cv2.namedWindow,因此必须具有焦点。

答案 1 :(得分:3)

这是一个简单的程序,可以使用默认相机捕获图像。 另外,它可以检测人脸

mergeMap

输出

enter image description here

此外,您可以签出我的GitHub code

答案 2 :(得分:2)

我对open cv没有太多经验,但如果你想在按下某个键时调用for循环中的代码,你可以使用while循环和raw_input以及一个条件来防止循环永远执行

import cv2

camera = cv2.VideoCapture(0)
i = 0
while i < 10:
    raw_input('Press Enter to capture')
    return_value, image = camera.read()
    cv2.imwrite('opencv'+str(i)+'.png', image)
    i += 1
del(camera)

答案 3 :(得分:2)

分解您的代码示例

import cv2

导入openCV以供使用

camera = cv2.VideoCapture(0)

使用连接到计算机的摄像机列表中的第一个camrea创建一个名为camera的对象,类型为openCV视频捕获。

for i in range(10):

告诉程序循环以下缩进代码10次

    return_value, image = camera.read()

使用它的读取方法从相机对象读取值。 它有2个值 将2个数据值保存到两个名为“return_value”和“image”

的临时变量中
    cv2.imwrite('opencv'+str(i)+'.png', image)

使用openCV方法imwrite(将图像写入磁盘)并使用临时数据变量中的数据写入图像

更少的缩进意味着循环现在已经结束......

del(camera)

删除camrea对象,我们不再需要它。

你可以通过多种方式提出要求,一个可以用while循环替换for循环,(永远运行,而不是10次),然后等待按键(如danidee回答当我打字的时候)

或创建一个更加邪恶的服务,隐藏在后台并在每次有人按下键盘时捕获图像。

答案 4 :(得分:0)

这是一个简单的程序,可以使用笔记本电脑的默认相机捕获图像。我希望这对所有人来说都是非常简单的方法。

import cv2

# 1.creating a video object
video = cv2.VideoCapture(0) 
# 2. Variable
a = 0
# 3. While loop
while True:
    a = a + 1
    # 4.Create a frame object
    check, frame = video.read()
    # Converting to grayscale
    #gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    # 5.show the frame!
    cv2.imshow("Capturing",frame)
    # 6.for playing 
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
# 7. image saving
showPic = cv2.imwrite("filename.jpg",frame)
print(showPic)
# 8. shutdown the camera
video.release()
cv2.destroyAllWindows 

您可以看到我的github代码here