OpenCV实现鱼眼图像径向展开

转载请注明出处。  

 2017.2.13

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <math.h>
using namespace std;
using namespace cv;

#pragma comment(lib, "opencv_core300d.lib")
#pragma comment(lib, "opencv_highgui300d.lib")
#pragma comment(lib, "opencv_imgcodecs300d.lib")
#pragma comment(lib, "opencv_imgproc300d.lib")

int main()
{
	//读取图片
	Mat Src = imread("1.png") ;
	//imshow("Src",Src);
	cout<< Src.size()<<endl;
	int nbottom = 0;
	int ntop = 0;
	int nright = 0;
	int nleft = 0;

	//遍历寻找上边界
	int nflag = 0;
	for (int i=0 ;i< Src.rows -1;i++)
	{
		for (int j=0; j<Src.cols -1; j++)
		{
			uchar I = 0.59*Src.at<Vec3b>(i,j)[0] + 0.11*Src.at<Vec3b>(i,j)[1] + 0.3*Src.at<Vec3b>(i,j)[2];
			if (I > 20)
			{
				I = 0.59*Src.at<Vec3b>(i+1,j)[0] + 0.11*Src.at<Vec3b>(i+1,j)[1] + 0.3*Src.at<Vec3b>(i+1,j)[2];
				if (I > 20)
				{
					ntop = i;
					nflag = 1;
					break;
				}
			}
		}
		if (nflag ==1)
		{
			break;
		}
	}
	//遍历寻找下边界
	nflag = 0;
	for (int i= Src.rows-1;i > 1;i--)
	{
		for (int j=0; j < Src.cols -1; j++)
		{
			uchar I = 0.59*Src.at<Vec3b>(i,j)[0] + 0.11*Src.at<Vec3b>(i,j)[1] + 0.3*Src.at<Vec3b>(i,j)[2];
			if (I > 20)
			{
				I = 0.59*Src.at<Vec3b>(i-1,j)[0] + 0.11*Src.at<Vec3b>(i-1,j)[1] + 0.3*Src.at<Vec3b>(i-1,j)[2];
				if (I > 20)
				{
					nbottom = i;
					nflag = 1;
					break;
				}
			}
		}
		if (nflag ==1)
		{
			break;
		}
	}
	//遍历寻找左边界
	nflag = 0;
	for (int j=0; j<Src.cols -1; j++)
	{
		for (int i=0 ;i< Src.rows ;i++)
		{
			uchar I = 0.59*Src.at<Vec3b>(i,j)[0] + 0.11*Src.at<Vec3b>(i,j)[1] + 0.3*Src.at<Vec3b>(i,j)[2];
			if (I > 20)
			{
				I = 0.59*Src.at<Vec3b>(i,j+1)[0] + 0.11*Src.at<Vec3b>(i,j+1)[1] + 0.3*Src.at<Vec3b>(i,j+1)[2];
				if (I > 20)
				{
					nleft = j;
					nflag = 1;
					break;
				}
			}
		}
		if (nflag ==1)
		{
			break;
		}
	}
	//遍历寻找右边界
	nflag = 0;
	for (int j=Src.cols -1; j >0; j--)
	{
		for (int i= 0;i <Src.rows ;i++)
		{
			uchar I = 0.59*Src.at<Vec3b>(i,j)[0] + 0.11*Src.at<Vec3b>(i,j)[1] + 0.3*Src.at<Vec3b>(i,j)[2];
			if (I > 20)
			{
				I = 0.59*Src.at<Vec3b>(i,j-1)[0] + 0.11*Src.at<Vec3b>(i,j-1)[1] + 0.3*Src.at<Vec3b>(i,j-1)[2];
				if (I > 20)
				{
					nright = j;
					nflag = 1;
					break;
				}
			}
		}
		if (nflag ==1)
		{
			break;
		}
	}
	cout<< ntop<<endl;
	cout<< nbottom<<endl;
	cout<< nleft << endl;
	cout<< nright <<endl;

	//根据边界值来获得直径
	int d = min(nright-nleft,nbottom-ntop);

	Mat imgRoi ;
	imgRoi = Src(Rect( nleft, ntop, d, d ));
	imwrite("C:/aa.jpg", imgRoi);

	Mat dst( imgRoi.size(), CV_8UC3, Scalar(255,255,255));

	//建立映射表
	Mat map_x,map_y;
	map_x.create( imgRoi.size(), CV_32FC1 );
	map_y.create( imgRoi.size(), CV_32FC1 );
	for (int j=0; j< d-1;j++)
	{
		for (int i=0; i< d-1; i++ )
		{
			map_x.at<float>(i,j) = static_cast<float>( d/2.0 + i/2.0*cos(1.0*j/d*2*CV_PI));
			map_y.at<float>(i,j) = static_cast<float>( d/2.0 + i/2.0*sin(1.0*j/d*2*CV_PI));
		}
	}

	remap(imgRoi, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0,0,0));
	//重设大小
	resize(dst, dst, Size(), 2.0, 1.0);

	imwrite("C:/bb.jpg",dst);
	waitKey();
	return 0;
}

