c++ - cv::Mat 初始化使用数组

标签 c++ arrays opencv mat

例如初始化后我遇到了一个奇怪的行为

#include <iostream>
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat h = cv::Mat(2, 2, CV_32F, {1.0, 2.0, 1.0, 0.0});
    std::cout << h << std::endl;
    return 0;
}

cout 打印出 [1, 1; 1, 1]。 WTF刚刚发生?我在 ubuntu 上使用 eclipse,gcc 5.4 版,OpenCV 3.2

最佳答案

您没有使用有效的 Mat构造函数。您有几个选择:

  1. 来自数组:

    float pf[] = { 1.f, 2.f, 3.f, 4.f };
    Mat1f m1(2, 2, pf);
    

    std::vector<float> vf = { 1.f, 2.f, 3.f, 4.f };
    Mat1f m2(2, 2, vf.data());
    
  2. 使用逗号初始值设定项:

    Mat1f m3 = (Mat1f(2, 2) << 1.f, 2.f, 3.f, 4.f);
    
  3. 如果矩阵很小,可以用Matx :

    Matx22f m4(1.f, 2.f, 3.f, 4.f);
    

请注意 Mat1fMat_<float> 的类型定义,这是一个 Mat类型 CV_32FC1 .


使用您的方法无效,因为 {1.0, 2.0, 1.0, 0.0}构造 cv::Scalar , 所以你调用构造函数 Mat(int rows, int cols, int type, cv::Scalar) .由于您只有一个 channel ,因此矩阵使用此标量的第一个值进行初始化,这是您的初始化列表中的第一个值。

请注意,这只是巧合,因为您的矩阵有 4 个元素(Scalar 支持的最大数量)。如果您使用更多的元素:

cv::Mat h(2, 3, CV_32F, {3.f, 2.f, 1.f, 0.f, 2.f, 5.f});

代码不应编译。

关于c++ - cv::Mat 初始化使用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44965940/

相关文章:

c++ - 寻找高级 C++ SSL 库

arrays - 初始化数组与分配内存有何不同?

Delphi:TImage.Create 导致访问冲突

python - 如何使用 opencv 和 Python 读取用户的 "ctrl+q"输入?

c++ - 自动检查我的应用程序的新版本

python - 用 pybind11 包装一个 C++ 分配的实例

c++ - 取消选择单选按钮

将int数组(十进制相当于ASCII中的一个字符)转换为C语言中的字符串

python - 在图像中查找图像(使用 CV2)

成功清理和构建后 JavaCV 无法运行