二、计算机视觉(100分)
1.(20分)(特征点匹配)给定两幅图像
A
A
A和
B
B
B,要求对两幅图中的特征点
x
i
,
i
=
1
,
.
.
,
m
,
x_i, i=1,..,m,
xi,i=1,..,m,和
x
i
′
,
j
=
1
,
.
.
,
n
x_i',j=1,..,n
xi′,j=1,..,n进行匹配。特征点的结构为:{
x
,
y
x,y
x,y坐标,128 位描述子},即
x
=
{
i
n
t
x
,
i
n
t
y
,
f
l
o
a
t
d
e
s
c
[
128
]
}
x=\{int\,x,int\,y,float \hspace{2pt} desc[128]\}
x={intx,inty,floatdesc[128]}.假设两幅图中所有特征点已经找出,并按照从左到右、从上到下的扫描顺序排序;一对特征点
x
i
,
x
j
′
x_i,x_j'
xi,xj′的差异由距离函数
F
(
x
i
,
x
j
′
)
F(x_i,x_j')
F(xi,xj′)定义,如果
F
(
x
i
,
x
k
(
i
)
′
)
≤
F
(
x
i
,
x
j
′
)
,
∀
j
∈
[
1
,
n
]
,
F(x_i,x_{k(i)}')\leq F(x_i,x_j'),\forall j\in[1,n],
F(xi,xk(i)′)≤F(xi,xj′),∀j∈[1,n],则
x
i
x_i
xi与
x
k
(
i
)
′
x_{k(i)}'
xk(i)′称为是一对特征点匹配对,记作
(
x
i
↔
x
k
(
i
)
′
)
.
(x_i\leftrightarrow x_{k(i)}').
(xi↔xk(i)′).试写出特征点匹配的算法(写出伪码即可),并分析时间复杂度(不考虑函数
F
F
F的开销)。
算法输入:按扫描顺序排序的特征点序列
x
i
,
i
=
1
,
.
.
.
,
m
x_i,i=1,...,m \hspace{4pt}
xi,i=1,...,m和
x
j
′
,
j
=
1
,
.
.
.
,
n
.
x_j',j=1,...,n.
xj′,j=1,...,n.
算法输出:所有特征点匹配对
(
x
i
↔
x
k
(
i
)
′
)
,
i
=
1
,
2
,
.
.
.
,
m
.
(x_i\leftrightarrow x_{k(i)}'),i=1,2,...,m.
(xi↔xk(i)′),i=1,2,...,m.
数据结构定义(不可更改):
typedef struct _feature{
int x;
int y;
float desc[128];
}feature;
函数声明:
C++:void featureMatch(vector<feature> x,vector<feature> xprime, vector<int>
void featureMatch(vector<feature> x, vector<feature> xprime, vector<int>& k) {
int m = x.size();
int n = xprime.size();
k.resize(m);
for (int i = 0; i < m; i++) {
int best_k = 1; // Initialize the best match index
float best_distance = distance(x[i], xprime[1]);
for (int j = 2; j <= n; j++) {
float current_distance = distance(x[i], xprime[j]);
if (current_distance < best_distance) {
best_k = j;
best_distance = current_distance;
}
}
k[i] = best_k; // Store the best match index for xi
}
}
特征点匹配的时间复杂度为 O ( m × n ) O(m\times n) O(m×n)
2.(20分)(图像矫正)试着设计一种算法可以将图
A
\textnormal A
A矫正成图
B
\textnormal B
B。
A,B
\textnormal{A,B}
A,B图的大小相同,宽高都为
w
,
h
.
w,h.
w,h.其中
A
\textnormal A
A图中的
A
1
,
A
2
,
A
3
,
A
4
A_1,A_2,A_3,A_4
A1,A2,A3,A4的坐标已知,分别为
A
i
=
(
x
i
,
y
i
)
,
i
=
1
,
.
.
.
,
4
,
A_i=(x_i,y_i),i=1,...,4,
Ai=(xi,yi),i=1,...,4,且对应
B
\textnormal B
B图中的四个角。并分析算法的优缺点。
要实现图像矫正的算法,将图A矫正成图B,可以按照以下步骤进行:
- 计算旋转角度:通过已知的点 A 1 , A 2 , A 3 , A 4 A_1, A_2, A_3, A_4 A1,A2,A3,A4的坐标,可以计算出图A相对于图B需要旋转的角度。可以通过计算两个向量的夹角来得到旋转角度。
- 旋转图像:使用计算得到的旋转角度,对图A进行逆时针旋转,使其与图B的对应角点对齐。
- 扩展图像:将旋转后的图A进行扩展,使其尺寸与图B相同。可以通过插值方法来填充新像素值,例如双线性插值。
伪代码:
function imageCorrection(imageA, A1, A2, A3, A4, imageB):
// 计算旋转角度
angle = calculateRotationAngle(A1, A2, A3, A4)
// 旋转图像
rotatedImageA = rotateImage(imageA, -angle) // 逆时针旋转
// 扩展图像
correctedImageA = expandImage(rotatedImageA, imageB.width, imageB.height)
return correctedImageA
优缺点:
优点:
- 算法基于已知的四个角点坐标,不需要复杂的特征点匹配。
- 通过计算旋转角度和扩展图像,可以相对精确地将图A矫正成图B。
缺点:
- 如果角点坐标的测量存在误差,可能会导致矫正不准确。
- 对于较大的旋转角度或者图像形状较复杂的情况,可能需要额外的处理步骤来保持图像质量。
- 算法对于图像中可能存在的噪声和畸变不够鲁棒,可能需要进一步的优化和处理。
3.(40分)(立体视觉)考虑一个典型的立体视觉系统,如下图所示。其中
C
,
C
′
C,C'
C,C′分别为两个相机的中心,称为光心;
e
,
e
′
e,e'
e,e′分别为光心
C
′
,
C
C',C
C′,C在另一个相机中的投影,称为对极点;X为三维空间中的一个点,其在两个相机的投影分别为
x
,
x
′
;
x,x';
x,x′;
l
′
\ l'
l′为
e
′
,
x
′
e',x'
e′,x′的连线,称为点
x
x
x对应的极线;连线
C
C
′
CC'
CC′称为基线。显然,上面所提到的所有点都共面,这个平面称为极平面。
用齐次坐标表示法来表示点和线(即在真实坐标后面加上一维1,例如二维坐标系
(
x
,
y
)
(x,y)
(x,y)的齐次坐标表示是
(
x
,
y
,
1
)
,
(x,y,1),
(x,y,1),三维坐标
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)的齐次坐标表示是
(
x
,
y
,
z
,
1
)
(x,y,z,1)
(x,y,z,1)。三维点
X
X
X投影到图像上的二维点可以由公式
P
X
=
x
,
P
′
X
=
x
′
PX=x,P'X=x'
PX=x,P′X=x′表示,其中
P
,
P
′
P,P'
P,P′称为投影矩阵
(
3
×
4
)
(3\times4)
(3×4)。投影矩阵是不可逆的,因为所有射线
CX
\textnormal{CX}
CX上的点都投影到图像上的相同点
x
x
x,但可以求出他的伪逆
P
+
P^+
P+,并表达出射线
CX
:
f
(
λ
)
=
P
+
x
+
λ
C
.
\textnormal{CX}:f(\lambda)=P^+x+\lambda C.
CX:f(λ)=P+x+λC.伪逆满足:
P
P
+
=
I
.
PP^+=I.
PP+=I.点
x
x
x在直线
l
l
l上可以表示为
x
⋅
l
=
x
T
l
=
0.
\mathbf{x}\cdot l=x^T\mathbf{l}=0.
x⋅l=xTl=0.两点
x
1
,
x
2
x_1,x_2
x1,x2所在的直线
l
l
l可以由他们的叉乘表示:
l
=
x
1
×
x
2
=
[
x
1
]
×
x
2
,
l=x_1\times x_2=[x_1]_{\times}x_2,
l=x1×x2=[x1]×x2,其中
[
⋅
]
×
[\cdot]_{\times}
[⋅]×为反对称运算符:
[
x
]
x
=
[
0
−
x
3
x
2
x
3
0
−
x
1
−
x
2
x
1
0
]
.
[x]_x=\begin{bmatrix} 0 & -x_3 & x_2\\ x_3& 0& -x_1\\ -x_2&x_1&0 \end{bmatrix}.
[x]x=
0x3−x2−x30x1x2−x10
.
1)(15分)试证明点
x
,
x
′
x,x'
x,x′满足:
x
′
T
F
x
=
0
x'^TFx=0
x′TFx=0。给出
F
F
F的表达式,并说明它的秩是多少。
[略]
2)(25分)假设已知两幅视图中的n组匹配点对
x
i
,
x
i
′
,
i
=
1
,
.
.
.
,
n
,
x_i,x_i',i=1,...,n,
xi,xi′,i=1,...,n,试设计算法求出F.说明n最小为多少才能求得一个有效的F.
[略]
4.(20分)请描述你认为最重要的3个图像或视觉技术在消费类小型无人机领域的应用,并请简要说明原因以及你所能够想到的可能解决方案。
在消费类小型无人机领域,以下是三个重要的图像或视觉技术以及它们的应用和可能的解决方案:
-
目标检测与跟踪:
- 应用: 小型无人机常常需要识别和跟踪特定的目标,如人、车辆、动物等。这在监控、搜救、农业等领域有重要应用。
- 原因: 目标检测和跟踪技术可以让无人机自动识别感兴趣的目标,并跟随它们,从而提供实时信息和数据。这种自动化可以提高效率,减轻操作员负担。
- 解决方案: 使用深度学习的目标检测模型,如YOLO(You Only Look Once)或Faster R-CNN,可以实现实时的目标检测。通过将这些模型与无人机的视觉系统集成,可以实现目标的自动识别和跟踪。
-
视觉导航与避障:
- 应用: 小型无人机需要在复杂的环境中进行导航和避障,以确保安全飞行和任务完成。
- 原因: 视觉导航和避障技术可以使无人机能够感知周围环境并作出实时决策,以避免障碍物并找到安全路径。
- 解决方案: 使用深度学习和计算机视觉技术,无人机可以通过摄像头捕捉环境信息,并使用实时的图像处理和数据分析来实现避障。例如,结合视觉SLAM(Simultaneous Localization and Mapping)技术,可以实现无人机的定位和环境建模,从而实现更精确的导航。
-
图像拼接与建模:
- 应用: 小型无人机可以用于拍摄航拍照片,这在旅游、房地产、城市规划等领域有广泛应用。图像拼接技术可以将多张照片拼接成完整的全景图像,图像建模则可以生成三维模型。
- 原因: 图像拼接和建模技术可以让无人机从不同角度捕捉到更大范围的场景,提供更全面的信息,满足不同领域的需求。
- 解决方案: 采用图像拼接算法,如SIFT(Scale-Invariant Feature Transform)或ORB(Oriented FAST and Rotated BRIEF),可以在图像上找到关键点,并将多张照片拼接成全景图像。对于图像建模,可以使用结构光、立体视觉等方法来获得深度信息,并生成三维模型。
这三个技术在消费类小型无人机领域的应用,能够提升无人机的自主性、导航能力和数据采集效率,使其在各种领域发挥更大的作用。