0

OpenCV でイメージ侵食を実行しようとしています。私はこのようにしたい: 4 つの異なる要素があるとします。

S1 = [ 0 1 0, 0 1 0, 0 1 0 ]
S2 = [ 0 0 0, 1 1 1, 0 0 0 ]
S3 = [ 0 0 1, 0 1 0, 1 0 0 ]
S4 = [ 0 1 0, 1 1 1, 0 1 0 ]

そして、元の画像でこれらの要素を使用して 4 つの異なる侵食を実行したいと考えています。

E1 = I & S1 
E2 = I & S2 
E3 = I & S3
E4 = I & S4

ここで、「I」は元の画像で、「&」は簡単にするために浸食を表すために使用しました。次に、次の 4 つを追加して最終的な侵食を取得したいと考えています。

E = E1 + E2 + E3 + E4

しかし、これらを opencv で実装すると、初期段階で問題が発生しました。次のように要素を宣言しました。

int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } };
int S2[3][3] = { { 0, 0, 0 }, { 1, 1, 1 }, { 0, 0, 0 } };
int S3[3][3] = { { 0, 0, 1 }, { 0, 1, 0 }, { 1, 0, 0 } }; 
int S4[3][3] = { { 0, 1, 0 }, { 1, 1, 1 }, { 0, 1, 0 } };

次に、「cv::erode」を使用するために、これらの要素は受け入れられるタイプではないため、これらの要素には問題があります。これらの要素を使用して、上記の目的の浸食を得るにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

3

おそらく、目的のカーネル形状から を作成する必要がありますcv::Mat。これらは構造化要素として知られています。OpenCV は、いくつかの一般的な形状を作成するためのgetStructuringElement関数を提供します。

または、次のようなものを使用して、データから直接新しいマトリックスを作成することにより、独自のマトリックスを作成できます。

cv::Mat S1 = (cv::Mat_<uchar>(3,3) << 0, 1, 0, 0, 1, 0, 0, 1, 0);

これが正しいかどうかは、ターミナルに表示することで確認できます。

std::cout << S1 << std::endl;

行列が見つかったら、次のような単純な算術演算で簡単に組み合わせることができます。

cv::Mat E = E1 + E2 + E3 + E4;
于 2012-11-26T16:02:00.907 に答える
1

Mat -oject をカーネルとして使用します。InputArrayOutputArray ( erodeドキュメントを参照) は、ほとんどの場合、Mats または std::vector オブジェクトのいずれかになります。

次のように初期化できると思います(テストされていません):

int S1[3][3] = { { 0, 1, 0 }, { 0, 1, 0 }, { 0, 1, 0 } };
Mat mat1 = Mat(3, 3, CV_32SC1, S1);
于 2012-11-26T16:16:12.253 に答える