在做全景拼接的时候,为了保持图片中的空间约束与视觉的一致性,需要进行柱面投影,否则离中心图像距离越远的图像拼接后变形越大。本文将具体介绍一下这如何实现,需要的可以参考一下
目录
前言实现代码针对彩色图像针对灰度图像
前言
在做全景拼接的时候,为了保持图片中的空间约束与视觉的一致性,需要进行柱面投影,否则离中心图像距离越远的图像拼接后变形越大。
柱面投影公式为
实现代码
针对彩色图像
int main()
{
cv:mat image 1=cv:im read(' images/1。jpg ',1);
如果(!图片1 .日期)
返回0;
imshow('第一帧,第一帧);
imgOut=Mat(第一帧,第一帧,第一帧,第8帧,第3帧):
浮点w=第一帧。关口
浮点h=影格1 .行
浮点f=(w/2)/atan(pi/8);
for(int I=0);我第一行;(一)
{
for(int j=0);j图片1 .科尔(j)
{
浮点x=j;
浮点y=I;
浮点x1=f * atan((x-w/2)/f)f * atan(w/(2.0f * f));
浮点1=f *(y-h/2.0f)/sqrt(x-w/2.0f)*(x-w/2.0f * f)h/2.0f;
int col=(int)(x1 0.5f)://加0.5版是为了四舍五入
int row=(int)(y 1 0.5 f);//加0.5版是为了四舍五入
如果(列图像1。列行图像1。行)
{
imgOut.atVec3b(row,col)[0]=第一帧。atVec3b(i,j)[0];
imgOut.atVec3b(row,col)[1]=第一帧。atVec3b(i,j)[1];
imgOut.atVec3b(row,col)[2]=第一帧。atVec3b(i,j)[2];
}
}
}
im show(' im out ',im out);
等待键(0);
返回0;
}
实现效果
针对灰度图像
cv:mat image 1=cv:im read(' e:\ \ zcb _ work \ \ 2113 \ \ pic 2 \ \ k . jpg ',0);
如果(!图片1 .日期)
返回0;
imshow('第一帧,第一帧);
cv:mat image 2=cv:im read(' e:\ \ zcb _ work \ \ 2113 \ \ pic 2 \ \ j . jpg ',0);
如果(!图片2 .日期)
返回0;
imshow('第2帧,第2帧);
imgOut1=Mat(第一帧,第一帧,第一帧,第8帧,第一帧):
img输出1。sepo(0);
imgOut2=Mat(第2帧。行数、第2帧。cols、CV_8UC1):
img out 2。sepo(0);
浮点w=第一帧。关口
浮点h=影格1 .行
浮点f=(w/2)/atan(pi/8);
for(int I=0);我第一行;(一)
{
for(int j=0);j图片1 .科尔(j)
{
浮点x=j;
浮点y=I;
浮点x1=f * atan((x-w/2)/f)f * atan(w/(2.0f * f));
浮点1=f *(y-h/2.0f)/sqrt(x-w/2.0f)*(x-w/2.0f * f)h/2.0f;
int col=(int)(x1 0.5f)://加0.5版是为了四舍五入
int row=(int)(y 1 0.5 f);//加0.5版是为了四舍五入
如果(列图像1。列行图像1。行)
{
imgOut1.atuchar(row,col)=image1.atuchar(i,j);
imgOut2.atuchar(row,col)=image2.atuchar(i,j);
//imgOut.atVec3b(row,col)[1]=image1.atVec3b(i,j)[1];
//imgOut.atVec3b(row,col)[2]=image1.atVec3b(i,j)[2];
}
}
}
imshow('imgOut1 ',img out 1);
imshow('imgOut2 ',img out 2);
实现效果
原图
柱面投影
用冲浪吗算法,特征检测,
合成这样,呵呵呵,
以上就是c。非政府组织语言OpenCV(开放简历)实现柱面投影的详细内容,更多关于c。非政府组织语言OpenCV(开放简历)柱面投影的资料请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。