如何在创建时强制cv::Mat中的数据类型为float ?

How do you force the type of data in a cv::Mat to be float upon creation?

本文关键字:Mat float 数据类型 cv 创建      更新时间:2023-10-16

当迭代cv::Mat以输出其所有值时,您可以执行以下操作:

for (int r = 0; r < t.rows; r++)
{
    for (int c = 0; c < t.cols; c++)
    {
        std::cout << t.at<float>(r,c) << ", ";
    }
    std::cout << std::endl << std::endl;
}

但是,如果存储在该数组中的信息不是float类型,则会崩溃。如何强制这个矩阵的类型?

对于2 Mats nonFloatMatfloatMat,当第一个是源矩阵,最后一个是目标矩阵,

nonFloatMat.convertTo(floatMat, CV_32F); //if its a color image use CV_32FC3, or 
                                         // CV_32FC4 if its RGBA

convertTo的引用可以在这里找到。

编辑:

,顺便说一下,如果你将浮动更改为正确的具体类型的矩阵,代码将工作,例如,如果垫子是CV_8U,你可以做t.at<char>(r,c)

当Boaz正确回答您的问题时,转换您的矩阵会增加一个新问题。您的函数将分配一些新的内存,将转换数据,然后将执行计算。

这会给函数增加很大的开销。解决方案是为您希望支持的每种数据类型创建一个分支。这是OpenCV处理多种数据类型的方式(当然,它比if-else聪明一点)

if(mat.type()==CV_32FC1)
{
}
else if(mat.type()==CV_32FC3)
{
}
else if(mat.type()==CV_8UC3)
{
}
...

另一个解决方案,如果您的唯一目的是打印矩阵

cout << myMat << endl;

很棒吧?

您也可以使用名为Mat_的模板包装器类。

因此,要"强制"矩阵的类型为float,您可以执行以下操作:

Mat_<float> A(100, 100);

另外,另一种确保矩阵是特定类型的方法(这在OpenCV源代码中做得相当多)是使用断言。

:

void functionOnlyUsesFloatMats(const Mat& src)
{
    CV_Assert( src.type() == CV_32FC1 );
    // now you can be assured that only single-channel float matrices reach this code...
}

或者,您可以在继续之前检查类型,并在需要时进行转换:

Mat floatMat;
if(src.type() != CV_32FC1)
{
    src.convertTo(floatMat, CV_32F);
}
else
{
    floatMat = src;
}
// proceed with float calculations...