赞
踩
大部分时候,我们都是通过 opencv 来读取 usb 摄像头的帧图像的。几乎所有的 usb 摄像头是可以进行自动对焦的,除非它是定焦的。当我们想要通过代码来控制摄像头的焦距的时候,会发现,有很多时候 opencv 的 API 没有办法进行有效的控制。
比较基础的 opencv 控制焦距的代码如下:
import cv2
def do_nothing(x):
pass
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0)
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.createTrackbar('focus', 'img', 0, 127, do_nothing)
while True:
focus_val = cv2.getTrackbarPos('focus', 'img')
cap.set(cv2.CAP_PROP_FOCUS, focus_val)
_, img = cap.read()
cv2.imshow('img', img)
key = cv2.waitKey(1)
if key == 27:
break
cv2.destroyAllWindows()
cap.release()
上面的代码正常来说,可以通过进度条的数值来对摄像头的焦距进行控制,但是实际上,在我的摄像头上并不行。不管怎么拖动进度条,焦距都是没有任何变化,而且设置的自动对焦为 False 也不起作用,相机还是会进行自动对焦。
但是因为我使用 window 相机的高级设置测试过,确实是可以手动调整焦距的,所以我觉得这波 opencv 应该负全责。
但是 opencv 用不了,问题还是没解决,我想着相机厂家应该会有相应的 SDK 来进行控制,于是满心欢喜的发了一条微信过去,可是消息却石沉大海,了无音讯。
最后在网上找到了一个 uvc 的 python 封装解决了我的问题。
项目地址:pyuvc
通过几句简单的代码,就实现了 opencv 实现不了的对焦控制功能(具体的安装步骤官方 github 仓库里面有,这里就不展开了)
import cv2
import uvc
def do_nothing(x)
pass
dev = uvc.device_list()[0]
cap = uvc.Capture(dev['uid'])
cap.controls[2].value = 0 # close auto focus
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.createTrackbar('focus', 'img', 0, 127, do_nothing)
while True:
focus_val = cv2.getTrackbarPos('focus', 'img')
cap.controls[3].value = focus_val
img = cap.get_frame_robust().bgr
cv2.imshow('img', img)
key = cv2.waitKey(1)
if key = 27:
break
cv2.destoryAllWindow()
cap.close()
上面这段代码就可以轻松通过 uvc 实现焦距的控制。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。