1.简介
接下来这个专栏会连续更新yolo+双目测距整个流程的全部文章,包看包会,看不懂来揍我,多点赞收藏哈,谢谢大家。本文主要介绍在Pycharm中使用OpenCV使用双目摄像头,包括:打开双目摄像头、设置相机分辨率、保存图片。
软件:Pycharm 编程语言:Python 主要依赖库:OpenCV
2.双目相机
一般双目相机两个相机都是同帧拍摄的,这相机的分辨率为1920×1520。
3.前期工作
前期准备工作主要是pycharm软件安装、和OpenCV库的下载。
4.整体流程
这段代码参考了这篇博客:双目视觉目标追踪及三维坐标获取—python(代码)_根据双目rgb获得相机坐标系中的坐标-CSDN博客
import cv2
import time
import os
AUTO = False # 自动拍照,或手动按s键拍照
INTERVAL = 2 # 自动拍照间隔
cv2.namedWindow("left")
cv2.namedWindow("right")
camera = cv2.VideoCapture(1)
# 设置分辨率
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 3840)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 1520)
# 检查摄像头是否成功打开
if not camera.isOpened():
print("无法打开摄像头")
exit()
counter = 0
utc = time.time()
folder = r"" # 拍照文件目录
# 创建左右相机的文件夹
left_folder = os.path.join(folder, "left")
right_folder = os.path.join(folder, "right")
os.makedirs(left_folder, exist_ok=True)
os.makedirs(right_folder, exist_ok=True)
def shot(pos, frame):
global counter
if pos == "left":
path = os.path.join(left_folder, f"left_{counter:04d}.jpg")
else:
path = os.path.join(right_folder, f"right_{counter:04d}.jpg")
cv2.imwrite(path, frame)
print("snapshot saved into: " + path)
while True:
ret, frame = camera.read()
if not ret:
print("无法获取帧")
break
# 裁剪坐标为[y0:y1, x0:x1] HEIGHT * WIDTH
left_frame = frame[0:1520, 0:1920]
right_frame = frame[0:1520, 1920:3840]
cv2.imshow("left", left_frame)
cv2.imshow("right", right_frame)
now = time.time()
if AUTO and now - utc >= INTERVAL:
shot("left", left_frame)
shot("right", right_frame)
counter += 1
utc = now
key = cv2.waitKey(1)
if key == ord("q"):
break
elif key == ord("s"):
shot("left", left_frame)
shot("right", right_frame)
counter += 1
camera.release()
cv2.destroyAllWindows()
这个代码有几个值得注意的地方。第一个就是相机id,我的电脑的双目相机后id是1。
第二个就是分辨率,我这个相机的分辨率是1920×1520,左右相机加起来就是3840×1520,在代码中需要根据自己的分辨率进行修改。这个是需要修改的第一部分:
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 3840)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 1520)
这个是需要修改的第二部分:
left_frame = frame[0:1520, 0:1920]
right_frame = frame[0:1520, 1920:3840]