双目摄像头标定

前言:

        因为项目的需要,需对相机进行标定,获取其相机的参数。

硬件:

        正点原子的双目摄像头模块、达芬奇FPGA开发板

        注:双目摄像头的分辨率是通过达FPGA进行设定的,其设定值为1280*960。若需通过FPGA对摄像头的分辨率进行调整,其教程可以参考(若不更改ddr大小,最大分配率为1080p,即1920*1080):正点原子ov5640双目摄像头hdmi显示verilog例程修改---分辨率调整

软件

        MATLAB2022a、vivado2019.2、pycharm2023

步骤:

        步骤1,编写camera_deal.py脚本,以对棋盘进行多角度拍摄,每按下一次s键,会保存一组左右镜头的照片,照片保存的路径参数可以由用户自由设定,参数名为folder。参考代码如下:

# !/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
import time

AUTO = False  # 自动拍照,或手动按s键拍照
INTERVAL = 2  # 自动拍照间隔

cap = cv2.VideoCapture(0)  # windows下开启摄像头是采用如下语句(微软有):cv2.VideoCapture( camera_number + cv2.CAP_DSHOW)
#注意1#
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 960)  # 设置双目的宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1280)  # 设置双目的高度

# 显示缓存数
# print(cap.get(cv2.CAP_PROP_BUFFERSIZE))
# 设置缓存区的大小
# cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

#注意2#
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 设置FPS
# print('setfps', cap.set(cv2.CAP_PROP_FPS, 25))
# print(cap.get(cv2.CAP_PROP_FPS))

counter = 0
utc = time.time()
folder = "F:/python_test/Camera_Deal/"  # 拍照文件目录


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 = cap.read()

    if not ret:
        print("camera is not connected!")
        break
    #注意3#
    left_frame = frame[:, 0:360]  # 假设左视图的宽度为480
    right_frame = frame[:, 360:720]  # 假设右视图的宽度为480

    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 & 0xFF == ord("s"):
        shot("left", left_frame)
        shot("right", right_frame)
        counter += 1

cap.release()

        注意事项1: 若注释“注意1”虽然会能够设计摄像头的分辨率,但在“注意2”这边同时也会获取到实际的分辨率大小,如果运行脚本时,左右图片大小不一致,“注意3”这边需根据“注意2”所获得分辨率进行调整。

        注意事项2: 键盘切换至英文小写键,通过按“s”,即可捕捉图像。

相关解释

        1:为什么cv.get与cv.set的值会不同?

        首先,重要的是要理解VideoCapture不仅仅是一个播放视频文件的类。例如,它还可以连接到流或照相机。然后,它可能具有只适用于特定情况的属性,这就是为什么它们有一个set / get泛型函数的原因。使用摄像头,如果你的摄像头/驱动程序允许的话,你可以设置分辨率,例如,你提供的代码片段。

        set函数返回C++ (和python)中的bool值,不确定这是否意味着设置了它,但是您可以签出它,可能您的函数返回false。我不确定,因为我没有检查过,而且文件也没有提供解释。

        在视频中,它将读取每一帧,但它可能不会改变视频的属性。那么你能做什么呢?取决于你打算用它做什么。

        您可以使用调整尺寸,例如:

retval, frame = cap.read()
res = cv2.resize(frame,(160, 120), interpolation = cv2.INTER_CUBIC)

        然后,您可以使用VideoWritter保存视频或对其进行任何图像处理。

参考:

在python环境下opencv无法调整分辨率

在Python中进行双目摄像头标定的步骤如下: 1. 收集标定图像:使用双目摄像头拍摄一系列的标定图像,确保每张图像都包含一些棋盘格子。 2. 检测角点:使用OpenCV的函数`findChessboardCorners()`来检测图像中的棋盘格子角点。这个函数会返回每张图像中检测到的角点的坐标。 3. 计算相机内参:使用OpenCV的函数`calibrateCamera()`来计算相机的内参,包括相机的焦距、主点位置和畸变系数。 4. 生成校正映射:使用OpenCV的函数`initUndistortRectifyMap()`来生成校正映射。这些映射可以将图像中的像素坐标转换为校正后的像素坐标。 5. 应用校正映射:使用OpenCV的函数`remap()`来应用校正映射,将原始图像校正为无畸变的图像。 6. 计算立体校正参数:使用OpenCV的函数`stereoRectify()`来计算立体校正参数,包括左右摄像机的校正矩阵和投影矩阵。 7. 应用立体校正参数:使用校正矩阵和投影矩阵,以及校正映射,对左右摄像机的图像进行立体校正。 经过以上步骤,你就可以得到经过畸变校正和立体校正后的图像了。请注意,以上步骤中的代码示例是基于OpenCV库的函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [4、OpenCV-Python双目标定流程](https://blog.csdn.net/baidu_39231810/article/details/128631622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值