如何在OpenCv中使用转换矩阵转换图像?

时间:2014-07-17 16:42:58

标签: c++ opencv math graphics transformation

我想根据直线(y = ax + b)的大小以一个角度(arcTan(a))变换整个图像,这个角度应该只应用于所有点的y轴。

我想使用warpAffine(...)

方法,但我能够使用此方法的方法是在图像中使用点(通常为3),以便warpAffine(...)能够找出自身的角度并转换图像的那一部分,并且&# 39;不是我需要的东西,因为我想要改变整个图像而不仅仅是一块。

如果有办法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

1 个答案:

答案 0 :(得分:2)

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);

这是我得到的:

Original Image Output Image

修改

要在Y方向上应用剪切,您需要将变换矩阵更改为:

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

(实际上,剪切变换通常是cot(angle),它是tan(angle)的倒数,但是如果它给出了你想要的结果,那么就使用它。)

这是使用新转换矩阵的输出图像:

Output Image with Y-Shear