larsen
larsen

Reputation: 1

Substracting two matrices with different sizes, OpenCV error

I am trying to make a program, which finds homogeneous coordinates from two same pictures, but where the objects have been rotated or translated and then taking the first picture and overlay it on the second picture.

The problem is, that i am getting a Matrix error, because i have different matrix sizes.

I have found the solution, which i need to apply to rotate and translate to get the first picture on the second (the values, which i have to apply on the second matrix)

This is my code:

    Size size(image2.cols, image2.rows);

    Mat dest = cv::Mat::zeros(image2.rows, image2.cols, CV_32FC2);

    warpAffine(image2, dest, t, size);

    namedWindow("manipulated img", CV_WINDOW_NORMAL);
    imshow("manipulated img", dest);

    Mat output;

    cout << image1.size() << endl;
    cout << dest.size() << endl;

    bitwise_and(dest, image1, output);

    //subtract(dest, image1, output);
    namedWindow("output img", CV_WINDOW_NORMAL);
    imshow("output img", output);

I get the following error:

> [3722 x 2937] 
> [3722 x 2932] 
> OpenCV Error: Sizes of input arguments do
> not match (The operation is neither 'a rray op array' (where arrays
> have the same size and type), nor 'array op scalar' , nor 'scalar op
> array') in cv::binary_op, file C:\builds\master_PackSlave-win32
> -vc12-shared\opencv\modules\core\src\arithm.cpp, line 1573

I think i know what the problem is, but i dont know what the solution is.

The Matrices have different size

image1.size() = [3722 x 2937] 
dest.size() = [3722 x 2932]

What can i do, to solve this?

Upvotes: 0

Views: 1421

Answers (2)

I suspect you just need to make dest be the size of image1, not image2. There is a very good chance that warpAffine will cope fine.

Upvotes: 1

Airman00
Airman00

Reputation: 336

  1. Create a new matrix (newDest) of the same size as image1
  2. Set newDest to Zero
  3. Copy the dest matrix to the newDest to the Region of Interest that you want ( you can set left, top to 0,0 if you want the new matrix to be in the top corner)

Like this:

src.copyTo(dst(Rect(left, top, src.cols, src.rows))); // left and top are the x,y position of where this Mat is going

Similar link: Copy an cv::Mat inside a ROI of another one

Upvotes: 0

Related Questions