生活随笔
收集整理的這篇文章主要介紹了
镜头桶形失真校正算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
短焦鏡頭通常會產生桶形失真,以下是校正算法的matlab代碼:
view plaincopy to clipboard
%%?鏡頭桶形失真校正(短焦鏡頭)?? ?? img_origin1?=?imread('Still001.bmp');?? img_origin?=?rgb2gray(img_origin1);?? ?? k1?=?-0.00000037;???%?形變參數,根據實際情況調整?? k2?=?-0.00000037;?? ?? img_size?=?size(?img_origin?);?? img_undist?=?zeros(?img_size?);?? img_undist?=?uint8(?img_undist?);?? ?? ?? for?l1?=?1:img_size(1)??%?垂直方向?? ?????? ????y?=?l1?-?img_size(1)/2;?? ?????? ????for?l2?=?1:img_size(2)??%?水平方向?? ?????????? ????????x?=?l2?-?img_size(2)/2;?? ?????????? ????????x1?=?round(?x?*?(?1?+?k1?*?x?*?x?+?k2?*?y?*?y?)?);?? ????????y1?=?round(?y?*?(?1?+?k1?*?x?*?x?+?k2?*?y?*?y?)?);?? ????????y1?=?y1?+?img_size(1)/2;?? ????????x1?=?x1?+?img_size(2)/2;?? ?????????? ????????img_undist(l1,l2)?=?img_origin(y1,?x1);?? ?????????? ????end?? end?? ?? ?? figure(1);?? subplot(121);?imshow(img_origin);?? subplot(122);?imshow(img_undist);?? ?? imwrite(img_origin,'1.bmp');?? imwrite(img_undist,'2.bmp');?? [cpp]?view plaincopy
%%?鏡頭桶形失真校正(短焦鏡頭)?? ?? img_origin1?=?imread('Still001.bmp');?? img_origin?=?rgb2gray(img_origin1);?? ?? k1?=?-0.00000037;???%?形變參數,根據實際情況調整?? k2?=?-0.00000037;?? ?? img_size?=?size(?img_origin?);?? img_undist?=?zeros(?img_size?);?? img_undist?=?uint8(?img_undist?);?? ?? ?? for?l1?=?1:img_size(1)??%?垂直方向?? ?????? ????y?=?l1?-?img_size(1)/2;?? ?????? ????for?l2?=?1:img_size(2)??%?水平方向?? ?????????? ????????x?=?l2?-?img_size(2)/2;?? ?????????? ????????x1?=?round(?x?*?(?1?+?k1?*?x?*?x?+?k2?*?y?*?y?)?);?? ????????y1?=?round(?y?*?(?1?+?k1?*?x?*?x?+?k2?*?y?*?y?)?);?? ????????y1?=?y1?+?img_size(1)/2;?? ????????x1?=?x1?+?img_size(2)/2;?? ?????????? ????????img_undist(l1,l2)?=?img_origin(y1,?x1);?? ?????????? ????end?? end?? ?? ?? figure(1);?? subplot(121);?imshow(img_origin);?? subplot(122);?imshow(img_undist);?? ?? imwrite(img_origin,'1.bmp');?? imwrite(img_undist,'2.bmp');?? 在實時視頻處理中,如果對每幀圖像都要重復進行坐標轉換運算,就是個很大的浪費,我們可以在初始化過程中先將坐標對應關系建立一個二維查找表,之后每幀處理只需要查表,C++代碼如下(用到了OpenCV):
view plaincopy to clipboard
?? CvPoint?CorrInd[480][640];?? ?? ?? void?LensCorrectInit(?double?k1?=?-0.00000035,?double?k2?=?-0.00000035?);?? ?? ?? ?? void?LensCorrectInit(?double?k1,?double?k2?)?? {?? ????int?imgWidth?=?camera.GetWidth();????? ????int?imgHeight?=?camera.GetHeight();?? ?? ????int?imgWd2?=?imgWidth>>1;?? ????int?imgHd2?=?imgHeight>>1;?? ?? ????int?it;?? ????int?jt;?? ????int?it2;?? ????int?jt2;?? ?? ????for(?int?i=0;?i<imgHeight;?i++?)?? ????{?? ????????it?=?(?i?+?1?)?-?imgHd2;??? ????????for(?int?j=0;?j<imgWidth;?j++?)?? ????????{?? ????????????double?temp;?? ?? ????????????jt?=?(?j?+?1?)?-?imgWd2;??? ????????????temp?=?1?+?k1*it*it?+?k2*jt*jt;?? ????????????it2?=?(int)(temp?*?it);?? ????????????jt2?=?(int)(temp?*?jt);?? ?? ????????????it2?=?it2?+?imgHd2?+?1;?? ????????????jt2?=?jt2?+?imgWd2?+?1;?? ?? ????????????CorrInd[i][j].x?=?jt2;?? ????????????CorrInd[i][j].y?=?it2;?? ????????}?? ????}?? }?? ?? ?? ?? ?? ?? void?LensCorrect(?IplImage*?src,?IplImage*?dst?)?? {?? ????int?imgWidth?=?dst->width;?? ????int?imgHeight?=?dst->height;?? ?? ????int?it2;?? ????int?jt2;?? ?? ????for(?int?i=0;?i<imgHeight;?i++?)?? ????{?? ????????uchar?*pdstdata?=?(uchar*)(dst->imageData)?+?i*dst->widthStep;?? ?? ????????for(?int?j=0;?j<imgWidth;?j++?)?? ????????{?? ????????????it2?=?CorrInd[i][j].y;?? ????????????jt2?=?CorrInd[i][j].x;?? ?? ????????????uchar?*?psrcdata?=?cvPtr2D(?src,?it2,?jt2?);?? ?? ????????????*(pdstdata++)?=?*(psrcdata++);?? ????????????*(pdstdata++)?=?*(psrcdata++);?? ????????????*(pdstdata++)?=?*(psrcdata++);?? ????????}?? ????}?? }??
總結
以上是生活随笔為你收集整理的镜头桶形失真校正算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。