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.
(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 )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With