2013-02-24 4 views
5

Ich multipliziere 2 Matrizen (Mat Objekte) in opencv.Opencv Fehler Multiplikation 2 Mat's

Hier ist, wie erste Mat generiert wurde:

cv::Mat R(m, k, CV_8UC1); 
rm.generateRandomMatrix(m, k, 255, R); 

Hier ist, wie die zweite generiert wurde:

for (int i=0; i<=n; i++) 
{ 
    randomMatrix_Xi rm; 
    cv::Mat Xi(k, 1, CV_8UC1); 
    rm.generateRandomMatrix(k, 1, 255, Xi); 
    random_Xi_Vectors.push_back(Xi); 
    sleep(2); 
} 

Hier ist die generateRandomMatrix() Funktion Definition, die ich in beiden Orten verwendet haben :

int randomMatrix_Xi::generateRandomMatrix(int m, int k, int range, cv::Mat R) 
{ 
    typedef boost::mt19937 RNGType; 
    RNGType rng(std::time(0)); 
    boost::uniform_int<> one_to_range(1, range); 
    boost::variate_generator< RNGType, boost::uniform_int<> > number_generator(rng, one_to_range); 
    for (int j=0; j<k; j++) 
    { 
     for (int i = 0; i < m; i++) 
     { 
      int n = number_generator(); 
      R.at<uchar>(i,j) = n; 
      //std::cout<<"Putting "<<n<<" at"<<i<<", "<<j<<std::endl; 
     } 
    } 
} 

Endlich, hier ist der Ort, an dem ich die Multiplikation mache zwei Mat:

for (int i = 0; i < n; i++) 
    { 
     std::cout<<" Sizes of matrices to be multiplied: "<<std::endl; 

     cv::Size Xi_size = random_Xi_Vectors[i].size(); 
     cv::Size A_size = R.size(); 
     std::cout<<"R : "<<A_size.height<<" "<<A_size.width<<std::endl; 
     std::cout<<"Xi : "<<Xi_size.height<<" "<<Xi_size.width<<std::endl; 

      cv::Mat temp(960,1, CV_8UC1); 
     cv::Mat temp = random_Xi_Vectors[i] * R; 
     shares.push_back(temp); 
    } 

Und das ist der Fehler Ich erhalte:

[email protected]:~/l33t/Secret Sharing$ ./mainProgram Sizes of matrices to be multiplied: 
R : 960 2 
Xi : 2 1 
OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) in gemm, file /build/buildd/opencv-2.3.1/modules/core/src/matmul.cpp, line 701 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /build/buildd/opencv-2.3.1/modules/core/src/matmul.cpp:701: error: (-215) type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2) in function gemm 

Aborted (core dumped) 
[email protected]:~/l33t/Secret Sharing$ 

Wie Sie sehen können, die Anzahl der Spalten in der ersten Matte entspricht die Anzahl der Zeilen in der zweiten Matte. Auch der Typ der beiden Mat ist der gleiche, d. H. CV_8UC1. Warum bekomme ich diesen Fehler? Bitte helfen Sie.

+0

Ihre Fehlermeldung sagt "Assertion failed" und sagt dann welche. –

+1

Ja, anscheinend ist die Multiplikation nur auf CV_xxFCHx erlaubt und nicht auf anderen. Ich habe es repariert. Vielen Dank. – Chani

Antwort

3
(type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2) 

, die eindeutig sagt, können Sie nur multiplizieren

so verwenden CV_32FC1 (float) oder CV_64FC1 (double) Mats anstelle des CV_8UC1

(Code wie diesen Punkt Mat floating:

boost::variate_generator<RNGType,boost::uniform_int<>> number_generator(rng,one_to_range); 

müssen möglicherweise dann auch ändern, nicht sicher)

+0

Danke, ich habe das Problem gefunden und die Mat-Typen in 'CV_32FC1' geändert. Das hat funktioniert. Außerdem musste ich die Typ-Zuordnung zu den Mat-Elementen im Zufallsgenerator ändern. – Chani