opencv 没办法控制焦距怎么办?来试一下 pyuvc 吧

大部分时候,我们都是通过 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 实现焦距的控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值