使用opencv打开相机——python

本文介绍如何使用Python的OpenCV库进行摄像头实时读取及图像处理,包括摄像头初始化、图像显示、按键响应及图片保存等功能。通过代码示例,读者可以学习到如何利用OpenCV进行基本的摄像头操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import cv2 as cv

def video_demo():
    # 0是代表摄像头编号,只有一个的话默认为0
    capture = cv.VideoCapture(0)
    while (True):
        # 调用摄像机
        ref, frame = capture.read()
        # 输出图像,第一个为窗口名字
        cv.imshow('frame', frame)
        # 10s显示图像,若过程中按“Esc”退出,若按“s”保存照片并推出
        c = cv.waitKey(10) & 0xff
        if c == 27:
            # 简单暴力释放所有窗口
            cv.destroyAllWindows()
            break
        elif c == ord('s'):
            # 储存照片
            cv.imwrite('./images/pic.png',frame)
            break


if __name__ == '__main__':
    cv.waitKey()
    video_demo()

参考文章

### 双目相机标定实现 通过 PythonOpenCV 进行双目相机标定时,可以利用 `cv2.stereoCalibrate` 函数来完成内外参的联合标定。该方法不仅能够获得单目的内参矩阵和畸变系数,还能进一步求解两摄像头之间的相对位置关系(即外参)。以下是具体实现方式: #### 数据准备 为了进行双目相机标定,需采集一系列棋盘格图像作为输入数据。这些图像应覆盖不同角度、距离以及光照条件下的场景。 #### 关键代码示例 以下是一个完整的代码框架用于执行双目标定过程,并提取所需的外部参数——旋转矩阵 \( R \) 和平移向量 \( T \): ```python import numpy as np import cv2 import glob # 终端尺寸定义 chessboard_size = (9, 6) # 获取世界坐标系中的三维点 objp = np.zeros((np.prod(chessboard_size), 3), dtype=np.float32) objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) # 存储每幅图片对应的对象点和图像点 objpoints_l = [] imgpoints_l = [] objpoints_r = [] imgpoints_r = [] images_left = glob.glob('left*.jpg') images_right = glob.glob('right*.jpg') for fname_l, fname_r in zip(images_left, images_right): img_l = cv2.imread(fname_l) gray_l = cv2.cvtColor(img_l, cv2.COLOR_BGR2GRAY) img_r = cv2.imread(fname_r) gray_r = cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY) ret_l, corners_l = cv2.findChessboardCorners(gray_l, chessboard_size, None) ret_r, corners_r = cv2.findChessboardCorners(gray_r, chessboard_size, None) if ret_l and ret_r: objpoints_l.append(objp) objpoints_r.append(objp) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) corners_l_refined = cv2.cornerSubPix(gray_l, corners_l, (11, 11), (-1, -1), criteria) imgpoints_l.append(corners_l_refined) corners_r_refined = cv2.cornerSubPix(gray_r, corners_r, (11, 11), (-1, -1), criteria) imgpoints_r.append(corners_r_refined) # 单独校准左摄像机 retL, cameraMatrixL, distCoeffsL, _, _ = cv2.calibrateCamera( objpoints_l, imgpoints_l, gray_l.shape[::-1], None, None)[^2] # 单独校准右摄像机 retR, cameraMatrixR, distCoeffsR, _, _ = cv2.calibrateCamera( objpoints_r, imgpoints_r, gray_r.shape[::-1], None, None) # 联合立体校正 flags = 0 flags |= cv2.CALIB_FIX_INTRINSIC criteria_stereo = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) retS, MLS, dLS, MRS, dRS, R, T, E, F = cv2.stereoCalibrate( objpoints_l, imgpoints_l, imgpoints_r, cameraMatrixL, distCoeffsL, cameraMatrixR, distCoeffsR, gray_l.shape[::-1], flags=flags, criteria=criteria_stereo)[^1] print("Rotation Matrix:") print(R) # 输出旋转矩阵 print("\nTranslation Vector:") print(T) # 输出平移向量 ``` 上述脚本实现了以下几个功能模块: - **角点检测**:分别针对左右两侧拍摄到的棋盘格图案寻找亚像素精度级别的角点。 - **单独标定**:先独立处理每一侧镜头的数据集以初步估计其内部几何特性。 - **联合优化**:最后调用 `stereoCalibrate()` 方法同步调整两个视图间的关联性约束条件从而得出精确的结果。 值得注意的是,在实际应用过程中可能还需要考虑更多细节问题比如噪声过滤等措施提升整体性能表现[^3]。 --- ####
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值