将点矢量转换为Mat(OpenCV)

时间:2013-09-29 21:57:59

标签: c++ opencv image-processing

我的问题与this非常相似...我试图从一个多边形的灰度图像中提取一个子矩阵5个点,并将其转换为Mat。

这不起作用:

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

它显示以下错误消息:

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

我正在使用OpenCV 2.4.6.1和C ++。

谢谢

修改

我将重新提出我的问题:我的目标是获得image的右侧。

我以为我会将图像看作多边形,因为我有顶点的坐标,然后在矩阵中转换具有顶点的矢量(cvMat)。

我的想法是正确的还是有更简单的方法来获得这个子矩阵?

1 个答案:

答案 0 :(得分:5)

您的代码有两个问题:

首先:

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

最初创建一个带有5个点的向量,因此在使用push_back() 5次后,你得到10个点的向量,其中前5个为(0, 0)

第二

Mat matROI = Mat(vert);

使用 TWO 频道创建一个10x1 Mat(来自10个点的矢量)。检查:

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

如果您有以下代码:

imshow("Window", matROI);

它会将matROI传递给cvConvertImage(),其中包含以下代码(这会导致您看到的错误):

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

由于matROI是一个点列表,因此将其传递给imshow()是没有意义的。 相反,试试这个:

Mat img(image.rows, image.cols, CV_8UC1);
polylines(img, vert, true, Scalar(255)); // or perhaps 0
imshow("Window", img);
int c = waitKey(0);