簡體   English   中英

如何在OpenCv中使用轉換矩陣轉換圖像?

[英]how to transform an image with a transformation Matrix in OpenCv?

我想根據具有角度( arcTan(a) )的直線(y = ax + b)的大小來變換整個圖像,該角度應僅應用於所有點的y軸。

我想使用warpAffine(...)

方法,但是我能夠使用此方法的方法是在圖像中使用點(通常為3個),以便warpAffine(...)可以找出自身的角度並變換圖像的該部分,這不是我所需要的。需要,因為我想變換整個圖像而不僅僅是一塊。

如果有辦法用warpAffine(...)或任何其他方法來做到這一點,請告訴我

cv::Mat t(3,3,CV_64F);
t=0;

t.at<double>(0,0) = 1;    
t.at<double>(1,1) = 1; 
t.at<double>(0,1) = -tan(0.17);    
t.at<double>(2,2) = 1;


cv::Mat dest;
cv::Size size(imgb1.cols,imgb1.rows);
warpAffine(imgb1, dest, t, size, INTER_LINEAR, BORDER_CONSTANT);

imshow("outputImage.jpg", dest);

到現在為止,這是我可以實現的,我的轉換矩陣是這樣的:

1 -tan(angle) 0
0     1       0
0     0       1

warpAffine采用2x3矩陣; 只需忽略轉換的最底行即可。 (我還更改了矩陣初始化。)這對我有用:

    cv::Mat t(2,3,CV_64F, cvScalar(0.0));

    t.at<double>(0,0) = 1;    
    t.at<double>(1,1) = 1; 
    t.at<double>(0,1) = -tan(0.17);    
//    t.at<double>(2,2) = 1;


    cv::Mat dest;
    cv::Size size(smiley_image.cols,smiley_image.rows);
    warpAffine(smiley_image, dest, t, size, INTER_LINEAR, BORDER_CONSTANT);

    imshow("outputImage", dest);

這是我得到的:

原始圖片輸出圖像

編輯

要在Y方向上應用剪切,您需要將變換矩陣更改為:

1               0       0
-tan(angle)     1       0
0               0       1

(實際上,剪切變換通常是cot(angle) ,它是tan(angle)的倒數,但如果它可以為您提供所需的結果,則可以使用它。)

這是使用新轉換矩陣的輸出圖像:

Y剪切輸出圖像

暫無
暫無

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

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