c++ - 如何在 OpenCv 中使用变换矩阵变换图像?

标签 c++ opencv math graphics transformation

我想根据直线 (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);

这是我得到的:

Original Image Output Image

编辑

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

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

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

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

Output Image with Y-Shear

关于c++ - 如何在 OpenCv 中使用变换矩阵变换图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24809142/

相关文章:

c++ - 请帮我找出为什么我陷入无限循环?

c++ - 在 Qt 中使用 Wt

c++ - 如何用四元数来描述大于360度的旋转角度?

android - 使用额外的模块为 android 构建 opencv 3.0

opencv_traincascade 找不到正样本

opencv - 如何访问opencv中的视差值

opencv - 立体三角测量的奇怪问题 : TWO valid solutions

algorithm - 将英语单词分为罕见和常见

Java- 在公式方面需要帮助

c++ - 如何将数据从 C++ 导出到 MatLab