3

( cv::calcCovarMatrixを使用して) マルチチャネル画像パッチの共分散を計算しようとしているので、そのパッチからピクセルのマハロノビス距離を計算できます。行列を正しい形式に変換します。

たとえば、マトリックスに 3 行、4 列、および 2 チャネルがある場合:

// 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

私が必要だと思うのは、画像を 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;
}
4

1 に答える 1

0

テストされていませんが、ドキュメントと calcCovarMatrix() の実装を見て、次のようにする必要があります

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

また

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

calcCovarMatrix() は、列行列と行行列の両方を処理できるようです。

opencv/modules/core/src/matmul.cpp2097 行のコードをご覧ください。

于 2012-07-25T14:57:40.307 に答える