本人写了一段代码用于校正鱼眼图像,但是校正出来的结果不理想,本人对程序方面不很熟悉,哪位对此方面有经验的童鞋能帮忙看一下,程序哪个地方出现问题??本人不胜感激!本人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; }
解决了吗?
第一个#include"ScanningMethod.h"头文件找不到,请问是在opencv里面的头文件吗