双目摄像头采集标定图像

复制代码
# -*- coding: utf-8 -*-

'''
@Time    : 2022/10/05 19:05
@Author  : jianbin
@Email   : jianbinXie_fzu@.com
@FileName: get_image.py
@Software: PyCharm
'''

import cv2
import numpy as np
import os


class StereoCamera(object):
    """采集双目标定图片,按键盘【c】或【s】保存图片"""

    #def __init__(self, chess_width, chess_height, detect=False):
    def __init__(self, chess_width, chess_height, detect=True):
        """
        :param chess_width: chessboard width size,即棋盘格宽方向黑白格子相交点个数,
        :param chess_height: chessboard height size,即棋盘格长方向黑白格子相交点个数
        :param detect: 是否实时检测棋盘格,方便采集数据
        """
        self.chess_width = chess_width
        self.chess_height = chess_height
        self.detect = detect
        #设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
        self.criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)#阈值

    def detect_chessboard(self, image):
        """检测棋盘格"""
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        ret, corners = cv2.findChessboardCorners(gray, (self.chess_width, self.chess_height), None)
        if ret:
            # 角点精检测
            corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), self.criteria)
            # Draw and display the corners
            image = cv2.drawChessboardCorners(image, (self.chess_width, self.chess_height), corners2, ret)
        return image

# 类的实例化
stereo = StereoCamera(8, 11, detect=True)

cap = cv2.VideoCapture(0)
# 设置摄像头分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 2560)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
i = 0
while cap.isOpened():
    ret, frame = cap.read()
    left_img = frame[:, 0:1280, :]
    right_img = frame[:, 1280:2560, :]
    if ret:
        if stereo.detect:
            l = stereo.detect_chessboard(left_img.copy())
            r = stereo.detect_chessboard( right_img.copy())
        else:
            l = left_img.copy()
            r =  right_img.copy()
        # 显示两幅图片合成的图片
        # cv2.imshow('img', frame)
        # 显示左摄像头视图
        cv2.imshow('left', l)
        # 显示右摄像头视图
        cv2.imshow('right', r)
    key = cv2.waitKey(delay=2)
    if key == ord("q") or key == 27:
        break
    # 按”c“或”s“保存图像
    elif key == ord('c') or key == ord('s'):
        print("save image:{:0=3d}".format(i))
        cv2.imwrite(os.path.join("data/camera", "left_{:0=3d}.png".format(i)),  left_img)
        cv2.imwrite(os.path.join("data/camera", "right_{:0=3d}.png".format(i)),  right_img)
        i += 1


cap.release()
cv2.destroyAllWindows()
复制代码

 

posted @   路人加  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示