1.在网上随便找了个原图:


2.获得有效区域图像:


3.展开后的图像:


  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 鱼眼畸变是由鱼眼相机广角镜头的特性引起的一种畸变现象。在图像中,直线变得弯曲并且物体的边缘拉伸。 OpenCV提供了一种用于鱼眼畸变矫正的函数,称为`cv2.fisheye.undistortImage()`。该函数可以将畸变图像转换为非畸变的图像。 使用该函数需要提供畸变图像、相机的内参矩阵和畸变参数。内参矩阵包括焦距和光学中心等参数,通常通过相机标定得到。畸变参数包括径向畸变和切向畸变等,同样也需要通过相机标定获得。 以下是使用OpenCV进行鱼眼畸变矫正的主要步骤: 1. 读取畸变图像和相机的内参矩阵和畸变参数。 2. 创建输出图像的尺寸和类型。 3. 调用`cv2.fisheye.undistortImage()`函数,传入畸变图像、内参矩阵和畸变参数,以及输出图像。 4. 显示和保存矫正后的图像。 需要注意的是,畸变矫正的效果取决于相机的标定质量和参数的准确性。在进行鱼眼畸变矫正之前,最好对相机进行标定,以获取准确的内参矩阵和畸变参数。 OpenCV鱼眼畸变矫正功能可以广泛应用于计算机视觉和图像处理领域,例如机器人导航、三维重建和全景图像拼接等。 ### 回答2: 鱼眼畸变矫正是一种在计算机视觉中常用的技术,可以通过对图片进行处理,将鱼眼相机拍摄的图像转换为透视图像,使图像中的直线保持直线,更符合人眼看到的实际情况。 OpenCV是一个开源的计算机视觉库,提供了许多图像处理和计算机视觉相关的函数和工具。在OpenCV中,也提供了鱼眼畸变矫正的函数来实现这一功能。 鱼眼畸变矫正的过程通常分为两步:参数估计和图像转换。 参数估计阶段主要是根据鱼眼相机的特性,估计出畸变的参数。OpenCV提供了一些函数,如`findChessboardCorners`和`calibrateCamera`等,可以通过拍摄棋盘格样板并基于棋盘格图像的角点位置,估计相机的标定矩阵和畸变系数。 图像转换阶段使用估计出的参数,对图像进行畸变矫正。OpenCV提供了函数`undistort`来完成这个任务。该函数接受源图像、畸变参数和标定矩阵作为输入,并输出矫正后的图像。 使用OpenCV进行鱼眼畸变矫正的步骤如下:首先,使用相机拍摄一系列棋盘格图片,并检测角点位置。然后,利用检测到的角点位置和已知的棋盘格尺寸,使用`calibrateCamera`函数估计相机的标定矩阵和畸变系数。最后,对要矫正的图像应用`undistort`函数,得到畸变校正后的图像。 通过OpenCV提供的鱼眼畸变矫正功能,我们可以清晰地看到鱼眼相机拍摄的图像中的物体和线条,使其更加符合真实的显示效果。 ### 回答3: OpenCV是一个开源的计算机视觉库,其中包含了很多图像处理和计算机视觉算法。其中一个功能是鱼眼畸变矫正。 在摄影中,鱼眼镜头是一种广角镜头,能够拍摄到非常宽广的景象。然而,鱼眼镜头会引入一种畸变,使得图像中的直线变为弯曲的弧线。这种畸变使图像在某些任务中变得不可用,因此鱼眼畸变矫正就变得十分重要。 鱼眼畸变矫正算法主要包括以下几个步骤: 1. 读取鱼眼图像:使用OpenCV的函数读取待处理的鱼眼图像。 2. 相机参数估计:根据鱼眼图像的特性,使用OpenCV的函数估计相机的畸变参数。这些参数包括焦距、主点和径向畸变系数等。 3. 畸变矫正:使用OpenCV的函数根据相机参数对图像进行畸变矫正处理。这个过程会根据畸变模型对图像进行重新映射,使得直线变为直线而不再弯曲。 4. 输出结果:保存或者显示经过畸变矫正后的图像。可以使用OpenCV的函数将图像保存到文件中,或者直接显示处理结果。 总结来说,OpenCV提供了强大的鱼眼畸变矫正功能,可以通过估计相机参数和对图像进行畸变矫正来减少或消除鱼眼镜头引入的畸变,从而得到更加准确和可靠的图像。这种算法在计算机视觉和机器人领域有广泛的应用。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值