第N次从零开始学习机器视觉 ——认识摄像头内参

Posted 无始之始

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第N次从零开始学习机器视觉 ——认识摄像头内参相关的知识,希望对你有一定的参考价值。

了解摄像头

0.前言

本着带着问题学习效果更佳的原则。此处,我们提出以下几个问题,并在下文的描述中一个一个解决。

  1. 摄像头的成像原理是什么?
  2. 2维图像中的像素坐标系是怎么定义的?摄像头的3维世界坐标系是怎么定义的?
  3. 如果给定2维图像中的任意一个像素点,如何知道该像素点在世界坐标系下的3维坐标?
  4. 如果给定3维坐标点,如何能够反算出对应的2维图像中的像素点?

1. 单目摄像头内参

内参是摄像头固有的属性,如同一件衣服,一旦裁剪完成,衣袖的长短就是固定的,但就如同世界上没有相同的一片雪花那样。世界上也没有完全一样尺寸的衣服。同理,每一个摄像头的内参都是不同的,包括焦距,像素中心点的偏移,光心的偏移,成像的畸变系数等参数。这些参数需要我们像求解一个含有未知数的方程那样,通过已知的参数,如标定板中的各个角点的相对坐标来值,构建多元线性方程,并将其求解得出。

1.1 摄像头成像原理

初中的时候我们就已经学会了小孔成像原理,穿过小孔的成像是倒立的,利用相似性原理,我们可以构造出以下公式:
f Z = x ′ X = y ′ Y \\fracfZ = \\fracx^\\primeX = \\fracy^\\primeY Zf=Xx=Yy
其中X, Y, Z是世界坐标系下的点。

1.2 坐标系的定义

  1. 像素坐标系定义:坐标表示为(U, V),其中图像的左上方为原点O, 向右为U,与世界坐标系的X轴平行;向下为V,与世界坐标系的Y轴平行。
  2. 世界坐标系定义:坐标表示为(X, Y, Z),人站在摄像头正后面,摄像头代替人的眼睛,此时,前方是Z轴,右手方向是X轴,正下方是Y轴。

1.3 摄像头内参

内参数通常出场就会标定,如果没有办法获得可以使用棋盘格的方法进行标定。 f x f_x fx为摄像头焦距 f f f乘上系数 α \\alpha α后得到的值,即 f x = f α f_x=f\\alpha fx=fα f y f_y fy同理。本质上是将成像数值通过缩放系数映射到成像平面中的各个像素点上。
Z [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] = K p Z\\left[ \\beginmatrix u\\\\v\\\\1 \\endmatrix \\right]= \\left[ \\beginmatrix f_x & 0 & c_x \\\\ 0 & f_y & c_y \\\\ 0 & 0 & 1 \\endmatrix \\right] \\left[ \\beginmatrix X\\\\Y\\\\Z \\endmatrix \\right]=\\boldKp Z uv1 = fx000fy0cxcy1 XYZ =Kp
其中 K \\boldK K为内参矩阵, f x f_x fx, f y f_y fy, c x c_x cx, c y c_y cy 的单位都是像素。

从零开始玩人工智能—机器视觉API—01

    我们使用Face API做了一些有趣的尝试。从原理上来说,人脸识别算是计算机视觉的分支。所以,接下来我们了解一下计算机视觉就很顺利成章了。

    计算机视觉是非常热门的人工智能方向,而我国在这个领域有着非常领先的地位。也出现了非常多的开源技术例如Open CV。在Azure里,微软提供了Computer Vision API用来帮助用户快速实现有关机器视觉的AI应用。

     目前,Azure的机器视觉能够根据2000多个能够识别的对象返回标签,同时也能够识别86类事物:

技术分享图片

    这是我用Excel做的颜色分类,怎么样色彩缤纷吧~微软Docs站点的如下:

技术分享图片

    当传递一张图像给机器视觉API后,会根据以上的类别、对象,返回标签、属性以及它们对应的评分。当然,除了分析图片,还可以使用人工智能识别图片的内容,使用一句话给你答复;也可以使用OCR来识别图片中的文字,识别手写文本,按照图片的内容和给定的大小自动生成合适的缩略图等等……

    感觉酷炫得无从下手吧?还好微软也给了不少示例代码~ 看示例代码可以学到好多东西,比如对json的处理…居然有这种操作…

image_caption = analysis["description"]["captions"][0]["text"].capitalize()

    居然直接就一级一级的挖到想要的数据了~学习了。

%matplotlib inline 
from PIL import Image 
from io import BytesIO 
import matplotlib.pyplot as plt

    又是一波秀操作的~不满足于输出json,这是要在照片上涂涂画画的吧?看着是要导入几个库。Python的默认安装貌似没有,老老实实安装吧。

>pip install pil

    得,报错了。

技术分享图片

    PIL全称Python Imaging Library,站点在这里:http://pythonware.com/products/pil/。查了一下,PIL貌似很久远只支持Python 2.x?还好,有替代的分支。用pillow代替了。

>pip install matplotlib

    这个库有点大……

    特殊时期,所有跨境HTTPS的流量变得极不稳定,在线pip安装完全无法完成,于是我只能想别的办法安装库了。原来,Python的库和Raspberry等Linux系统的软件包一样,可以在网站上下载。这就提供了断点续传的可能,使得无法在线安装的包能够通过下载之后进行安装。

技术分享图片

    访问https://pypi.python.org/pypi ,就可以搜索需要的软件包进行下载。下载之后,一样可以通过pip安装离线的软件包。

>pip install c:\download\matplotlib-2.1.2-cp35-cp35m-win_amd64.whl

    安装matplotlib的时候,自然会要求安装依存的其他软件包,有的小,直接就下载安装了,有的比matplotlib还大,只能再次离线下载。如果你也遇到和我一样的困扰,这里有包的依存关系,可以一起下载了安装。

