Hanjie's Blog

一只有理想的羊驼

罗汉杰. 摄像头快门的调控方法、装置、计算机设备及存储介质:中国,CN201810146484.9[P]. 2018-07-24.

Introduction

输入图像的质量所决定往往能决定视觉系统的表现。传统的摄像头快门控制程序是以人的感官作为评判标准的。它们控制快门时间,使得曝光度控制在合理的范围,使得照片对比度强,亮度适中,照片中物体边缘轮廓清晰,色彩丰富,符合人的观感。如果使用传统的快门控制方法,我们可以获得一张对于人来说感观良好的照片,但是此时的图片中梯度信息可能并不是最丰富的。而对于无论是基于特征点还是灰度信息的视觉SLAM系统来说,图像的梯度信息都是十分重要的。所以对于视觉SLAM系统来说,使用传统快门控制方法获得的照片往往不是一张最佳的照片。

ae

上图展示了其中一个户外拍摄时经常会发生的情况。左图使用摄像头自带的自动曝光程序所拍摄的图片,而右图为图像梯度最大时的图片。我们分别在这两张图上提取FAST Feature Keypoints,可以看到,两者能提取的关键点数目差距非常大。

在本文中,我们提出一种用于视觉SLAM的摄像头快门控制方法,它会使得照片中的梯度信息最大,方便后续的机器视觉任务。

Exposure Prediction

在曝光预测程序中,我们需要预测增大/减少快门时间时,图片的可能发生的变化。这里,我们通过模仿光圈的变化而对图片进行曝光预测。我们对于图片中每一个像素点\(I(x,y)\)进行一次\(f_{F-stop}(I(x,y),k)\)操作,定义如下:

\[\begin{align} f_{F-stop}(I(x,y),k) = I_{k}(x,y) &= \begin{cases} I(x,y)(\sqrt 2)^k, & I_{k}(x,y)<255 \newline 255, & otherwise \end{cases} \end{align}\]

在这里,\(k\)为光圈大小参数,\(f_{F-stop}\)函数模仿了摄像头的光圈值k发生改变时,图片灰度值发生的变化。

kvalue

由上图可以看出,当\(k\)为负数并且越小时,光圈值越小,曝光量越少,图片越暗;当\(k\)为正数并且越大时,光圈越大,曝光量越多,图片越亮(\(k=0\)时表示原图)。我们可以对原图\(I\)进行一系列的\(f_{F-stop}\)操作,模仿由于快门时间变化而对曝光量所造成变化。在我们的程序中,\(k\)值设置为-1, -0.5, 0, 0.5, 1。

Image Quality Metrics

参考Zhang1提出的方法,我们设定了图片质量评估函数\(Q(I)\),用于估计图片\(I\)的图片质量,当\(Q(I)\)的值越大时,我们认为图片的质量越好,图中可获取的特征点数量越多。

首先,给定一张图片\(I\),假定它的长为\(w\),宽度为\(h\)。我们首先计算图片中每一个像素\(I(x,y)\)的梯度向量大小:

\[\begin{align} g(x,y)=‖∇I(x,y)‖^2 \end{align}\]

然后我们对所有的\(g(x,y)\)从小到大进行排序,获得了一个经过排序后的梯度值集合\(G= \lbrace g(x,y) \rbrace\),并且\(G_i\)表示集合\(G\)中第\(i\)个数,\(i∈[0,s),s=w*h\)

我们定义图片\(I\)的梯度质量评估函数\(Q(I)\)为:

\[\begin{align} Q(I) = \sum\limits_{i \in [0,s)} {W_i}{G_i} \end{align}\]

其中,权重函数\(W_i\)定义为:

\[\begin{align} W_i &= \begin{cases} \frac{sin(πi/2ps)^k}{‖W‖}, & i<ps \newline \frac{sin(\frac{π(s-ps-i)}{2(s-ps)})^k}{‖W‖}, & i≥ps \end{cases} \end{align}\]

其中\(p \in (0,1]\)\(k\)均为控制参数,根据经验,我们一般设置为\(p=0.8\)\(k=5\)。权重函数\(W_i\)的作用在于压制过小/过大的梯度值,避免图片噪点等干扰。

在下面的实验中,我们在同一场景中,获取不同曝光时间的照片,并且计算各个图片的FAST关键点数目和质量评估值。可以看到,两者的极值位置基本一致。

iq iq iq

Exposure Control

