0

角が内側にあるぼやけた画像の角の位置を見つけたいです。次の例のように:

ぼやけた画像の例

画像内にコーナーが 1 つだけあることを確認できます。

角は黒と白のチェス盤の一部です。

openCVでクロス位置を検出するにはどうすればよいですか? ありがとう!

4

3 に答える 3

0

通常、グラデーションを使用してコーナーを決定できます。

Gx = im[i][j+1] - im[i][j-1]; Gy = im[i+1][j] – im[i-1][j];

G^2 = Gx^2 + Gy^2;

teta = atan2 (Gy、Gx);

画像がぼやけているため、より大きなスケールでグラデーションを計算する必要があります。

Gx = im[i][j+delta] - im[i][j-delta]; Gy = im[i+ デルタ][j] – im[i- デルタ][j];

デルタ = 50 で得た結果は次のとおりです。

勾配ノルム (20 倍)

勾配ノルム http://imageshack.us/scaled/thumb/822/xdpp.jpg

グラデーションの方向:

グラデーションの方向 http://imageshack.us/scaled/thumb/844/h6zp.jpg

于 2013-10-22T08:16:16.303 に答える
0

別の解決策

ここに画像の説明を入力

#include <opencv2/opencv.hpp>

using namespace cv;
int main()
{

    Mat img=imread("c:/data/corner.jpg");
    Mat gray;
    cvtColor(img,gray,CV_BGR2GRAY);
    threshold(gray,gray,100,255,CV_THRESH_BINARY);
    int step=15;
    std::vector<Point> points;
    for(int i=0;i<gray.rows;i+=step)
        for(int j=0;j<gray.cols;j+=step)
            if(gray.at<uchar>(i,j)==255)            
                points.push_back(Point(j,i));

    //fit a rotated rectangle

    RotatedRect box = minAreaRect(Mat(points));
    //circle(img,box.center,2,Scalar(255,0,0),-1);

    //invert it,fit again and get average of centers(may not be needed if a 'good' threshold is found)
    Point p1=Point(box.center.x,box.center.y);
    points.clear();
    gray=255-gray;
    for(int i=0;i<gray.rows;i+=step)
        for(int j=0;j<gray.cols;j+=step)
            if(gray.at<uchar>(i,j)==255)
                points.push_back(Point(j,i));
    box = minAreaRect(Mat(points));
    Point p2=Point(box.center.x,box.center.y);

    //circle(img,p2,2,Scalar(0,255,0),-1);
    circle(img,Point((p1.x+p2.x)/2,(p1.y+p2.y)/2),3,Scalar(0,0,255),-1);
    imshow("img",img);
    waitKey();

    return 0;
}
于 2013-10-22T10:23:28.747 に答える