【问题标题】:how to transform an image with a transformation Matrix in OpenCv?如何在 OpenCv 中使用变换矩阵变换图像?
【发布时间】:2014-07-17 16:42:57
【问题描述】:

我想根据具有角度 (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

【问题讨论】:

  • "...但它要求目标顶点..." - 我不这么认为,你确定你检查了the documentation
  • 谢谢,我编辑了我的问题。事实上,我确实给了它一个变换矩阵,但我不知道如何用我找到的角度来表示它
  • 您能否向我们展示您的代码中生成转换矩阵然后扭曲图像的部分?
  • 这是我到现在为止的成就

标签: c++ opencv math graphics transformation


【解决方案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 轴上应用此转换
  • @Namine 这就是你想要的吗?
  • @breaker 谢谢 :)
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2014-03-31
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多