簡體   English   中英

如何在opencv中了解warpAffine的源代碼

[英]How to understand the source code of warpAffine in opencv

我正在研究opencv中cv::warpAffine()的源代碼,但有2個問題。

這是第一個問題。 就像下面的代碼一樣,在通過調用函數cv::getAffineTransform()計算轉換矩陣之后,我們將調用cv::warpAffine()來扭曲圖像。

cv::Point2f src[3], dst[3];
src[0] = cv::Point2f(35.148750, 255.26263);
src[1] = cv::Point2f(293.08679, 215.27223);
src[2] = cv::Point2f(153.83780, 168.80141);

dst[0] = cv::Point2f(35.000000, 275.00000);
dst[1] = cv::Point2f(293.00000, 215.00000);
dst[2] = cv::Point2f(116.00000, 126.00000);

cv::Mat image = cv::imread("C:/Users/CJZ/Desktop/TestSample/eye_test.jpg");
cv::Mat reslt = cv::Mat(image.rows * 1.3, image.cols * 1.3, image.type(), cv::Scalar::all(255));

cv::Mat warpMat = cv::getAffineTransform(src, dst);
cv::warpAffine(image, reslt, warpMat, reslt.size());

當我看到cv::warpAffine()的源代碼時,我發現再次重新計算了轉換矩陣。

if( !(flags & WARP_INVERSE_MAP) )
{
    double D = M[0]*M[4] - M[1]*M[3];
    D = D != 0 ? 1./D : 0;
    double A11 = M[4]*D, A22=M[0]*D;
    M[0] = A11; M[1] *= -D;
    M[3] *= -D; M[4] = A22;
    double b1 = -M[0]*M[2] - M[1]*M[5];
    double b2 = -M[3]*M[2] - M[4]*M[5];
    M[2] = b1; M[5] = b2;
}

這種計算是什么意思?

這是第二個問題。 我在源代碼中發現了一些枚舉變量,它們使我感到困惑。 看來我們可以使用它們來優化速度,但是為什么呢? 我希望有人可以給我有關優化的詳細信息。

enum
{
    INTER_BITS=5, INTER_BITS2=INTER_BITS*2,
    INTER_TAB_SIZE=(1<<INTER_BITS),
    INTER_TAB_SIZE2=INTER_TAB_SIZE*INTER_TAB_SIZE
};

還有最后一件事。 我發現cv::warpAffine的體系結構龐大且對我來說很困難。 有關於它的文章嗎?

關於您的最后一個問題:看看喬治·沃爾伯格(George Wolberg)關於“數字圖像變形”的書,其中涵蓋了仿射(2D)變形。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM