1

opencv を使用して c++ で拡張問題に取り組んでいます。私は駐車場のビデオフレームをキャプチャしました。最高のブロブを取得するために、これを思い付きました。

  1. 浸食 (5x5 カーネル長方形)、3 回の繰り返し
  2. Dilation GRADIENT (y 軸に沿った色のグラデーションのようなものと考えてください)

それで、これを機能させるために私は何をしましたか?最初に、2 つのポイント (x,y) と、それらのポイントでの 2 つの適切な拡張カーネルサイズを知る必要がありました。この情報を使用して、画像全体でこれらの値を補間および推定できます。そこで、これらのパラメーターから ROI (サイズと拡張カーネルサイズ) を計算しました。したがって、各 ROI には、膨張に使用される独自の事前定義されたカーネルサイズがあります。2 つの連続する ROI (opencv の四角形) の間にスペースがないことに注意してください。すべて正常に動作していますが、2 つの副作用があります

  1. ブロブの側面に膨らみがあります。黒い線は ROI の境界線です。 バルジ画像
  2. メインのブロブから「切り離された」ブロブ。これらは実際には切り取られていませんが、上のブロブの 1 つの下の ROI は、分離されたブロブに拡張します (上の ROI からピクセル情報を取得すると思います)。それは 1 つの巨大なブロブである必要があります。そこにいるべきではないブロブ画像

ROI のサイズを変更するためにあらゆることを試し、その間にスペースを残しましたが、2 つの分離された ROI の間のブロブが拡張されないという欠点があります。

だから私の質問は:

  1. それらの副作用の正確な原因は何ですか?
  2. それらをなくすにはどうすればよいですか?

編集

だから私は私の解決策を見つけました: opencv dilate 関数を呼び出すとき、同じ cv::Mat を宛先イメージとして使用できるかどうかを確認する必要があります。そうでない場合は、元の画像と新しい画像の一部を使用することになります。だから私がしなければならなかったのは、宛先 cv::Mat を含めることだけでした。

4

1 に答える 1

0

これはあなたの最初の質問には答えません (これらの副作用の原因は何ですか)。 )。

考えられるすべてのカーネル サイズを使用して、イメージ全体の膨張を計算できます。次に、これらのバイナリ イメージがすべて計算された後、正しいイメージから正しいサンプルを取得してそれらを結合し、目的の出力イメージを得ることができます。これはかなりの時間を無駄にしますが、アーティファクトがなくても機能するはずです。

上記で得た結果 (可能な限り良い品質であることがほぼ保証されている) を確認したら、最適化を開始できます。私が試してみたいことの 1 つは、膨張を計算するための各 ROI サイズをカーネル サイズのサイズで拡張することです。これにより、奇妙な境界条件から発生する可能性のあるアーティファクトが回避される可能性があります。

これは、そもそもアーティファクトの原因についての私の推測につながります。有限の画像を取得して畳み込み(または形態演算子)を実行するときはいつでも、エッジピクセルで何をするかを選択する必要があります。通常、(-4, -1) のピクセルにアクセスすることは無意味ですが、カーネルがオーバーラップしている場合は、演算子を実行する必要があります。OpenCV がサブリージョンに対してこのエッジ パディングを行っている場合、表示されているアーティファクトが非常に簡単に発生する可能性があります。

お役に立てれば!

于 2013-03-08T23:13:45.993 に答える