jp2*_*p23 5 c++ opencv image-processing
我的问题与这个问题非常相似......我试图从一个多边形的灰度图像中提取一个子矩阵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);
Run Code Online (Sandbox Code Playgroud)
它显示以下错误消息:
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
Run Code Online (Sandbox Code Playgroud)
我正在使用OpenCV 2.4.6.1和C++.
谢谢
编辑:
我将重新提出我的问题:我的目标是获得图像的右侧.
我以为我会将图像看作多边形,因为我有顶点的坐标,然后转换矩阵中具有顶点的矢量(cvMat).
我的想法是正确的还是有更简单的方法来获得这个子矩阵?
您的代码有两个问题:
第一:
std::vector<Point> vert(5);
Run Code Online (Sandbox Code Playgroud)
最初创建一个带有5个点的向量,所以在你使用push_back()5次后你得到10个点的向量,其中前5个是(0, 0).
第二:
Mat matROI = Mat(vert);
Run Code Online (Sandbox Code Playgroud)
使用两个通道创建一个10x1 Mat(来自10个点的向量).用以下方法检查:
cout << "matROI.channels()=" << matROI.channels() << endl;
Run Code Online (Sandbox Code Playgroud)
如果您有以下代码:
imshow("Window", matROI);
Run Code Online (Sandbox Code Playgroud)
它将传递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" );
Run Code Online (Sandbox Code Playgroud)
由于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);
Run Code Online (Sandbox Code Playgroud)