c++ - 图像到点 vector

标签 c++ opencv

我正在尝试计算多 channel 图像 block 的协方差(使用 cv::calcCovarMatrix ),因此我可以依次计算 Mahalonobis distance来自该补丁的像素,我真的很难找到正确的选项来将矩阵 reshape 为正确的格式。

例如,如果我的矩阵有 3 行、4 列和 2 个 channel :

// Channel 1:
1 2 3 4
5 6 7 8
9 0 1 2

// Channel 2:
99 98 97 96
95 94 93 92
91 90 89 88

我认为我需要的是将图像 reshape 为 3x4=12 行和 2 列(或其转置)的形状:

// Desired result:
1  2  3  4  5  6  7  8  9  0  1  2
99 98 97 96 95 94 93 92 91 90 89 88
  1. 这是 cv::calcCovarMatrix 的正确格式吗?
  2. .reshape() 需要哪些参数才能实现此目的?

代码示例:

#include <opencv2/opencv.hpp>
int main(int argc, char* argv[])
{
    // Construct channel 1
    cv::Mat_<float> channel1 = (cv::Mat_<float>(3, 4) << 1.0, 2.0, 3.0, 4.0,
                                                         5.0, 6.0, 7.0, 8.0,
                                                         9.0, 0.0, 1.0, 2.0);
    std::cout << "Channel 1: " << std::endl;
    std::cout << channel1 << std::endl;

    // Construct channel 2
    cv::Mat_<float> channel2 = (cv::Mat_<float>(3, 4) << 99.0, 98.0, 97.0, 96.0,
                                                         95.0, 94.0, 93.0, 92.0,
                                                         91.0, 90.0, 89.0, 88.0);
    std::cout << "Channel 2: " << std::endl;
    std::cout << channel2 << std::endl;

    // Merge together
    std::vector<cv::Mat> stack;
    cv::Mat merged;
    stack.push_back(channel1);
    stack.push_back(channel2);
    cv::merge(stack, merged);
    std::cout << "Merged:" <<std::endl;
    std::cout << merged << std::endl;

    // Reshape
    cv::Mat reshaped = merged.reshape(0,1).reshape(1); // <----Need help with this line
    std::cout << "Reshaped:" <<std::endl;
    std::cout << reshaped << std::endl;

    return 0;
}

最佳答案

未测试,但查看文档和 calcCovarMatrix() 实现,您应该做类似的事情

cv::Mat reshaped = merged.reshape(1,1);

cv::Mat reshaped = merged.reshape(1,3*4);

似乎 calcCovarMatrix() 可以处理列矩阵和行矩阵。

你可以看看opencv/modules/core/src/matmul.cpp中的代码,第2097行

关于c++ - 图像到点 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11651205/

相关文章:

python - 如何计算android相机捕获的图像中物体的深度

matlab - 使用 OpenCV 和 python 从图像中提取对象(指纹和签名)

c++ - 为什么在调用 QXYSeries::replace() 后,当 size() 尚未超过capacity() 时,QVector 的地址会发生变化?

c++ - 二维数组的意外初始化结果

c++ - C++ 标准是否规定这两种访问数组的方法是相同的还是不同的?

c++ - 使用 c++0x Lambda 表达式时调用不匹配

C++ std::iterator 内部不使用 std::vector 或 std::list

opencv - 如何获取 OPENCV 实现中关键点的方向比例位置信息?

opencv - 如果我们有一个结构元素全为0或为0的组合且不关心,那么空白图像的Dilation输出应该是什么

c - OpenCV 较低的颜色值