相关文章推荐
喝醉的拖把  ·  双目视觉简介- Being_young - 博客园·  2 天前    · 
喝醉的拖把  ·  摄像头单目与双目有什么区别?哪个更好?_长龙鑫·  2 天前    · 
喝醉的拖把  ·  一篇文章认识《双目立体视觉》-腾讯云开发者社 ...·  2 天前    · 
喝醉的拖把  ·  双目视觉技术的原理、结构、特点、发展现状和发 ...·  2 天前    · 
失眠的鞭炮  ·  双目视觉标定+矫正(基于MATLAB)-云社 ...·  2 年前    · 
小百科  ›  一篇文章认识《双目立体视觉》开发者社区
双目增强现实设备 双目立体视觉
喝醉的拖把
2 天前
一颗小树x

一篇文章认识《双目立体视觉》

原创
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
圈层
工具
MCP广场
文章/答案/技术大牛
发布
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
一颗小树x
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
社区首页 > 专栏 > 一篇文章认识《双目立体视觉》

一篇文章认识《双目立体视觉》

原创
作者头像
一颗小树x
修改 于 2021-05-17 10:51:29
修改 于 2021-05-17 10:51:29
10.6K 1 0
代码可运行
举报
文章被收录于专栏: 用户5033944的专栏 用户5033944的专栏
运行总次数: 0
代码可运行

前言

双目立体视觉,由两个摄像头组成,像人的眼睛能看到 三维 的物体,获取物体长度、宽度信息,和深度的信息;单目视觉获取 二维 的物体信息,即长度、宽度。

1)双目摄像头

常见的双目摄像头有以下几款:

​

能看到不同类型的双目摄像头,左摄像头和右摄像头之间的距离不一样。

2)双目相机基线

基线越大,测量范围越远;基线越小,测量范围越近。

​

建议:

  • (1)基线距B是工作距离的08-2.2倍时测量误差比较小;
  • (2)双目立体视觉的结构对称时,测量系统的误差比较小,精度也比较高。
  • (3)两台相机的有效焦距∫越大,视场越小,视觉测量系统的测量精度越高(即采用长焦距镜头容易获得较高的测量精度)

出自博士论文 基于双目视觉的空间非合作目标姿态测量技术研究.颜坤

3)打开双目摄像头

在OpenCV用使用双目摄像头,包括:打开单目摄像头、设置摄像头参数、拍照、录制视频。

环境

编程语言:Python3 主要依赖库:OpenCV3.x 或 OpenCV4.x

双目同步摄像头,两个镜头共用一个设备ID,左右摄像机同一频率。这款摄像头分辨率支持2560*960或以上。

​

思路流程

1、由于两个镜头共用一个设备ID,打开摄像头时使用cv2.VideoCapture()函数,只需打开一次。区别有的双目摄像头是左右镜头各用一个设备ID,需要打开两次cv2.VideoCapture(0),cv2.VideoCapture(1)。

2、双目摄像头的总分辨率是由左右镜头组成的,比如:左右摄像机总分辨率1280x480;分割为左相机640x480、右相机640x480

​

为了方便理解画了张草图;图中的“原点”是图像像素坐标系的原点。

3、分割后,左相机的分辨率:高度 0:480、宽度 0:640

右相机的分辨率:高度 0:480、宽度 640:1280

4、转换为代码后

代码语言: javascript
代码 运行次数: 0
运行
复制
    # 读取摄像头数据
    ret, frame = camera.read()
    #裁剪坐标为[y0:y1, x0:x1]  HEIGHT * WIDTH
    left_frame = frame[0:480, 0:640]
    right_frame = frame[0:480, 640:1280]
    cv2.imshow("left", left_frame)
    cv2.imshow("right", right_frame)

源代码

举个栗子: 打开分辨率1280x480的双目摄像头

代码语言: javascript
代码 运行次数: 0
运行
复制
# -*- coding: utf-8 -*-
import cv2
import time
AUTO = False  # 自动拍照,或手动按s键拍照
INTERVAL = 2 # 自动拍照间隔
cv2.namedWindow("left")
cv2.namedWindow("right")
camera = cv2.VideoCapture(0)
# 设置分辨率 左右摄像机同一频率,同一设备ID;左右摄像机总分辨率1280x480;分割为两个640x480、640x480
camera.set(cv2.CAP_PROP_FRAME_WIDTH,1280)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
counter = 0
utc = time.time()
folder = "./SaveImage/" # 拍照文件目录
def shot(pos, frame):
    global counter
    path = folder + pos + "_" + str(counter) + ".jpg"
    cv2.imwrite(path, frame)
    print("snapshot saved into: " + path)
while True:
    ret, frame = camera.read()
    # 裁剪坐标为[y0:y1, x0:x1] HEIGHT*WIDTH
    left_frame = frame[0:480, 0:640]
    right_frame = frame[0:480, 640:1280]
    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.destroyWindow("left")
cv2.destroyWindow("right")

补充理解

OpenCV有VideoCapture()函数,能用来定义“摄像头”对象,0表示第一个摄像头(一般是电脑内置的摄像头);如果有两个摄像头,第二个摄像头则对应VideoCapture(1)。

 
推荐文章
喝醉的拖把  ·  双目视觉简介- Being_young - 博客园
2 天前
喝醉的拖把  ·  摄像头单目与双目有什么区别?哪个更好?_长龙鑫
2 天前
喝醉的拖把  ·  一篇文章认识《双目立体视觉》-腾讯云开发者社区-腾讯云
2 天前
喝醉的拖把  ·  双目视觉技术的原理、结构、特点、发展现状和发展方向分析—技术 ...
2 天前
失眠的鞭炮  ·  双目视觉标定+矫正(基于MATLAB)-云社区-华为云
2 年前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南