我有用于轮换的矩阵:
CvMat* rot_mat = cvCreateMat(2, 3, CV_32FC1);
cv2DRotationMatrix(center, angle, scale, rot_mat);
...
此矩阵用于图像操作。
cvWarpAffine(..., ..., rot_mat, ..., ...);
我必须知道,这个矩阵应该如何影响精确的像素 - 它应该被转移的位置。
如何将2D点(像素位置)和我的矩阵相乘以找出应该转移像素的位置?
答案 0 :(得分:3)
我在forum找到了答案。以防链接失败是解决方案:
cv::Point2f operator*(cv::Mat M, const cv::Point2f& p)
{
cv::Mat_<double> src(3/*rows*/,1 /* cols */);
src(0,0)=p.x;
src(1,0)=p.y;
src(2,0)=1.0;
cv::Mat_<double> dst = M*src; //USE MATRIX ALGEBRA
return cv::Point2f(dst(0,0),dst(1,0));
}
答案 1 :(得分:1)
如果您已经将信息存储在cv :: Point元素中,则可以使用cv :: Mat构造函数将该信息转换为无内存副本的矩阵,例如
cv::Mat V = cv::Mat(v, false); // false to avoid memory copy
使用'V'进行操作后,您可以返回原始结构,如
V.copyTo( cv::Mat(p, false) );
您可以使用相同的构造函数解析它们的单个点或列表(std :: vector)。此示例代码可以更好地显示该想法:
#include <iostream>
#include <opencv2/core/core.hpp>
int main( )
{
std::vector< cv::Point2f > v(3);
v[0] = cv::Point2f(1, 1);
v[1] = cv::Point2f(2, 2);
v[2] = cv::Point2f(3, 3);
cv::Mat V = cv::Mat(v, false); // false to avoid memory copy
std::vector< cv::Point2f > p(3);
V.copyTo( cv::Mat(p, false) );
for (int i = 0; i < 3; ++i) {
std::cout << p[i] << std::endl;
}
return 0;
}
答案 2 :(得分:-2)
我为此实现了一些愚蠢的代码。我想应该有更复杂的解决方案:
CvMat* rot_mat;
CvPoint* p;
...
float* data = (float*)(rot_mat->data.ptr);
float newX = data[0] * p->x + data[1] * p->y + data[2];
float newY = data[3] * p->x + data[4] * p->y + data[5];