如何将cv::Mat转换为cv::Matx33f

3

我有一个cv::Mat,我想将其转换为cv::Matx33f。 我尝试这样做:

cv::Mat m;
cv::Matx33f m33;
.........
m33 = m;

但是所有数据都会丢失!有什么办法可以解决这个问题吗? 更新 这里是导致我的问题的代码的一部分:
cv::Point2f Order::warpPoint(cv::Point2f pTmp){
    cv::Matx33f warp = this->getTransMatrix() ; // the getter gives a cv::Mat back 
    transformMatrix.copyTo(warp); // because the first method didn't work, I tried to use the copyto function 

    // and the last try was 
    warp = cv::Matx33f(transformationMatrix); // and waro still 0 
    cv::Point3f  warpPoint = cv::Matx33f(transformMatrix)*pTmp;
    cv::Point2f result(warpPoint.x, warpPoint.y);
    return result;
}
4个回答

11

要从Mat转换为Matx,可以使用数据指针。例如,

cv::Mat m; // assume we know it is CV_32F type, and its size is 3x3

cv::Matx33f m33((float*)m.ptr());

假设 m 中有连续的内存,那么这应该能完成工作。你可以通过以下方式进行检查:

std::cout << "m " << m << std::endl;

std::cout << "m33 " << m33 << std::endl;

7
使用 m.clone().ptr() 要比 m.ptr() 更好。这样即使原始矩阵 m 在内存中不是连续的,它也能正常工作。 - Michael Burdinov
1
这将一个uchar *转换为float *?这样做没问题吗? - simplename
我与@simplename一同。当以这种方式访问和转换指针时,类型安全确实无法保证。 - Hermann

1

我知道这个问题的提问已经很久了,但是以下方法也可以解决:

auto m33 = Matx33f(m.at<float>(0, 0), m.at<float>(0, 1), m.at<float>(0, 2),
                   m.at<float>(1, 0), m.at<float>(1, 1), m.at<float>(1, 2),
                   m.at<float>(2, 0), m.at<float>(2, 1), m.at<float>(2, 2));

虽然这确实可行,但编写起来相当繁琐。我期望转换可在没有显式元素访问的情况下进行。 - Hermann

0

现在,cv::Mat类中有专门的转换运算符可用于双向转换:

cv::Mat {
    template<typename _Tp, int m, int n> operator Matx<_Tp, m, n>() const;
}

        cv::Mat tM = cv::getPerspectiveTransform(uvp, svp);
        auto ttM = cv::Matx33f(tM);
        ...
        tM = cv::Mat(ttM);

你在哪里找到这个转换的? - simplename
@simplename 它已经存在了超过10年,但是文档不太完善 - Hermann

0

这对我来说运作正常: Matx33f m(1, 2, 3, 4, 5, 6, 7, 8, 9); Mat x = Mat(m); std::cout << x; - Barshan Das
说实话,我不明白为什么它在这里不起作用。我从另一个类中获取了框架,应该可以正常工作,因为我写了一个简单的主函数并且它确实起作用 :),但是非常感谢您的回答!我认为这是正确的! - Engine
@Engine 这个示例展示了如何从Matx转换为Mat,但是如何轻松地将Mat转换为Matx呢? - eruditass
@Eruditass 抱歉,我记不起来了。 - Engine
17
这并没有回答这个问题(将cv :: Mat转换为cv :: Matx)。 - kmac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接