1

我想採取的仿射矩陣,我從OpenCV的有:轉換的OpenCV的仿射矩陣CGAffineTransform

Mat T = getAffineTransform(src_pt, dst_pt); 

,然後將其轉換成CGAffineTransform在覈芯顯卡/的Objective-C/iOS版應用。 (CGAffineTransform docs

我已經試過:

CGAffineTransform t = CGAffineTransformIdentity; 
t.a = T.at<float>(0,0); 
t.b = T.at<float>(0,1); 
t.c = T.at<float>(1,0); 
t.d = T.at<float>(1,1); 
t.tx = T.at<float>(0,2); 
t.ty = T.at<float>(1,2); 

這工作正常,x和y的翻譯,但如果沒有在矩陣中的任何旋轉。由於產生的圖像看起來奇怪地偏斜,似乎缺少某些東西。我試着乘以.b.c乘以-1和切換.b.c,但這兩者似乎都不起作用。圖像仍然出現不正確的傾斜。

編輯:我應該提及它的差不多正確旋轉。當我切換b和c時,它至少在正確的方向旋轉。它似乎有點偏離,因爲旋轉得有點過分。

+0

我很驚訝切換'B'和'C'沒有工作,因爲這會導致正確的旋轉。您發佈的代碼目前構建了不正確的輪換。 – Aurelius

+0

是的,我試過't.b = T.at (1,0)'和't.c = T.at (0,1)'但沒有運氣。我認爲這可能與原點有關。 – taber

回答

1

您的問題是OpenCV的是行主要和CGAffineTransform是列爲主,你要

t.a = T.at<float>(0,0); 
t.b = T.at<float>(1,0); 
t.c = T.at<float>(0,1); 
t.d = T.at<float>(1,1); 

你可以告訴,因爲在文檔CGAffineTransform採取的形式

[a b 0 
c d 0 
tx ty 1] 

注意,tx和ty是在最後一行。在標準列主要矩陣的平移分量的最右邊一列去

[a c tx 
b d ty 
0 0 1] 

如果使這種變化(這你的問題建議你已經嘗試過),但問題仍然存在,那麼你需要發佈更多信息。正如你所建議的那樣,問題可能出在你的座標系的原點上,但沒有關於你的原點的任何信息,沒有人能夠幫助你。

+0

好吧,謝謝,我會盡力用圖像等進一步更新。 – taber

+0

知道了!它是交換b和c的組合,需要將圖層的anchorPoint設置爲0,0,然後將圖像寬度的-1/2轉換爲圖像高度的-1/2。謝謝。 – taber

+0

@taber:第一部分b和c被交換 - 就是爲什麼你會得到歪斜的行爲。你可以通過在[我的仿射變換測試應用](https://github.com/boredzo/AffineTransformTest)中手動交換數字來看到這一點。 –