C语言 OpenCV实现柱面投影

 更新时间:2021年12月25日 15:27:42   作者:rjszcb  
在做全景拼接的时候,为了保持图片中的空间约束与视觉的一致性,需要进行柱面投影,否则离中心图像距离越远的图像拼接后变形越大。本文将具体介绍一下这如何实现,需要的可以参考一下

前言

在做全景拼接的时候,为了保持图片中的空间约束与视觉的一致性,需要进行柱面投影,否则离中心图像距离越远的图像拼接后变形越大。

柱面投影公式为

实现代码

针对彩色图像

int main()
{
	cv::Mat image1 = cv::imread("images/1.jpg", 1);
	if (!image1.data)
		return 0;
	imshow("image1", image1);
 
	Mat imgOut = Mat(image1.rows, image1.cols, CV_8UC3);
	float w = image1.cols;
	float h = image1.rows;
	float f = (w / 2) / atan(PI / 8);
 
	for (int i = 0; i < image1.rows; i++)
	{
		for (int j = 0; j < image1.cols; j++)
		{
			float x = j;
			float y = i;
			float x1 = f * atan((x - w / 2) / f) + f * atan(w / (2.0f * f));
			float y1 = f * (y - h / 2.0f) / sqrt((x - w / 2.0f) * (x - w / 2.0f) + f * f) + h / 2.0f;
 
			int col = (int)(x1 + 0.5f);//加0.5是为了四舍五入
			int row = (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);
	return 0;
}

实现效果

针对灰度图像

cv::Mat image1 = cv::imread("E:\\zcb_work\\2113\\pic2\\k.jpg", 0);
	if (!image1.data)
		return 0;
	imshow("image1", image1);

	cv::Mat image2 = cv::imread("E:\\zcb_work\\2113\\pic2\\j.jpg", 0);
	if (!image2.data)
		return 0;
	imshow("image2", image2);

 	Mat imgOut1 = Mat(image1.rows, image1.cols, CV_8UC1);
	imgOut1.setTo(0);
	Mat imgOut2 = Mat(image2.rows, image2.cols, CV_8UC1);
	imgOut2.setTo(0);
	
	float w = image1.cols;
	float h = image1.rows;
	float f = (w / 2) / atan(PI / 8);
 
	for (int i = 0; i < image1.rows; i++)
	{
		for (int j = 0; j < image1.cols; j++)
		{
			float x = j;
			float y = i;
			float x1 = f * atan((x - w / 2) / f) + f * atan(w / (2.0f * f));
			float y1 = f * (y - h / 2.0f) / sqrt((x - w / 2.0f) * (x - w / 2.0f) + f * f) + h / 2.0f;
 
			int col = (int)(x1 + 0.5f);//加0.5是为了四舍五入
			int row = (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);

实现效果

原图

柱面投影

用surf算法,特征检测,

合成这样,呵呵呵,

 

以上就是C语言 OpenCV实现柱面投影的详细内容,更多关于C语言 OpenCV柱面投影的资料请关注脚本之家其它相关文章!

相关文章

  • C++实现LeetCode(174.地牢游戏)

    C++实现LeetCode(174.地牢游戏)

    这篇文章主要介绍了C++实现LeetCode(174.地牢游戏),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c++深入浅出讲解堆排序和堆

    c++深入浅出讲解堆排序和堆

    在c++里有很多排序方法,比如相对简单的冒泡排序、选择排序、插入排序,还有 STL里的sort函数  手写快排  归并排序等,还有就是堆排序,这次主要说堆排序和堆
    2022-03-03
  • C++实现特殊矩阵的压缩存储算法

    C++实现特殊矩阵的压缩存储算法

    在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定的规律,称这类型的矩阵为特殊矩阵。本文将利用C++实现特殊矩阵的压缩存储,感兴趣的可以了解一下
    2022-08-08
  • C&C++设计风格选择 命名规范

    C&C++设计风格选择 命名规范

    本文难免带有主观选择倾向,但是会尽量保持客观的态度归纳几种主流的命名风格,仅供参考
    2018-04-04
  • C语言中数组常用的一些排序算法小结

    C语言中数组常用的一些排序算法小结

    数组的排序方法有很多,效率也各不相同,下面这篇文章主要给大家介绍了关于C语言中数组常用的一些排序算法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • C语言实现宿舍管理系统设计

    C语言实现宿舍管理系统设计

    这篇文章主要为大家详细介绍了C语言实现宿舍管理系统设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++基础入门教程(八):函数指针

    C++基础入门教程(八):函数指针

    这篇文章主要介绍了C++基础入门教程(八):函数指针,本文讲解了函数原型和函数定义、const限定符与指针、函数的指针参数、为什么要使用指针参数等内容,需要的朋友可以参考下
    2014-11-11
  • vs2022启动一个CmakeLists.txt项目的实践

    vs2022启动一个CmakeLists.txt项目的实践

    本文主要介绍了vs2022启动一个CmakeLists.txt项目的实践,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • C语言编写五子棋游戏

    C语言编写五子棋游戏

    这篇文章主要为大家详细介绍了C语言编写五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C++可变参数的实现方法

    C++可变参数的实现方法

    可变参数给编程带来了很大的方便,在享受它带来的方便的同时,很有必要了解一下其实现方式,在了解编程语言的同时,也可以扩展编程的思路。
    2013-03-03

最新评论