opencv error multiplying 2 Mat's

我怕爱的太早我们不能终老 提交于 2021-01-22 05:18:29

问题


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.


回答1:


(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 )



来源:https://stackoverflow.com/questions/15049811/opencv-error-multiplying-2-mats

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!