iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

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

day8-從影像中如何獲得3D點座標

  • 分享至 

  • xImage
  •  

當我們獲得一張影像的時候,我們要如何獲得3D資訊呢?
首先我們得先了解openCV裡面的mat是如何儲存一張影像的。
以下是你可能需要知道的資訊
https://docs.opencv.org/master/d6/d6d/tutorial_mat_the_basic_image_container.html
https://docs.opencv.org/master/db/da5/tutorial_how_to_scan_images.html
mat就像是一個matrix它的大小取決於你的照片的的大小與色彩資訊,
如果你的照片是800X600,
那麼你的matrix就是800X600的大小。
而你的色彩資訊,如果是灰階(grayscale)照片那麼matrix裡面可能儲存的就是 0~255的灰階值。
如果是彩色(RGB)照片那麼matrix裡面可能儲存的就是三個0~255的數值,分別代表RGB的大小。

而當我從一張影像獲得一個觀測點,或者更專業一點我們會說特徵點。
我可能會需要這個點的在這個matrix的哪一個row或是哪一個column來描述這個點的(x,y)。
而這個點的RGB會影響之後再做匹配所需要的特徵點的描述符,這邊在此不贅述。
而如果你的照片是深度相機的RGBD的話,那麼你就可以直接獲得D的深度資訊。

而有了第一張相片的(x1,y1)之後,我們會去找這個觀測點出現在第二張相片的位子(x2,y2)。
而透過觀察這兩個位子的變化我們能獲得特徵點的視差,
進而獲得特徵點的深度資訊。
而我們紀錄多個特徵點進而推得相機的運動模式。

而視差要如何轉換成深度資訊呢?
如果兩個照片的移動距離已知(或是你的影像定位系統是雙目的,兩個相機的基線已知)的情況下,
其原理就是三角測量或是說前方交會。
https://ithelp.ithome.com.tw/upload/images/20190924/201211278xqVjUfqxs.png

#include<opencv2/core/core.hpp>
#include <opencv2/core/types.hpp>
#include<iostream>

int main() {
	cv::Point3d pointA = cv::Point3d(0, 0, 800);


	cv::Mat cameraMatrix_out = (cv::Mat_<double>(3, 4) << 1, 0, 0, 0,
		0, 1, 0, 0,
		0, 0, 1, 0);

	cv::Mat cameraMatrix_in = (cv::Mat_<double>(3, 3) << 800, 0, 400,
		0, 800, 300,
		0, 0, 1);

	cv::Mat image_place = cameraMatrix_in * cameraMatrix_out * (cv::Mat_<double>(4, 1) << pointA.x, pointA.y, pointA.z, 1);

	std::cout << image_place << std::endl;

	std::cout << image_place / image_place.at<double>(2, 0) << std::endl;

	cv::Mat cameraMatrix_out2 = (cv::Mat_<double>(3, 4) << 1, 0, 0, 40,
		0, 1, 0, 0,
		0, 0, 1, 0);

	cv::Mat image_place2 = cameraMatrix_in * cameraMatrix_out2 * (cv::Mat_<double>(4, 1) << pointA.x, pointA.y, pointA.z, 1);

	std::cout << image_place2 << std::endl;

	std::cout << image_place2 / image_place2.at<double>(2, 0) << std::endl;
	return 0;
}

我們拿day3的code拿來稍作修改
當我的觀測點為(0,0,800)的時候我的第一個相機看這個觀測點會是[400,300]的位子,
而我假設相機向X軸移動了40piexl的單位,而觀測點就會移動到的[440,300]的位子。
而依據我們的公式我的深度就會是https://chart.googleapis.com/chart?cht=tx&amp;chl=d%3D(40piexl800piexl)%2F((0%2B40)piexlw)
https://chart.googleapis.com/chart?cht=tx&amp;chl=d%3D800piexl%2Fw
而W就是piexl跟現實世界物理單位的比值,當我有W的時候我得到的d才有物理意義。


上一篇
day7-四元數旋轉
下一篇
day9-圖像特徵(FAST實作)
系列文
我的影像視覺定位學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言