0

如果在使用 C++ API 的 openCV 中创建旋转矩阵,如果我写

       Mat rot_matrix = getRotationMatrix2D(src_center, angle, 1.0);

那么我应该如何用C在openCV中编写它?我应该写什么而不是 Mat?是不是这样:-

         CvMat* rot_mat =cv2DRotationMatrix( center, angle, scale, rot );

上述声明是否正确?如果是,那么我如何在包装仿射函数中表示它?是不是这样:-

         cvWarpAffine( src, dst, rot_mat);
4

2 回答 2

1

根据我们在评论区的小聊天,我认为您有些困惑,因此我决定给您写一个答案,以使其更清楚一些。

首先对于您所写的原始问题Mat确实是 C++ 形式。

在 C 中,您使用CvMat但该函数 cv2DRotationMatrix()已经CvMat *作为参数的一部分,因此它可以像这样使用:

 cv2DRotationMatrix(center,angle,scale,rot_mat);

在哪里:

  • center 是CvPoint2D32f,源图像中旋转的中心(宽度/2,高度/2)。
  • angle - 所需的旋转角度(以度为单位)。
  • scale – 各向同性比例因子(1 表示图片将保持相同大小)
  • mapMatrix – 指向目标矩阵的指针(将用作旋转矩阵的 2x3 矩阵)

现在 rot_mat 将保存旋转矩阵:

在此处输入图像描述

在哪里:

在此处输入图像描述

现在您想在将整个图片旋转 x 度后计算每个像素的位置(对像素/图像/图像进行仿射变换)。

在这个阶段,您拥有在仿射变换中使用的旋转矩阵,并且您想要进行仿射变换(旋转图像),以便您可以使用该函数cvWarpAffine()

在我们的例子中:

cvWarpAffine( src, dst, rot_mat );

在哪里:

  • src - 源图像
  • dst - 目标图像
  • rot_mat 作为我们的 mapMatrix(变换矩阵)

*还有第四个参数是flag,但对于我们的情况,默认值是可以的。

它能做什么?

使用指定的矩阵变换源图像:

在此处输入图像描述

在此处输入图像描述

*或者用我之前描述的更简单的话来说,它“只是”计算旋转后每个像素的新位置(使用旋转矩阵 - 作为仿射函数的输入)。

rot_mat 应该是 2x3 mat - 你可以通过调用来创建它cvCreateMat()

src,dst 是IplImage *(因为我们说它是 c 代码)。

*函数的技术方面来自: http: //opencv.willowgarage.com/documentation/geometric_image_transformations.html

于 2013-07-11T14:52:58.627 回答
0

似乎将 C++ 程序移植到 C。根据Wikipedia,您可以根据自己的目的寻找 C 接口。

如果参数不是引用而是指针,声明似乎是正确的,因为 C 不支持引用。

您可以使用指针来包装类对象。它会像:

CvMat * cv2dRotationMatrix( CvPoint *, CvAngle *, float );

正如您所指出的,您需要将 C++ 函数包装在纯 C 函数下。

于 2013-07-11T09:28:56.433 回答