iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0
自我挑戰組

我的影像視覺定位學習筆記系列 第 19

day19-Camera calibration [實戰心得筆記?]

  • 分享至 

  • xImage
  •  

鐵人馬拉松,進行到今天也已經累積了不少的內容,
一些比較基礎的入門知識都稍微著墨了一番。

是差不多該把前幾日播種的種子開始收割,
開發一個可能精準度尚可?功能簡單的定位系統了。
所以就讓我們從校正手邊的相機開始吧~~~~

我原先以為拿個定位板chessboard pattern,隨手拿台影像擷取裝置(webcam、smartphone、camera)拍個幾張照片,丟進去範例就能夠順利地跑出個結果。
沒想到過程其實還蠻坑坑巴巴的,校正的結果也不慎滿意。

今天的進度可能就只能把過程遇到的問題敘述一下,以及目前的解決方法。

首先我拿了手邊正在使用的智慧型手機,現在的智慧型手機都標榜幾千萬畫素,我原先以為畫素越高,校正的精度應該越準。我就只改了in_VID.xml的影像清單,就開始執行程式了。
HTC_UU.xml

<opencv_storage>
<images>
  images/CameraCalibration/HTC_UU/IMAG0541.jpg
  images/CameraCalibration/HTC_UU/IMAG0542.jpg
...
  images/CameraCalibration/HTC_UU/IMAG0558.jpg
  images/CameraCalibration/HTC_UU/IMAG0559.jpg
</images>
</opencv_storage>

而打開jpg的內容
https://ithelp.ithome.com.tw/upload/images/20191005/20121127A36XFewKjg.png
你可以在詳細資料得到一些相機的相關數據,但目前跟我們校正預先準備無關,
你可以查看Day15的範例中,in_VID5.xml裡面沒有相機的先驗資訊。
而這邊可以看到影像的大小,我們可以預想到讀入影像(Mat)的 col & row是多少。

而在初次執行的時候,我發現程式連第一張影像都讀取很久,我原先以為是程式沒有讀到影像。
後來才發現程式卡在找角點的部分。而這裡還不是亞像素的角點。

		case Settings::CHESSBOARD:
			found = findChessboardCorners(view, s.boardSize, pointBuf, chessBoardFlags);
			break;

起先我懷疑findChessboardCorners只吃灰階影像,所以我嘗試在讀入影像的時候修改讀進來的影像通道。
結果發現chessBoardFlags=CALIB_CB_ADAPTIVE_THRESH會控制findChessboardCorners特徵子自己會將彩色影像轉為灰階,這反而使得程式在之後的流程出錯。

最後發現是偵測子在偵測特徵時,因為影像的大小使得在尋訪的過程中,路程會很遠。
如果我們沒有對讀入的影像大小做些修改,那麼程式在每張影像都會處理很久的時間。
所以我在程式執行 nextImage讀入影像的時候,重新改變了影像的大小。

	Mat nextImage()
	{
		Mat result;
		if (inputCapture.isOpened())
		{
			Mat view0;
			inputCapture >> view0;
			view0.copyTo(result);
		}
		else if (atImageList < imageList.size())
			result = imread(imageList[atImageList++], IMREAD_COLOR);
			if (!result.empty())          // If there are no more images no resize
			{
				resize(result, result, Size(1920, 1080), 0, 0, CV_INTER_AREA);
			}
			//result = imread(imageList[atImageList++], IMREAD_GRAYSCALE);
		return result;
	}

而這也會影響到後面秀出改正影像的大小,所以再remap之前程式還會再次讀入每張影像並改正他,
由於我們校正後的改正矩陣是修改大小的結果,所以這邊我們也要再resize 影像的大小。

			view = imread(s.imageList[i], IMREAD_COLOR);
			if (view.empty()){
				continue;
			}
			else {
				resize(view, view, Size(1920, 1080), 0, 0, CV_INTER_AREA);
			}
			remap(view, rview, map1, map2, INTER_LINEAR);
			imshow("Image View", rview);

而在初步執行的時候,我嘗試了跟範例一樣的大小640X480,其結果似乎跟範例差不多,在投影誤差都不到1。
而我慢慢嘗試加大影像的解析度,但是再投影誤差卻沒有因為影像的大小而變準。

有些影像甚至因為解析度變高,反而沒有找到對應的角點,這使得我懷疑是我校正板的角點,沒有均勻分布在影像的四周圍,沒有充分的體現鏡頭的畸變,而又重新拍了一組角點比較分布在四周的校正影像。

其投影誤差都在7~9,而改正後的影像變形反而越來越大。這讓我開始思考專業相機是怎麼校正鏡頭的。
https://ithelp.ithome.com.tw/upload/images/20191006/201211278iepO0P0Z9.jpg

也許因為相機的解析度增加,校正板的角點密度也要增加,原先的9X6的校正板似乎不夠展現變形的情況,
也許未來在執行高解析度的影像的時候,會有建議的校正板設定與搭配的影像解析度。
而在製作校正板的時候,不必在意最外圍的正方型是否完整。
你可以注意到範例中的實驗影像,他的校正板的最外圍並不是完整的正方形,
只要其角點是明顯的,能夠被特徵子偵測到就是好的校正板。


上一篇
day18-stereo calibration使用心得
下一篇
day20-讀入實驗影像與相機參數
系列文
我的影像視覺定位學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言