2012-07-25 3 views
3

(cv::calcCovarMatrix을 사용하여) 다중 채널 이미지 패치의 공분산을 계산하려고하므로이 패치에서 픽셀의 Mahalonobis distance을 계산할 수 있습니다. 그리고 나는 오른쪽을 찾기 위해 정말 고심하고 있습니다. 행렬을 올바른 형식으로 재 형성하는 옵션. 예를 들어 점의 벡터로 이미지

내 행렬은 3 행 4 열 2 개 채널의 경우 : 나 3 × 4 = 12 행, 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 

를 (또는 그 전치) :

// 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. 이 이력서 :: calcCovarMatrix에 대한 올바른 형식인가?
  2. 이것을 달성하기 위해 .resape()에 필요한 매개 변수는 무엇입니까?

코드의 예 :

#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; 
} 
+0

내가 여기서 찾을 수 있습니다 귀하의 질문에 모두 답을 생각 : 당신이 그것을 docs.opencv.org 시도 했습니까? – Sam

+0

그건 내가 가장 많이 클릭 한 링크 중 하나이며, 내가 함수를 링크 한 곳입니다. calcCovarMatrix에 대한 입력은'샘플을 별도의 행렬 또는 행렬/단일 행렬의 열로 저장해야합니다 .'라고하며, 현재 http://docs.opencv.org/에서 제안 사항을 이해하려고합니다. modules/core/doc/basic_structures.html # mat-reshape을 사용하면 해당 요구 사항을 충족하고 만족시킬 수 있습니다. 내가 놓친 문서의 특정 위치가 더 있습니까? – Chris

답변

0

테스트하지,하지만 문서와 calcCovarMatrix() 구현을보고, 당신은

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

또는

cv::Mat reshaped = merged.reshape(1,3*4); 
같은 것을해야

calcCovarMatrix()는 열 matri ces 및 행 - 행렬. 당신은 opencv/modules/core/src/matmul.cpp의 코드를 살펴 수

, 라인 2097

+0

'.reshape (1,1)'은 내가 겪어 본 것과 같은 문제를 일으킨다 : 1 row, 24 cols. 그러나, .reshape (1,12)는 그렇게 작동합니다. – Chris