我的问题与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)。
我的想法是正确的还是有更简单的方法来获得这个子矩阵?
答案 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);