首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:如何使用OpenCV从摄像头中获取图像

Python:如何使用OpenCV从摄像头中获取图像
EN

Stack Overflow用户
提问于 2016-01-04 09:53:57
回答 5查看 218.9K关注 0票数 56

我想用OpenCV从我的摄像头中获取并保存一些图像。这是我目前的代码:

代码语言:javascript
运行
复制
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)

问题是,我不知道照片是什么时候拍摄的,所以很多照片都是模糊的。我的问题是:是否有一种方法可以在键盘键的点击下拍摄图像?

还有更好的方法来拍摄多个图像,而不是距离?

EN

回答 5

Stack Overflow用户

发布于 2016-01-04 10:11:50

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

代码语言:javascript
运行
复制
import cv2

cam = cv2.VideoCapture(0)

cv2.namedWindow("test")

img_counter = 0

while True:
    ret, frame = cam.read()
    if not ret:
        print("failed to grab frame")
        break
    cv2.imshow("test", frame)

    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,因此它必须有焦点。

票数 100
EN

Stack Overflow用户

发布于 2016-01-04 10:16:15

分解您的代码示例(解释在代码行下面)。

代码语言:javascript
运行
复制
import cv2

导入openCV以供使用

代码语言:javascript
运行
复制
camera = cv2.VideoCapture(0)

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

代码语言:javascript
运行
复制
for i in range(10):

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

代码语言:javascript
运行
复制
    return_value, image = camera.read()

从摄像机对象中读取值,使用它的read方法。它与两个值产生共鸣,将两个数据值保存到两个称为"return_value“和”图像“的临时变量中。

代码语言:javascript
运行
复制
    cv2.imwrite('opencv'+str(i)+'.png', image)

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

减少缩进意味着循环现在已经结束..。

代码语言:javascript
运行
复制
del(camera)

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

您可以通过多种方式来满足您的要求,一种方法是用while循环替换for循环(永远运行,而不是10次),然后等待按键(就像我键入时由丹尼德回答的那样)。

或者创建一个更邪恶的服务,隐藏在后台,每次有人按下键盘就能捕捉到图像.

票数 10
EN

Stack Overflow用户

发布于 2016-01-04 10:10:52

我不太熟悉打开的cv,但是如果您希望在按下键时调用for循环中的代码,则可以使用while循环和raw_input以及防止循环永远执行的条件。

代码语言:javascript
运行
复制
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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34588464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档