#include "ScanningMethod.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
#include<math.h>
/****************************************************************
*作用 标定鱼眼图像的中心和半径
*参数
img 输入图像
x0 【输出】中心X坐标
y0 【输出】中心Y坐标
r 【输出】半径
*返回 剪切后的鱼眼图像
****************************************************************/
IplImage* ScaningMethod( IplImage* img, float* x0, float* y0, float* r)
{
IplImage* imgTemp;
int n_left;
int n_right;
int n_top;
int n_bottom;
float n_max;
float n_min;
//寻找鱼眼图像区域左切线
for(int i = 0; i < img->width; i++)
{
ExtremeCol( img, &n_max, &n_min, i );
if(( n_max - n_min ) > GRAY_DIFF_THR )
{
n_left = i;
break;
}
}
//寻找鱼眼图像区域右切线
for( int i = img->width - 1; i >= 0; i--)
{
ExtremeCol( img, &n_max, &n_min, i );
if(( n_max - n_min ) > GRAY_DIFF_THR )
{
n_right = i;
break;
}
}
//寻找鱼眼图像区域上切线
for(int i = 0; i < img->height; i++)
{
ExtremeRow(img, &n_max, &n_min, i );
if(( n_max - n_min ) > GRAY_DIFF_THR )
{
n_top = i;
break;
}
}
//寻找鱼眼图像区域下切线
for( int i = img->height - 1; i >= 0; i--)
{
ExtremeRow(img, &n_max, &n_min, i );
if(( n_max - n_min ) > GRAY_DIFF_THR )
{
n_bottom = i;
break;
}
}
if( n_left >= n_right || n_top >=n_bottom )
{
return NULL;
}
else
{
imgTemp = cvCreateImage( cvSize( n_right - n_left, n_bottom - n_top ), IPL_DEPTH_8U, 3 );
cvZero( imgTemp );
cvSetImageROI( img, cvRect( n_left, n_top, n_right - n_left, n_bottom - n_top ));
cvAdd( imgTemp, img, imgTemp, NULL );
IplImage* imgCircle = Standard_circle( imgTemp );
cvReleaseImage(&imgTemp);
//计算鱼眼图像中心坐标和半径
*x0 = 1.0 * ( n_left + n_right ) / 2;
*y0 = 1.0 * ( n_top + n_bottom ) / 2;
float r1 = 1.0 * ( n_right - n_left ) / 2;
float r2 = 1.0 * ( n_bottom - n_top ) / 2;
*r = max( r1, r2 );
return imgCircle;
}
}
/*******************************************************************
*作用 寻找图像某行的极值,包括最大值和最小值
*参数
img 输入图像
maxRow 【输出】行最大值
minRow 【输出】行最小值
row 输入查找极值的行数
*******************************************************************/
void ExtremeRow( IplImage* img, float* maxRow, float* minRow, int row)
{
float maxTemp;
float minTemp;
float n_temp;
maxTemp = RGB_to_gray( img, 0, row ); //将最大值预设为该行第一个像素
minTemp = RGB_to_gray( img, 0, row ); //将最小值预设为该行第一个像素
for( int i = 0; i < img->width; i++ )
{
n_temp = RGB_to_gray( img, i, row );
if( maxTemp < n_temp )
maxTemp = n_temp;
if( minTemp > n_temp )
minTemp = n_temp;
}
*maxRow = maxTemp;
*minRow = minTemp;
}
/*******************************************************************
*作用 寻找图像某列的极值,包括最大值和最小值
*参数
img 输入图像
maxRow 【输出】列最大值
minRow 【输出】列最小值
col 输入查找极值的列数
*******************************************************************/
void ExtremeCol(IplImage* img, float* maxCol, float* minCol, int col )
{
float maxTemp;
float minTemp;
float n_temp;
maxTemp = RGB_to_gray( img, col, 0 ); //将最大值预设为该列第一个像素
minTemp = RGB_to_gray( img, col, 0 ); //将最小值预设为该列第一个像素
for( int i = 0; i < img->height; i++ )
{
n_temp = RGB_to_gray( img, col, i );
if( maxTemp < n_temp )
maxTemp = n_temp;
if( minTemp > n_temp )
minTemp = n_temp;
}
*maxCol = maxTemp;
*minCol = minTemp;
}
/**********************************************************
*作用 用公式 I=0.59*r+0.11*g+0.3*b 计算像素的亮度
*参数
img 输入图像
x 像素的行坐标
y 像素的列坐标
*放回 像素亮度I
**********************************************************/
float RGB_to_gray( IplImage* img, int x, int y )
{
float n_pixel;
n_pixel = 0.59 * ((uchar*)(img->imageData + img->widthStep*y))[x*3+2]
+ 0.11 * ((uchar*)(img->imageData + img->widthStep*y))[x*3+1]
+ 0.3 * ((uchar*)(img->imageData + img->widthStep*y))[x*3];
return n_pixel;
}
//将椭圆变换为标准圆
IplImage* Standard_circle(IplImage* img)
{
float u =1.0*img->width /2;
float v = 1.0*img->height/ 2;
float beta = 1.0 * img->width / img->height;
IplImage* imgOut;
if( img->width < img->height )
imgOut = cvCreateImage( cvSize( min( img->width, img->height ), min( img->width, img->height)), IPL_DEPTH_8U, 3);
else
imgOut = cvCreateImage( cvSize( max( img->width, img->height ), max( img->width, img->height)), IPL_DEPTH_8U, 3);
float a[] = { 1.0, 0, 0,
0, beta, 0,
0, 0, 1.0 };
CvMat* K = cvCreateMat( 3,3,CV_32FC1);
cvSetData(K,a,K->step);
cvWarpPerspective( img, imgOut, K, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, cvScalarAll( 255 ));
cvReleaseMat(&K);
return imgOut;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
鱼眼畸变图像标定校正源码.rar (50个子文件)
球面坐标定位法校正鱼眼图像畸变
球面坐标定位
标定鱼眼中心.suo 18KB
CalibCentre
8.jpg 101KB
ScanningMethod.cpp 5KB
yuyan1.jpg 172KB
15.jpg 72KB
Release
BuildLog.htm 5KB
vc90.pdb 36KB
vc90.idb 11KB
yuyan5.jpg 170KB
14.jpg 5KB
2.jpg 19KB
标准圆.jpg 68KB
1.jpg 61KB
6.jpg 44KB
yuyan3.jpg 171KB
19.bmp 466KB
3.jpg 136KB
5.jpg 40KB
yuyan6.jpg 166KB
yuyan4.jpg 172KB
CalibCentre.vcproj.WWW-AF70301D37B.Administrator.user 1KB
11.jpg 55KB
yuyan2.jpg 171KB
4.jpg 50KB
10.jpg 57KB
yuyan.jpg 170KB
ScanningMethod.h 405B
CalibCentre.vcproj 4KB
宾得4.bmp 231KB
CalibCentre.vcproj.VTRONCORP.lxwei.user 1KB
13.jpg 49KB
Thumbs.db 109KB
椭圆.JPG 7KB
12.jpg 137KB
9.jpg 66KB
鱼眼图像中心.xlsx 10KB
7.jpg 34KB
CalibCentre.vcproj.6CA8DB2F46314F9.Administrator.user 1KB
Debug
CalibCentre.exe.embed.manifest.res 728B
BuildLog.htm 12KB
vc90.pdb 284KB
CalibCentre.exe.embed.manifest 663B
vc90.idb 603KB
mt.dep 69B
FishEye.obj 63KB
ScanningMethod.obj 36KB
CalibCentre.exe.intermediate.manifest 621B
FishEye.cpp 3KB
标定中心.ncb 27KB
标定鱼眼中心.sln 899B
共 50 条
- 1
zhima159
- 粉丝: 19
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页