一、问题引入
我们在进行机器视觉图像采集任务的之前,可能会选择购买一些USB相机作为采集设备。而有些USB相机具有自动对焦的功能,打开Windows自带的相机,界面如下:
拥有调整对焦功能的相机在接入之后,最左侧会出现对焦按钮(红框已圈出),点击按钮后拖动纵向滑动条即可调整相机的对焦位置,直到我们希望得到的最清晰位置;也可以将滑动条下拉至最下方,即为自动对焦的策略,相机会根据当前图像清晰度进行自动对焦。
以上操作在Windows系统相机应用中十分简单,但针对某个机器视觉任务,我们往往希望自己使用OpenCV库编程来实现手动或自动对焦的命令。
二、问题解决
此处我们使用opencv-python,使用C++的同学亦不难找到对应的函数。首先我们创建一个相机的类class Camera,在类中用cv2.VideoCapture实例化一个self.stream,再使用self.stream的set方法设置相机的属性。
class Camera:
def __init__(self, src=0):
self.src = src
self.stream = cv2.VideoCapture(src, cv2.CAP_MSMF)
if self.stream.isOpened():
# (2592,1944)此处根据自己相机的像素值进行修改
self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, 2592)
self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 1944)
self.stream.set(cv2.CAP_PROP_FOCUS,500) # 此处即为修改相机对焦参数的命令
else:
self.stream = cv2.VideoCapture(self.src + 1)
self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, 2592)
self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 1944)
self.stream.set(cv2.CAP_PROP_FOCUS,500)
通过上述代码可以看到,我们使用了self.stream.set(cv2.CAP_PROP_FOCUS, 500)来修改相机的对焦位置。通过查阅资料和实验,发现该参数的取值范围为0-1023,代表了相机的对焦位置从近到远,1023代表对焦在无限远。
让相机进行自动对焦,方法也比较简单,只需要set(cv2.CAP_PROP_AUTOFOCUS, 1),此处值为1,代表开启自动对焦,值为0,代表关闭自动对焦。代码如下:
self.stream.set(cv2.CAP_PROP_AUTOFOCUS, 1)
三、注意事项
使用以上方法,就可以实现USB相机的自动对焦和手动对焦了。但需要注意的是:调焦方法仅在有调焦功能的相机上适用并生效,以上set方法在调用成功后会返回True,定焦镜头无法调用成功,使用set方法进行调焦会返回False。