首页 新闻 搜索 专区 学院

鱼眼图像校正

0
悬赏园豆:30 [待解决问题]

校正图像本人写了一段代码用于校正鱼眼图像,但是校正出来的结果不理想,本人对程序方面不很熟悉,哪位对此方面有经验的童鞋能帮忙看一下,程序哪个地方出现问题??本人不胜感激!本人QQ1075863733!!

 

 
#include"ScanningMethod.h"
#include"cv.h"
#include"cxcore.h"

#include"highgui.h"
#include"math.h"
#include<iostream>
using namespace std;



int main( int argc, char** argv )
{
    IplImage* pImg;
    //加载鱼眼图像
    if( ( pImg = cvLoadImage( "560.jpg", CV_LOAD_IMAGE_ANYCOLOR ) ) == 0)  

        return 0;
    
    //定义变量x0,y0为鱼眼图像的圆心,r为半径
    float x0;
    float y0;
    float r;
    
    //利用扫描线法计算出鱼眼图像的圆心和半径,并输出,扫描线法返回的图像imgTemp为得到的标准圆的图像
    IplImage* imgTemp = ScaningMethod( pImg, &x0, &y0, &r);
    if( imgTemp == 0 )
    {
        cout << "标定鱼眼图像中心失败" <<endl;
        return 0;
    }
    cout << x0 << endl << y0 << endl <<  r << endl;
    
    float pi= 3.1415926;
    //定义展开图像imgCalib,展开图像的尺寸和标准圆图像的尺寸一样
    IplImage* imgCalib = cvCreateImage( cvGetSize( imgTemp), IPL_DEPTH_8U, 3);
            

    for( int j = 0 ; j < (imgCalib->height) ; j++)
        for( int i = 0 ; i < (imgCalib->width) ; i++)    
        {
            
            //xq,yq表示展开图像中点的位置
            
            float xq = (float) (i-(imgCalib->width)/2);
            float yq = (float) (j-(imgCalib->height)/2);
            
            
            float x1 = (xq/r);
            float y1 = (yq/r);
            float m = sin( x1 );
            float n = cos( x1 );
            float p = atan((sqrt(y1*y1+m*m))/n);
            float q = m/(sqrt(y1*y1+m*m));
            float t = y1/(sqrt(y1*y1+m*m));
        
            // (x,y)表示标准鱼眼图像中的点的位置
            float x = r*p*q+(imgCalib->width)/2;
            float y = r*p*t+(imgCalib->height)/2;
            
            
            int ix = (int)x;
            int iy = (int)y;
            
            if( ix>0 && iy>0  )
            {
                
                //   计算出鱼眼图像的(x,y)坐标后,使用双线性插值将鱼眼图像中点的像素值填充到
                //展开图像的对应点的位置上
                 ((uchar*)(imgCalib->imageData + imgCalib->widthStep*j))[i*3] =
                    ((uchar*)(imgTemp->imageData + imgTemp->widthStep*j))[ix*3] * (1-abs(x-ix))+
                    ((uchar*)(imgTemp->imageData + imgTemp->widthStep*j))[(ix+1)*3] * (1-abs(x-(ix+1)));

                ((uchar*)(imgCalib->imageData + imgCalib->widthStep*j))[i*3+1] =
                    ((uchar*)(imgTemp->imageData + imgTemp->widthStep*j))[ix*3+1] * (1-abs(x-ix))+
                    ((uchar*)(imgTemp->imageData + imgTemp->widthStep*j))[(ix+1)*3+1] * (1-abs(x-(ix+1)));

                ((uchar*)(imgCalib->imageData + imgCalib->widthStep*j))[i*3+2] =
                    ((uchar*)(imgTemp->imageData + imgTemp->widthStep*j))[ix*3+2] * (1-abs(x-ix))+
                    ((uchar*)(imgTemp->imageData + imgTemp->widthStep*j))[(ix+1)*3+2] * (1-abs(x-(ix+1)));    
                
                
                
            
            }
            else
            {
                ((uchar*)(imgCalib->imageData + imgCalib->widthStep*j))[i*3] =0;

                ((uchar*)(imgCalib->imageData + imgCalib->widthStep*j))[i*3+1] =0;
                    

                ((uchar*)(imgCalib->imageData + imgCalib->widthStep*j))[i*3+2] =0;
                    
            }
        }
            //创建窗口
    //cvNamedWindow( "原图", 1);
    cvNamedWindow( "标准圆", 1 );
    cvNamedWindow( "校正图", 1 );
    //显示并保存结果
    //cvShowImage( "原图", pImg );
    cvShowImage( "标准圆", imgTemp );
    cvSaveImage( "标准圆.jpg", imgTemp);
    cvShowImage( "校正图", imgCalib );
    cvSaveImage( "校正图.jpg",imgCalib );

    cvWaitKey(0); //等待按键

    cvDestroyWindow( "原图" );//销毁窗口
    cvReleaseImage( &imgTemp ); //释放图像
    cvReleaseImage( &imgCalib );
    cvReleaseImage( &pImg );


    return 0;

}

 

hwwsjh的主页 hwwsjh | 初学一级 | 园豆:172
提问于:2013-06-09 09:09
< >
分享
所有回答(2)
0

解决了吗?

midu | 园豆:202 (菜鸟二级) | 2014-11-14 12:07
0

第一个#include"ScanningMethod.h"头文件找不到,请问是在opencv里面的头文件吗

Forrest25 | 园豆:204 (菜鸟二级) | 2015-01-04 21:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册