C语言中OpenCV怎样实现柱面投影
生活随笔
收集整理的這篇文章主要介紹了
C语言中OpenCV怎样实现柱面投影
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C語言中OpenCV怎樣實(shí)現(xiàn)柱面投影,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
前言
在做全景拼接的時(shí)候,為了保持圖片中的空間約束與視覺的一致性,需要進(jìn)行柱面投影,否則離中心圖像距離越遠(yuǎn)的圖像拼接后變形越大。
柱面投影公式為
實(shí)現(xiàn)代碼
針對(duì)彩色圖像
intmain()
{
cv::Matimage1=cv::imread("images/1.jpg",1);
if(!image1.data)
return0;
imshow("image1",image1);
MatimgOut=Mat(image1.rows,image1.cols,CV_8UC3);
floatw=image1.cols;
floath=image1.rows;
floatf=(w/2)/atan(PI/8);
for(inti=0;i<image1.rows;i++)
{
for(intj=0;j<image1.cols;j++)
{
floatx=j;
floaty=i;
floatx1=f*atan((x-w/2)/f)+f*atan(w/(2.0f*f));
floaty1=f*(y-h/2.0f)/sqrt((x-w/2.0f)*(x-w/2.0f)+f*f)+h/2.0f;
intcol=(int)(x1+0.5f);//加0.5是為了四舍五入
introw=(int)(y1+0.5f);//加0.5是為了四舍五入
if(col<image1.cols&&row<image1.rows)
{
imgOut.at<Vec3b>(row,col)[0]=image1.at<Vec3b>(i,j)[0];
imgOut.at<Vec3b>(row,col)[1]=image1.at<Vec3b>(i,j)[1];
imgOut.at<Vec3b>(row,col)[2]=image1.at<Vec3b>(i,j)[2];
}
}
}
imshow("imgOut",imgOut);
waitKey(0);
return0;
}
實(shí)現(xiàn)效果
針對(duì)灰度圖像
cv::Matimage1=cv::imread("E:\\zcb_work\\2113\\pic2\\k.jpg",0);
if(!image1.data)
return0;
imshow("image1",image1);
cv::Matimage2=cv::imread("E:\\zcb_work\\2113\\pic2\\j.jpg",0);
if(!image2.data)
return0;
imshow("image2",image2);
MatimgOut1=Mat(image1.rows,image1.cols,CV_8UC1);
imgOut1.setTo(0);
MatimgOut2=Mat(image2.rows,image2.cols,CV_8UC1);
imgOut2.setTo(0);
floatw=image1.cols;
floath=image1.rows;
floatf=(w/2)/atan(PI/8);
for(inti=0;i<image1.rows;i++)
{
for(intj=0;j<image1.cols;j++)
{
floatx=j;
floaty=i;
floatx1=f*atan((x-w/2)/f)+f*atan(w/(2.0f*f));
floaty1=f*(y-h/2.0f)/sqrt((x-w/2.0f)*(x-w/2.0f)+f*f)+h/2.0f;
intcol=(int)(x1+0.5f);//加0.5是為了四舍五入
introw=(int)(y1+0.5f);//加0.5是為了四舍五入
if(col<image1.cols&&row<image1.rows)
{
imgOut1.at<uchar>(row,col)=image1.at<uchar>(i,j);
imgOut2.at<uchar>(row,col)=image2.at<uchar>(i,j);
//imgOut.at<Vec3b>(row,col)[1]=image1.at<Vec3b>(i,j)[1];
//imgOut.at<Vec3b>(row,col)[2]=image1.at<Vec3b>(i,j)[2];
}
}
}
imshow("imgOut1",imgOut1);
imshow("imgOut2",imgOut2);
實(shí)現(xiàn)效果
原圖
柱面投影
用surf算法,特征檢測(cè),
合成這樣,呵呵呵,
總結(jié)
以上是生活随笔為你收集整理的C语言中OpenCV怎样实现柱面投影的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux服务器上装R语言,R语言 在l
- 下一篇: linux usb 升级脚本,linux