日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

C语言中OpenCV怎样实现柱面投影

發(fā)布時(shí)間:2023/12/19 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。