我想根据直线 (y=ax+b) 的大小和角度 (arcTan(a)
) 来转换整个图像,这个角度应该只应用于 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)
的倒数,但是如果它给你想要的结果,那么使用它。)
这是使用新变换矩阵的输出图像:
关于c++ - 如何在 OpenCv 中使用变换矩阵变换图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24809142/