透視變換原理我也不細說,原理可以參考:
在opencv中只要調兩個函式就可以了。
cv::mat warpmatrix = cv::getperspectivetransform(src_pt, dst_pt);
cv::warpperspective(srcimg, m_src_correct, warpmatrix, srcimg.size(), cv::inter_nearest, cv::border_constant);
src_pt是原來物體的4個點座標,dst_pt是根據原來的座標計算得來的,一般是原來座標的外接矩形。
但是,實踐起來並不是這樣的,透視變換矩陣是33的,點座標是(x,y),為了相乘,點座標需要補上1,(x,y,1)。因為透視變換是三維裡面的變換,需要z座標。**中可以看到我把各個矩陣都列印出來了:
warpmatrix=
[2.175396430644075, 4.822550437851066, -786.7332303651573;
-0.5767283475053204, 2.366574943211475, 211.6593035344521;
0.0001578547637398106, 0.004169585228612301, 1]
mat_pt==
[316;
186;
1]mat_tmp=
[797.6864231586686;
469.5960851601052;
1.825424957863668]
a1=797.686 a2=469.596 a3=1.82542
在變換之後的圖上並沒有找到我畫的變換之後的中心點。應該是超出影象範圍了。。。經過一頓亂操作,左乘右乘還是不行。再仔細看看,透視變換之後好像被裁剪了一點,感覺是因為裁剪導致座標對不上了的。。。。後來同事幫忙,弄對了。說需要歸一化,讓我把得到的點第三個座標變為1,這樣歸一化同乙個平面。
哈哈,果真出來了!!!
還有個問題,就是已知透視變換之後的圖上點,如何知道該點變換之前的座標?
opencv透視變換
1 目前效果最好的乙個 但還是紙牌能檢測出來 2 下面將我修改執行成功的 貼出,至於優化,提高識別四邊形準確度,還需要繼續研究。透視變換,檢測四邊形,有時候容易檢測不出 但目前效果最好的就是該程式 include stdafx.h include core core.hpp include incl...
透視變換(高階)
透視變換比仿射變換更普遍。它們不一定保持線條之間的 平行性 但是因為它們更普遍,也更實用,幾乎所有在日常影象中遇到的變換都是透視變換。有沒有想過為什麼兩條軌道似乎在遠處會相遇?這是因為您的眼睛中的對影象好比做了透視變換,透視變換不一定保持平行線平行。如果你站在上面觀察圖1.1中的鐵軌,他們似乎根本不...
Bitmap透視變換
import flash.geom.var photo sprite new sprite addchild photo img為繼承於bitmapdata的類 var bitmapsource new img 400,300 var showline true var inbitmapwidth ...