5

以前、c++ を使用して画像内の関心点をマークするという質問 をしました。. 同じソリューションを使用し、適応しきい値とブロブ検出アルゴリズム(成長領域) を使用して必要なポイントを得ました。中央の長方形の領域を検出したい元のソース図があります

元の画像:

元の画像.しかし、アルゴリズムを使用した後、次のような結果が得られました(新しいタブで開くと詳細が表示されます)

マークされた画像:

ここに画像の説明を入力長方形の領域とは別に、明るい日光に照らされたスポットも見えます。バイラテラル フィルタリングを使用しましたが、まだ長方形の領域を検出できません。しかし、このアルゴリズムは、背景が予想どおりより暗い夜の画像で機能します。

いくつかの変更を加えた同じアルゴリズムで十分か、または他の効率的な方法が利用可能かどうか、誰かが私に提案できますか..

ありがとう

4

2 に答える 2

4

ぼかししきい値の単純な組み合わせを使用して、この結果を得ることができました(表示目的でサイズ変更されました)。

その後、侵食squares.cppテクニック(OpenCVからのサンプル)を適用すると、次のように出力されます。

これはほとんどあなたが探している結果です:長方形の下部が正常に検出されました。あなたがする必要があるのはあなたの興味のある領域に合うように検出された長方形(赤い正方形)の高さを増やすことです。

コード:

Mat img = imread(argv[1]);

    // Blur
Mat new_img = img.clone();
medianBlur(new_img, new_img, 5);

// Perform threshold
double thres = 210;
double color = 255;
threshold(new_img, new_img, thres, color, CV_THRESH_BINARY);
imwrite("thres.png", new_img);

// Execute erosion to improve the detection
int erosion_size = 4;   
Mat element = getStructuringElement(MORPH_CROSS,
                                   Size(2 * erosion_size + 1, 2 * erosion_size + 1),
                                   Point(erosion_size, erosion_size) );
erode(new_img, new_img, element);
imwrite("erode.png", new_img);

vector<vector<Point> > squares;
find_squares(new_img, squares);
std::cout << "squares: " << squares.size() << std::endl;

draw_squares(img, squares);

imwrite("area.png", img);

編集

このfind_squares()関数は、画像で見つかったすべての正方形を含むベクトルを返します。画像のすべてのチャネルで反復するため、この例では、各チャネルの長方形の領域を正常に検出し、squares.size()出力を印刷します3

正方形は4(X、Y)座標のベクトルと見なすことができるため、OpenCVはこの概念を、座標のXおよびY部分にアクセスできるようにするものとして表現していますvector<Point>

ここで、印刷squaresすると、ポイントが反時計回りに検出されたことがわかります。

1st ------ 4th
 |          |
 |          |
 |          |
2nd ------ 3rd

この例に従うと、長方形の高さを増やす必要がある場合は、1番目と4番目のポイントのYを変更する必要があることはかなり明白です。

for (int i = 0; i < squares.size(); i++)
{
    for (int j = 0; j < squares[i].size(); j++)
    {
    //  std::cout << "# " << i << " " << squares[i][j].x << ","<< squares[i][j].y << std::endl;
        if (j == 0 || j == 3)
            squares[i][j].y = 0;
    }
}

于 2012-05-14T18:59:53.793 に答える
1

上の画像では、

  1. かなりうまく機能するはずの通常のしきい値処理操作または

  2. 行ごとのチェーンコード「計算」または

  3. ヒストグラムで勾配を見つけます。

他にもたくさんの解決策があるでしょう。これが一貫している場合は、背景の陰影を差し引くことを検討します。

于 2012-05-14T10:35:52.050 に答える