Matlab 雙目校正 + Opencv測距

這部分網路上資源很多,直接貼上參考網址。

https://blog.csdn.net/rocky_shared_image/article/details/7726570
https://www.itread01.com/content/1548870865.html
https://blog.csdn.net/liangchunjiang/article/details/79040295

透過上述參考網址即可完成 校正及測距。

除了用Matlab校正外, Openc官方也有提供原始碼可參考。

雙目校正官方代碼路徑如下: C:\opencv\sources\samples\cpp\stereo_calib.cpp
測距官方代碼路徑如下 :
C:\opencv\sources\samples\cpp\stereo_match.cpp

官方代碼 stereo_calib.cpp 部分,貼上關鍵部分,並請請參考註解處

int main(int argc, char** argv)
{
     
	Size boardSize;
	string imagelistfn;
	bool showRectified;
	cv::CommandLineParser parser(argc, argv, "{w|8|}{h|6|}{s|1|}{nr||}{help||}{@input|stereo_calib.xml|}");
	//這邊修改參數 W H 就是棋盤格寬高,S是每個大小,讀取stereo_calib.xml取這部分資料格式提供在下面
	if (parser.has("help"))
		return print_help();
	showRectified = !parser.has("nr");
	imagelistfn = samples::findFile(parser.get<string>("@input"));
	boardSize.width = parser.get<int>("w");
	boardSize.height = parser.get<int>("h");
	float squareSize = parser.get<float>("s");
	if (!parser.check())
	{
     
		parser.printErrors();
		return 1;
	}
	vector<string> imagelist;
	bool ok = readStringList(imagelistfn, imagelist);
	if (!ok || imagelist.empty())
	{
     
		cout << "can not open " << imagelistfn << " or the string list is empty" << endl;
		return print_help();
	}

	StereoCalib(imagelist, boardSize, squareSize, false, true, showRectified);
	return 0;
}

stereo_calib.xml格式如下,只需修改載入的圖檔名即可。

<?xml version="1.0"?>
<opencv_storage>
<imagelist>
"L1.jpg"
"R1.jpg"
"L2.jpg"
"R2.jpg"
</imagelist>
</opencv_storage>

運行完之後會產生intrinsics.yml ,這個檔案運行官方代碼stereo_match.cpp會用到。
這邊要注意的是,所有的圖檔、.xml及.yml等都需要放在程式目錄下。
請參考下圖。
Matlab 雙目校正 + Opencv測距_第1张图片

stereo_match.cpp 部分代碼如下:

	cv::CommandLineParser parser(argc, argv,
		"{@arg1|hand1.png|}{@arg2|hand1.png|}{help h||}{algorithm|sgbm|}{max-disparity|96|}{blocksize|7|}{no-display||}{scale|1|}{i|intrinsics.yml|}{e|extrinsics.yml|}{o||}{p||}");
//arg1及arg2分別為左右圖檔,	algorithm可輸入sbgm或者bm,其他可以參考此處修改,主要是測距的參數。

跑過官方代碼後,與Matlab雙目校正比較,看起來是Matlab校正結果比較好,不過這可能是因為Matlab是分別做左右校正,再做雙目校正的關係。

你可能感兴趣的:(opencv,matlab,xml)