我想用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)问题是,我不知道照片是什么时候拍摄的,所以很多照片都是模糊的。我的问题是:是否有一种方法可以在键盘键的点击下拍摄图像?
还有更好的方法来拍摄多个图像,而不是距离?
发布于 2016-01-04 10:11:50
下面是一个简单的程序,它在cv2.namedWindow中显示相机馈送,并在您点击SPACE时拍摄快照。如果你点击ESC,它也会退出。
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,因此它必须有焦点。
发布于 2016-01-04 10:16:15
分解您的代码示例(解释在代码行下面)。
import cv2导入openCV以供使用
camera = cv2.VideoCapture(0)使用连接到计算机的摄像机列表中的第一个摄像机创建一个名为camera的对象,其类型为openCV视频捕获。
for i in range(10):告诉程序循环以下缩进代码10次
return_value, image = camera.read()从摄像机对象中读取值,使用它的read方法。它与两个值产生共鸣,将两个数据值保存到两个称为"return_value“和”图像“的临时变量中。
cv2.imwrite('opencv'+str(i)+'.png', image)使用openCV方法imwrite (将图像写入磁盘),并使用临时数据变量中的数据写入映像
减少缩进意味着循环现在已经结束..。
del(camera)删除camrea对象,我们不再需要它。
您可以通过多种方式来满足您的要求,一种方法是用while循环替换for循环(永远运行,而不是10次),然后等待按键(就像我键入时由丹尼德回答的那样)。
或者创建一个更邪恶的服务,隐藏在后台,每次有人按下键盘就能捕捉到图像.
发布于 2016-01-04 10:10:52
我不太熟悉打开的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)https://stackoverflow.com/questions/34588464
复制相似问题