我想根据直线(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
答案 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);
这是我得到的:
要在Y方向上应用剪切,您需要将变换矩阵更改为:
1 0 0
-tan(angle) 1 0
0 0 1
(实际上,剪切变换通常是cot(angle)
,它是tan(angle)
的倒数,但是如果它给出了你想要的结果,那么就使用它。)
这是使用新转换矩阵的输出图像: