前言:
因为项目的需要,需对相机进行标定,获取其相机的参数。
硬件:
正点原子的双目摄像头模块、达芬奇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保存视频或对其进行任何图像处理。