国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android廣角相機畸變校正算法和實現示例

2019-10-21 21:42:52
字體:
來源:轉載
供稿:網友

1.光學相機鏡頭一般都存在畸變的問題,畸變屬于成像的幾何失真,它是由于焦平面上不同區域對影像的放大率不同而形成的畫面扭曲變形現象。除了一些特定的場合,大部分情況下,這些失真都是需要校正到正常人眼不產生扭曲的程度。

2常見的畸變是枕形畸變,桶形畸變和線性畸變。廣角鏡頭的攝像設備拍攝出來的圖像經常會有桶形畸變的問題。原因在于廣角鏡頭使用的是凸透鏡,初中物理知識告訴我們凸透鏡會對光線起匯聚作用,這是光的折射造成的。而離鏡頭中心越遠,折射效果越強,因而其拍出來的照片會以鏡頭中心為圓心,呈圓形向外擴展失真。

3.攝像頭精確校正需要先獲取標定數據,可以利用張正友的張氏標定法,或者使用MATLAB標定。

4.一般攝像頭畸變校正可以使用OPENCV,OpenCV的畸變參數總共有五個,徑向畸變3個(k1,k2,k3)和切向畸變2個(p1,p2)。

徑向畸變:

android,廣角相機,校正算法

切向畸變:

android,廣角相機,校正算法

以及在OpenCV中的畸變系數的排列(這點一定要注意k1,k2,p1,p2,k3),千萬不要以為k是連著的。

android,廣角相機,校正算法

其公式由好像是泰勒公式,K和P應該可以無限精確,也可以橫豎使用不同參數,r=x*X+y*y;

5.這里不對標定過程和opencv校正過程詳細推理。這里使用代碼實現簡單的畸變算法,考慮到效率和實時性,略去切向畸變,徑向畸變假設x,y相等且只取一階K值,其實一階K值大約已經可以把畸變控制人眼接受的范圍內了。

6.代碼

public class LensCorrect2 {	// 鏡頭校正查找表	private Point[][] CorrInd = null;// new Point[480][640];	private double k1 = 0f;	private double k2 = 0f;	private Bitmap mBm = null;	private int mW = 0;	private int mH = 0; 	private int max_x = 0, max_y = 0;	private int min_x = 0, min_y = 0; 	// 鏡頭徑向畸變校正初始化	public LensCorrect2(double k1, double k2, Bitmap mBm) {		super();		this.k1 = k1;		this.k2 = k2;		this.mBm = mBm; 		this.mW = mBm.getWidth();		this.mH = mBm.getHeight(); 		int cw = mW >> 1;		int ch = mH >> 1;		CorrInd = new Point[mH][mW];		Log.i("XXXXX", "imgHeight=" + mH);		Log.i("XXXXX", "imgWidth=" + mW); 		int it;		int jt;		int it2;		int jt2; 		for (int i = 0; i < mH; i++) {			it = (i + 1) - ch; // (i+1) 是其真正的圖像坐標			for (int j = 0; j < mW; j++) {				double temp; 				jt = (j + 1) - cw; // (j+1) 是其真正的圖像坐標				temp = 1 + k1 * it * it + k2 * jt * jt;				it2 = (int) (temp * it);				jt2 = (int) (temp * jt); 				it2 = it2 + ch + 1;				jt2 = jt2 + cw + 1; 				// Log.i("AAAAA", "imgHeight="+imgHeight);				// Log.i("AAAAA", "imgWidth="+imgWidth);				// Log.i("AAAAA", "i="+i);				// Log.i("AAAAA", "j="+j); 				// Log.i("XXXXX", "jt2="+jt2);				// Log.i("XXXXX", "it2="+it2);				if (max_x < jt2) {					max_x = jt2;				}				if (min_x > jt2) {					min_x = jt2;				}				if (max_y < it2) {					max_y = it2;				}				if (min_y > it2) {					min_y = it2;				} 				Point p = new Point(jt2, it2);				CorrInd[i][j] = p; 			}		}		Log.i("XXXXX", "max_x=" + max_x);		Log.i("XXXXX", "min_x=" + min_x);		Log.i("XXXXX", "max_y=" + max_y);		Log.i("XXXXX", "min_y=" + min_y);	} 	public Bitmap getLensCorrect() {		Bitmap bm = Bitmap.createBitmap((max_x - min_x) + 1,				(max_y - min_y) + 1, Bitmap.Config.ARGB_8888); 		int it2;		int jt2; 		for (int i = 0; i < mH; i++) {			for (int j = 0; j < mW; j++) {				it2 = CorrInd[i][j].y;				jt2 = CorrInd[i][j].x; 				bm.setPixel(jt2 - min_x, it2 - min_y, mBm.getPixel(j, i)); 			}		}		return bm;	} 	public Bitmap getLensCorrect0() {		Bitmap bm = Bitmap.createBitmap(mW, mH, Bitmap.Config.ARGB_8888); 		int it2;		int jt2; 		for (int i = 0; i < mH; i++) {			for (int j = 0; j < mW; j++) {				it2 = CorrInd[i][j].y;				jt2 = CorrInd[i][j].x; 				if ((it2 >= 0) && (jt2 >= 0) && (it2 < mH) && (jt2 < mW)) {					// bm.setPixel(j, i, mBm.getPixel(jt2, it2));					bm.setPixel(jt2, it2, mBm.getPixel(j, i));				}			}		}		return bm;	} }

7.下圖對圖像進行反畸變,由于用于測試的廣角相機手機找不到了,沒有找到合適的圖片,使用一下沒有變形的圖片,對其做反桶形畸變,反畸變后,損失的像素需要插值補充完整

android,廣角相機,校正算法

android,廣角相機,校正算法

以上這篇android廣角相機畸變校正算法和實現示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 荔波县| 塔河县| 临洮县| 九龙县| 珲春市| 嵊州市| 应城市| 调兵山市| 虹口区| 南江县| 阳曲县| 房山区| 瓦房店市| 邳州市| 乐业县| 南乐县| 吉水县| 东阿县| 丽水市| 安泽县| 丰镇市| 左云县| 萍乡市| 耿马| 清远市| 德钦县| 清新县| 刚察县| 密山市| 景洪市| 锦州市| 滨州市| 永安市| 通河县| 靖安县| 德惠市| 璧山县| 阜南县| 湘阴县| 瑞昌市| 黄梅县|