iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

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

day11-drawMatches with mask 遮罩

  • 分享至 

  • xImage
  •  

昨天我將過濾後的DMatch重新塞進另外一個vector存成過濾後的結果,
而drawMatch再將此匹配的結果繪製出來,
如果你熟悉mask的用法你可能不用浪費儲存空間,
你只需要將前20組匹配的結果選擇輸出,
後面的匹配利用mask將其遮蔽,就能達到一樣的繪製效果,

	std::vector<char> test_mask(match_result.size(),0);
	for (size_t i = 0; i < 15; i++)
	{
		for (size_t j = 0; j <= i; j++)
		{
			test_mask[j] = 1;
		}

		cv::Mat img_Match_result_sorted_testmask;
		cv::drawMatches(image01, SURFkeypoints_ofbox, image02, SURFkeypoints_ofscene, match_result, img_Match_result_sorted_testmask, cv::Scalar::all(-1), cv::Scalar::all(-1), test_mask, cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
		cv::imshow("img_Match_result_sorted_testmask", img_Match_result_sorted_testmask);
	}

這段程式碼主要再說,我先宣告了一個跟DMatch的size一樣的mask vector,
其內容都初始化為0(也就是都被遮罩遮蔽),
接著我將排序過的DMatch從前面一個一個打開來,
所以你這邊會看到一條一條匹配的結果依序畫上,

std::string ithmatch = std::to_string(i) + "th match: left_img_kpID" + std::to_string(match_result.at(i).queryIdx);

		size_t left_img_kpID = match_result.at(i).queryIdx;
		size_t right_img_kpID = match_result.at(i).trainIdx;
        
		cv::putText(img_Match_result_sorted_testmask, ithmatch, cv::Point(SURFkeypoints_ofbox.at(left_img_kpID).pt.x, SURFkeypoints_ofbox.at(left_img_kpID).pt.y), 0, 0.5, cv::Scalar(255, 255, 255), 1);
        
		cv::imshow("img_Match_result_sorted_testmask", img_Match_result_sorted_testmask);
		cv::waitKey();

同時我放上了一些文字,在同樣的畫布上,
https://ithelp.ithome.com.tw/upload/images/20190927/20121127M2kaGxLlcL.png
第0組匹配他所對應到左邊的影像會是queryID而他出現在的(x,y)位置
我必須回去特徵子偵測的第queryID尋找,SURFkeypoints_ofbox.at(left_img_kpID).pt.x
它的xy資訊,找到之後putText才知道要將文字放在哪個位子。
你可以搭配我的code看看輸出的畫面是不是隨著匹配的線有連動。
https://ithelp.ithome.com.tw/upload/images/20190927/20121127v00lr4i4bI.png

		ithmatch = std::to_string(i) + "th match: right_img_kpID" + std::to_string(match_result.at(i).trainIdx);
        
		cv::putText(img_Match_result_sorted_testmask, ithmatch, cv::Point(SURFkeypoints_ofscene.at(right_img_kpID).pt.x+ 324, SURFkeypoints_ofscene.at(right_img_kpID).pt.y), 0, 0.5, cv::Scalar(255, 255, 255), 1);
        
		cv::imshow("img_Match_result_sorted_testmask", img_Match_result_sorted_testmask);
		cv::waitKey();

同樣的我也將右邊的影像trainID的資訊輸出在畫面上做比較,
而trainID的特徵我就必須到第二組影像偵測的特徵子序列去找尋它的xy資訊,
SURFkeypoints_ofscene.at(right_img_kpID).pt.x+ 324
而程式碼中的324是左邊影像的大小,你如果要繪製右邊的影像必須向右偏移。
也許可以從mat裡面的資訊去撈,但我這邊時間來不及測試。

而這邊我繪製的文字顏色是白色的可能有些不清楚,都是可以做調整的
而最後我輸出的文字只有匹配的ID,你可以根據你的需求放上x,y資訊或者是該特徵點的RGBor灰階值scale。
更甚至你如果想知道它的描述符也是可行的。
https://ithelp.ithome.com.tw/upload/images/20190928/20121127pZprVjXrh7.png
也可以透過這樣的方式去過濾可能有誤的匹配。


上一篇
day10-特徵描述符與匹配過濾
下一篇
day12-匹配過濾 cross_check &kNN with ratio_test
系列文
我的影像視覺定位學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言