相机对焦的重要性
相机对焦是确保图像清晰度的关键因素。如果相机对焦不准确,可能会导致图像模糊,进而影响模型的识别效果。例如,在缺陷检测系统中,如果相机对焦不准确,可能会导致多个缺陷被遗漏,从而使得产品在装配线上的流动超出了预期。
通过计算机视觉技术,可以构建一个系统,该系统能够持续地测量相机的对焦状态,而无需编写任何手动对焦代码。这种系统可以输出相机对焦状态,以便可以编写自定义逻辑,将其集成到更广泛的生产系统中。例如,如果相机失去对焦,员工可以收到警报,以便及时处理问题。
以下是系统显示相机对焦测量值随着调整相机对焦而变化的示例:
00:00 / 00:09 1× 左侧显示工程师手动调整相机对焦到正确位置时相机对焦的变化。右侧显示算法内部的可视化,该算法用于计算对焦值。
使用计算机视觉测量相机对焦
有多种方法可以以编程方式测量相机对焦。一种常见的方法是检测相机帧中高斯模糊的存在。如果帧中像素的分布与高斯分布足够相似,这意味着图像可能是模糊的。这可以用于设置什么是对焦或模糊相机的阈值。
Roboflow Workflows是一个基于Web的计算机视觉应用程序构建器,它提供了一个相机对焦块,可以使用它来持续测量相机帧中的相机对焦。这个块可以与Workflows中构建的任何自定义逻辑集成。例如,可以构建一个工作流,该工作流部署了一个对象检测模型,并在每一帧上运行相机对焦检查。
Workflows中有超过50个“块”或功能,从相机对焦到使用对象检测模型到Open AI LLMs。要了解Workflows的可能性,请参考Roboflow Workflows模板库。
构建计算相机对焦的工作流
要开始,首先创建一个免费的Roboflow账户。然后,导航到Roboflow仪表板并点击左侧边栏中的Workflows标签。这将带到Workflows主页,可以从那里创建一个工作流。点击“创建工作流”以创建一个工作流。
一个窗口将出现,可以从中选择几个模板。对于本指南,选择“自定义工作流”:点击“创建工作流”以创建工作流。将进入Workflows编辑器,在那里可以配置工作流:有了空白的工作流准备就绪,可以使用相机对焦工作流功能。
添加相机对焦块
点击Workflows编辑器右上角的“添加块”,然后选择“相机对焦”块:这个块接受输入图像,计算相机对焦,然后以JSON格式返回结果。然后,这些数据可以与制造系统集成代码,发送自定义警报,具体取决于使用的系统。
一旦添加了相机对焦块,可以添加任何其他想要的逻辑。使用Workflows,可以构建使用以下功能的应用程序:
托管在Roboflow上的微调模型;像CLIP和SAM-2这样的最新基础模型;显示模型返回的检测结果的可视化工具;像GPT-4这样的LLMs与视觉;条件逻辑,如果满足条件,则运行工作流的部分;像SIFT、主色检测等经典计算机视觉算法;等等。
在图像上测试工作流
以下是一个运行相机对焦计算的工作流示例:要测试工作流,点击“运行预览”,然后上传图像:点击输入部分的“运行预览”以运行工作流。页面的输出部分将有一个JSON值,显示相机对焦的程度。
在Web编辑器中,只能在单个图像上测试工作流。话虽如此,这个功能在部署到视频时大放异彩。让谈谈部署,然后在视频上进行测试。
部署工作流
可以以三种方式部署工作流:使用Roboflow API部署到Roboflow云;在由Roboflow托管并专门为使用的专用部署服务器上;或者在自己的硬件上。Workflows部署文档详细介绍了如何使用上述各种方法部署工作流。
如果需要一个API来运行工作流而不需要管理自己的硬件,那么部署到云是理想的。话虽如此,对于减少延迟至关重要的用例,建议在自己硬件上部署。如果在Roboflow云中部署模型,可以在图像上运行推理。如果在专用部署或自己的硬件上部署,可以在图像、视频、网络摄像头流和RTSP流上运行推理。
要部署工作流,点击Roboflow工作区中的任何工作流上的“部署工作流”。然后,一个窗口将打开,提供有关如何部署工作流的信息。让在视频上测试工作流。使用“在视频上部署”代码片段将工作流部署到自己的硬件上,然后输入自定义视频输入。
可以使用以下代码同时查看实时相机馈送以及对焦水平:
from inference import InferencePipeline
import cv2
import numpy as np
def my_sink(result, video_frame):
# 获取对焦图像
focus_image = result.get("camera_focus_image").numpy_image
# 转换为颜色
focus_image = cv2.cvtColor(focus_image, cv2.COLOR_GRAY2BGR)
# 获取输入图像
input_image = result.get("input_image").numpy_image
# 连接图像
if focus_image is not None:
result_image = np.concatenate((input_image, focus_image), axis=1)
else:
result_image = input_image
# 显示结果图像
cv2.imshow("Result Image", result_image)
cv2.waitKey(1)
# 初始化一个管道对象
pipeline = InferencePipeline.init_with_workflow(
api_key="KEY",
workspace_name="WORKSPACE",
workflow_id="WORKFLOW_ID",
video_reference=0, # 视频路径,设备ID(通常是内置网络摄像头的0)或RTSP流URL
max_fps=30,
on_prediction=my_sink
)
pipeline.start() # 启动管道
pipeline.join() # 等待管道线程完成
在上面的代码中,替换:
KEY为Roboflow API密钥。
WORKSPACE为Roboflow工作区ID。
WORKFLOW_ID为工作流ID。
所有这些值都可以在工作流编辑器中的部署选项卡上的“在视频上运行(本地)”选项卡上找到。
以下是工作流在实时视频馈送上工作的一个示例:
00:00 / 00:09 1× 工作流成功测量相机对焦。然后,可以更新代码,使用自己的内部系统发送警报,以通知当相机对焦离开特定阈值时。
可以使用Roboflow Workflows来测量相机对焦。在本指南中,介绍了如何在Roboflow Workflows中使用相机对焦块。在图像上测试了该块,然后在视频上部署了工作流,以查看系统在实时中的表现。