1

これは私のソース画像です(ポイントは無視してください。後で手動で追加されました):

ここに画像の説明を入力

私の目標は、2 つの手の大まかなポリゴン近似を取得することです。このようなもの:

ここに画像の説明を入力

これを行う方法についての一般的な考えがあります。cvCannyエッジをcvFindContours見つけ、輪郭を見つけ、そしてcvApproxPoly.

私が直面している問題は、 を適切に使用する方法がわからないことですcvCanny。特に、最後の 3 つのパラメーター (threshold1&2、apertureSize) には何を使用すればよいですか? 私はやってみました:

cvCanny(source, cannyProcessedImage, 20, 40, 3);

しかし、結果は理想的ではありません。左手は比較的きれいに見えますが、右手の場合はほとんど検出されませんでした。

ここに画像の説明を入力

一般的に、私が望むほど信頼できるものではありません。Canny の「最適な」パラメータを推測する方法はありますか、または少なくとも詳細な説明 (初心者でも理解できる) があるので、知識に基づいた推測を行うことができますか? それとも、これを完全に行うためのより良い方法がありますか?

4

2 に答える 2

6

しきい値を下げる必要があるようです。

キャニー アルゴリズムは、ヒステリシスしきい値で動作します。少なくともピクセルが最大しきい値と同じくらい明るい場合は輪郭を選択し、下限しきい値を上回っている場合は、接続されているすべての輪郭ピクセルを取得します。

論文では、2:1 または 3:1 のスケールで 2 つのしきい値を使用することを推奨しています (たとえば、10 と 30、または 20 と 60 など)。一部のアプリケーションでは、手動で決定され、ハードコーディングされたしきい値で十分です。あなたの場合もそうかもしれません。画像はそれほど複雑ではないため、しきい値を下げると、良い結果が得られると思います。

最適なキャニーしきい値を自動的に決定するための多くの方法が提案されています。それらのほとんどは、最適なしきい値を推定するために勾配の大きさに依存しています。

手順:

  • 勾配を抽出します (Sobel が適切なオプションです)。
  • uchar に変換できます。勾配は理論的には 255 より大きい数値を持つことができますが、それは問題ありません。opencv の sobel は uchars を返します。
  • 結果の画像のヒストグラムを作成します。
  • ヒストグラムの 95 パーセンタイルで最大しきい値を取り、低い方を high/3 とします。
  • アプリに応じてパーセンタイル値を調整する必要がありますが、結果はハードコードされた高値と低値よりもはるかに堅牢です。

注: Matlab には優れたしきい値検出アルゴリズムが実装されています。これは上記の考え方に基づいていますが、もう少し洗練されています。

注 2 : この方法は、輪郭と照明が画像領域間で大きく変化しない場合に機能します。画像の一部で輪郭がはっきりしている場合は、局所的に適応するしきい値が必要ですが、それは別の話です。しかし、あなたの写真を見ると、そうではないはずです。

于 2012-07-17T06:00:32.280 に答える
4

おそらく最も簡単な解決策の 1 つは、グレースケール画像で大津のしきい値処理を行い、バイナリ画像で輪郭を見つけて、それらを近似することです。コードは次のとおりです。

Mat img = imread("test.png"), gray;
vector<Vec4i> hierarchy;
vector<vector<Point2i> > contours;

cvtColor(img, gray, CV_BGR2GRAY);
threshold(gray, gray, 0, 255, THRESH_OTSU);
findContours(gray, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

for(size_t i=0; i<contours.size(); i++)
{
    approxPolyDP(contours[i], contours[i], 5, false);
    drawContours(img, contours, i, Scalar(0,0,255));
}

imshow("result", img);
waitKey();

そして、これは結果です:

ここに画像の説明を入力

于 2012-07-17T06:51:26.487 に答える