没有合适的资源?快使用搜索试试~ 我知道了~
1. 尺度空间极值检测:搜索所有尺度上的图像位置 2. 关键点定位:在每个候选位置上,通过一个拟合精细的模型来确定位置和尺度 3. 方向确定:基于图像局部梯度方
资源详情
资源评论
资源推荐
计算机视觉实验报告
16340220 王培钰 电子政务
编译运行:
运行环境:
Ubuntu 18
链接库:
VLFeat && CImg
编译命令:
g++ -o test main.cpp ImageStitching.cpp ImageStitching.h -lpthread -l X11 -Lglnxa64/ -lvl -O3 -
std=c++11
(linux下编译比较简单,只需将CImg.h文件和用到的vl库放在同目录下,但是要将libvl.so添加到usr下的动态链接
库内)
读入图像:
将目录下的多张图片读入,运用了linux环境下提取目录文件的一个目录指针,然后图片存在了CImgList中
柱面投影:
struct dirent *ptr;
DIR *dir;
dir = opendir("TEST-ImageData1");
while ((ptr = readdir(dir)) != NULL) {
if(ptr->d_name[0] == '.')
continue;
string file = string("TEST-ImageData1/") + string(ptr->d_name);
cout << file << endl;
const char *Ff = file.c_str();
CImg<float> picture;
picture.load(Ff);
imgs.push_back(picture);
}
在全景图像中,由于摄像头的朝向不同,重合部分部分图像不一定满足视觉一致性的要求,因此先对图像进行投
影,使其满足要求,以为后面的拼接做准备。在环形全景中,一般选择柱面投影算法,将图像分别投影到以 像素焦
距+摄像头与圆心距离 为半径的圆柱上。投影后的图像为上图摄像头前方的圆弧。从圆弧上看,图像的重合部分已
经满足视觉一致性的要求 。
圆柱面坐标转换的公式为:
可以注意到把x和y写在了等式的左边而x',y'写在了右边,这样做是为了方便进行插值计算 。投影后的图像点坐标未
必为整数,而图像的坐标需要为整数,所以必将造成误差 。为了减少这种误差,我们对坐标点进行双线性插值。
其中半径R的值: R = W / (2*tan(α/2)),α的取值一般为相机视场角度。
CImg<float> ImageStitching::CylindricalProjection(CImg<float> pic) {
int width = pic._width;
int height = pic._height;
int channel = pic._spectrum;
CImg<float> result(width, height, 1, channel, 0);
float R = width / (2*tan(28.0f/2.0f*PI/180.0f));
for (int x = 0; x < width; x++) {
将图像由RGB空间转为灰度空间:
这一步是为了下面的sift算法做铺垫:
SIFT算法查找特征点
SIFT算法的实质是在不同尺度空间上查找关键点(特征点),并计算关键点方向。SIFT所查找的关键点是一些十分突
出,不会因光照,仿射变换和噪音等因素而变化的点,例如角点、边缘点、暗区的亮点以及亮区的暗点。
算法主要分为以下四步:
1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴
趣点。
2. 关键点定位:在每个候选位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据它们的稳
定程度。
3. 方向确定:基于图像局部梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作
都相对于关键点的方向,尺度和位置进行变换。
for (int y = 0; y < height; y++) {
float x0 = x - (float)(width / 2);
float y0 = y - (float) (height/2);
float _x = x0*sqrt(R*R + x0*x0) / R + (float) width / 2;
float _y = y0*sqrt(R*R + x0*x0) / R + (float) height / 2;
if (_x >= 0 && _x < width && _y >=0 && _y <= height) {
for (int c = 0; c < channel; c++) {
result(x,y,c) = Interpolation(pic,_x,_y,c);
}
}
}
}
return result;
}
CImg<float> ImageStitching::convertTogray(CImg<float> pic) {
CImg<float> picture(pic._width, pic._height, 1,1,0);
cimg_forXY(pic,x,y) {
float R = pic(x,y,0);
float G = pic(x,y,1);
float B = pic(x,y,2);
picture(x,y) = R*0.299 + G*0.587 + B*0.114;
}
return picture;
}
剩余13页未读,继续阅读
内酷少女
- 粉丝: 16
- 资源: 302
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0