投影成像是投影机作为光源把光投射在散射光线的投影幕布或墙上,这样因为投影机放置的位置与角度以及镜头畸变会影响到成像的画面。最常见的是形成梯形,通常投影机都自带有垂直梯形校正的功能,有些投影机还会有水平梯形校正,这可以应付多数单屏投影。在有些工程中尤其是多台投影做拼接的时候要求画面精确对齐,这时投影自带的校正功能往往不能满足要求,这时需要使用软件对投影画面做出调整,以完美的投射出画面。 常见的几何校正有: 线性校正 – 一般用于平面投影,当投影机梯形校正的幅度不够,或者拼接需要精确对齐时。如图1
图1 弧形校正 – 一般用于弧幕投影,投影机画面投射在弧形幕布上观看时可以加强立体沉浸感,这时画面需要做弧形校正。如图2
图2 球面校正 – 把投影画面投射到球面上时需要对画面做球面校正。如图3
图3 任意曲面 – 投影到更复杂的或不规则曲面时需要做任意曲面校正。如图4
图4 这篇文章主要讨论第一种线性校正,其它的以后讨论。 线性校正一般使用透视变换原理,透视变换是中心投影的射影变换,使用Intel开源视觉库OpenCV的cvWarpPerspective函数可以很方便的实现,下面给出使用OpenCV实现透视变换的源码: //透视变换 int WarpPerspective(IplImage *grey) { IplImage* Img_old = cvCloneImage( grey );
float fix = 4; float w = (float)Img_old->width + fix; float h = (float)Img_old->height + fix;
CvPoint2D src_point[4]; CvPoint2D dst_point[4];
//设定源观察面,即指定四边形的四个顶点 src_point[0].x=4; src_point[0].y=105; src_point[1].x=285; src_point[1].y=139; src_point[2].x=8; src_point[2].y=8; src_point[3].x=289; src_point[3].y=33; //设定目标观察面,即指定四边形的四个顶点 dst_point[0].x=-fix; dst_point[0].y=h; dst_point[1].x=w; dst_point[1].y=h; dst_point[2].x=-fix; dst_point[2].y=-fix; dst_point[3].x=w; dst_point[3].y=-fix;
float newm[9]; CvMat newM = cvMat( 3, 3, CV_, newm ); //获得透视转换矩阵 cvWarpPerspectiveQMatrix(src_point,dst_point,&newM); //透视转换 cvWarpPerspective(Img_old,grey,&newM,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0) );
cvNamedWindow(“ImgWarp”,1); cvShowImage(“ImgWarp”,grey); cvWaitKey(0);
cvReleaseImage(&Img_old); return 0; }
如果你想深入研究透视变换的实现算法,可以参看cvWarpPerspectiveQMatrix和cvWarpPerspective函数的源码。 |
几何校正
最新推荐文章于 2024-05-12 21:14:50 发布
var html = document.getElementById("artContent").innerHTML; document.getElementById("artContent").innerHTML = html;