Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

convert vector of points to Mat (OpenCV )

my question is very similar to this one... I'm trying to extract a sub matrix from a grayscale image wich is a polygon by 5 points , and convert it to a Mat.

This does not work:

std::vector<Point> vert(5);
vert.push_back(pt1);
vert.push_back(pt2);
vert.push_back(pt3);
vert.push_back(pt4);
vert.push_back(pt5);

Mat matROI = Mat(vert);

It shows me the following error message:

OpenCV Error: Bad number of channels (Source image must have 1, 3 or 4 channels) in cvConvertImage, file /home/user/opencv-2.4.6.1/modules/highgui/src/utils.cpp, line 611
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/user/opencv-2.4.6.1/modules/highgui/src/utils.cpp:611: error: (-15) Source image must have 1, 3 or 4 channels in function cvConvertImage

I'm using OpenCV 2.4.6.1 and C++.

Thank you

Edit:

I will rephrase my question: my objective is to obtain the right side of the image.

I thought I'd see the image as a polygon because I have the coordinates of the vertices, and then transform the vector that has the vertices in a matrix (cvMat).

My thought is correct or is there a simpler way to get this submatrix?

like image 534
jp23 Avatar asked Sep 29 '13 21:09

jp23


1 Answers

Your code has two problems:

First:

std::vector<Point> vert(5);

creates a vector initially with 5 points, so after you use push_back() 5 times you have a vector of 10 points, the first 5 of of which are (0, 0).

Second:

Mat matROI = Mat(vert);

creates a 10x1 Mat (from a vector of 10 points) with TWO channels. Check that with:

cout << "matROI.channels()=" << matROI.channels() << endl;

If you have a code like:

imshow("Window", matROI);

it will pass matROI through to cvConvertImage() which has the following code (and this causes the error you are seeing):

if( src_cn != 1 && src_cn != 3 && src_cn != 4 )
    CV_ERROR( CV_BadNumChannels, "Source image must have 1, 3 or 4 channels" );

Since matROI is a list of points, it doesn't make sense to pass it to imshow(). Instead, try this:

Mat img(image.rows, image.cols, CV_8UC1);
polylines(img, vert, true, Scalar(255)); // or perhaps 0
imshow("Window", img);
int c = waitKey(0);
like image 193
Bull Avatar answered Sep 23 '22 15:09

Bull