首页 > 代码库 > 利用视差图合成新视点
利用视差图合成新视点
利用视差图合成新视点,视差图一般通过图像匹配获取,以middlebury上的一张图为例,左边为原图(左图像),右边为对应视差图。
简单的利用视差图进行视点合成,取每一个像素点处的视差值,然后计算新图像中像素点位置,然后赋值。前向映射,单点赋值代码如下。配置完Opencv可以直接跑,设置的生成50张新视点图像
1 #include <iostream> 2 #include <string> 3 #include <opencv.hpp> 4 5 using namespace std; 6 using namespace cv; 7 8 int index(int m, int n) 9 { 10 if (m>=0 && m<n) 11 return m; 12 else if (m<0) 13 return 0; 14 else if (m>=n) 15 return n-1; 16 } 17 18 void main() 19 { 20 string imgPath="data/source_images/teddy/"; 21 Mat srcImgL=imread(imgPath+"imgL.png"); 22 Mat dispL=imread(imgPath+"dispL.png"); 23 dispL=dispL/4; 24 25 int imgHeight=srcImgL.rows; 26 int imgWidth=srcImgL.cols; 27 28 Mat dstImgL=Mat::zeros(imgHeight,imgWidth, CV_8UC3); 29 30 uchar* pImgDataL=(uchar*)srcImgL.data; 31 uchar* pDispDataL=(uchar*)dispL.data; 32 uchar* pDstDataL=(uchar*)dstImgL.data; 33 34 for (int k=0; k<50; k++) 35 { 36 float interp=(float)k/50; 37 for (int j=0; j<imgHeight; j++) 38 { 39 for (int i=0; i<imgWidth; i++) 40 { 41 uchar dispL=pDispDataL[j*imgWidth+i]; 42 43 float offsetL=dispL* interp; 44 int idL=(int)(i-offsetL); 45 46 idL=index(idL, imgWidth); 47 //插值结果 48 pDstDataL[j*imgWidth*3+idL*3+0]=pImgDataL[j*imgWidth*3+i*3+0]; 49 pDstDataL[j*imgWidth*3+idL*3+1]=pImgDataL[j*imgWidth*3+i*3+1]; 50 pDstDataL[j*imgWidth*3+idL*3+2]=pImgDataL[j*imgWidth*3+i*3+2]; 51 } 52 } 53 namedWindow("show"); 54 imshow("show", dstImgL); 55 waitKey(100); 56 } 57 58 }
边缘有锯齿,随后找时间加上反向映射以及双线性插值的版本。
利用视差图合成新视点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。