5

我的问题与这个问题非常相似......我正在尝试从灰度图像中提取一个子矩阵,该图像是一个由 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++。

谢谢

编辑:

我将改写我的问题:我的目标是获得图像的右侧。

我想我会把图像看作一个多边形,因为我有顶点的坐标,然后转换具有矩阵(cvMat)中的顶点的向量。

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

4

1 回答 1

7

您的代码有两个问题:

第一的:

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

最初创建一个包含 5 个点的向量,因此在您使用push_back()5 次后,您将拥有一个包含 10 个点的向量,其中前 5 个是(0, 0).

第二:

Mat matROI = Mat(vert);

创建具有两个通道的 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);
于 2013-09-30T09:49:59.863 回答