鐵人馬拉松,進行到今天也已經累積了不少的內容,
一些比較基礎的入門知識都稍微著墨了一番。
是差不多該把前幾日播種的種子開始收割,
開發一個可能精準度尚可?功能簡單的定位系統了。
所以就讓我們從校正手邊的相機開始吧~~~~
我原先以為拿個定位板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的內容
你可以在詳細資料得到一些相機的相關數據,但目前跟我們校正預先準備無關,
你可以查看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,而改正後的影像變形反而越來越大。這讓我開始思考專業相機是怎麼校正鏡頭的。
也許因為相機的解析度增加,校正板的角點密度也要增加,原先的9X6的校正板似乎不夠展現變形的情況,
也許未來在執行高解析度的影像的時候,會有建議的校正板設定與搭配的影像解析度。
而在製作校正板的時候,不必在意最外圍的正方型是否完整。
你可以注意到範例中的實驗影像,他的校正板的最外圍並不是完整的正方形,
只要其角點是明顯的,能夠被特徵子偵測到就是好的校正板。