沿用上一篇文章硬件实现对于摄像头标校
此案例仅仅为实验标校功能基础,为单目标校
环境搭建
- python3.x及其以上版本
- 需要opencv库支持
- 需要glob支持
- 需要numpy支持
安装方法如下
在cmd终端中输入
pip install opencv-python
pip install numpy
pip install glob
需要的外设
需要打印一张9*6棋盘黑白格(采用摄像头不同,所使用的棋盘格也有所差异)
输入如下完整代码
import cv2
import numpy as np
import imageio
import os
import time
from glob import glob
img_dir = '标定图'
os.makedirs(img_dir, exist_ok=True)
# 观察窗口分辨率
viewer_hw = [720, 1280]
# 相机分辨率
capture_resolution_hw = [1080, 1920]
'''
cam = cv2.VideoCapture(0)
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1080)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 1920)
'''
cam_id = int(1)
# dshow only for windows
cam_cap = cv2.CAP_DSHOW
# v4l2 only for linux
# cam_cap = cv2.CAP_V4L2
cam = cv2.VideoCapture(cam_cap + cam_id)
if not cam.isOpened():
print('open cam id %d failure' % cam_id)
exit(-1)
imhw = [0, 0]
# 预热相机
print('预启动相机')
while True:
ret, img = cam.read()
if ret:
imhw = img.shape[:2]
break
print('预热失败')
print('open cam success')
# 启动相机设置面板,只有windows并且使用dshow时可用,Linux上无效
cam.set(cv2.CAP_PROP_SETTINGS, 0)
# 设置相机分辨率,windows上opencv默认使用vfw,会造成实际无法更改分辨率情况,所以需要上面设置为dshow设备
print('设定相机X分辨率', cam.set(cv2.CAP_PROP_FRAME_WIDTH, capture_resolution_hw[1]))
print('设定相机Y分辨率', cam.set(cv2.CAP_PROP_FRAME_HEIGHT, capture_resolution_hw[0]))
print('当前相机X分辨率', cam.get(cv2.CAP_PROP_FRAME_WIDTH))
print('当前相机Y分辨率', cam.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 初始化观察窗口
cv2.namedWindow('viewer', cv2.WINDOW_FREERATIO | cv2.WINDOW_GUI_EXPANDED)
cv2.resizeWindow('viewer', viewer_hw[1], viewer_hw[0])
cv2.namedWindow('findCorners', cv2.WINDOW_FREERATIO | cv2.WINDOW_GUI_EXPANDED)
cv2.resizeWindow('findCorners', viewer_hw[1], viewer_hw[0])
cv2.imshow('viewer'