精华内容
下载资源
问答
  • 目摄像头实时视觉定位 单目摄像头实时视觉定位 单目摄像头实时视觉定位 单目摄像头实时视觉定位 单目摄像头实时视觉定位 单目摄像头实时视觉定位
  • OpenCV 单目摄像头(python版)

    千次阅读 2021-01-24 14:34:29
    目摄像头 1)基础 2)设置分辨率 3)细节提升 4)摄像头拍照 5)录制视频 单目摄像头 1)基础 OpenCV有VideoCapture()函数,能用来定义“摄像头”对象,0表示第一个摄像头(一般是电脑内置的摄像头);...

    前言

    本文主要介绍在OpenCV用使用单目摄像头,包括:打开单目摄像头、设置摄像头参数、拍照、录制视频。

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

     

    目录

    1)打开摄像头

    2)设置分辨率

    3)细节提升

    4)摄像头拍照

    5)录制视频


     

    单目摄像头

    1)打开摄像头

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

    在while循环中使用“摄像头对象”的read()函数一帧一帧地读取摄像头画面数据。

    imshow函数是显示摄像头的某帧画面;cv2.waitKey(1)是等待1ms,如果期间检测到了键盘输入q,则退出while循环。

    # -*- coding: utf-8 -*-
    import cv2
    
    cap = cv2.VideoCapture(0) # 0表示第一个摄像头
    while(1):
        # get a frame
        ret, frame = cap.read()
        # show a frame
        cv2.imshow("capture", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

     调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。

     

    2)设置分辨率

    有时需要指定摄像头的分辨率,比如1920*1080;

    cap.set(3,1920) 设置帧的宽度为1920。cap.set(4,1080) 设置帧的长度为1080。

    # -*- coding: utf-8 -*-
    import cv2
    
    cap = cv2.VideoCapture(0)
    #先设置分辨率,宽:1920 长:1080
    cap.set(3,1920)
    cap.set(4,1080)
    while(1):
        # get a frame
        ret, frame = cap.read()
        # show a frame
        cv2.imshow("capture", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

    拓展:当摄像流为 cap,设置参数是cap.set(参数编号,参数);获取参数值的函数是 cap.get(参数编号)。

    方法释义
    cv2.VideoCapture.get(0)视频文件的当前位置(播放)以毫秒为单位
    cv2.VideoCapture.get(1)基于以0开始的被捕获或解码的帧索引
    cv2.VideoCapture.get(2)视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
    cv2.VideoCapture.get(3)在视频流的帧的宽度
    cv2.VideoCapture.get(4)在视频流的帧的高度
    cv2.VideoCapture.get(5)帧速率
    cv2.VideoCapture.get(6)编解码的4字-字符代码
    cv2.VideoCapture.get(7)视频文件中的帧数
    cv2.VideoCapture.get(8)返回对象的格式
    cv2.VideoCapture.get(9)返回后端特定的值,该值指示当前捕获模式
    cv2.VideoCapture.get(10)图像的亮度(仅适用于照相机)
    cv2.VideoCapture.get(11)图像的对比度(仅适用于照相机)
    cv2.VideoCapture.get(12)图像的饱和度(仅适用于照相机)
    cv2.VideoCapture.get(13)色调图像(仅适用于照相机)
    cv2.VideoCapture.get(14)图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
    cv2.VideoCapture.get(15)曝光(仅适用于照相机)
    cv2.VideoCapture.get(16)指示是否应将图像转换为RGB布尔标志
    cv2.VideoCapture.get(17)× 暂时不支持
    cv2.VideoCapture.get(18)立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

     

    3)细节提升

    其实在ret, frame = cap.read() 代码,能通过ret 的值来判断是否成功读取到摄像头的画面数据,加一个判断逻辑更严谨一些;

    成功读取摄像头数据时,ret 值返回True;获取失败时返回False。

    # -*- coding: utf-8 -*-
    import cv2
    
    cap = cv2.VideoCapture(0)
    #先设置分辨率,宽:1920 长:1080
    cap.set(3,1920)
    cap.set(4,1080)
    while(1):
        # get a frame
        ret, frame = cap.read()
        if ret:
            # show a frame
            cv2.imshow("capture", frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            print("图像数据获取失败!!")
            break
    cap.release()
    cv2.destroyAllWindows()

     

    4)摄像头拍照

    拍照 = 保存图片,使用 cv2.imwrite 把当前摄像头的帧 数据写进去,保存为图片的形式;如果s键按下,则进行图片保存;

    # -*- coding: utf-8 -*-
    import cv2
    
    cap = cv2.VideoCapture(0)
    #先设置分辨率,宽:1920 长:1080
    cap.set(3,1920)
    cap.set(4,1080)
    # 图像计数 从1开始
    img_count = 1
    
    while(1):
        # get a frame
        ret, frame = cap.read()
        if ret:
            # show a frame
            cv2.imshow("capture", frame)
            # 等待按键事件发生 等待1ms
            key = cv2.waitKey(1)
            if key == ord('q'):
                # 如果按键为q 代表quit 退出程序
                print("程序正常退出..")
                break
            elif key == ord('s'):
                ## 如果s键按下,则进行图片保存
                # 写入图片 并命名图片为 图片序号.png
                cv2.imwrite("{}.png".format(img_count), frame)
                print("保存图片,名字为  {}.png".format(img_count))
                # 图片编号计数自增1
                img_count += 1
    
        else:
            print("图像数据获取失败!!")
            break
    cap.release()
    cv2.destroyAllWindows()

     

    5)录制视频

    保存图片使用的是cv2.imwrite(),要保存视频,需要创建一个VideoWriter对象,需要传入四个参数。

    • 输出的文件名,如’output.avi’
    • 编码方式FourCC码
    • 帧率FPS
    • 要保存的分辨率大小
    # -*- coding: utf-8 -*-
    import cv2
    
    cap = cv2.VideoCapture(0)
    # 定义编码方式并创建VideoWriter对象
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    outfile = cv2.VideoWriter('output.avi', fourcc, 25., (640, 480))
    
    while(cap.isOpened()):
        ret, frame = cap.read()
        if ret:
            outfile.write(frame)  # 写入文件
            cv2.imshow('frame', frame)
            if cv2.waitKey(1) == ord('q'):
                break
        else:
            break

    使用cv2.VideoCapture()创建视频对象,然后在循环中一帧一阵显示图像。

     

    参考:https://www.programcreek.com/python/example/85663/cv2.VideoCapture

    https://appdividend.com/2020/06/26/python-cv2-videocapture-how-to-load-video-in-python/

     

     

     

     

    展开全文
  • python程序,在opencv下使用单目摄像头,测量人到摄像头的距离,行人检测。
  • 目摄像头的标定

    2011-11-24 11:25:44
    这是一个单目摄像头标定程序,可以纠正摄像头畸变
  • 我今天看D435i的图像话题消息发现只有一个图像,没有左右之分 再看下面这个图感觉D435i真的只有一个摄像头啊?单目摄像头怎么跑vins-fusion?难道vins-fusion单目的也可以? ...

    我今天看D435i的图像话题消息发现只有一个图像,没有左右之分

     

    再看下面这个图感觉D435i真的只有一个摄像头啊?单目摄像头怎么跑vins-fusion?难道vins-fusion单目的也可以?是的,是可以的。

    https://blog.csdn.net/huanghaihui_123/article/details/86518880

     

    那看来D435i做不了双目VIO?原来D435i的建图不是靠双目估计深度的,靠的结构光啊。

    红外是起纹理增强作用的,比如对着白墙,这种功能小觅也有。深度主要还是靠双目图像来的。可以具体细看我后面的截图。

     

    既然D435i是单目的话,弄得我想买小觅了。

    https://blog.csdn.net/qq_21950671/article/details/98079115?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161693859116780261976800%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161693859116780261976800&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-98079115.pc_v2_rank_blog_default&utm_term=D435i

    IR Rrojector我搜翻译是红外投影仪的意思,应该就是发射红外光的,而且还搜到kinect上面也有IR Rrojector

    Stereo IR Pair是立体红外对,我怀疑是两个摄像头?拍红外光用的?是的话不就符合结构光的原理了么!!!!!我之前不也是做过结构光么。kinect好像也就是结构光。当然D435i的发出的红外是一个个点,我之前大学想弄的结构光是一条一条的。

     

     

     

    之前还有人问我这个问题。

    https://blog.csdn.net/sinat_16643223/article/details/107434231#commentBox

     

     

    后来了解之后确实是都可。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    需要注意D435i的那两个双目是黑白图像的,似乎他们做SLAM的都是用黑白图像,opencv好像也是用的黑白图像,彩色图像只有那个rgb相机有,就那个单目。

     

     

     

    现在看来很多都采用双目+IMU+结构光的形式,结构光不光是对着白墙有用,在黑暗环境也有用!!!!!!!!!!!这个倒是很重要了。

    https://blog.csdn.net/weixin_29416629/article/details/112324299?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-9&spm=1001.2101.3001.4242

    展开全文
  • 目摄像头测距

    万次阅读 多人点赞 2018-08-30 19:16:39
    在Adas等领域中,当检测出前方车辆后通常需要进行距离估计,单目摄像头光学图像测距具有低成本和计算快的优点,下面简单介绍一下该方法。 首先列举一下所需的参数: 相机高度,探测器俯仰角,探测器垂直半视场角,...

    在Adas等领域中,当检测出前方车辆后通常需要进行距离估计,单目摄像头光学图像测距具有低成本和计算快的优点,下面简单介绍一下该方法。

    首先列举一下所需的参数:

    相机高度,探测器俯仰角\Theta,探测器垂直半视场角\beta,水平半视场角\gamma。探测器的垂直与水平半视场角若厂商没有提供,可以自行标定测量或根据公式计算。水平半视场角计算公式如下:

    \gamma =\arctan \left ( \frac{W\ast d}{2\ast f}\right )

    W为图像宽度,d为像元长度,f为焦距。垂直半视场角的计算同上,将W替换为H即可。

    探测器检测到地面区域的示意图如下。绿色区域代表图像对应的实际地面区域,{O}'对应图像中心。

    (1)求{y}'轴方向y的距离

    {y}'轴切面的示意图如上。假设Y为坐标点在图像中y方向距离图像中心点的距离,{Y}'为图像高的一半。

    Y位于图像上半部分时取+号,当Y位于图像下半部分时取-号。

    需注意,此时为理想情况,相机探测区域全部在地面上。实际过程中,当俯仰角较小时,相机的视场会同时涵盖天空与地面区域,此时只取y>0的情况,对应地面区域。

    (2)求{x}'轴方向x的距离

    x轴的计算示意图如上。由此可得,

    y为(1)中计算出的y方向的地理坐标,X坐标点在图像中x方向距离图像中心点的距离,{X}'为图像宽的一半。

    (3)计算距离

    根据(1)(2)中计算出的x、y的值可以计算地面距离。

    dis=\sqrt{x^{2}+y^{2}}

    (4)若被测物体本身具有一定高度H,则

    \left ( {x}',{y}' \right )=\left ( x,y \right )*(1-\frac{H}{h}))

    (5)补充一点:该模型的假设是相机光学中心即为图像中心,实际过程中会有偏差,找出光学中心对应的像素位置替换即可。

    贴下代码

    #define USE_RIDE 
    const float PI = 3.1415926;
    const int IMAGE_WIDTH = 1280;
    const int IMAGE_HEIGHT = 720;
    const float HORIZONTAL_HALF_ANGLE = 26 * PI/180;
    const float VERTICAL_HALF_ANGLE = 16 * PI / 180;
    const float H = 1.16;
    const float PITCH_ANGLE = 7 * PI / 180;
    const float RIDE_HEIGHT = 0.15;
    
    float CoordinateTransform(const int &_x,const int &_y, float &x, float &y)
    {
    	if (_x < 0 || _x >= IMAGE_WIDTH || _y < 0 || _y >= IMAGE_HEIGHT)
    		return -1;
    	float j = _x + 0.5;
    	float i = _y + 0.5;
    	if (i > IMAGE_HEIGHT / 2)
    		y = H / tan(PITCH_ANGLE + atan((i - IMAGE_HEIGHT / 2) * 2 * tan(VERTICAL_HALF_ANGLE) / IMAGE_HEIGHT));
    	else
    		y = H / tan(PITCH_ANGLE - atan((IMAGE_HEIGHT / 2 - i) * 2 * tan(VERTICAL_HALF_ANGLE) / IMAGE_HEIGHT));
    	if (y <= 0)
    		return -1;
    	x = sqrt(H*H + y*y) * fabs(j - IMAGE_WIDTH / 2) * tan(HORIZONTAL_HALF_ANGLE) * 2 / IMAGE_WIDTH;
    
    #ifdef USE_RIDE
    	x = x*(1 - RIDE_HEIGHT / H);
    	y = y*(1 - RIDE_HEIGHT / H);
    #endif
    	return sqrt(x*x + y*y);
    }

     

    展开全文
  • 用于单目摄像头标定 1.可用摄像头获取实时流进行标定 2.可用本地的包含完整棋盘格的图片进行标定(15幅图片)
  • 各位大神好,我是opencv新手,现在在做一个项目,要求用单目摄像头提取图像中的深度信息,测量之前已经识别出来的障碍物与摄像头的距离。 现在已经在网上找到标定例程calibration.cpp而且已经输出了摄像头的内参数...
  • 准备材料:单目摄像头、定标板、摄像头拍下定标板的图片 本博客带大家实际动手,再讲单目摄像头标定原理。 准备标定板 标定的开始阶段最需要用到的标定板,可以直接从opencv官网上能下载到: (注意:这里是7...

    实验环境:matlab2016 

    准备材料:单目摄像头、定标板、摄像头拍下定标板的图片

    本博客带大家实际动手,再讲单目摄像头标定原理。

     

    准备标定板

    标定的开始阶段最需要用到的标定板,可以直接从opencv官网上能下载到: (注意:这里是7*10的定标板,推荐奇*偶的)
    http://docs.opencv.org/2.4/_downloads/pattern.png

    具体如下:

     

    然后,建议固定到平面物体上,方便等下拍照,降低误差。(然后用尺子量一下正方形格子的实际长度,如:25mm)

     

    准备图片

    使用摄像头拍下定标板:(拍30张左右就可以了)

     

    进行摄像头定标

    打开matlab,点击应用程序,点击小箭头来显示下拉列表

     

    找到Camera Calibrator

     

    添加图片:

     

    选择刚才拍好的图片:

     

    输入正方形格子的实际长度

     

    这里显示一共有28张图片,成功添加了19张,其余的舍弃掉(图片拍的不好)

    然后可以看到自动标出了x,y轴,和圈出了方角。下一步点击Calibrator

     

    有两个点值得留意的:

    1)红色框框中的,Overal Mean Error (这个值要尽量降低)

    2)蓝色框框中的,是可以看出每一幅图片到相机的距离(和图片当时的姿态)

     

    把和平均值相差较大的图片删除掉:

     

     

    最后导出摄像头的参数

    点击确定

     

    来到首页查看摄像头的参数

     

     

    到这里,单目摄像头的内参就成功获取啦,恭喜呀。

     

    摄像头标定意义

         在图像测量及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。

    即:找出三维空间与二维图像的对应关系。

         在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定。相机参数的标定是非常关键的环节,其标定结果的精度将直接影响相机工作产生结果的准确性。

     

    坐标系

    在这里总共涉及到四个坐标系的变化。这四个坐标系分别是:

    (1)像素坐标系;(2)成像坐标系;(3)相机坐标系;(4)世界坐标系。

    1.像素坐标系

       像素坐标系是一个直角坐标系,其定义方式是:原点位于图像的左上角,轴向右与轴平行,轴向下与轴平行,其反映了相机CCD/CMOS芯片中像素的排列情况,在像素坐标系中单位是像素。像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。

     

    2.成像坐标系

    成像坐标系是用来表示图像的物理位置的坐标系,则此坐标系中的坐标表示图像上点的位置坐标。对应的成像坐标系中的物理坐标的单位是毫米。

     

    3.相机坐标系

    相机坐标系是一个三维直角坐标系,其坐标轴为,原点位于镜头光心处,其中轴称为相机的光轴,垂直于图像平面,轴平行于成像坐标系的轴,轴平行于成像坐标系的轴。

    如图所示:O为摄像机光心,Zc为摄像机的光轴,和图像平面垂直;OO1为摄像机焦距;

    相机标定之四个坐标系及其关系

     

    相机坐标系与图像坐标系的关系:

    如图所示:

    相机标定之四个坐标系及其关系

     

    4.世界坐标系

    世界坐标系作为一个基准,选择世界坐标系没有固定的方式,具体情况具体来考虑。其可以用来描述待测物体与相机的相对位置关系。其坐标轴为。

    世界坐标系是为了描述相机的位置而被引入的,任何维的旋转可以表示为坐标向量与合适的方阵的乘积。

    平移向量是第一个坐标原点与第二个坐标原点的偏移量;

    在世界坐标系下,有两个重要的参数:旋转矩阵R 和 平移向量T

    相机标定之四个坐标系及其关系

    相机标定之四个坐标系及其关系

     

    2.坐标系与坐标系之间的关系


    1)世界坐标系与相机坐标系

    设在相机坐标系下有一个点,它的坐标为。在世界坐标系下对应的坐标为。

    因此,世界坐标系与相机坐标系中的坐标存在如下的关系:

    其中,是旋转矩阵,为3x3的正交单位矩阵;t是一个平移矩阵,。

    同时这里用了一个数学技巧(《视觉SLAM14讲》第43页):我们在一个三维向量的末尾添加1,将其变成了四维向量,称为齐次坐标。其中称为外参数矩阵。

    2)像素坐标系与成像坐标系

    在二维成像平面坐标系中,相机光轴与图像平面的交点即为原点,该点称为图像的主点,如果我们不去考虑畸变,图像的主点就是图像的中心点,但是由于相机系统加工,外力作用等原因会产生一定的偏移。设主点在像素坐标系中的坐标为,则像素坐标系与成像坐标系对应关系如下:

     

    希望对你有帮助。

    坐标原理参考https://jingyan.baidu.com/article/63f2362826ea1c0208ab3dec.html

    友情链接:单目摄像头内参的含义的使用

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 此代码是基于halcon软件的关于单目摄像头的标定,以及对发生镜像畸变的图像的矫正,最后再利用标定好的摄像头对真实拍摄的物体图像进行测距。本人已试验过,效果还不错。
  • 目摄像头标定与测距

    千次阅读 2020-05-17 13:49:50
    目摄像头标定与测距 一、 标定 首先要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这里顺带提一句,这本书虽然确实老,但有些理论、算法类的东西里面还是讲的很不错的,必要的时候可以去看...
  • OpenCV单目摄像头标定

    千次阅读 2018-08-15 22:53:43
    转载自:...   OpenCV单目摄像头标定 代码示例: http://blog.csdn.net/zc850463390zc/article/details/48946855  做了适当修改 #include &lt;opencv2/opencv.hpp&gt; ...
  • 目摄像头检测输出 3D 边界框

    千次阅读 2019-04-12 20:03:28
    目摄像头检测输出 3D 边界框 单纯的 2D 检测框无法在 3D 空间去做规划控制,单目图像估计 3D 检测框也是自动驾驶研发的一个课题,百度 Apollo 发布 2.5 / 3.0 版本特意提到这方面的解决方案。 Amnon Shashua is a ...
  • 目摄像头检测6D姿态 CVPR2019: ROI-10D: Monocular Lifting of 2D Detection to 6D Pose and Metric Shape 论文链接: https://arxiv.org/pdf/1812.02781.pdf 摘要 本文提出了一种端到端单目三维目标检测和度量...
  • 基于单目摄像头的距离测量

    千次阅读 2019-05-29 09:32:19
    1. 简介: /***********************************************... 本项目是使用单目摄像头实现距离的测量,首先单目摄像头与kinect等深度摄像头最大 的区别是无法有效获取深度信息,那就首先从这方面入手,尝试...
  • 1.首先调用摄像头是涉及到底层的系统实现的,首先是需要跟自己采购的平板厂家沟通确认好是否做了双通道摄像头的底层驱动,因为很Android开发板是只有一个摄像头通道的,可以满足你使用单目摄像头。调用方法也都是...
  • 目摄像头外参标定

    2020-09-30 14:58:12
    任务动机:标定单目摄像头外参,为导航使用ORB-SLAM视觉全局定位二次开发做准备。 任务描述: 1. 简介 在之前的内参标定中,我们已经得到了相机内参的参数,于是便可以进行外参标定。本文所讲的外参标定就是摄像...
  • 需要对单目摄像头进行内参和外参标定。 任务描述: 1)镜头畸变和内参标定 用棋盘格标定 2)摄像机与机器人坐标系间的位姿标定 在线数据采集:找一个场景内容丰富的环境 启动激光雷达SLAM,启动摄像机图像采集 ...
  • 目摄像头内参的含义的使用

    千次阅读 2019-11-14 21:59:21
    当我们从matlab等工具中拿到摄像头内部参数,在使用时却不知道哪个参数是表达什么意思的,下面为大家分享一下: 以下栗子中参数结合opencv来使用 摄像头内部参数表: 举个栗子: 在matlab中获取到摄像头的...
  • 基于单目摄像头的物体检测

    千次阅读 2019-11-05 20:43:30
    摄像头是无人车系统中最重要的传感器之一, 具有明显的优点和缺点:廉价、高帧率、信息丰富、观测距离远,但是易受环境影响、缺乏深度信息。 因此,如何建立高准确率、高召回率的物体识别系统,是无人车感知模块的...
  • 标定笔记本单目摄像头 需要的准备:1、标定图:下面这张打印到a4纸上。 2、摄像机驱动,我使用的是usb_cam,下载地址:https://github.com/ros-drivers/usb_cam 下载后放到ros的src目录下(catkin_ws/src) ,编译...
  • 基于深度学习的单目摄像头动态手势识别与交互.pdf
  • ORB SLAM2 ROS单目摄像头环境搭建

    千次阅读 2017-10-18 20:22:19
    ORB SLAM2 ROS单目摄像头环境搭建 平台:arm,windows虚拟机都能成功系统Ubuntu14.04LTS ROS:Indigo
  • 本程序运行后为一个MFC界面,利用opencv库函数打开摄像头,点击保存图片按钮就可以保存图片,点击测距按钮就可以测试出图像点高度及点宽度还有距离。点击关闭摄像头即可关闭摄像头,点击推出程序即可退出程序。
  • Real-time 3D Pose Estimation with a Monocular Camera Using Deep Learning and Object Priors On an Autonomous Racecar 背景 三维物体投影在平面上会失去一个维度,即不知道物体的距离。但是,有了三维物体的...
  • ROS标定单目摄像头

    2020-09-21 19:54:42
    参考链接 ROS.org How to Calibrate a Monocular Camera

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,120
精华内容 2,448
关键字:

多目摄像头