【问题标题】:Transform image via a given matrix using OpenCv使用 OpenCv 通过给定矩阵变换图像
【发布时间】:2017-12-12 20:26:44
【问题描述】:

我想要做的是使用(Matlab)变换矩阵变换图像。它是以下 3x3 维度的 2D 变换矩阵:

aaa   bbb   0
ccc   ddd   0
eee   fff   1

我在这里找到了一个很好的解释:how to transform an image with a transformation Matrix in OpenCv? 但我无法填充 3x3 矩阵(并将其应用于图像)。这是我的代码:

cv::Mat t(3,3,CV_64F,cvScalar(0.0));

t.at<double>(0, 0) = aaa;
t.at<double>(1, 0) = bbb;
t.at<double>(2, 0) = 0;

t.at<double>(0, 1) = ccc;
t.at<double>(1, 1) = ddd;
t.at<double>(2, 1) = 0;

t.at<double>(0, 2) = eee;
t.at<double>(1, 2) = fff;
t.at<double>(2, 2) = 1;  

cv::Mat dest;
cv::Size size(imageToTransform.cols,imageToTransform.rows);
warpAffine(imageToTransform, outputImage, t, size, INTER_LINEAR, BORDER_CONSTANT);

imshow("outputImage", outputImage);

导致以下错误:

OpenCV 错误:断言失败 ((M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 2 && M0.cols == 3)

知道这里有什么问题吗?

【问题讨论】:

  • 这里不是opencv行家,但是看到断言,你的矩阵需要有2行
  • @Lovy 但导致 cv::Mat t(3,3,CV_64F,cvScalar(0.0)); 不是 3 行?
  • warpAffine 函数要求转换矩阵是 2x3 矩阵,但在您的情况下它是 3x3 矩阵。

标签: c++ matlab opencv matrix


【解决方案1】:

warp affine中使用的变换矩阵是仿射变换矩阵,representation如下:

a11 a12 b1
a21 a22 b2
0   0   1

这意味着它确实是一个 3x3 矩阵。但是 OpenCV 并不关心最后一行,因为它总是相同的(查看之前的链接)。然后,您可以消除这一行并获得input needed (2x3):

a11 a12 b1
a21 a22 b2

getAffineTransform 中,您可以看到他们为什么想要这样(将同质点映射到新的 2d 点并且已经在 2d 中并避免额外的乘法)。

你有一个类型的矩阵:

aaa   bbb   0
ccc   ddd   0
eee   fff   1

这似乎以某种方式转置?因为我不知道你是如何生成矩阵的,所以我不能确定。也许您已经转置它,然后将其分配给 opencv(或直接执行)。有趣的部分是(有意或无意地)您在 C++ 代码中使用了矩阵转置。请记住,在大多数情况下,OpenCV 表示法通常是(行、列)。

您的代码应如下所示:

cv::Mat t(2,3,CV_64F,cvScalar(0.0));

t.at<double>(0, 0) = aaa;
t.at<double>(1, 0) = bbb;

t.at<double>(0, 1) = ccc;
t.at<double>(1, 1) = ddd;

t.at<double>(0, 2) = eee;
t.at<double>(1, 2) = fff;

cv::Mat dest;
cv::Size size(imageToTransform.cols,imageToTransform.rows);
warpAffine(imageToTransform, outputImage, t, size, INTER_LINEAR, BORDER_CONSTANT);

imshow("outputImage", outputImage);

我希望这可以帮助您解决问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2014-03-31
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多