经过了曝光预测步骤后,我们获得一系列不同\(k\)值的图片\(I_k\),然后我们对于每一张\(I_k\)计算对应图片质量值\(Q(I_k)\),并且获得\(Q(I_k)\)值最大时对应的\(k\),定义为\(k'\)。然后我们根据下式计算新的快门速度\(∆t_{next}\)

\[\begin{align} ∆t_{next} &= ∆t(1+ck') \end{align}\]

其中\(∆t\)为当前的摄像头快门速度,\(c \in (0,1]\)为控制参数,我们一般设置为\(c=0.2\)

当图像过暗时,\(∆t_{next}\)的值会变大;当图像过亮时,\(∆t_{next}\)的值会变小;但图片质量最好时,\(k'\)的值为0,\(∆t_{next}\)保持不变。对于同一个场景,无论起始快门速度为何值,经过上述方法不断迭代后,最终会稳定于一个快门值,获得一张质量较好的图片。

Initialization Strategy

通过上述步骤可知,无论快门初始速度如何,对于同一个场景,主动快门控方法最终会令快门速度值稳定于一个最优值。但当快门初始速度与最优值相差太远时,需要较长的迭代时间才能达到。所以,为了减少第一次运行程序时的迭代时间,这里,我们首先根据一组给定的快门时间\(T= \lbrace ∆t_{i};i=1…n \rbrace\),拍摄一系列照片\(I_{∆t_i}\),图片质量值\(Q(I_{∆t_i })\)。我们选取\(Q(I_{∆t_i })\)中的最大值时所对应的\(∆t_i\)为快门的初始值。这样做的好处是主动快门控方法能够以一个比较快的时间使得快门时间达到最优值。根据经验,我们一般将\(T\)设置为\(T= \lbrace 1,5,10,100 \rbrace\),单位为毫秒。

Validation

我们对同一个场景分别使用摄像头自带的自动曝光程序2,Shim's method3,Zhang's method4,和我们提出的方法控制摄像机快门进行拍摄,然后在图片上提取FAST关键点,通过关键的数目评价各种快门控制程序。

aec_experment1
aec_experment2
aec_experment3
aec_experment4
aec_experment5
aec_experment6

通过对比实验可以看出,我们提出的方法能够获得梯度信息最大的图片。


  1. Zhang, Zichao, Christian Forster, and Davide Scaramuzza. "Active exposure control for robust visual odometry in HDR environments." Robotics and Automation (ICRA), 2017 IEEE International Conference on. IEEE, 2017.↩︎

  2. https://www.ptgrey.com/↩︎

  3. Shim, Inwook, Joon-Young Lee, and In So Kweon. "Auto-adjusting camera exposure for outdoor robotics using gradient information." Intelligent Robots and Systems (IROS 2014), 2014 IEEE/RSJ International Conference on. IEEE, 2014.↩︎

  4. Zhang, Zichao, Christian Forster, and Davide Scaramuzza. "Active exposure control for robust visual odometry in HDR environments." Robotics and Automation (ICRA), 2017 IEEE International Conference on. IEEE, 2017.↩︎

新电脑为Thinkpad T470p(自带940mx显卡),为SLAM系统开发配置环境,使用MYNT EYE Camera。

Ubuntu 16.04

系统安装

官网下载Ubuntu16.04系统ISO镜像。 使用Rufus创建启动盘。 rufus

安装系统。

换源
1
2
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
sudo gedit /etc/apt/sources.list

填入:

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse

终端:

1
2
sudo apt-get update
sudo apt-get upgrade
1
sudo apt-get install build-essential vim

安装NVIDIA驱动

查看Linux内核版本:

1
2
uname -r
4.13.0-36-generic

本来想安装CUDA 9.1,但它自带的387.26驱动不支持当前的内核版本(4.13),如果降低内核版本(4.4),则会导致很多其他的硬件驱动问题。

所以使用APT安装1

1
2
3
4
5
sudo apt-get remove --purge nvidia*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FCAE110B1118213C
sudo apt-get update
sudo apt-get install nvidia-396
测试

重启电脑,终端执行:

1
ls /dev/nvidia*

应出现如:

1
/dev/nvidia0  /dev/nvidiactl  /dev/nvidia-modeset /dev/nvidia-uvm

如出现"/dev/nvidia*: No such file or directory"错误,按这里提示修复。

终端执行:

1
2
3
4
cat /proc/driver/nvidia/version

NVRM version: NVIDIA UNIX x86_64 Kernel Module 396.24 Thu Apr 26 00:10:09 PDT 2018
GCC version: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)

安装CUDA 9.1

官网下载CUDA cuda_9.1.85_387.26_linux.run。

1
2
chmod +x cuda_9.1.85_387.26_linux.run
sudo sh ./cuda_9.1.85_387.26_linux.run

只安装CUDA 9.1 Toolkit。

重启,配置环境:

1
sudo gedit ~/.bashrc

添加:

1
2
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

刷新:

1
source /etc/profile

重启:

1
2
3
4
5
6
nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85

Building Samples (optional)

1
2
3
4
cd <sample_dir>
make

./1_Utilities/deviceQuery/deviceQuery
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce 940MX"
CUDA Driver Version / Runtime Version 9.2 / 9.1
CUDA Capability Major/Minor version number: 5.0
Total amount of global memory: 2004 MBytes (2101870592 bytes)
( 3) Multiprocessors, (128) CUDA Cores/MP: 384 CUDA Cores
GPU Max Clock rate: 1189 MHz (1.19 GHz)
Memory Clock rate: 2505 Mhz
Memory Bus Width: 64-bit
L2 Cache Size: 1048576 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Supports Cooperative Kernel Launch: No
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID: 0 / 2 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.2, CUDA Runtime Version = 9.1, NumDevs = 1

安装OpenCV 3.4.0

官网下载sources。

1
2
3
4
5
6
7
8
9
10
sudo apt-get install build-essential git cmake git yasm libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev python-dev python-numpy python-tk libtbb2 libtbb-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libdc1394-22-dev libswscale-dev libopenexr-dev libeigen2-dev libeigen3-dev libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_EXAMPLES=OFF -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D WITH_GTK_2_X=ON ..
make -j8
sudo make install

sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig

安装 ROS Kinetic2

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full

sudo rosdep init
rosdep update

echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

sudo apt-get install python-rosinstall

echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc之后,系统的opencv版本会变成Kinetic自带的3.3版本,所以必要时不要添加此句。

配置MYNT EYE Camera

下载mynteye-1.8-linux-x64-gcc5-opencv-3.4.0.tar.gz

1
2
3
4
5
sudo apt-get install libssl-dev libv4l-dev v4l-utils

cd <sdk directory>
sudo ./install.sh
source ~/.bashrc

重启电脑。

测试
1
2
3
echo $MYNTEYE_SDK_ROOT

/home/cvte/Documents/software/mynteye-1.8-linux-x64-gcc5-opencv-3.4.0
1
./samples/bin/camera [name id]

  1. https://blog.csdn.net/soulmeetliang/article/details/78429197↩︎

  2. http://wiki.ros.org/kinetic/Installation/Ubuntu↩︎

选择 Scheme

在主题_config.yml文件中修改scheme: Pisces的值。

菜单设置

在主题_config.yml文件中修改:

1
2
3
4
5
6
menu:
home: /
categories: /categories
archives: /archives
tags: /tags
about: /about

代码高亮

在网站_config.yml文件中,设置auto_detect: true

开启第三方评论

disqus注册一个账号,并且Set up disqus on a new site。这时需要Choose your unique Disqus URL,记下你填下的disqus_shortname,在网站_config.yml文件中添加:

1
disqus_shortname: your-disqus-shortname

如需取消某个页面的评论,在md文件的front-matter中增加[^7]:

1
comments: false

社交信息

网站_config.yml文件中添加:

1
2
3
4
5
6
7
since: 2016
social:
github: https://github.com/HanjieLuo
# twitter: https://twitter.com/your-user-name
# weibo: http://weibo.com/your-user-name
# douban: http://douban.com/people/your-user-name
# zhihu: http://www.zhihu.com/people/your-user-name

自定义字体

编辑主题的 source/css/_variables/custom.styl文件,新增变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$font-family-headings = Baskerville, Georgia, "Liberation Serif", "Kaiti SC", STKaiti, "AR PL UKai CN", "AR PL UKai HK", "AR PL UKai TW", "AR PL UKai TW MBE", "AR PL KaitiM GB", KaiTi, KaiTi_GB2312, "TW\-Kai", Lato, "PingFang SC", "Microsoft YaHei", sans-serif, "Times New Roman", serif; // 标题,修改成你期望的字体族

$font-family-base = askerville, Georgia, "Liberation Serif", "Kaiti SC", STKaiti, "AR PL UKai CN", "AR PL UKai HK", "AR PL UKai TW", "AR PL UKai TW MBE", "AR PL KaitiM GB", KaiTi, KaiTi_GB2312, "TW\-Kai", Lato, "PingFang SC", "Microsoft YaHei", sans-serif; // 修改成你期望的字体族

$code-font-family = "Input Mono", "PT Mono", Consolas, Monaco, Menlo, monospace // 代码字体

// Font size
$font-size-base = 16px // 正文字体的大小
$font-size-small = $font-size-base - 2px
$font-size-smaller = $font-size-base - 4px
$font-size-large = $font-size-base + 4px

// Headings font size
$font-size-headings-base = 28px
$font-size-headings-step = 2px

$code-font-size = 13px // 代码字体的大小

其他的可参看base.styl文件。

将侧边栏头像修改为圆形1

修改_sidebar.styl,增加两段程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.site-author-image {
display: block;
margin: 0 auto;
max-width: 96px;
height: auto;
padding: 2px;
border-width: 1px;
border-color: $gainsboro;

/* start*/
border-radius: 50%
webkit-transition: 1.4s all;
moz-transition: 1.4s all;
ms-transition: 1.4s all;
transition: 1.4s all;
/* end */
}


  1. http://fancyluo.com/2015/09/18/2015-09-18-hexo-next-update/↩︎

0%