如何在创建时强制cv::Mat中的数据类型为float ?
How do you force the type of data in a cv::Mat to be float upon creation?
当迭代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 nonFloatMat
和floatMat
,当第一个是源矩阵,最后一个是目标矩阵,
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...
相关文章:
- Difference in displaying cv2 Mat
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 将CHW格式的浮点向量转换为cv::Mat
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- C++中的openCV Mat访问冲突
- 没有从阵列<float>到阵列<int>的可行转换
- 数组下标的类型"float*[float]"无效
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 在矢量到矢量中复制数据<float> <Mat> (Opencv/C++)
- OpenCV从float*数组构造Mat
- 如何在创建时强制cv::Mat中的数据类型为float ?
- 将Mat转换为**float
- 如何将 Mat(CV_32FC1) 复制到矢量<float>*
- 在cv::Mat中将float转换为uchar的偏移量
- 如何在OpenCV中限制float类型Mat精度