与 OpenCV 集成#
为什么要使用 OpenCV?#
OpenCV 是应用最广泛的计算机视觉库之一。它提供以下功能:
- 快速图像处理算法
- 可视化工具
- 支持特征检测、滤波和分析
- 与 NumPy 的互操作性
由于 pypylon 图像本身就是 NumPy 数组,因此集成过程非常顺畅。
基本工作流#
简单示例#
import cv2
from pypylon import pylon
with pylon.InstantCamera(pylon.FirstFound) as camera:
camera.StartGrabbingMax(1)
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
# Display using OpenCV
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Color Format 注意事项#
OpenCV 要求图像采用 BGR 格式,而相机可能会输出以下格式:
- Mono(灰度)
- Bayer
- RGB
将图像转换为与 OpenCV 兼容的格式#
对于实时循环,建议使用 converter.ConvertToArray(grab_result):这会将转换后的像素直接写入预分配的 NumPy 数组中,并避免了对 converter.Convert(grab_result).Array (看 处理图像 的额外复制(详见)
converter = pylon.ImageFormatConverter()
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
image = converter.ConvertToArray(grab_result)
实时显示循环#
import cv2
from pypylon import pylon
with pylon.InstantCamera(pylon.FirstFound) as camera:
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
while camera.IsGrabbing():
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
cv2.imshow("Live", image)
if cv2.waitKey(1) == 27: # ESC to exit
break
cv2.destroyAllWindows()
典型的 OpenCV 操作#
灰度转换#
边缘检测#
模糊/滤波#
绘制叠加层#
结合使用 NumPy 和 OpenCV#
此示例演示了一个结合了 pypylon、NumPy 和 OpenCV 的完整机器视觉处理流程。它从相机中连续采集图像,提取固定的兴趣区域 (ROI),计算简单的统计数据(平均亮度),并直接在实时图像中可视化结果。
具体步骤如下:
- 使用 NumPy 切片定义并提取 ROI。
- 计算 ROI 的平均亮度。
- 使用 OpenCV 矩形叠加层可视化 ROI。
- 在图像上显示基于简单规则的决策结果(“明亮区域”)。
此模式代表了常见的实际工作流程:
import cv2
from pypylon import pylon
import numpy as np
with pylon.InstantCamera(pylon.FirstFound) as camera:
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
while camera.IsGrabbing():
with camera.RetrieveResult(5000) as grab_result:
if grab_result.GrabSucceeded():
image = grab_result.Array
# Define ROI coordinates
y1, y2 = 100, 200
x1, x2 = 200, 300
# Extract ROI
roi = image[y1:y2, x1:x2]
# Compute statistics
mean = np.mean(roi)
# Draw rectangle around ROI
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
if mean > 100:
cv2.putText(image, "Bright Region", (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Live", image)
if cv2.waitKey(1) == 27:
break
cv2.destroyAllWindows()
核心要点#
- pypylon 通过 NumPy 与 OpenCV 无缝集成。
- 通常需要进行色彩转换。
- OpenCV 提供了强大的可视化和处理工具。
- 结合使用 NumPy 和 OpenCV 可以构建灵活的处理流程。