matplotlib-2.1.2-cp35-cp35m-win_amd64.whl
     cycler-0.10.0-py2.py3-none-any.whl 
     pytz-2018.3-py2.py3-none-any.whl
     pyparsing-2.2.0-py2.py3-none-any.whl
     python_dateutil-2.6.1-py2.py3-none-any.whl
     numpy-1.14.1-cp35-none-win_amd64.whl
     pyparsing-2.2.0-py2.py3-none-any.whl

    安装完包,自然就回到代码进行运行了。可是…又报错了…

%matplotlib inline

^

SyntaxError: invalid syntax

    仔细研究一番,原来这种写法是需要jupyter notebook或者ipython console的,貌似试运行在’osx’, ‘qt4’, ‘qt5’, ‘gtk3’, ‘wx’, ‘qt’, ‘gtk’, ‘tk’系统下,估计写Doc的人用的是Mac OS~更详细的问答可以看这里:

https://stackoverflow.com/questions/30878666/matplotlib-python-inline-on-off

https://stackoverflow.com/questions/47007130/matplotlib-inline-error-in-python-3-6-2

    对着屏幕上我特别喜欢的Visual Studio Code,难道我就木有办法了?不能放弃,我继续了解matplotlib的用法,终于有一篇blog给到我提示了:

https://www.data-blogger.com/2017/11/15/python-matplotlib-pyplot-a-perfect-combination/

    查看示例代码,我发现这个库是可以写文件的,那么,不显示在输出,我保存为图片文件总可以吧~

技术分享图片

    请注意,对于Analyze Image方法,除了挑选视觉功能visualFeatures,还能可选使用details和language。语言除了默认的英语,还支持简体中文哦!这也不奇怪,计算机视觉好多使用的技术和论文都有大量华人的贡献在。微软还特意列出了一些:https://docs.microsoft.com/en-us/azure/cognitive-services/computer-vision/research

    那么,我们看看机器视觉怎么看天安门前的国旗护卫队的:

技术分享图片

    一组人站在一栋建筑前……这智商貌似还不怎么高吧……天安门都不认识?不是认识20 万商业、政治、体育和娱乐界名人,识别全世界 9000 个自然和人工地标么?我再试试看。


技术分享图片

    换了一张图,嗯,识别出了天安门广场… 返回的json数据如下:

{
  "categories": [
    {
      "detail": {
        "landmarks": [
          {
            "confidence": 0.9956175088882446,
            "name": "Tiananmen Square"
          }
        ]
      },
      "name": "building_street",
      "score": 0.7421875
    },
    {
      "detail": {
        "landmarks": [
          {
            "confidence": 0.9956175088882446,
            "name": "Tiananmen Square"
          }
        ]
      },
      "name": "outdoor_",
      "score": 0.01171875
    }
  ],
  "color": {
    "accentColor": "0051B1",
    "dominantColorBackground": "Blue",
    "dominantColorForeground": "Black",
    "dominantColors": [
      "Blue", "Grey"
    ],
    "isBwImg": false
  },
  "description": {
    "captions": [
      {
        "confidence": 0.8968637267424504,
        "text": "a large red building with Tiananmen Square in the background"
      }
    ],
    "tags": [
      "building", "outdoor", "red", "sitting", "large", "clock", "front",
      "street", "top", "parked", "train", "white", "sign", "track", "old",
      "station", "city", "man", "standing", "tower", "bus"
    ]
  },
  "metadata": {
    "format": "Jpeg", "height": 273, "width": 820
  },
  "requestId": "8e1c16f7-3d03-4a0f-8e2f-b50150374959"
}

    不是说支持简体中文么?是的:

{
  "categories": [
    {
      "name": "\u5efa\u7b51_\u8857\u9053",
      "score": 0.7421875
    },
    {
      "name": "\u6237\u5916_",
      "score": 0.01171875
    }
  ],
  "metadata": {
    "format": "Jpeg",
    "height": 273,
    "width": 820
  },
  "requestId": "14f74b94-8dbe-491c-966f-9fcdd0c599f3",
  "tags": [
    {
      "confidence": 0.9926539659500122,
      "name": "\u5efa\u7b51"
    },
    {
      "confidence": 0.9916537404060364,
      "name": "\u6237\u5916"
    },
    {
      "confidence": 0.9839764833450317,
      "name": "\u5929\u7a7a"
    },
    {
      "confidence": 0.8205077052116394,
      "name": "\u7ea2"
    }
  ]
}

    “你骗我,哪有中文啊?” 中文其实以UNICODE提供了,把\u5929\u7a7a这种放到转换网站转换一下:http://www.pdtools.net/tools/unicode.jsp 限于篇(Lan)幅(Duo)就不写了。

技术分享图片

    matplotlib的官网在:https://matplotlib.org 大致是拿来做科学数据图形的,很厉害。

技术分享图片

    matplotlib博大精深,有时间要好好学学了。在Google的机器学习速成课程里,就是用了Matplotlib用作数据可视化:

    https://developers.google.cn/machine-learning/crash-course/

第三方 Python 库机器学习速成课程代码示例使用了第三方库提供的以下功能。无需提前熟悉这些库;您可以在需要时查询相关内容。Matplotlib(适合数据可视化)pyplot 模块cm 模块gridspec 模块


以上是关于第N次从零开始学习机器视觉 ——认识摄像头内参的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习及实战kaggle从零到竞赛pdf电子版下载

PYTHON机器学习及实践_从零开始通往KAGGLE竞赛之路pdf

从零开始认识iptables

机器学习从零基础开始第一节

机器学习从零基础开始第一节

从零开始机器学习 第1篇 一个感知机的实现