5

私の質問はこれと非常によく似ています...5ポイントのポリゴンであるグレースケール画像からサブマトリックスを抽出し、それをマットに変換しようとしています。

これは動作しません:

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

コードには 2 つの問題があります。

初め:

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

は、最初に 5 点のベクトルを作成します。したがって、 をpush_back()5 回使用すると、10 点のベクトルが得られます。そのうちの最初の 5 点は(0, 0)です。

2番:

Mat matROI = Mat(vert);

2つのチャネルを持つ 10x1 のマット (10 ポイントのベクトルから) を作成します。それを確認してください:

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

次のようなコードがある場合:

imshow("Window", matROI);

次のコードを持つに渡さmatROIcvConvertImage()ます(これにより、表示されているエラーが発生します)。

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 に答える