Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

opencv error multiplying 2 Mat's

Tags:

c++

opencv

matrix

I am multiplying 2 matrices (Mat objects) in opencv.

Here is how first Mat was generated :

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

Here is how the second one was generated:

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);
}

Here is the generateRandomMatrix() function definition which I have used in both places:

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;
        }
    }
}

Finally, here is the place where I am doing the multiplication of the two Mat's:

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);
    }

And this is the error I am getting:

r@r-HP-Mini-110:~/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)
r@r-HP-Mini-110:~/l33t/Secret Sharing$ 

As you can see, the number of columns in the first Mat matches the number of rows in the second Mat. Also, the type of both the Mat is the same i.e CV_8UC1. So then why am I getting this error. Please help.

like image 570
Chani Avatar asked Feb 24 '13 08:02

Chani


1 Answers

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

that clearly says, you can only multiply floating point Mat's

so use CV_32FC1 (float) or CV_64FC1 (double) Mats instead of the CV_8UC1

( code like this:

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

might need to change then, too, not sure )

like image 176
berak Avatar answered Oct 13 '22 01:10

berak