流域変換のマーカーを作成するために、気の利いたエッジ検出と等高線検索機能 (両方とも OpenCV) を使用しています。すべてうまくいきますが、結果に 100% 満足しているわけではありません。その理由は、一部のエッジが欠落しているため、重要な情報が失われているためです。より詳細には、四角形のウィンドウ (正面図) がたくさんあります。流域変換後、次のようになります。
しかし、私はむしろ、完全で片側が開いていない素敵な長方形が欲しいです。不規則な形状(家の前の茂み、車..)を維持しながら、この問題を解決する方法はありますか?画像全体をグリッドでオーバーレイすることを考えましたが、うまくいきません。
どうもありがとうございました。
これが私のコードです:
Mat gray;
cvtColor(im, gray, CV_BGR2GRAY);
// Use Canny instead of threshold to catch squares with gradient shading
Mat bw;
Canny(gray, bw, 0, 100, 5, true);
// Find contours
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( bw, contours, hierarchy,
CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
// watershed
Mat markers(bw.size(), CV_32S);
markers = Scalar::all(0);
int idx = 0;
int compCount = 0;
for( ; idx >= 0; idx = hierarchy[idx][0], compCount++ ) {
if (fabs(contourArea(contours[compCount])) < min_size )
continue;
drawContours(markers, contours, idx, Scalar::all(compCount+1), 1, 8, hierarchy, INT_MAX);
}
watershed( im, markers );
要求に応じて、元の画像、取得したい画像、および出力は次のとおりです。
そして、私はこのようなセグメンテーションをしたいと思います(セグメンテーションを超えても害はありませんが、確認する必要があるだけです。すべての詳細を取得します):
次のような
結果が得られますが
(色は無視してください。この質問では重要ではなく、プログラム全体の結果にすぎません)。これは 1 つの例にすぎません。必要に応じて、さらにお見せします。また、etrims データセットをご覧ください。私の写真はすべてそこからのものです。